我希望我的程序执行以下操作:
测试$ t0和$ t1。如果他们是平等的印刷品#34;等于"。如果没有,请打印"不等于"。然后测试哪一个是更大的,哪个是更小的。最后,相应地打印一条消息。
此代码存在的问题是,在打印"大于"之后它没有进行。它继续打印" Lesser Than"。
我如何达到预期的效果?
.data
equals: .asciiz "\nEqual"
notEquals: .asciiz "\nnot Equal"
greaterThans: .asciiz "\nGreater Than"
lessThans: .asciiz "\nLesser Than"
.text
main:
li $t0, 5
li $t1, 125
beq $t0, $t1, messageEqual
bne $t0, $t1, messageNotEqual
bgt $t0, $t1, messageGreaterThan
blt $t0, $t1, messageLessThan
#Declare the end of the program
li $v0, 10
syscall
messageEqual:
la $a0, equals
li $v0, 4
syscall
messageNotEqual:
la $a0, notEquals
li $v0, 4
syscall
messageGreaterThan:
la $a0, greaterThans
li $v0, 4
syscall
messageLessThan:
la $a0, lessThans
li $v0, 4
syscall
答案 0 :(得分:0)
打印“大于”后不会停止。它继续打印“小于”。
当然可以,因为打印“Lesser Than”的代码直接遵循打印“大于”的代码,并且您没有在其间放置任何代码来转移执行流程。标签不是某种神奇的障碍,它只是程序中特定位置的一个便利名称。
如果您在SPIM / MARS中运行程序并希望在打印消息后终止它,则应使用系统调用10(exit
)。你的所有条件跳转都有一个,但你的代码中没有任何内容会跳回到那个位置。
所以你可以这样做:
messageGreaterThan:
la $a0, greaterThans
li $v0, 4
syscall
li $v0, 10
syscall # exit
您应该在打印信息的所有其他地方做同样的事情 稍微清洁会做这样的事情:
# ...
messageNotEqual:
# code for printing string omitted
j exit
messageGreaterThan:
# code for printing string omitted
j exit
exit:
li $v0, 10
syscall # exit