LDMFD和STMFD个人理解

ARM里面的堆栈是满递减(FULL DESCENDING)的。SP指向最后一个入栈的数据,SP的地址由高向低生长。对于LDM和STM指令来说,编号小的寄存器对应堆栈中的低地址。


STMFD的寻址方式是事先递减方式(Decrease Before)。内存地址可以用下面的式子表示:

start_address=SP-(Number of register *4)

end_address=SP-4

举例来说:STMFD SP!,{R1-R7,LR}  //SP=0x48000060

入栈后各寄存器存放的地址如下图所示:

 

SP后面的!表示SP=SP-(Number of registers *4),在这里入栈后SP指向R1寄存器入栈的地址。

 

LDMFD的寻址方式是事后递增方式(Increase After)。内存地址可以用下面的式子表示:

start_address=SP

end_address=SP+(number of registers*4)-4

举例来说:LDMFD SP!,{R1-R7,LR}  //紧跟上例,SP=0x48000040

根据编号小的寄存器对应低地址的原则,0x48000040地址处的值出栈给R1寄存器,0x48000044地址处的值出栈赋给R2寄存器,依次类推。正好与STMFD一一对应。

SP后面的!表示要更新SP的值。SP=SP+(number of registers*4)。

 

 

 

转载于:https://www.cnblogs.com/zuji0203/p/3601194.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值