ваши системные вызовы MIPS находятся в этом разделе
li $v0, 4
la $a0, msg1
syscall
li $v0, 5 #Exit syscall
syscall
add $a0, $v0, $zero
jal fact
add $a0, $v0, $zero
li $v0, 1
syscall
li $v0, 10
la $a0, msg2
syscall
Они неправильно комментируются
В системном вызове MIPS $ v0 содержит "функцию системного вызова" или, на английском языке, нужную вам услугу:операционная система для выполнения. Здесь есть их таблица.
$a0
будет содержать первый параметр, переданный в вызов.Чтобы установить этот параметр, одним из методов является добавление входного значения к нулю, сохраняя результат в $a0
. Вот почему у вас так много строк, как этот
add $a0, $v0, $zero # this adds $v0 to the number zero and storing in $a0
Наконец, системные вызовы, которые вы используете: (4=> print String, 5 => read integer, 1 => print integer и 10 => exit)
Поэтому правильно прокомментированный пример вашего кода будет иметь вид
la $a0, msg1 # load string as parameter
li $v0, 4 # load operation "print string"
syscall # request "print string" for msg1
li $v0, 5 # load operation "read integer"
syscall # request "read integer"
add $a0, $v0, $zero # load the read integer into $a0
jal fact
add $a0, $v0, $zero # load the value of $v0 into $a0
li $v0, 1 # load operation "print integer"
syscall # request "print integer"
Как видите, мое замешательство связано не с вашей способностью использовать системные вызовы, а с вашим описанием того, что, по вашему мнению, вы используете для системных вызовов.
Вы заявляете, что хотите напечатать двоичное число, например 01001010
, из десятичного числа.Как правило, это включает в себя разбиение десятичного числа в цикле, вывод на печать нуля или единицы в каждом из двоичных чисел.Поскольку для этого потребуется цикл для каждого заполнителя в двоичном числе, не представляется возможным, чтобы один вызов «print integer» был возможен (если только ввод не был ограничен только десятичными «1» и «0», иливход ограничен таким небольшим числом, что его двоичное представление, представленное в десятичном формате, меньше, чем max_int).
Таким образом, для входа 5 желаемый вывод будет 101, и это будет 3 вызовапечатать в порядке «1», «0», «1».Я считаю, что такой подход печати цифр в цикле даст вам больший успех и позволит вам печатать каждое введенное положительное десятичное число.
Короче говоря, я думаю, что ваша команда syscall в порядке, но вывсе еще борется с тем, как делать петли и решать проблемы при сборке.Попробуйте выяснить, как вы будете определять цифры в нужном порядке вручную, используя карандаш и бумагу, а затем попытайтесь закодировать это в своей программе.