我正在学习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
答案 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将跳转到该标签;否则,如果将前进到指示跳转到减法标签的下一行。