2012-03-31 104 views
1

我不能完全弄清楚我在彙編代碼中做錯了什麼。我想有時「主:」在寫比較兩個空值終止被輸入爲A0 $和$ A1字符串的程序段,然後調用簡單的MIPS彙編

jal hamming 

啓動程序。

基本上這部分我想兩個字符串進行比較字符通過字符,直到一個字符串命中null終止字符。然後程序停止並返回有多少個字符不同,直到終止。

我認爲它與我使用的跳躍有關,但我不太確定。該方案是有點長,所以我把主要的一塊,我認爲是問題(因此忽略像$ A3,已初始化和定義已經變量):

diffchar: 
     li $t4, 0 
     li $t5, 1 

     beq $a0, $a1, samechars 
     move $v0, $t5 
     j diffcharend 

samechars: 
     move $v0, $t4 

diffcharend: 
     jr $ra 

hamming: 

absvaluedone: 
     li $a2, 0 
     #li $v0, 0 

     move $t0, $a0 
     move $t1, $a1 

hammingloopbegin: 
     lb $t2, 0($t0) 
     lb $t3, 0($t1) 
     beq $t2, $0, hammingdone 
     beq $t3, $0, hammingdone 

     la $a0, 0($t0) 
     la $a1, 0($t1) 
     jal diffchar **#this is the line that causes me problems, if I take this out it is fine** 
     beq $v0, $0, next 
     addiu $a2, $a2, 1 

next: 
     addiu $t0, $t0, 1 
     addiu $t1, $t1, 1 
     j hammingloopbegin 

hammingdone: 
     add $v0, $a2, $a3 
     jr $ra 

當我運行我的程序我的輸出看起來這樣口口聲聲說一個無限循環:

Exception occurred at PC=0x00400144 
    Bad address in data/stack read: 0x10021226 
    Exception 7 [Bad address in data/stack read] occurred and ignored 
Exception occurred at PC=0x00400140 
    Bad address in data/stack read: 0x1002121b 
    Exception 7 [Bad address in data/stack read] occurred and ignored 

我覺得有什麼毛病diffchar或我使用跳來跳去到diffchar過程。這是我第一次編寫彙編代碼,所以我認爲這些東西真的很基本,我錯過了這些。任何指針都會很棒。

感謝您的幫助

回答

2

你不jal diffchar之前保存的返回地址。它返回並且$ra仍然保持新值。當您在hammingdone中再次登錄jr $ra時,您會在撥打diffchar後跳回到右側。在呼叫diffchar之前,您需要在某處存儲$ra,並在呼叫返回後將其恢復。

這裏是一個good explanation of nested procedures in MIPS,它描述你所遇到的問題和使用運行時堆的溶液:

當執行jal B指令,過程A在寄存器 $ra返回地址將被覆蓋返回地址爲 程序B,程序B將正確返回到A,但是當程序A執行jr指令時,它將再次返回到B的返回地址 ,該地址是jal B in 過程A.這使程序A處於無限循環。

...

系統堆棧通常用於保存返回地址。當程序被調用時,它們可以被推入堆棧,並彈出到 執行返回指令。

在寄存器$ra的返回地址可被壓入系統堆棧 用下面的MAL代碼:

sw  $ra, ($sp) 
    add  $sp, -4 

下面的代碼從所述堆棧的頂部和 返回它在寄存器彈出返回地址$ra

add  $sp, 4 
    lw  $ra, ($sp)