如何寻址堆栈上不在其顶部的元素?我说的是例如首先执行
stmfd sp!, {r0-r12}
,然后执行 push {lr}
。 现在我想使用 stmfd 命令的存储位置的首地址,因此我需要从 sp 中减去 112 个字节。我正在尝试编写一个中断处理程序包装函数来调用 C 函数。
我阅读了有关 ARM 汇编的教程,但没有找到我需要的内容。
事实上,要对存储在堆栈上的数据进行操作,您需要 SP 相对寻址。 ARM 汇编提供了与此相关的指令。
例如,具有 SP 相对寻址的
ldr
指令如下所示:
ldr r0, [sp, #imm]
现在,需要注意的重要一点是,根据ARM的数据表,“寄存器按数字顺序存储在堆栈中,编号最小的寄存器位于最低地址”。这意味着将寄存器范围压入堆栈后,
sp
将指向编号最小的寄存器。
看简化的示例代码:
movs r1, #0xab
push {r0-r2}
ldr r0, [sp, 4]
代码执行后,您将在
r0
指向的地址处找到sp
的内容。要访问 r1
,随着堆栈的增长,您必须添加 4(或 8,具体取决于 CPU 的架构)。
还要记住,位不是字节。寻址时使用字节,因此对于 32 位长寄存器,您使用 4,对于 64 位长寄存器,您使用 8,等等。