我对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
do?此处.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
是什么意思?
1条答案
按热度按时间r3i60tvu1#
下面一行
指示汇编器分配4个字节来保存
.LANCHOR0
标签处的代码/数据地址。地址本身位于标签.L10
处。注意.LANCHOR0
和.L10
都是普通的本地标签(后缀只是表示编译器将它们用于不同的目的)。正如您所提到的,可以在程序集中混合代码和只读数据,例如
编译器经常这样做来声明局部函数数据(文本池、静态变量等)。来自
.word
行的数据在目标代码中也是连续的。