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