ARM汇编常用指令记录
指令的一般格式:
<opcode>{<cond>}{S} <Rd>,<Rn>{,<op2>}
其中<>为不可省略,{}为可以省略。
注意:opcode、cond、S之间没有空格,S和Rd之间使用空格隔开。
- LSL 左移指令
MOV R1,R0,LSL#3 //将寄存器R0中的值左移3位后传送到寄存器R1中
- CMP 比较指令
CMP R1,R0 //将寄存器R1的值与寄存器R2的值相减,并根据结果来设置CPSR的标志位
CMP R1,#100 //将寄存器R1的值与立即数100相减,并根据结果来设置CPSR的标志位
- TST 位测试指令
TST R1,#0x01 //将寄存器R1中的值与立即数0x01按位与,并根据是结果来设置CPSR的标志位
TST R1,#0xFE //将寄存器R1中的值与立即数0xFE按位与,并根据是结果来设置CPSR的标志位
- TEQ 相等测试指令
TEQ R1,R2 //将寄存器R1中的值与寄存器R1中的值按位异或,并根据是结果来设置CPSR的标志位
- ADD 加法指令
ADD R0,R1,R2 //即 R0 = R1 + R2
ADD R0,R1,#256 //即 R0 = R1 + 256
ADD R0,R2,R3,LSL#3 //即 R0 = R2 + (R3<<3)
注意:ADD、ADC、ADDS、ADCS的区别:
ADD是不带进位的加法指令
ADC是带进位的加法指令
----------------------------------------------
ADDS和ADCS后加S是代表更新CPSR状态
ADDS R1,R2,R3 //即 R1 = R2 + R3且更新CPSR状态
ADCS R5,R6,R7 //即 R5 = R6 + R7,带进位且更新了CPSR状态
- SUB 减法指令
SUB R0,R1,R2 //即 R0 = R1 - R2
SUB R0,R1,#256 //即 R0 = R1 - 256
SUB R0,R2,R3,LSL#3 //即 R0 = R2 - (R3<<3)
注意:SBC是带借位的减法指令,其与SBCS、SUBS使用与加法指令类似。
- AND 与指令
AND R0, R0,#3 //将寄存器中R0中的值与立即数3按位与,并且将结果放入R0中
注意:AND通常用来保留特定位,清零其它位
- ORR 或指令
ORR R1,R1,#3 //将寄存器中R1中的值与立即数3按位或,并且将结果放入R1中
注意:ORR通常用来置位特定位
- BIC 位清除指令
BIC R0,R0,#0x0B // 将寄存器R0中值的第0、1、3位清零(0x0B是0000_1011),其余位保持不变。
- MRS 程序状态寄存器到通用寄存器的数据传输指令
MRS和MSR的格式: MRS{cond} Rd,<PSR> //PSR可以是CPSR或SPSR
MRS R0,CPSR //传输CPSR中的内容到R0当中
MRS R1,SPSR //传输SPSR中的内容到R1当中
- MSR 通用寄存器到程序状态寄存器的数据传输指令
格式: MSR{cond} Rd,<PSR>_<fields>,Rm //PSR可以是CPSR或SPSR,fields为域
程序状态寄存器可分为4个域:
PSR[31:24]为条件标志位域,用f表示,f为小写
PSR[23:16]为状态位域,用s表示,s为小写
PSR[15:8]为扩展位域,用x表示,x为小写
PSR[7:0]为控制位域,用c表示,c为小写
MSR CPSR,R0 //传送R0的内容到CPSR中
MSR SPSR,R1 //传送R1的内容到SPSR中
MSR CPSR_c,R2 //传送R2的内容到CPSR中,但仅仅修改CPSR中的控制位域
注意:MRS和MSR一般用于需要改变程序状态寄存器的内容 或者 是异常处理和进程切换时要保留程序状态寄存器中的值时。