您的位置 首页 IOT

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

STM和LDM的主要用途是现场保护、数据复制、参数传递等,其模式有8种,如下:注:前面4种用于数据块的传输,后面4种用于堆栈操作(1)IA

STMLDM的主要用途是现场维护、数据仿制、参数传递等,其形式有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的次序恣意)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/261567.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部