这段汇编代码中的 `b .` 是什么意思?

8
我正在研究用Rust编写的操作系统Redox OS (源代码),以期从中学习。我正在阅读位于bootloader文件夹中的汇编文件start.s。在中,我们有以下内容:
interrupt_vector_table:
    b . @ Reset
    b . 
    b . @ SWI instruction
    b . 
    b .
    b .
    b .
    b .

b .是什么意思?

我并不是汇编的完全新手,只是以前从未遇到过这个。


3
好的,“b”是一个无条件分支,我猜点号表示“这里”(指“b”指令的地址)。因此,这些看起来像是存根(无限循环),如果有必要,它们可以稍后替换。 - Michael
2
这是/看起来像 ARM(完整的32位,不是Cortex-M也不是Aarch64)。所以前8个带一些未使用的向量是您要执行的指令,将未使用的向量分支到自身或分支到其他某个无限循环位置不是一个坏主意。这样,如果您遇到一个(未定义指令,数据中止,预取中止),您就不会再次进入引导代码并可能误解正在发生的情况。稍后将它们更改为真正的向量(使用分支或基于PC的负载跳转到实际位置,必须是单个指令)。 - old_timer
1
这在您的ARM核心的ARM架构参考手册中有所涵盖,最好从旧版的ARM ARM开始,我认为他们将其列为ARMv5架构参考手册,然后ARMv7手册会增加更多的复杂性(尽管基本事件相同,但现在可以移动)。 - old_timer
1
如果你汇编然后反汇编,你会发现 b . 将分支到自身,形成无限循环。 - old_timer
1
有一些更奇怪的东西,gas支持,比如如果你有一个带有数字的标签,比如1:,那么在页面/代码不远处,你会看到一个b 1b,它表示标签1:向后跳转。b 1f表示标签1:向前跳转。所以这些行1:; b 1b; b1f; 1:有两个匹配的标签,但显然这是可以的,尽管人们必须质疑理智,b 1b表示向后跳转一个,b 1f表示向前跳转到标签1:你可以使用其他数字。显然这是懒惰的程序员的事情,或者是宏扩展的事情,对读者来说很困难。 - old_timer
显示剩余6条评论
1个回答

17

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

使用 GNU 工具链的 . 意味着:指令本身的地址。

因此,b . 等同于:

temporaryLabel:
    b temporaryLabel

或(适用于x86 CPU):

temporaryLabel:
    jmp temporaryLabel

啊,这很有道理。我熟悉jmp但是对b还不熟悉。非常感谢你。 - UndercoverCoder
问题是,如果它像jmp一样,为什么在标签中使用它这么多次,而它们都做同样的事情? - UndercoverCoder
2
@UndercoverCoder:在我看来,所有的中断向量都是无限循环,直到被替换为跳转到不同中断实际处理程序的跳转指令。 - Peter Cordes
1
这是一个汇编语言的问题,其中汇编语言由汇编器定义,即您使用的工具。这不应该仅限于ARM,但GNU可能有其他一些工具。适用于x86(jmp .),适用于MIPS,AVR,PDP11,我在那里停止尝试。在GNU汇编中,“.”(不是通用规则,因为个人制作这些后端)表示此处或跳转/跳转到自身。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接