1

我正在尝试创建一个循环来显示用户在程序早期阶段输入的 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

但这是错误的,因为我认为它只是卡在一个连续循环中并且不打印值。

4

1 回答 1

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()也是如此,它是可变参数,因此很难看。

于 2015-01-06T21:25:11.737 回答