我对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
提前致谢。
UPDATE
在阅读了ARM文档之后,我明白了
.L7:
.word 131586
.word .LANCHOR0
在那里分配2个存储位置,存储值131586和值.LANCHOR0。这些内存位置是否彼此相邻?另外,.LANCHR0是什么意思?
以下行
.L10:
.word .LANCHOR0
指示汇编程序分配4个字节来保存.LANCHOR0
标签上的代码/数据地址。地址本身位于标签.L10
。请注意,.LANCHOR0
和.L10
都是普通的本地标签(后缀只是表示编译器将它们用于不同的目的)。
正如您所指出的那样,可以在汇编中混合代码和只读数据,例如,在
.L7:
.word 131586
.word .LANCHOR0
mov r2, #0
ldr r3, .L10
编译器经常这样做来声明本地函数数据(文字池,静态变量等)。来自.word
线的数据彼此相邻也将在目标代码中连续。