繁体   English   中英

ARM程序集。 使用负偏移量存储和加载堆栈中的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM