首页 > 解决方案 > ARM 组件:.LANCHOR0

问题描述

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

标签: gccassemblyarm

解决方案


以下行

.L10:
  .word   .LANCHOR0

指示汇编器分配 4 个字节来保存.LANCHOR0标签处代码/数据的地址。地址本身位于 label .L10。请注意,两者.LANCHOR0都是.L10普通的本地标签(后缀只是表示编译器将它们用于不同的目的)。

正如您所指出的,可以在汇编中混合代码和只读数据,例如

.L7:
  .word   131586
  .word   .LANCHOR0
  mov     r2, #0
  ldr     r3, .L10

编译器经常这样做来声明本地函数数据(文字池、静态变量等)。来自.word彼此相邻的行的数据在目标代码中也将是连续的。


推荐阅读