ARM程序集中的偏移量是多少?它是如何工作的



我正在学习ARM汇编语言。我所做的就是用c编写一个程序,然后编译它来查看Assembly文件。下面是一个程序的编译片段,它有这个ldr r0, [pc, #28]。在这里,我需要帮助来理解这台电脑。我知道它的意思是程序计数器,但我不理解指令的实际用途。

1000037c&ltman&gt:1000037c:b570推{r4,r5,r6,lr}。。10000388:f000 f812 bl 100003b01000038c:4807 ldr r0,[pc,#28]1000038e:626c str r4,[r5,#36]。.

在C程序中,它可能是一个整数(>256(,我不完全理解这个概念。提前谢谢。

您看到的是一条预索引加载指令,使用pc寄存器的值作为基址。

任何时候您的代码都需要加载一个";"大";立即值到寄存器中,您可能会在它下面的某个位置看到类似的内容和数据声明。您还没有在代码段中显示它,但在程序集中向下滚动一点,您可能还会看到类似以下内容:

.word 0x12345678

甚至可能是标签的值

_some_label: ...
...
.word _some_label

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

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

这个问题也是一个很好的参考,我强烈建议你去看看。

最新更新