-1

我正在学习 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
4

3 回答 3

2

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

    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 将跳转到该标签;else if 将前进到指示跳转到减法标签的下一行。

于 2013-10-04T23:24:59.480 回答
1

因为这是家庭作业:

如果相等,则会跳转到标签指定的偏移量。如果不相等,您希望它执行什么代码?

于 2012-09-15T17:21:57.507 回答
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

还有其他技术可以分支像您这样的几个案例(我猜您似乎必须检查四个操作),但您应该首先开始了解基础知识。

[更新:嗯,实际上并没有什么不同,只是代码块分布得更广了……/更新]

玩得开心...

于 2012-09-15T18:17:46.360 回答