ARM汇编:如何寻址栈中非栈顶元素(中断包装函数场景)
ARM汇编中非栈顶栈元素的寻址方法
在ARM汇编里,要访问栈中不是栈顶的元素,直接通过栈指针(SP)加上或减去固定偏移量来直接寻址就行——栈是连续的内存区域,只要算准目标元素相对于当前SP的偏移,就能用ldr/str这类内存访问指令直接操作。
结合你写中断处理包装函数的场景来说:
你先后执行了stmfd sp!, {r0-r12}和push {lr}两条压栈指令,现在要访问stmfd存储区域的首个元素,已经算出需要SP减去112字节,直接这么写就行:
; 读取目标位置的内容到某个寄存器,比如r0 ldr r0, [sp, #-112] ; 如果要往目标位置写入内容,比如把r1的值写进去 str r1, [sp, #-112]
关键注意点
- 偏移计算要准确:
- 先明确当前ARM架构的栈类型(中断场景一般用满递减栈
FD) - 统计压栈的寄存器总数和单个寄存器的字节数(ARM32是4字节/寄存器,ARM64是8字节)
- 注意
stmfd/push的压栈顺序:stmfd sp!, {r0-r12}会按寄存器编号从高到低的顺序压栈(也就是先存r12,再存r11…最后存r0),计算偏移时要对应好目标寄存器的位置。
- 先明确当前ARM架构的栈类型(中断场景一般用满递减栈
- 中断场景的栈对齐:
有些ARM架构要求中断栈必须满足特定对齐规则(比如ARMv7要求8字节对齐,ARMv8要求16字节对齐),计算偏移时别忘了把对齐的额外空间算进去,避免访问出错。
内容的提问来源于stack exchange,提问作者user25858014
相关产品推荐
相关产品推荐

