Mips 我怎样才能达到预期的结果?
我希望我的程序执行以下操作: 测试$t0和$t1。如果它们相等,则打印“相等”。如果不是,请打印“不相等”。然后测试其中哪一个更大,哪一个更小。最后,相应地打印一条消息 此代码的问题是,它在打印“大于”后不会闪烁。它继续打印“小于” 我怎样才能达到预期的结果Mips 我怎样才能达到预期的结果?,mips,Mips,我希望我的程序执行以下操作: 测试$t0和$t1。如果它们相等,则打印“相等”。如果不是,请打印“不相等”。然后测试其中哪一个更大,哪一个更小。最后,相应地打印一条消息 此代码的问题是,它在打印“大于”后不会闪烁。它继续打印“小于” 我怎样才能达到预期的结果 .data equals: .asciiz "\nEqual" notEquals: .asciiz "\nnot Equal" greaterThans: .asciiz "\nGreater 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
打印“大于”后不会停止。它继续打印“小于”
当然是这样,因为打印“小于”的代码直接跟在打印“大于”的代码后面,并且您没有在两者之间放置任何代码来转移执行流。标签不是某种魔障,它只是程序中某个特定位置的一个昵称
如果您正在SPIM/MARS中运行程序,并希望在打印消息后终止程序,则应使用syscall 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
两者都不合适。如果我需要在
beq$t0,$t1,messageEqual bne$t0,$t1,messageNotEqual bgt$t0,$t1,messagegreaterther blt$t0,$t1,messageLessThan
之后添加一些代码,但是在之前声明程序的结束li$v0,10系统调用
然后将退出:
标签放在blt
后面。或者将打印“子例程”转换为使用jal
调用的适当函数,并返回jr$ra
。通过将其与条件分支组合,可以实现条件jal
(例如,反转条件分支上的条件,以便在不应调用函数时跳过jal
)。