【问题标题】:What does `b .` mean in this ASSEMBLY code?`b .` 在这个汇编代码中是什么意思?
【发布时间】: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


【解决方案1】:

ARM CPU 的 b 指令与 x86 CPU 的 jmp 指令几乎相同:跳转指令

使用 GNU 工具链. 表示:指令本身的地址。

所以b . 等于:

temporaryLabel:
    b temporaryLabel

或(对于 x86 CPU):

temporaryLabel:
    jmp temporaryLabel

【讨论】:

  • 啊,这很有道理。我对jmp 很熟悉,但对b 很陌生。非常感谢。
  • 问题,如果像jmp,为什么在标签中使用了这么多次,而他们都做同样的事情?
  • @UndercoverCoder:在我看来,所有中断向量都是无限循环,直到替换为跳转到不同中断的实际处理程序。
  • 它是一种汇编语言,其中汇编语言由您使用的工具的汇编程序定义。这不是也不应该仅限于 arm,但 gnu 可能还有其他一些。适用于 x86 (jmp .),适用于 mips、avr、pdp11,我不再在那里尝试。这 。在 gnu 程序集中(不是个人制作这些后端的通用规则)意味着此处或分支/跳转到自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多