STMFD相关汇编

 

加深对ARM汇编中对stmfd和ldmfd的理解

 

AREA STMFD,CODE,READONLY
ENTRY
CODE32
START
sub sp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc
mov r0,#0x1d ;将0x1d赋值给r0寄存器
mov r1,#0x1c ;将0x1c赋值给r1寄存器


stmfd sp!,{r0} ;将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d)
第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(fffffffa处放的是0x00),将第二十五位到第三十二位放入
sp+3的位置(fffffffb处放的是0x00).


str r1, [sp,#4] ;将r1中的值压入堆栈,压入过程是,由于r1中的值为32位的,将r0中的低八位放入sp+4(fffffffc处放的是0x1c)这个位置
第九位到第十六位放入sp+5的地址(fffffffd处放的是0x00),将第十七位到第二十四位放入sp+6的位置(fffffffe处放的是0x00),将第二十五位到第三十二位放入
sp+7的位置(ffffffff处放的是0x00).
.


ldmfd sp!,{r2,r3} ;将堆栈中的内容出栈,出栈过程是,将sp这个位置的值放入r2中的低八位,将sp+1这个位置的值放入r2中的第九
位到第十六位,将sp+2这个位置的值放入r2中的第十七位到第二十四位,将sp+3这个位置的值放入r2中的第二十
五位到第三十二位。(即r2中的值为0x0000001d)将sp+4这个位置的值放入r3中的低八位,将sp+5这个位置的值放入r3中的第九位到第十六位,将sp+6这个位置的值放入r3中的第十七位到第二十四位,将sp+4这个位置的值放入r3中的第二十
五位到第三十二位(即r2中的值为0x0000001c)。同时sp=sp+8

 

 

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

///================================================================================

 

一开始,看到 STMFD sp!{R0-R5,LR} 这条命令时真是有点疑惑。现根据自己的理解记录一下。供大家分享!

我们先要理解一下关于堆栈的相关概念.

1,满堆栈:即入栈后堆栈指针sp指向最后一个入栈的元素。也就是sp先减一(加一)再入栈。

2,空堆栈:即入栈后堆栈指针指向最后一个入栈元素的下一个元素。也就是先入栈sp再减一(或加一)。

1,递增堆栈:即堆栈一开始的地址是低地址,向高地址开始递增。就如同一个水杯(假设上面地址大)开口的是大地址,从杯底开始装水。自己画一画图就清楚了。我就偷懒一下不画了。

2,递减堆栈:即堆栈一开始的地址是高地址,向低地址开始递增。就如同还是刚才说的那个水杯,现在开口的是小地址,从大地址开始用,往下走,相当于杯子口朝下。我们用的时候是把水往上一点点压上去。呵呵呵,不过这样的杯子就失去了用途。但在内存上还是可以的。

当然有这些类型就可以构成4种不同的堆栈方式。

还有就是,我们要明确一点就是arm的栈一般我们用满堆栈、递减堆栈

下面说一下咱们的正题,STMFD sp!{R0-R5,LR}

STMFD 我解释一下 ST(store 存储) M(multiple 多次)F(full 满堆栈)D(decrease 递减堆栈) 合起来就是按满的递减的方式把后面的寄存器里的值都存到sp中。

STMFD sp!{R0-R5,LR} 就这条就是 把 lr r5-r0 依次存到sp中,并且sp会在存数据之前自动减一个数据的空间(别忘了arm是递减的哦)。至于最后一个问题,我想大家肯定还有一个疑惑就是sp后为什么有一个“!”。是这样的如果有 !号,表示在存入数据后sp会指向最后一个存入的数据的地址,否则sp会把自己的值加到一开始的地址。(就是sp在执行完这条指令之后sp指向的地址不变)

好了,下面说一个表,你就明白其他有关命令的用法了。

现在通过下表,可以轻松的解决这个问题:

寻址方式
说明
pop
=LDM
push
=STM
FA
递增满
LDMFA
LDMDA
STMFA
STMIB
FD
递减满
LDMFD
LDMIA
STMFD
STMDB
EA
递增空
LDMEA
LDMDB
STMEA
STMIA
ED
递减空
LDMED
LDMIB
STMED
STMDA

我觉着掌握汇编指令一方面是多用,还有就是我们把汇编指令的英文全称找到或自己按英文理解。这样可能会对你理解这条语句有帮助。

你可以把其他指令按我说的做一做。由于时间关系我就不一一列举

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值