工控网首页
>

应用设计

>

ARM中的STM和LDM指令

ARM中的STM和LDM指令

2016/3/25 14:14:53

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指令 STMFD Rn{!},{reglist}{^} STMFD SP!,{R0-R7,LR} 对于这条指令伪代码的解释,个人理解如下: sp = address; sp = sp - 4; Memory[address] = LR; for( i=7;i>0;i--) { sp = sp-4; Memory[address] = Ri; } 由于ARM堆栈结构是从高向低压栈的,此时SP即是栈顶。 这里的sp = sp-4,是因为处理器是32位的ARM,所以每次压一次栈SP就会移动4个字节(32位)。 假设此时SP地址为: 0x40000460,由前面解释伪代码可得下图(蓝色填充区为地址): 蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。 LDMFD 指令 LDMFD Rn{!},{reglist}{^} 这条指令的意思是以Rn为基址(起始地址),取值写入寄存器列表。 LDMFD SP!,{R0-R7,PC}^ 对于这条指令,网上的伪代码解释是: address = SP; for i = 0 to 7 Ri = Memory[address ,4] address = address + 4; SP = address; 个人理解与之相同。。 假设此时SP地址为: 0x4000043C,由前面解释伪代码可得下图(蓝色填充区为地址): 蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址。

投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机