我很难理解为什么我的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发布于 2021-09-05 18:34:42
第一,术语:
标签不执行。它们在汇编代码中,但是没有机器代码,处理器从未看到它们。因此,标签本身不能改变控制流,只有处理器指令才能做到这一点。
标签在汇编代码中,它们用于通知汇编程序在机器代码指令中为引用它们的汇编指令选择了哪些偏移(标签)。
这段代码中没有任何东西可以“返回”. --通常我们为通过间接分支返回给调用方的子例程保留返回术语。
至于结束,您没有一个有效的程序指令序列结束,所以,它只是运行结束时,它是完成。
在第一个分支中,blt不应该开火(而应该通过)b/c9确实不少于8。
您对bne的评论与在程序集中编写的操作相反,这可能会清除一些东西。这个分支也不会触发,因为2确实等于2。
最后一个分支将触发,因为4是>= 1,因此将跳过前面的几条指令。
您应该在开始时将$t1初始化为零,而不是依赖模拟器将其清除为零。
您是正确的,$t6将以9= 4+5结束。
发布于 2021-09-05 18:40:33
让您困惑的是,MIPS有分支延迟槽 --这意味着每当您有分支(有条件的或无条件的,没关系),在分支指令之后立即执行的指令总是在分支实际分支之前执行。所以在这个代码中:
    blt $t6,$t5, L1 // if (9 < 8) goto L1
    addi $t1, $t1, 2 // $t1 = 2
L1: 即使条件为真,分支也似乎没有效果,因为分支之后的指令(在分支和目标之间是唯一的指令)无论如何都会被执行。
在代码中
    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 = 9add $t6, $t6, $t5指令将始终被执行,因此当分支条件为真时,只会跳过addi $t6, $t6, 3。
处理这个问题的最简单的方法就是总是在分支之后放置一个nop指令。这样做是可行的,但效率很低(浪费了一个指令槽和循环),所以如果你能找到一个有用的指令,那就更好了。请注意,分支之后的指令直到条件分支计算其测试后才会执行,因此您不能只在分支之后移动该分支之前的指令。
最近的MIPS实现有“紧凑”版本的分支指令,没有延迟插槽。您可以通过在指令中添加一个c来使用它们
bgec $t6,$t5, L3 // if (4 >= 1) goto L3如果您的模拟器/系统支持它们
https://stackoverflow.com/questions/69066022
复制相似问题