一,ARM汇编语言立即数的表示方法
十六进制:前缀:0x
十进制:无前缀
二制:前缀:0b
二,常用的ARM指令(标准的ARM语法,GNU的ARM语法)
1、@M开头系列
MOV R0, #12 @R0 = 0XFF。(1)、寄存器或寄存器之间的数据传送 MVF = MOV
MOV R0, R0
MOV R0, R0, LSL#2 @OR =ASL#2, LSR/ASR/ROR/RRX,(2)、移位操作
MVN R0, #4 @数据取反传送 R0 = -5
MVN R0, #0
@MOV R0, #0X88888888 这样是不合法的,mov操作立即数范围为0~512,可以通过使用LDR/STR的伪指令实现将大的立即数或内存写入寄存器,如下
LDR R0, =0X88888888
@MSR CPSR, R0
MSR SPSR, R0
MSR CPSR_flg, R0
MSR CPSR_flg, #1<<28
MUL R0, R1, R2
@MOV PC, R14 @(3)、程序跳转(默认模式为从程序第一句到当前这一句循环执行)
@MOVS PC, R14 @(4)、S->C 拷贝,实现从异常中断返回
@MOVS PC, LR @这三句在这里是等价的
2、ADD、ADDS、ADC、ADCS
ADD指令将表示的数据加上寄存器的值,将结果保存到目标寄存器中,并根据指令的执行结果更新CPSR中相应的条件标志位。
@两个64位数相加
LDR R1, =0X10101010
LDR R2, =0X10010010
LDR R3, =0X20202020
LDR R4, =0X20020020
ADDS R5, R1, R3 @加低位的字
ADCS R6, R2, R4 @加高位的字,带进位
ADC指令常用于实现两个数的相加,无进位时为C=0
3、SUB、SBC、RSB、RSC
SUB指令的作用是将寄存器中的数值减去所表示的数值,将运算结果保存到目标寄存器中,并根据指令的执行结果更新CPSR中的条件标志位。
SUB指令常用于实现两个数的相减,若结果>=0,则C位为1,若结果为0,则Z位为1
SBC指令的作用是将寄存器中的值减去表示的数值,再减去寄存器CPSR中C条件标志位的反码[NOT (Carry Flag)],将结果保存到目标寄存器中,并根据指令的执行结果更新CPSR中相应的条件标志位。
SBC指令常与SUB指令联合使用,可以实现两个64位数的减法。
@减法***************************
SUB R0, R1, R2 @ R0 = R1 - R2 不带借位的减法
SUB R0, R1, #255 @ R0 = R1 - 256
SUB R0, R2, R3, LSL#1 @ R0 = R2 - (R3 << 1)
SBC R0, R1, R2 @ R0 = R1 - R2 -!CARRY 带借位的解减法
RSB R0, R1, R2 @ R0 = R2 - R2 反向减法
RSC R3, R4, R5 @ R3 = R5 - R4 - !CARRY 带借位的反向减法
4、 AND、EOR、ORR、BIC、
*AND指令将表示的数值与寄存器的值按位做“与”运算,将将结果保存到目标寄存器中,同时根据操作的结果更新CPSR寄存器中的条件标志位。
(1) 指令的语法格式
AND{}{S} , ,
(2) 指令举例
AND R0, R0, #0x03 ;R0寄存器中的0、1位不变,其它位清零
AND R2, R1, R3 ;R2 = R1 & R3
ANDS R0, R0, #0x1 ;R0 = R0 & 0x1
*EOR(Exclusive OR)指令将寄存器中的值和表示的值按位进行“异或”操作,并将执行结果保存中目标寄存器中,同时根据指令的执行结果更新CPSR中相应的条件标志位。
(1) 指令的语法格式
EOP{}{S} , ,
(2) EOR指令举例
EOR R0, R0, #3 ;反转R0的第0位和第1位
EOR R1, R1, #0x0F ;将R1的低4位取反
EOR R2, R1, R0 ;R2 = R1 ^ R0
EORS R0, R5, #0x1 ;将R5和0x1进行逻辑异或,结果保存在R0中,并根据执行结果更新标志位。
*ORR(logical OR)为按位或指令,它将第2个源操作数表示的值与寄存器表示的值按位做“或”操作,结果保存到寄存器中。
(1) 指令的语法格式
ORR{条件}{S} , ,
(2)指令的例子
ORR R0, R0, #3 ;将R0的第1、3位设置成1
ORR R0, R0, #0xFF ;将R0的低4位置1
*BIC(Bit Clear)位清零指令,将寄存器的值与第2个源操作数的值的反码按位做“逻辑与”运算,结果保存到寄存器中
(1) 指令的语法格式
BIC{条件}{S} , ,
(2)指令例子
BIC R0, R0, #0x1