2012-09-15 42 views
0

我正在學習MIPS編程,其中我試圖實現If else條件。但問題是當我輸入2選擇減法條件時,程序不起作用。我知道可以使用BNE,但我想學習BEQ。請告訴我是什麼問題是這樣的代碼如果其他在MIPS

.text 

main: 

li $t0,1 
li $t1,2 
li $t2,3 
li $t3,4 

li $v0,5 
syscall 

move $s0,$v0 

beq $s0,$t0,ADDTN 
ADDTN: 


li $a0,40 
li $v0,1 
syscall 

li $v0,5 
syscall 


move $s1,$v0 

li $v0,5 
syscall 

move $s2,$v0 

add $a0,$s1,$s2 

li $v0,1 
syscall 

li $v0,10 
syscall 



beq $s0,$t1,SUBTN 
SUBTN: 

li $a0,50 
li $v0,1 
syscall 

li $v0,5 
syscall 


move $s3,$v0 

li $v0,5 
syscall 

move $s4,$v0 

sub $a0,$s3,$s4 

li $v0,1 
syscall 

li $v0,10 
syscall 
+0

'不行'是你可以給的最好的錯誤描述嗎? –

回答

0

例如:

beq $s0,$t0,ADDTN 
ADDTN: 
    # code for addition 
    # ... 
    # some syscalls 
beq $s0.$t1,SUBTN 
SUBTN: 
. 
. 
. 

我不知道的系統調用做什麼(我通常不代碼MIPS)。

但是你檢查一個條件,我。即等同於$ s0和$ tn中的一個,在平等的情況下,您跳到適合案例的例程。很好,但例程緊跟在BEQ指令之後,所以這裏的分支絕對是多餘的。此外,如果條件是不符合,程序會繼續執行BEQ指令後面的代碼。

結果是,例程(加上最少的ADDTN)被無條件執行。如上所述,我不知道系統調用的作用,但如果加法運行,我猜他們有點跳躍。

無論如何,您必須重新排列代碼,以便根據測試條件的狀態執行代碼的另一分支。這是一個通用的「模板」:

 beq $s0, $t0, equal 
     # this code is executed if $s0 and $t0 differ 
     . 
     . 
     jmp notequal  # avoid also executing the code for equal 
equal: 
     # code for the case $s0 and $t0 hold the same value 
     . 
     . 
notequal: 
     # all that follows executes with no regard of the checked condition 

還有其他的技術分支幾種情況像你(你似乎有檢查的四則運算,我猜),但你應該先開始瞭解的基礎知識。

[更新:嗯,其實這是沒有什麼不同,只是代碼塊影響範圍廣... /更新]

玩得開心......

0

由於這是功課:

如果相等,它會跳轉到由標籤指定的偏移。如果不相同,你期望它執行什麼代碼?

0

如果你打算在使用分支等於那麼你的程序應該實際執行一些有意義的分支。檢查你的分支指令:

beq $s0,$t0,ADDTN 
ADDTN: 

在MIPS你必須記住的是,PC(程序計數器)將線簡單地提前線,除非另有指示,否則。分支指令可以將PC指向程序中的其他位置;然而,在你的代碼中,分支指令告訴PC只是前進到下一行,這正是程序在沒有分支指令的情況下所做的。另外,如果你只想要這些特定的標籤ADDTN,SUBTN被執行,那麼每個標籤在其操作結束時必須有一個跳轉指令。例如,當ADDTN完成時,程序應該跳過SUBTN,除非你想讓SUBTN執行。這是你可以做的一個例子。製作一系列分支指令,將PC轉移到特定的操作員標籤,並在每個標籤末尾跳到EXIT標籤。

beq $s0, $t1, SUBTN # if(input==2) {goto SUBTN} 
    beq $s0, $t0, ADDTN # if(input==1) {goto ADDTN} 
    beq $s0, $t2, MULT  # if(input==3) {goto MULT} 
    beq $s0, $t3, DIV  # if(input==4) {goto DIV} 


ADDTN: 
    # Code for addition 
    j EXIT 

SUBTN: 
    # Code for subtraction 
    j EXIT 

MULT: 
    # Code for multiplication 
    j EXIT 

DIV: 
    # Code for division 
    j EXIT 

EXIT: 
    # Code to exit 
    j EXIT 

注意:您應該能夠想象在這個例子中會發生什麼,如果$ S0的價值是什麼,但1,2,3或4。如果沒有等於的分支會導致PC跳到標籤,那麼程序將執行ADDTN標籤中的代碼。另外,如果每個標籤都不會跳轉到某個結束標籤(EXIT),程序將繼續執行剩餘的標籤。

如果要執行一個明確的else語句,請看下面的例子:

MAIN:  
    beq $s0, $t0, ADDTN # if(input==2) {goto ADDTN} 
    j SUBTN    # else {goto SUBTN} 

ADDTN: 
    # Code for addition 
    j EXIT 

SUBTN: 
    # Code for subtraction 
    j EXIT 

EXIT: 
    # Exit the program 

在這個例子中,如果輸入與加標籤相關的第一個分支將檢查。如果確實如此,PC將跳轉到該標籤;否則,如果將前進到指示跳轉到減法標籤的下一行。