立即寻址
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 处。