ARM架构中普通LDR指令是否可从内存栈区域加载数据?
答案
当然可以。
ARM架构中的栈本质就是普通的可寻址内存区域,只是SP(栈指针)寄存器被约定用来指向栈的当前栈顶位置,普通LDR加载指令本身没有对内存地址的来源做任何限制:只要传入的地址是合法的、属于当前进程可访问的内存范围,不管该地址属于栈区、全局数据区还是堆区,LDR都可以正常读取对应位置存储的数据。
你给出的示例指令逻辑完全符合ARM指令规范:
sub r3,sp,4 ldr r1, [r3]
第一条指令通过栈指针计算得到栈顶向下偏移4字节的地址(属于栈地址范围)存入r3,第二条指令就可以正常把该地址处存储的32位数据加载到r1寄存器,这也是ARM程序中读取栈上局部变量的常用实现方式。
唯一需要注意的是访问的栈地址不能超出当前程序分配的栈空间范围,否则会触发内存访问异常。
内容的提问来源于stack exchange,提问作者hany erfan
相关产品推荐
相关产品推荐

