gcc - 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 是什么意思?
解决方案
以下行
.L10:
.word .LANCHOR0
指示汇编器分配 4 个字节来保存.LANCHOR0
标签处代码/数据的地址。地址本身位于 label .L10
。请注意,两者.LANCHOR0
都是.L10
普通的本地标签(后缀只是表示编译器将它们用于不同的目的)。
正如您所指出的,可以在汇编中混合代码和只读数据,例如
.L7:
.word 131586
.word .LANCHOR0
mov r2, #0
ldr r3, .L10
编译器经常这样做来声明本地函数数据(文字池、静态变量等)。来自.word
彼此相邻的行的数据在目标代码中也将是连续的。
推荐阅读
- bash - awk 和 bash 脚本?
- ios - Swift Playgrounds 在以不同速度运行时崩溃
- c++ - 输入文件问题:input_file.fail() 为真,不知道为什么
- angular - 如何为模板中动态生成的jspdf自动内容提供边框
- javascript - 如何通过与id比较来合并三个不同的数组?在角 6
- ionic-framework - 切换一个图标按钮会切换我分享帖子中的所有图标按钮
- react-native - 应用程序崩溃,如果 API 数据大小 500kb 并且在 react-native 中很大
- linux - 拉取新代码后创建本地目录以编辑代码
- python - 数字日期更改为字符串
- rust - 如何清除kiss3d中的场景?