Цикл для отображения чисел между двумя регистрами в MIPS

Я пытаюсь создать цикл для отображения чисел между значениями двух регистров, которые вводятся пользователем на более раннем этапе программы.

Итак, для примера:

  • $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

но это неправильно, так как я думаю, что он просто застрял в непрерывном цикле и не печатает значения.


person JohnnyC    schedule 06.01.2015    source источник
comment
Прежде чем вы сможете выполнить свою ветвь, вы должны провести сравнение. Одного движения недостаточно. (и вы должны на самом деле напечатать значение)   -  person Jeff Mercado    schedule 07.01.2015
comment
@JeffMercado Как вы предлагаете это сделать?   -  person JohnnyC    schedule 07.01.2015


Ответы (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 и, следовательно, уродливым.

person EOF    schedule 06.01.2015
comment
Да, я очень хорошо понимаю циклы в java, но когда дело доходит до языка ассемблера MIPS, я немного в тупике. - person JohnnyC; 07.01.2015
comment
@JohnnyC: взгляните на мою правку. Я настоятельно рекомендую немного изучить C, если вы хотите работать с ассемблером. Кроме того, не публикуйте просто несколько строк сборки. Думайте целыми функциями, иначе вам не хватает контекста. - person EOF; 07.01.2015