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