ARM程序集:.LANCHOR0

问题描述 投票:2回答:1

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

gcc assembly arm
1个回答
2
投票

以下行

.L10:
  .word   .LANCHOR0

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.