(ARM汇编)如何相对于sp来寻址堆栈上的元素

问题描述 投票:0回答:1

如何寻址堆栈上不在其顶部的元素?我说的是例如首先执行

stmfd sp!, {r0-r12}
,然后执行
push {lr}
。 现在我想使用 stmfd 命令的存储位置的首地址,因此我需要从 sp 中减去 112 个字节。我正在尝试编写一个中断处理程序包装函数来调用 C 函数。

我阅读了有关 ARM 汇编的教程,但没有找到我需要的内容。

assembly arm interrupt stack-memory stack-pointer
1个回答
0
投票

事实上,要对存储在堆栈上的数据进行操作,您需要 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,等等。

© www.soinside.com 2019 - 2024. All rights reserved.