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

时间:2015-08-29 19:39:07

标签: mips

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

测试$ 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 

1 个答案:

答案 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