首页 > 解决方案 > 对 MIPS 中的 if 跳转感到困惑

问题描述

我很难理解为什么我的bge语句中的跳转会跳转到标签然后结束,而其他两个执行标签并返回。我对此有些陌生,希望有一个链接或另一篇帖子,其中包含我找不到的类似问题。我在 结尾处就我的外观和代码结果留下了评论nop,我可能是错的,如果我有希望,我可以指导它应该如何工作。

.globl main
.data
.text
main:

    li $t5, 8
    li $t6, 9 
    blt $t6,$t5, L1 // if (9 < 8) goto L1
    addi $t1, $t1, 2 // $t1 = 2
L1: 
    addi $t1, $t1, 1 // $t1 = 3
    nop // $t1 = 3 
    li $t7, 2
    li $t3, 2
    bne $t7,$t3, L2 // if ( 2 == 2) goto L2
    addi $t3, $t3, 2 // $t3 = 9
L2: 
    addi $t3, $t3, 5 // $t3 = 7
    nop // $t3 = 9
    li $t6, 4
    li $t5, 1
    bge $t6,$t5, L3 // if (4 >= 1) goto L3
    add $t6, $t6, $t5
    addi $t6, $t6, 3  
L3: 
    addi $t6, $t6, 5 // $t6 = 9
    nop // $t6 = 9

标签: if-statementmips

解决方案


一、术语:

标签不执行。它们在汇编代码中,但不获取/获取机器代码,处理器永远不会看到它们。因此,单独的标签不能改变控制流,只有处理器指令可以做到这一点。

标签存在于汇编代码中,它们用于通知汇编程序在机器代码指令中为引用它们的汇编指令(标签)选择哪些偏移量。

这段代码中没有任何东西可以“返回”。通常,我们保留术语 return 用于通过间接分支返回给调用者的子例程。

就结尾而言,您没有有效的程序指令序列结尾,因此它在完成时只是从结尾运行。

第一个分支,blt不应该开火(应该倒下)b/c 9 确实不少于 8。

您对 的评论与bne汇编中编写的操作相反,也许这会澄清一些事情。这个分支也不会触发,因为 2 确实等于 2。

最后一个分支将触发,因为 4 >= 1,因此将跳过前面的一些指令。

您应该在开始时将其初始化$t1为零,而不是依靠模拟器将其清除为零。

你是对的,$t6最终会得到 9 = 4+5。


推荐阅读