2023-12-23 09:54来源:m.sf1369.com作者:宇宇
恩,是这样的意思,ARM中的LDM/STM指令主要用于现场保护,数据复制,参数传送等。
在ARM中,ARM堆栈结构是从高向低压栈的,在初始的时候就像你理解的那样,sp是在高地址,然后按照高编号进行压栈操作。
ldm有相关伪指令,你可以参考下:
LDMFD SP!,{R0-R7,PC}^
对于这条指令,网上的伪代码解释是:
address = SP;
for i = 0 to 7
Ri = Memory[address ,4]
address = address + 4;
SP = address;
你这个是ARM7 CPU的指令码格式,早期的ARM架构,是ARMV4T,而且只是其数据处理类指令的指令编码格式(4位编码,配合这其余位,如I位,Rn,Rm,第二操作数等编码位,可以编码出很多条数据处理指令。)。所以说,并不是25-27位没有使用。在其它类型的指令中就有使用25-27,如图2.
图1 ARM7 CPU数据处理指令的编码格式。
图2 ARM7 CPU的单字节传输(LAD,STR)指令编码格式
具体请自己查找官方手册,在arm官网可以找到对应资料。
ARM 体系结构参考手册ARMv7-A和ARMv7-R版:DDI0406C_C_arm_architecture_reference_manual.pdf 的A5章节,193页起都是讲这个的。
LDR指令:将存储器地址为R1的字数据读入寄存器R0
STR指令:将寄存器R0中的字数据写入为以R1为地址的存储器中
(注意存储器和寄存器的区别)
下面是LDR指令的编码:
由此可以看到offset部分是占12位的。
学ARM汇编,建议去看英文资料Data Sheets,如ARM7TDMI.pdf。