指令集介绍
ARM是三地址指令格式:
1. <opcode> {<cond>} {s} <Rd> , <Rn> {,operand2}
<>内是必须的, {}是可选的。
opcode :指令助记符;cond:执行条件;
S:是否影响CPSR寄存器的值
Rd:目标寄存器;Rn:第一个操作数寄存器:operand2:第二个操作数
2.条件码
cond:可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率
如不标明条件代码,将默认认为无条件(AL)执行。
指令条件码表:
操作码 | 条件助记符 | 标志 | 含义 |
0000 | EQ | Z=1 | 相等 |
0001 | NE | Z=0 | 不相等 |
0010 | CS/HS | C=1 | 无符号数大于或等于 |
0011 | CC/LO | C=0 | 无符号数小于 |
0100 | MI | N=1 | 负数 |
0101 | PL | N=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 | 任何 | 无条件执行 (指令默认条件) |
1111 | NV | 任何 | 从不执行(不要使用) |
例如:
if(a>b)
a+=2;
else
b+=3;
对于的ARM汇编:
CMP R0,R1
ADDHI R0,R0,#2
ADDLS R1,R1,#3
2.存储器访问指令
ARM处理器是典型的RISC处理器。对存储器的访问只能使用加载和存储指令实现。
ARM处理器是冯诺依曼存储结构,RAM,I/O、程序数据的访问都要通过加载和存储指令。
2.1 分类:
a 单存储操作指令
助记符 | 说明 | 操作 | 条件码位置 |
LDR Rd,addressing | 加载字数据 | Rd←[addressing],addressing索引 | LDR{cond} |
LDRB Rd,addressing | 加载无符号字节数据 | Rd←[addressing],addressing索引 | LDR{cond}B |
LDRT Rd,addressing | 以用户模式加载字数据 | Rd←[addressing],addressing索引 | LDR{cond}T |
LDRBT Rd, addressing | 以用户模式加载无符号字节数据 | Rd←[addressing],addressing索引 | LDR{cond}BT |
LDRH Rd, addressing | 加载无符号半字数据 | Rd←[addressing],addressing索引 | LDR{cond}H |
LDRSB Rd, addressing | 加载有符号字节数据 | Rd←[addressing],addressing索引 | LDR{cond}SB |
LDRSH Rd, addressing | 加载有符号半字数据 | Rd←[addressing],addressing索引 | LDR{cond}SH |
例:
LDR R1,[R0,#0x12]
LDR R1,[R0,R2]
LDR R1,[R0,-R2]
LDR R1,[R0,R2,LSL #2]
从寻址方式的地址计算方法分,加载/存储指令有以下4中格式:
1.零偏移。 LDR Rd,[Rn]
2.前索引偏移 LDR Rd,[Rn,#0x04]!
3,程序相对偏移 LDR Rd,label
4,后索引偏移 LDR Rd,[Rn],#-0x04
示例:
LDR R2,[R5];将R5指向地址的字数据存入R2
LDRB R3,[R2],#-1;R2指向的直接数据存入R3,R2-=1;
STRH R1,[R0,#2]!; 将R1的半字数据保存到R0+2地址;值修改低2字节数据,然后R0=R0+2
b.多存储操作指令
助记符 | 说明 | 操作 | 条件码位置 |
LDM{mode} Rn{!},reglist | 多寄存器加载 | reglist←[Rn...],Rn回写等 | LDM{cond} {mode} |
STM{mode} Rn{!},reglist | 多寄存器存储 | [Rn...]←reglist,Rn回写等 | STM{cond} {mode} |
多寄存器加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。
模式 | 说明 | 模式 | 说明 |
IA | 每次传送后地址加4 | FD | 满递减堆栈 |
IB | 每次传送前地址加4 | ED | 空递减堆栈 |
DA | 每次传送后地址减4 | FA | 满递增堆栈 |
DB | 每次传送前地址减4 | EA | 空递增堆栈 |
数据块传送操作 | 堆栈操作 |
进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储 。
进行堆栈操作操作时要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。
3.寄存器和存储器交换指令
助记符 | 说明 | 操作 | 条件码位置 |
SWP Rd,Rm,Rn | 寄存器和存储器字数据交换 | Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm) | SWP{cond} |
SWPB Rd,Rm,Rn | 寄存器和存储器字节数据交换 | Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm) | SWP{cond}B |