指令&指令格式
31-28 | 27-20 | 19-16 | 15-12 | 11-0 |
---|---|---|---|---|
cond | opcode | Rn | Rd | Op2 |
<opcode> {<cond>} {s} <Rd>,<Rn>{,<operand2>}
例如:
ADDEQS R0,R1,#0x8;
备注: <>内的项是必须的,{}内的项是可选的
ARM指令分类
分类:
- 数据处理指令
- 数据加载/存储指令
- 分支(跳转)指令
- 程序状态寄存器指令
- 协处理器指令
- 异常产生指令
常见指令:
指令条件后缀
条件后缀影响指令是否执行,不影响指令内容和寄存器内容
编码 | 后缀助记符 | 标志位 | 定义 |
---|---|---|---|
0000 | EQ | Z=1 | 相等 |
0001 | NE | Z=0 | 不相等 |
0010 | CS | C=1 | 无符号大于或者等于 |
0011 | CC | C=0 | 无符号小于 |
0100 | MI | N=1 | 负值 |
0101 | PL | N=0 | 正值或0 |
0110 | VS | V=1 | 溢出 |
0111 | VC | V=0 | 无溢出 |
1000 | HI | C=1且Z=0 | 无符号大于 |
1001 | LS | C=0或Z=1 | 无符号小于或等于 |
1010 | GE | N和V相同 | 有符号大于或等于 |
1011 | LT | N和V不同 | 有符号小于 |
1100 | GT | Z=0且N等于V | 有符号大于 |
1101 | LE | Z=1或N不等于V | 有符号小于或等于 |
1110 | AL | 无条件 | 无条件 |
指令可选后缀
S
S:是否影响CPSR寄存器的值
例如:
R0 = 0x1 ,R3 = 0x3 ,CPSR = nzcvqIFt_SVC
SUB R1,R0,R3 ;R0的值减去R3的值,结果存入R1
SUBS R1,R0,R3 ;R0的值减去R3的值,结果存入R1,影响标识位
!
!: 是否影响基址寄存器的值
例如:
LDR R3,[R0,#4]
LDR R3,[R0,#4]!
寻址方式
- 立即数寻址
- MOV R1,#0x1
- 寄存器寻址
- MOV R1,R2
- 寄存器间接寻址
- LDR R1,[R2]
- 寄存器移位寻址
- MOV R0,R1,LSL,#1
- 基址变址寻址
- LDR R1,[R2,#4]
- 相对寻址
- BL sub_1234
- 多寄存器寻址
- LDMIA R0!,{R1-R4}
- LDMIA R0!,{R1-R4}
- 堆栈寻址
- STMFD R13!,{R0-R4}
数据加载/存储指令
LDR/STR
地址索引
- 前索引
- LDR R0,[R4,#0x4]
- R4+0x4的地址数据加载到R0,R4不变
- 后索引
- LDR R0,[R4],#0x4
- R4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
- 自动索引
- LDR R0,[R4,#0x4]!
- R4+0x4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
栈
- 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。
- 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。
- 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。
- 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。
寻址方式 | 说明 | POP | LDM | PUSH | STM |
---|---|---|---|---|---|
FA | 递增满 | LDMFA | LDMDA | STMFA | STMIB |
FD | 递减满 | LDMFD | LDMIA | STMFD | STMDB |
EA | 递增空 | LDMEA | LDMDB | STMEA | STMIA |
ED | 递减空 | LDMED | LDMIB | STMED | STMDA |