1. 立即寻址
立即寻址也叫立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。立即数要求以 “#” 为前缀。
#0x1100
:表示十六进制数#0b1100
:表示二进制数#0d1100
:表示十进制数
示例:
ADD R0, R0, #1 ; R0 ← R0 + 1
ADD R0, R0, #0x3f ; R0 ← R0 + 0x3f
2. 寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
示例:
ADD R0, R1, R2 ; R0 ← R1 + R2
3. 寄存器间接寻址
操作数本身存放在存储器中,存储器的地址是寄存器中的值。
示例:
LDR R0, [R1] ; R0 ← [R1]
STR R0, [R1] ; [R1] ← R0
4. 基址加偏移寻址
将寄存器的内容与偏移量相加,得到一个操作数的地址,有以下几种模式:
前变址模式
LDR R0, [R1, #4] ; R0 ← [R1 + 4]
自动变址模式
LDR R0, [R1, #4]! ; R0 ← [R1 + 4],R1 ← R1 + 4
后变址模式
LDR R0, [R1], #4 ; R0 ← [R1],R1 ← R1 + 4
基址加偏移寻址操作数的其它形式
LDR R0, [R1, #4] ; R0 ← [R1 + 4]
LDR R0, [R1, R2] ; R0 ← mem32[R1 + R2]
LDR R0, [R1, R2, LSL #2] ; R0 ← [R1 + R2 * 4] 注:先乘4再加R1
5. 堆栈寻址
满递增
STMFA SP!, {R0 - R7, LR}
空递增(Thumb - 2)
STMEA SP!, {R0 - R7, LR}
满递减(Thumb - 2)
STMFD SP!, {R0 - R7, LR}
空递减
STMED SP!, {R0 - R7, LR}
6. 块寻址
块寻址是多寄存器传送指令 LDM/STM 的寻址方式,可以将存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器的内容保存到存储器中。寻址中的寄存器是 R0 - R15 的子集。LDM/STM 指令的后缀名可以为:IA (Thumb - 2)、IB、DA、DB (Thumb - 2)。
示例:
LDMIA R5!, {R0 - R4}
LDMDB R5!, {R0 - R4}
7. 相对寻址
相对寻址是基地址为 PC 的变址寻址。
示例:
BL SUBR ; 转移到SUBR
; 返回到此
SUBR ; 子程序入口
MOV PC, R14 ; 返回