ARM汇编指令
指令基本格式
基本格式
<opcode> {<cond>{s} <Rd>,<Rn>{,<operand2>}}
- 其中,<>是必选项,{}内是可选项
<opcode>
是助记符,如LDR、STR等- cond是执行条件,如BEQ、BNE等
- S:是否影响CPSR的值:SUB SUBS
- Rd:目标寄存器
- Rn:第一个操作数的寄存器
- operand:第二个操作数
存储器访问指令
加载/存储体系结构
- ARM是RISC结构,无法直接对存储器数据直接进行操作,要首先加载到寄存器才能处理。对存储器访问使用加载指令LDR和存储指令STR实现
- 可以实现半字、字、无符号/有符号字节操作
基本命令
- 完成寄存器和内存单元之间数据的搬运
- LDR R1, [R0];将R0值作为内存地址,取出该地址值保存到R1
- STR R1,[R0];将R1的值保存到以R0中的值为地址的存储单元
- LDRB/STRB: 读取一字节
- LDM/STM: 实现一组寄存器和连续内存单元之间传输数据
- SWP R1, R1, [R0]; 将R1和R0指向的存储单元内容进行交换
- SWP R1, R2, [R0]; 将[R0]读取到R1,将R2写入到[R0]存储单元
LDM与STM
数据块传输指令
- 加载(LDM)或存储(STM)一组寄存器
- 支持堆栈操作
- ARM使用FD满递减堆栈
- LDMFD SP!, {R0-R2, R14}
- STMFD SP!, {R0-R2, R14}
堆栈格式 | 说明 | 备注 |
---|---|---|
FA | Full Ascending | 满递增堆栈 |
FD | Full Descending | 满递减堆栈 |
EA | Empty Ascending | 空递增堆栈 |
ED | Empty Descending | 空递减堆栈 |
数据传输指令
常用命令
- MOV R1, #1; 将立即数1传送到寄存器R1中
- MOV R1, R0; 将R0中的值传送到R1寄存器中
- MOV PC, LR; 子程序返回
- MVN R1,#0xFF; 将0xFF取反后再赋值给R1
算术逻辑运算指令
加减&与或非&异或&清除
https://www.cnblogs.com/armlinux/archive/2011/03/23/2396833.html
- ADD R1, R1, #1; R1 = R1+1
- ADC R1, R1, #1; R1 = R1 + 1 + C(CPSR中的C标志位)
- SUB R1, R1, R2; R1 = R1 - R2
- SBC R1, R1, R2; R1 = R1 - R2 - C
- AND R0, R0, #3; 保留R0的bit0和bit1,其余位清除
- ORR R0, R0, #3; 置位R0的bit0和bit1
- EOR R0, R0, #3; 反转R0的bit0和bit1
- BIC R0, R0, #3; 清除R0中的bit0和bit1
乘法指令
乘法和带累加的乘法
- MUL R2, R1, R0; R2 = R1 * R0
- MLA R3, R2, R1, R0; R3 = R2 * R1 + R0
比较指令
比较指令
- 影响CPSR状态寄存器的N、Z、C、V
- CMP R1, #10 R1-10,结果影响N、Z、C、V位
- CMP R1, R2 R1-R2, 结果影响N、Z、C、V位
- CMN R0, #1 R0- (-1) 比较取负的值,负数比较
- TST R1, #1 R1 & 1 位测试
- TEQ R1, R0 R1^R0 测试是否相等
跳转指令
- B label;跳转到label处,跳转范围[0~32M]
- CMP R2, #0
- BEQ label
- BL label; 带链接跳转,先将下一条指令保存到LR,然后再跳转
- MOV PC,LR ;通常用于函数调用,然后从子程序返回
- BX Rm;带状态切换跳转,Rm保存的是跳转地址,处理器根据Rm[0]位决定切换到ARM或thumb状态。0:目标地址为ARM指令
- BLX label; 带链接和状态换跳转