ARM指令中STM和LDM的理解误区

28 篇文章 0 订阅

STM和LDM的主要用途是现场保护、数据复制、参数传递等。

其模式有8种,如下:(前面4种用于数据块的传输,后面4种用于堆栈操作)

(1)IA  每次传送后地址加4

(2)IB  每次传送前地址加4

(3)DA  每次传送后地址减4

(4)DB  每次传送前地址减4


(5)FD  满递减堆栈

(6)FA  满递增堆栈

(7)ED  空递减堆栈

(8)EA  空递增堆栈

   下面的讲述对于空递减堆栈和空递增堆栈同样适用.

   在堆栈操作时,经常错误以为使用STMFD满递减将寄存器压入堆栈后,在弹出数据的时候应该使用LDMFA。

但是FD和FA仅用于指示目前操作的堆栈是何种模式(堆栈共有四种模式),FD指明目前的堆栈是满递减堆栈,

则数据入栈时的指令为STMFD,那么数据出栈时的指令对应的为LDMFD,而不是LDMFA。

   我们可以这样认为STMFD等价于STMDB,LDMFD等价于STMIA

   那么,数据传输的顺序和数据入栈的顺序又是如何呢

   先来看STMFD SP!,{R1-R3}  执行的结果图(操作之后SP指向SP')

                 SP------->

                           |R3|

                           |R2|

                 SP'------>|R1|

那么STMFD SP!,{R3,R2,R1}执行后的堆栈顺序是不是刚好和上面的堆栈顺序相反,实际情况时这两个指令执行后的堆栈数据顺序一样,因为ARM编译器会自动将STMFD SP!,{R3,R2,R1}转换为STMFD SP!,{R0-R3}指令,也就是说,ARM编译器默认高寄存器优先存入堆栈。即便你在指令STMFD SP!,{R3,R2,R1}中刻意“安排”了寄存器入栈顺序,而在编译时编译器又重新做了处理,打乱了你期望的数据入栈顺序。

   同理STMDB R0!,{R1-R3}和STMDB R0!,{R3,R2,R1}指令执行后数据在堆栈中的顺序完全一致。

   STMFD SP!,{R1-R3}指令对应的出栈指令是LDMFD SP!,{R1-R3}(R1,R2,R3的顺序任意)


****************************************************************************************************************


STMFD SP!,{R0-R7,LR} 的伪代码如下
SP = SP - 9×4;
address = SP; 
for i = 0 to 7
Memory[address] = Ri;
address  = address + 4;
Memory[address] = LR;
注意:ARM规定,sp始终是指向栈顶位置的,STM指令把寄存器列表中索引最小的寄存器存在最低地址,所以R0在最低地址,向上依次是R1,R2,...R7,LR。完成后SP指向保存R0的地址。
详解:对于大多数的设计来说都是把栈底设置在高地址栈顶设置在低地址,即是说上面所说的首先要sp=sp-9×4,这里理解了之后就好理解了,那么执行这条指令后,栈中的数据顺序从栈底到栈顶为lr ,r7,r6,r5,r4,r3,r2,r1,r0,此时sp-->r0,即栈顶,这和堆栈的定义没有冲突,如果sp指向的是lr的话栈就没有用了哦,其实这里stmfd有两种方法处理的,第一种先计算总共压入的数据个数,直接一次更改指针sp=sp-4*(number)并从低地址向高地址存入数据,第二种就是每压入一次就把sp=sp-1*4,同时一个一个的把数据从高地址向低地址压入。

                              
****************************************************************************************************************

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值