Цикл для отображения чисел между 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 и таким образом уродливым.

Другие вопросы по тегам