汇编指令ldr str stm ldm

ldr命令:把数据从内存加载到寄存器

ldr r0, =addr	;r0 = addr
ldr r1, [r0]		; r1 = *r0
ldr r1, [r0, #4]	; r1 = *(r0+4)
ldr r1, [r0, #4] !	; r1 = *(r0+4);r0=r0+4;
ldr r1, [r0], #4	; r1 = *(r0);r0=r0+4;

str命令:把数据从寄存器保存到内存

str r1, [r0]		; *r0 = r1 
str r1, [r0, #4]	; *(r0+4) = r1 
str r1, [r0, #4] !	; *(r0+4) = r1;r0=r0+4;
str r1, [r0], #4	; *r0 = r1;r0=r0+4;

**多数据传输指令:stm ldm **
ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的Load和Store指令分为2组:一组用于数据的存储与读取,对应于IA、IB、DA、DB,一组用于堆栈操作,对应于FD、ED、FA、EA,两组中对应的指令含义相同。
即:

STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);
STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);
STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);
STMDA(完成操作而后地址递减)、STMED(空递减堆栈)。
上述各组2个指令含义相同只是适用场合不同,同理有:
LDMIB、LDMED;
LDMIA、LDMFD;
LDMDB、LDMEA;
LDMDA、LDMFA。

IA模式表示:每次传送后地址+4;(After Increase)
DB模式表示:每次传送前地址-4;(Before Decrease)
多寄存器加载/存储指令共有8种模式(4个用与数据块的传输,4个用于栈操作)

举例
指令:stmdb sp!,{r0-r12,lr}
含义:sp = sp - 4,先压lr,sp = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,sp = r12。sp = sp - 4,再压r11,sp = r11…sp = sp - 4,最后压r0,sp = r0。

如果想要将r0-r12和lr弹出,可以用ldmia指令:
指令:ldmia sp!,{r0-r12,lr}

你可能感兴趣的:(错误合集)