【问题标题】:ARM assembly : .LANCHOR0ARM 组件:.LANCHOR0
【发布时间】:2019-08-21 08:34:21
【问题描述】:

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

【问题讨论】:

  • 这里没有.word前面的标签。你没看到上一行的.L10:吗?无论如何,寻找 GCC 将.LANCHOR0: 标签放在哪里:IIRC,它使用它作为引用多个静态数据项的公共参考点。 (从代码附近的文字池中加载.LANCHOR0 地址后。)
  • 了解汇编语言是由工具而非架构定义的。它可能类似于针对 arm 工具的汇编语言的 arm 文档,但语言不必符合,尤其是在数据项的声明方式方面。
  • .LANCHOR0 可能只是一些编译器生成的标签。
  • Godbolt.. 您可能想使用那里的设置来获得更详细的列表,您可能会看到这个 .LANCHOR0 是什么。
  • 是的,在 Godbolt 中,您可以从 .text 选项卡中删除勾号,您会在列表中的某处看到 .set .LANCHOR0,. + 0 行。如果您还没有阅读“部分锚点”,请阅读this

标签: gcc assembly arm


【解决方案1】:

下面一行

.L10:
  .word   .LANCHOR0

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多