2011-03-07 116 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