[英]ARM assembly. Is it safe to use r13 (stack pointer) as a general purpose register?
[英]ARM assembly. Storing and loading data from stack with negative offset
我们可以使用负地址偏移量来存储和加载堆栈中的数据,如下面的代码片段所示吗? 从堆栈边界外部( [sp, #-16]
或[sp, #-20]
)的内存地址写入和读取数据是否安全? 谢谢!
stmdb sp, { r4 - r6 }
mov r4, #255
str r4, [sp, #-16]
mov r3, #127
str r3, [sp, #-20]
ldr r4, [sp, #-20]
sub sp, #12
ldmia sp, { r4 - r6 }
这是ABI的问题,而不是架构或语言,所以最终它取决于运行环境和有效的ABI。
虽然您可以访问SP以下的地址,但是基本寄存器r13和负偏移的加载或存储是完全有效的指令,只有ABI指示您的数据是否安全,以及是否这样的访问保证不会首先出现段错误。 当前使用的大多数系统可能正在使用ARM EABI的一些变体,其程序调用标准称,作为“通用堆栈约束”的一部分:
进程只能访问(用于读取或写入)由[SP,stack-base-1]分隔的整个堆栈的闭合间隔(其中SP是寄存器r13的值)。
即虽然没有什么能够真正阻止你违反这一限制,但试试吧,所有的赌注都会被取消。
既然你提到了Android,它肯定是EABI(特别是GNU变体),那么最明显的问题就是Linux内核提供信号的方式。 如果您的进程恰好在str r3, [sp, #-20]
之后立即发出信号,则信号处理程序可以使用进程堆栈运行,因此当(if)正常执行恢复时,SP本身将返回相同的值之前,谁知道ldr r4, [sp, #-20]
实际上会加载什么。
请注意, 某些环境可能会对堆栈指针下方的内容提供某些额外的保证,如果您处于裸机场景或完全控制,那么您可以做任何您喜欢的事情,但通常情况下,除非您不知道然后假设答案是“不”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.