8种寻址方式
寄存器寻址 mov r1,r2
立即寻址 mov r#0xFF00
寄存器移位寻址 mov r0,r1,lsl #3
寄存器间接寻址 ldr r1,[r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址 ldmia r1!,{r2-r7,r12}
堆栈寻址 stmfd sp!,(r2-r7,lr)
相对地址 flag:beq flag
指令后缀
B(byte) 功能不变,操作长度变为8位
H(half word) 功能不变,操作长度变为16位
S(signed) 功能不变,操作长度变为有符号
如ldr、ldrb、drh、ldrsb、
S(S标志) 功能不变,影响CPSR标志位
如mov和movs
条件执行后缀
mov r0,r1 0 相当于C语言当中的r0=r1
moveq r0,r1 0 如果eq后缀成立,则直接执行mov r0,r1;如果eq不成立,相当于没有
0 类似于 C语言当中的if(eq){r0=r1}
多级指令流水线
cpsr
:程序状态寄存器,整个CPU只有一个;而SPSR有5个,分别在五种异常模式下,作用是当普通模式进入异常模式
时,用来保存之前普通模式的CPSR的,以在返回普通模式是复原原来的CPSR.
跳转指令
b 直接跳转
bl 跳转前将返回地址保存到lr寄存器,一般用于子程序调用
bx 跳转同时切换到ARM模式,一般用于异常处理的跳转
访存指令
单个字/半字/字节访问ldr/str
多字节访问 ldm/stm
8中后缀
ia (increase after) 先传输,再地址加4
ib (increase before) 先地址加4,再传输
da (dacrease after) 先传输,再地址减4
db (decrease before) 先地址减4,再传输
gun汇编中的一些符号
@用来作注释,可以在行首也可以在代码后面同一行直接跟,和C语言中//类似
#做注释,一般放在行首,表示这一行都是注释而不是代码
:以冒号结尾的是标号
.点号在gun汇编中表示当前指令的地址
#立即数前面要加#或$
常见的gun伪指令
.global_start @给_start外部链接属性
.section.text @指定当前段为代码段
.ascii.byte.short.long.word
.quad.float.string @定义数据
.align 4 @以16字节对齐 2^4
.balignl 16,0xabcdefgh @对齐+(位)填充
.equ @类似于C中宏定义
.end @文件结束
.arm/.code 32 @声明以下为arm指令
.thumb/code 16 @声明以下为thumbm指令
最重要的伪指令
ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
ARM中有一个ldr指令,还有一个ldr的伪指令
adr和ldr的差别,ldr加载的地址在链接时确定,而adr加载的地址在运行时确定,所以可以通过adr和ldr加
载的地址来判断程序是否在链接时指定的地址执行