如果在MIPS中还有

时间:2012-09-15 17:00:21

标签: assembly mips

我正在学习MIPS编程,其中我正在尝试实现If else条件。但问题是当我输入2来选择减法条件时,程序不起作用。我知道可以使用BNE,但我想学习BEQ。请告诉我这个代码是什么问题

.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

3 个答案:

答案 0 :(得分:0)

因为这是家庭作业:

如果相等,它将跳转到标签指定的偏移量。如果它不相等,你期望它执行什么代码?

答案 1 :(得分: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

还有其他技术可以像你一样分支几个案例(我猜你似乎要检查四个操作),但你应该先开始理解基础知识。

[更新:嗯,实际上并没有那么不同,只是代码块传播得更广...... /更新]

玩得开心......

答案 2 :(得分:0)

如果你打算在equals上使用branch,那么你的程序应该实际执行一些有意义的分支。检查你的分支指令:

    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,您应该可以看到此示例中会发生什么。如果equals上没有任何分支导致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将跳转到该标签;否则,如果将前进到指示跳转到减法标签的下一行。