if-statement - 对 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
解决方案
一、术语:
标签不执行。它们在汇编代码中,但不获取/获取机器代码,处理器永远不会看到它们。因此,单独的标签不能改变控制流,只有处理器指令可以做到这一点。
标签存在于汇编代码中,它们用于通知汇编程序在机器代码指令中为引用它们的汇编指令(标签)选择哪些偏移量。
这段代码中没有任何东西可以“返回”。通常,我们保留术语 return 用于通过间接分支返回给调用者的子例程。
就结尾而言,您没有有效的程序指令序列结尾,因此它在完成时只是从结尾运行。
第一个分支,blt
不应该开火(应该倒下)b/c 9 确实不少于 8。
您对 的评论与bne
汇编中编写的操作相反,也许这会澄清一些事情。这个分支也不会触发,因为 2 确实等于 2。
最后一个分支将触发,因为 4 >= 1,因此将跳过前面的一些指令。
您应该在开始时将其初始化$t1
为零,而不是依靠模拟器将其清除为零。
你是对的,$t6
最终会得到 9 = 4+5。
推荐阅读
- javascript - 如何转换一个数字输入,使前两个数字变成小数与oninput
- postgresql - Spring Data Jpa OneToMany 双向保存
- swift - 如何在滚动视图中设置组件的全高?
- java - 继承实体类的休眠模式验证错误
- java - 在指定日期设置桌面通知
- r - 将来自符合模式并忽略 NA 的名称的字符串粘贴在一起
- c# - 使用包含数组的嵌套类进行 JSON 到 C# 的转换
- python - 使用理解创建值是关键的字典
- swift - 如何在 heighForRowAt indexPath 中设置自动高度?
- image - 当我使用 require 时图像未在 React Native 中加载,但在我从 URL 加载时加载