循环以在MIPS中显示2个寄存器之间的数字

时间:2015-01-06 21:16:57

标签: assembly mips mars-simulator

我正在尝试创建一个循环来显示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 个答案:

答案 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,因此很难看。