繁体   English   中英

ARM 组件中的偏移量是多少? 它是如何工作的?

[英]What is offset in ARM Assembly? How does it work?

我正在学习 ARM 汇编语言。 我所做的是在 c 中编写一个程序并编译它以查看程序集文件。 下面是这样一个程序的编译片段,它有这个ldr r0, [pc, #28] 在这里,我需要帮助来理解这个 PC 的东西。 我知道这意味着程序计数器,但我无法理解指令的实际目的。

1000037c &ltmain>:
1000037c:    b570         push  {r4, r5, r6, lr}
.
.
10000388:    f000 f812    bl    100003b0
1000038c:    4807         ldr   r0, [pc, #28]
1000038e:    626c         str   r4, [r5, #36]
.
.

在 C 程序中,它一定是 integer (>256) 也许,我不完全理解这个概念。 提前致谢。

您正在查看的是预索引加载指令,使用pc寄存器的值作为基地址。

每当您的代码需要将“大”立即值加载到寄存器中时,您可能会在其下方某处看到类似的数据声明。 您尚未在代码段中显示它,但在程序集中向下滚动一点,您可能会看到如下内容:

.word 0x12345678

甚至可能是 label 的值

_some_label: ...
...
.word _some_label

只要 memory 中的.word值与pc当前执行的位置足够接近,就可以使用相对偏移量加载数据。 在您的示例中,应该有一个数据字位于该加载指令所在的偏移量 32 处(根据 ARM ISA 为 PC 相对寻址添加 8)。

通常,当您手动编写汇编时,这种加载立即值的方法可能会很棘手(因为您需要跟踪放置指令的确切相对偏移量),但编译器可以非常可靠地做到这一点,这就是为什么您经常在编译器生成的程序集中看到这一点。

这个问题也可以作为一个很好的参考,我强烈建议你检查一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM