立即寻址

mov r0, #1234

相当于:r0=#1234。

#开头,表示16进制时,以0x开头,如#0x1f。

寄存器寻址

mov r0, r1

执行后,r0 = r1。
NOP 操作通常为 mov r0, r0,对应的HEX为00 00 a0 e1

寄存器移位寻址

寄存器移位寻址支持以下5种移位操作:

LSL:逻辑左移,移位后寄存器空出的低位补0;
LSR:逻辑右移,移位后寄存器空出的高位补0;
ASR:算数右移,移位过程中,符号位保存不变,如果源操作数为正数,则移位后空出的高位补0,否则补1。
ROR:循环右移,移位后,移出的低位,填入移位空出的高位。
RRX:带扩展的循环右移,操作数右移一位,移位空出的高位,用C标志的值填充。

mov r0, r1, lsl #2

相当于:r0 = r1<<2 = r1*4。

寄存器间接寻址

ldr r0, [r1] // 取值

相当于:r0 = *r1。

基址寻址

ldr r0, [r1, #-4]

相当于:r0 = *(r1 - 4)。

多寄存器寻址

lmdia r0, {r1, r2, r3, r4}

LDM 是数据加载指令,指令的后缀IA表示,每次执行完成加载操作后,R0寄存器的值自增1个字。
R1=[R0], R2=[R0+#4], R3=[R0+#8], R4=[R0+#12]
字表示一个32位的数值。

堆栈寻址

它需要特定的指令完成:
LMDFA/STMFA, LDMEA/STMEA, LDMFD/SDMFD, LDMED/STMED。
LMD/STM 表示多寄存器寻址,一次可以传送多个寄存器值。
FA/EA/FD/ED ..参考指令集。

stmfd sp!, {r1-r7, lr} @将 r1~r7, lr 压栈 多用于保存子程序现场。
ldmfd sp!, {r1~r7, lr} @将 r1~r7, lr 出栈,放入 r1~r7, lr 多用于恢复子程序现场。

块拷贝寻址

可实现连续地址数据从存储器的某一位置拷贝至另一位置。
LDMIA/STMIA, LDMDA/STMDA, LDMIB/STMIB, LDMDB/STMDB。
LDM/SDM 表示多寄存器寻址,一次可以传送多个寄存器值。
IA, DA, IB, DB ..参考指令集。

ldmia r0!, {r1-r3} @ 从r0指向的区域的值取出来,放到r1-r3中
stmia r0!, {r1-r3} @ 将r1-r3的值取出来,放入r0指向的区域

相对寻址

相对寻址以PC的当前值为基址,与偏移值相加,得到最终的地址。

bl .lc0
    ...
.lc0:
    ...

bl 直接跳到 .lc0 处。