2012-09-15 48 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将跳转到该标签;否则,如果将前进到指示跳转到减法标签的下一行。