【发布时间】:2018-06-13 13:20:41
【问题描述】:
所以我正在研究source code for Redox OS(一个用 Rust 制作的操作系统),只是想看看我是否能学到一些东西。
我正在读取bootloader 文件夹中的程序集文件start.s。在interrupt_vector_table 标签中,我们有:
interrupt_vector_table:
b . @ Reset
b .
b . @ SWI instruction
b .
b .
b .
b .
b .
b . 到底是什么?
我不是一个完整的汇编初学者,我以前从未遇到过。
【问题讨论】:
-
好吧,
b是一个无条件分支,我猜这个点的意思是“这里”(如:b指令的地址)。所以这些看起来像存根(无限循环),以后如有必要会被替换。 -
这是/看起来像 arm(全尺寸 32 位,不是 cortex-m 不是 aarch64)。所以前 8 个带有一些未使用向量的指令是您执行的指令,让未使用的向量分支到自身或分支到其他地方的无限循环并不是一个坏主意。这样,如果您点击一个(未定义的指令、数据中止、预取中止),您就不会再次进入引导代码并可能误解正在发生的事情。稍后将它们更改为真实向量(使用基于分支或 pc 的负载分支到真实位置,必须是一条指令)。
-
这在您的 arm 核心的 arm 架构参考手册中有所介绍,最好从较旧的 arm arm 开始,我认为他们将其列为 armv5 架构参考手册,然后 armv7 添加了一个总体上要复杂得多(即使基本事件相同,但现在可以移动)。
-
如果你组装然后反汇编你会看到 b 。将分支编码为自身,无限循环。
-
还有一些更奇怪的,gas 支持的,比如如果你有一个带有数字 1 的标签:那么在页面/代码下方不远处,你会看到一个 b 1b,这意味着标签 1:向后。 b 1f 表示标签 1 向前。所以这些行 1: ; b 1b ; b1f; 1:有两个匹配的标签,但显然没关系,尽管必须质疑理智,b 1b 表示向后分支一个 b 1f 表示向前分支到标签 1:并且您可以使用其他数字。显然是一个懒惰的程序员的事情,或者一个宏扩展的事情,一个对读者来说很困难的事情。
标签: assembly arm gnu-assembler instruction-set