我很难理解为什么我的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结束。
https://stackoverflow.com/questions/69066022
复制相似问题