Цикл для отображения чисел между 2 регистрами в MIPS
Я пытаюсь создать цикл для отображения чисел между значениями 2 регистров, которые вводятся пользователем на более раннем этапе программы.
Итак, для примера:
$s0
= 5$s1
= 1
тогда результат будет: 5 4 3 2 1
Моя логика такова:
move $t1,$s0
loop:
move $t1, $s1
# branch to loop if
# greater than or equal to zero.
bgez $t1, loop
но это неправильно, так как я думаю, что он просто застрял в непрерывном цикле и не печатает значения.
1 ответ
Итак, вы хотите что-то вроде:
void printnumbetween(int low, int high)
{
while(high >= low)
{
printf("%d ",high);
high--;
}
return;
}
На ассемблере вы можете сделать:
printnumbetween:
#assume $a0 is "int low", $a1 is "int high"
addiu $sp, -12 #to store variables during printf-call
sw $ra, 12($sp) #save return address
sw $s0, 8($sp) #free up caller-saved register
sw $s1, 4($sp) #ditto
addu $s0, $zero, $a0 #move arguments to caller-saved registers
addu $s1, $zero, $a1
bgt $s0, $s1, endfun #if (low > high) return
loop:
addu $a0, $zero, $s1 #move high to argument register
... #set up other arguments for printf()
jal printf #call printf()
addiu $s1, $s1, -1 #high--
ble $s0, $s1, loop #if-converted loop: if (low <= high) goto loop
endfun:
lw $ra, 12($sp)
lw $s0, 8($sp) #restore caller-saved registers
lw $s1, 4($sp)
addiu $sp, 12 #restore stack
jal $ra
Точная семантика сохранения содержимого в стеке может отличаться (указывает ли указатель стека на первый пустой адрес или последний использованный адрес?), Так же как и требования к вызову printf()
, который является varargs и таким образом уродливым.