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

来源:本站
导读:目前正在解读《ARM指令中STM和LDM的理解误区》的相关信息,《ARM指令中STM和LDM的理解误区》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ARM指令中STM和LDM的理解误区》的详细说明。
简介:本文给大家介绍了ARM指令中STM和LDM的理解误区。

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的顺序任意)

提醒:《ARM指令中STM和LDM的理解误区》最后刷新时间 2024-03-14 00:57:53,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ARM指令中STM和LDM的理解误区》该内容的真实性请自行鉴别。