Что делает эта программа MIPS? - PullRequest
0 голосов
/ 07 марта 2011

Я знаю, что программа загружает адрес .word 5, который является начальным значением, я запутался в том, что на самом деле делает программа.Это сравнение стеков слова или добавление.

.data   

 arg:   .word 5 
.text

.globl main

main:

la  $t3, arg    

lw  $t2, 0($t3) 

lw  $t3, 0($t3)


addi    $t1, $zero, 0

beqz    $t2, fin        


  fori:


add $t1, $t1, $t2   

addi    $t3, $t3, -1

bnez    $t3, fori       


 fin:


li  $v0, 10
syscall 

Ответы [ 2 ]

1 голос
/ 07 марта 2011

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

Так, например, если вы введете символ, представляющий значение ascii, равное 5 (а не само iirc '5'), вы можете увидеть что-то вроде этого:

    int t2 = 5, t3 = 5, t1 = 0;
    do {
         t1 += t2;
         t3 -= 1;
    } while(t3 > 0);

Кто-то уже ответил, но я предоставлю перевод, который я сделал:

.data   

 arg:   .word 5 
.text

.globl main

main:

la  $t3, arg    # load-address of arg into t3
lw  $t2, 0($t3) # load-word from the address in t3 + 0 offset, like t3[0]
lw  $t3, 0($t3) # same but to t3

addi    $t1, $zero, 0 # initialize t1 to 0? weird they don't use li
beqz    $t2, fin # if t2 is zero jump to fin:


  fori:


add $t1, $t1, $t2       # t1 = t1 + t2
addi    $t3, $t3, -1    # t3 -= 1
bnez    $t3, fori       # if(t3 != 0) goto fori


 fin:


li  $v0, 10    # load immediate 10 into v0, which is the syscall to terminate the program
syscall
0 голосов
/ 07 марта 2011

Отказ от ответственности: у меня нет прямого опыта работы с MIPS, я просто изучал несколько языков ассемблера.

Тем не менее, я думаю, что программа вычисляет квадрат 'arg' путем повторного сложения - в этом случае 5 * 5 = 25. Однако результат в $ t1, похоже, нигде не сохраняется, вместо этого программа просто выходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...