【发布时间】:2019-08-21 08:34:21
【问题描述】:
我对 ARM 汇编比较缺乏经验,需要帮助理解几行代码。我使用 Godbolt 用 ARM gcc 8.2 编译器编译 C++ 11 代码,得到了这些汇编行:
.L10:
.word .LANCHOR0
我读到 .LANCHOR0 是部分锚点,但这是什么意思?
我知道 .word 和 .data 可以一起使用来声明变量并将值分配给内存空间,如下所示:
.data ! start a group of variable declarations
x: .word 23 ! int x = 23;
但是,是什么
.L10:
.word .LANCHOR0
做吗? .word 前面没有标签。
其次,当一个 .word 行被另一个这样的汇编指令块处理时,这意味着什么?
.L7:
.word 131586
.word .LANCHOR0
_GLOBAL__sub_I_unsigned int atlantic_line_ns::getSimInstAddr<atlantic_line_ns::Cr>():
mov r2, #0
ldr r3, .L10
str r2, [r3]
str r2, [r3, #4]
bx lr
提前致谢。
更新
在阅读了 ARM 文档之后,我明白了
.L7:
.word 131586
.word .LANCHOR0
分配 2 个内存位置,存储值 131586 和 .LANCHOR0 处的值。这些内存位置是否彼此相邻?另外,.LANCHR0 是什么意思?
【问题讨论】:
-
这里没有.word前面的标签。你没看到上一行的
.L10:吗?无论如何,寻找 GCC 将.LANCHOR0:标签放在哪里:IIRC,它使用它作为引用多个静态数据项的公共参考点。 (从代码附近的文字池中加载.LANCHOR0地址后。) -
了解汇编语言是由工具而非架构定义的。它可能类似于针对 arm 工具的汇编语言的 arm 文档,但语言不必符合,尤其是在数据项的声明方式方面。
-
.LANCHOR0 可能只是一些编译器生成的标签。
-
Godbolt.. 您可能想使用那里的设置来获得更详细的列表,您可能会看到这个 .LANCHOR0 是什么。
-
是的,在 Godbolt 中,您可以从 .text 选项卡中删除勾号,您会在列表中的某处看到
.set .LANCHOR0,. + 0行。如果您还没有阅读“部分锚点”,请阅读this。