if-statement - 在指令顺序中,是否会在没有分支指令的情况下执行标记指令?
问题描述
beq $s0, $s1, Lab1
add $s2, $s0, $s1
Lab1: sub $s1, $s1, $s0
当 $s0, $s1 不等于 line2 时将被执行。line3 会在 line2 之后执行吗?或者仅当满足 if 语句并发送到 Lab1 时可以执行 line3 吗?
我希望我把我的问题说清楚了。提前致谢。
解决方案
每条指令都告诉处理器接下来是什么指令。
让我们仔细看看add
指令。
它计算总和,将其放入目标寄存器,并且并行地将程序计数器递增 4——明确地告诉处理器下一条指令是地址顺序中的下一条指令。
一条nop
指令通常被认为什么都不做——它甚至代表无操作——但它确实增加了 pc,所以从技术上讲它根本什么都不做。
作为汇编语言学生的导师,我发现强调程序计数器很有用。
有经验的汇编语言程序员经常忽略程序计数器,因为它对处理器的运行至关重要。所以,让我们谈谈它。
每条指令都告诉处理器接下来是什么指令:每条指令都会更新程序计数器,并且,对程序计数器的更新是每条指令告诉处理器下一步是什么的机制。每条指令都有自己的内存地址;因为程序计数器保存了它的地址,所以执行了给定的指令。顺序操作并不神奇——每条指令都必须告诉处理器下一步是什么(即必须更新电脑)。
程序还可以与程序计数器交互,调用 ( jal
) 将程序计数器捕获到$ra
寄存器中,以便子例程或函数用于将处理器的控制权返回给调用者。
只是稍微过度简化,在子程序或函数中,向后移动程序计数器形成一个循环——处理器向后重新执行它之前已经做过的事情;根据 if-then 或 if-then-else 的需要,向前移动它会跳过某些内容。
但是每条指令都有明确定义的方式来修改程序计数器,无论它看起来是显式的还是隐式的。
Assembly Machine Code Operation
beq $s0, $s1, Lab1 # skip 1 instruction on condition $s0 == $s1
add $s2, $s0, $s1 # not skipped if $s0 != $s1: next is pc+4
Lab1: # no machine code for this
sub $s1, $s1, $s0 # run after beq when $s0 == $s1 -or else- after add
在汇编语言中,标签通知汇编器如何翻译使用它的指令。 Lab1
将与一个位置、一个地址相关联,这里是sub
指令的地址。
这beq
是一个有条件的 pc 相对分支。因此,它想要的值是 pc-next (自身的)和分支目标之间的 delta,here Lab1
。delta 为 0 将导致不跳过任何指令,而 delta 为 1 将导致跳过 1 条指令。在这里,我们要跳过 1 条指令,因此 delta 将为 1。机器代码中的字面意思是 1 beq
。
执行后beq
,处理器将被告知(基于指定的 eq 条件)它是否会分支。它通过将 pc 调整为 pc+4 - 或 - 调整为 pc+4+delta 来做到这一点。
其他两个指令都是我们所说的顺序指令,因此它们通知处理器 pc-next 是 pc+4。知道您可以在采用或未采用的条件分支上遵循完整的顺序。
推荐阅读
- r - 如何找到与距离矩阵的距离最小的两个对象?
- android - 如何在 Android 应用的 Express API 中进行 Google OAuth 登录?
- flutter - 像图像一样颤动的文本字段设计
- search - Algolia:跨多个字段搜索和评分结果
- python - Python Django - 上传图片以在开发模式下在浏览器中查看
- error-handling - 仅在 rmarkdown 中运行 rchunk 时,stargazer 错误“无法更改 NULL 的长度”
- python - 我无法在我的 django HTML 模板中显示我的图像
- javascript - TypeScript 中的变量声明错误
- php - 使用引导产品卡表单显示数据库记录时出现问题
- validation - 一种优雅的获取结果的方式
基于 Result<_, E1> 和 Result ?