我对 ARM 汇编相对缺乏经验,需要帮助理解几行代码。我已经使用 Godbolt 和 ARM gcc 8.2 编译器编译 C++ 11 代码,并得到了这些汇编代码行:
.L10:
.word .LANCHOR0
Run Code Online (Sandbox Code Playgroud)
我读到这.LANCHOR0是部分锚点,但这是什么意思?
我理解,.wordand.data可以一起使用来声明变量并将值分配给内存空间,如下所示:
.data ! start a group of variable declarations
x: .word 23 ! int x = 23;
Run Code Online (Sandbox Code Playgroud)
但是,什么是
.L10:
.word .LANCHOR0
Run Code Online (Sandbox Code Playgroud)
做?这里前面没有标签.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
Run Code Online (Sandbox Code Playgroud)
提前致谢。
更新
多读一点 ARM 文档后,我明白了
.L7:
.word 131586
.word .LANCHOR0
Run Code Online (Sandbox Code Playgroud)
分配 2 个内存位置,存储值 131586 和 , 处的值.LANCHOR0。这些内存位置是否彼此相邻?还有,是什么.LANCHR0意思?
下面一行
.L10:
.word .LANCHOR0
Run Code Online (Sandbox Code Playgroud)
指示汇编器分配 4 个字节来保存标签处代码/数据的地址.LANCHOR0。地址本身位于 label 处.L10。请注意, 和.LANCHOR0都是.L10普通的本地标签(后缀仅表示编译器将它们用于不同的目的)。
正如您所指出的,可以在程序集中混合代码和只读数据,例如
.L7:
.word 131586
.word .LANCHOR0
mov r2, #0
ldr r3, .L10
Run Code Online (Sandbox Code Playgroud)
编译器经常这样做来声明局部函数数据(文字池、静态变量等)。.word彼此相邻的行中的数据在目标代码中也将是连续的。