if-statement - 对 MIPS 中的 if 跳转感到困惑

标签 if-statement assembly mips

我很难理解为什么我的 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

最佳答案

首先,术语:

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

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

此代码中没有任何内容可以“返回”。通常,我们保留术语 return 用于通过间接分支返回到其调用者的子例程。

就结束而言,您没有程序指令序列的有效结束,因此它在完成时只是简单地结束。

第一个分支,blt 不应该触发(而是应该落下)b/c 9 确实不小于 8。

您对 bne 的评论与用汇编编写的操作相反,也许这会清除一些东西。该分支也不会触发,因为 2 确实等于 2。

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

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

你是正确的,$t6 将以 9 = 4+5 结束。

关于if-statement - 对 MIPS 中的 if 跳转感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69066022/

相关文章:

java - 项目跳过我的 if 语句? java

c# - 如果代码有其他方法可以写这个吗?

c - 条件移动优化是否针对 C 标准?

string - 在 MIPS 中解析字符串

javascript - NodeJS,多个 if 可能返回 header (并且失败)

Python 编程 : Multiline Comments before an Else statement

assembly - x86 cmpl 和 jne

assembly - MASM .DATA 是如何工作的?对内指导工作

assembly - 为什么非寄存器跳转指令需要分支目标缓冲区?

具有四个以上参数的 MIPS 函数调用