Mips 我怎样才能达到预期的结果?

Mips 我怎样才能达到预期的结果?,mips,Mips,我希望我的程序执行以下操作: 测试$t0和$t1。如果它们相等,则打印“相等”。如果不是,请打印“不相等”。然后测试其中哪一个更大,哪一个更小。最后,相应地打印一条消息 此代码的问题是,它在打印“大于”后不会闪烁。它继续打印“小于” 我怎样才能达到预期的结果 .data equals: .asciiz "\nEqual" notEquals: .asciiz "\nnot Equal" greaterThans: .asciiz "\nGreater Than"

我希望我的程序执行以下操作:

测试$t0和$t1。如果它们相等,则打印“相等”。如果不是,请打印“不相等”。然后测试其中哪一个更大,哪一个更小。最后,相应地打印一条消息

此代码的问题是,它在打印“大于”后不会闪烁。它继续打印“小于”

我怎样才能达到预期的结果

.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
)。