ARM汇编指令ldmia.w sp, {r1, r2}与ldmia.w sp!, {r1, r2}的区别
ARM ldmia.w 指令两种变体的行为说明
ldmia是ARM架构的多寄存器加载指令,完整语义为「从指定基地址开始读取内存,每读取一个32位数据(32位运行模式下)后地址自增4,依次加载到指令中指定的寄存器列表」。后缀.w是Thumb-2指令集下的宽指令标识,不影响核心执行逻辑。
两种变体的差异仅在于是否触发基址寄存器写回:
- 带
!后缀的ldmia.w sp!, {r1, r2}!是基址写回标识,指令执行完成后,会把加载结束的地址回写到基址寄存器sp中。32位模式下加载2个寄存器共读取8字节,因此sp值会增加8,和pop {r1, r2}的执行效果完全一致,属于同义写法。 - 不带
!后缀的ldmia.w sp, {r1, r2}
无写回逻辑,执行时仅以sp当前存储的值作为起始地址读取内存,将前4字节加载到r1、后4字节加载到r2,sp的值在指令执行前后不会发生任何变化。你提到的两种猜测本质上是统一的:sp本身存储的就是栈顶地址,以该地址读取栈数据且不修改sp,就是典型的「读取栈顶元素但不弹出」的操作,这种写法通常用于需要多次访问栈上存储的参数/临时值、又不想破坏栈指针平衡的场景。
内容的提问来源于stack exchange,提问作者hany erfan
相关产品推荐
相关产品推荐

