我正在尝试创建一个循环来显示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
但这是错误的,因为我认为它只是停留在一个连续循环中并且不打印这些值。
答案 0 :(得分:0)
所以你想要这样的东西:
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,因此很难看。