2011-03-07 101 views
0

我知道程序加载它是初始值的.word 5的地址,我越来越感到困惑,以什么程序实际上做。是比较单词的堆叠还是添加?这个MIPS程序是做什么的?

.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 

回答

0

声明:我没有任何直接的MIPS经验,我只是围绕一些汇编语言。

这么说,我觉得什么程序没有通过反复高加法运算“ARG”的平方 - 在这种情况下,5 * 5 = 25。然而,在$ T1似乎并不存储在任何位置,而是该程序刚刚退出。

0

看起来基于在因为它不从环内访问阵列的空间中的第一项像它相加。

因此,举例来说,如果你输入较5的ASCII值的字符(不是“5”本身IIRC),你可能会看到这样的事情:

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

不错!但是,我不认为该程序执行equiv。 '的回报10' - 据我所知道的,'10'表示执行系统调用是“退出计划”的系统调用。也许$ t1中的值被用作退出代码的值? – Lars 2011-03-07 19:42:55

+0

Derp。是的,根据笔记我结束了程序。 – Matt 2011-03-07 23:53:30