gcc arm assembly :..兰乔0

owfi6suc  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(210)

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

r3i60tvu

r3i60tvu1#

下面一行

.L10:
  .word   .LANCHOR0

指示汇编器分配4个字节来保存.LANCHOR0标签处的代码/数据地址。地址本身位于标签.L10处。注意.LANCHOR0.L10都是普通的本地标签(后缀只是表示编译器将它们用于不同的目的)。
正如您所提到的,可以在程序集中混合代码和只读数据,例如

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

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

相关问题