ARM 汇编:.LANCHOR0

S. *_*ion 5 assembly gcc arm

我对 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意思?

yug*_*ugr 5

下面一行

.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彼此相邻的行中的数据在目标代码中也将是连续的。