assembly - ARM 汇编中的偏移量是什么?它是如何工作的?
问题描述
我正在学习 ARM 汇编语言。我所做的是用c编写一个程序并编译它以查看Assembly文件。下面是这样一个程序的编译片段,它有这个ldr r0, [pc, #28]
. 在这里,我需要帮助来理解这个 PC 的东西。我知道这意味着程序计数器,但我无法理解指令的实际目的。
1000037c <主>: 1000037c: b570 推 {r4, r5, r6, lr} . . 10000388: f000 f812 bl 100003b0 1000038c:4807 ldr r0,[pc,#28] 1000038e:626c str r4,[r5,#36] . .
在C程序中,它一定是一个整数(> 256),我不完全理解这个概念。提前致谢。
解决方案
您正在查看的是预索引加载指令,使用pc
寄存器的值作为基地址。
每当您的代码需要将“大”立即值加载到寄存器中时,您可能会在其下方某处看到类似的数据声明。您尚未在代码段中显示它,但在程序集中向下滚动一点,您可能会看到如下内容:
.word 0x12345678
甚至可能是标签的值
_some_label: ...
...
.word _some_label
只要.word
内存中的值与当前执行的位置足够接近pc
,您就可以使用相对偏移量加载数据。在您的示例中,应该有一个数据字位于该加载指令所在的偏移量 32 处(根据 ARM ISA 为 PC 相对寻址添加 8)。
通常,当您手动编写汇编时,这种加载立即值的方法可能会很棘手(因为您需要跟踪放置指令的确切相对偏移量),但编译器可以非常可靠地做到这一点,这就是为什么您经常在编译器生成的程序集中看到这一点。
这个问题也可以作为一个很好的参考,我强烈建议你检查一下。
推荐阅读
- python - 如何使用增强设置训练,但确保未增强的实际图像也得到训练?
- ssl - 以二进制模式与 Spark Thrift 服务器的通信是否安全传输?
- options - 如何更改 pyomo 中的 couenne 求解器选项?
- android - 模拟器:意外的功能列表:MultiDisplay VulkanNullOptionalStrings YUV420888toNV21 YUVCache
- qt - Qt QML新项目创建错误(只能看到“.pro”文件)
- node.js - 提升使用 child_process.fork() 创建的 NodeJS ChildProcess
- ios - 如何在 OpenGLES 2.0 中使视口背景颜色清晰
- html - 在 CSS flexbox 的粘性页眉和页脚内仅滚动子标题下的中间内容
- python - SQLALchemy 增加了显着的过载。SQLAlchemy 对象没有属性'dateTime
- c++ - 对齐/偏移结构的特定成员