条件码:
Code Suffix Flags Meaning
0000 EQ Z set equal (= =)
0001 NE Z clear not equal (! =)
0010 CS/HS C set unsigned higher or same (>=) unsigned
0011 CC/LO C clear unsigned lower (<) unsigned
0100 MI N set negative
0101 PL N clear positive or zero
0110 VS V set overflow
0111 VC V clear no overflow
1000 HI C set and Z clear unsigned higher (>) unsigned
1001 LS C clear or Z set unsigned lower or same (<=) unsigned
1010 GE N equals V greater or equal (>=) signed
1011 LT N not equal to V less than (<) signed
1100 GT Z clear & (N ==V) greater than (>) signed
1101 LE Z set | (N != V) less than or equal (<=) signed
1110 AL (ignored) always This suffix is normally omitted.
LR 保存返回PC地址
指令+S 则会影响cpsr
b 类似 goto fun # pc = fun
bl 类似子函数调用 lr = pc pc = fun
mov r0,r0 相当于 nop
mov r0 , r1 , lsl #n //左移n位,相当于乘于 2^n次方
mov r0 , r1 , lsr #n //右移n位,相当于乘于 2^n次方
mvn r0, r1 //将源操作数,取反赋值给目标
加法操作:
ADD Rd,Rn,op2 // Rd = Rn + op2
ADC Rd,Rn,op2 // Rd = Rn + op2 !c 带进位翻转减法
减法操作:
sub Rd,Rn,op2 // Rd = Rn - op2
suc Rd,Rn,op2 // Rd = Rn - op2 !c 带进位翻转减法
rsb Rd,Rn,op2 // Rd = op2 - Rn
rsc Rd,Rn,op2 // Rd = op2 - Rn !c 带进位翻转减法
乘法操作:
MUL Rd,Rn,op2 //Rd = Rn *op2 保留32位结果同时影响 cpsr -》Multiply
MLA R1,R2,R3,R4 //R1 = R2 * R3 + R4 乘----累加指令 ,同时影响cpsr ->Multiply accumulate
UMULL R0,R1,R2,R3 //(R0,R1) = R2 *R3 64位无符号乘法指令,结果地位存在R0中,高位存在 R1中
UMLAL R0,R1,R2,R3 //(R0,R1) = R2 *R3 + (R0,R1) 64位无符号乘法指令 , 结果低位加上 R0 存放在R0中,高位 加上R1,存放在R1中
SMULL R0,R1,R2,R3 //(R0,R1) = R2 *R3 64位有符号乘法指令,结果地位存在R0中,高位存在 R1中
SMLAL R0,R1,R2,R3 //(R0,R1) = R2 *R3 + (R0,R1) 64位有符号乘法指令 , 结果低位加上 R0 存放在R0中,高位 加上R1,存放在R1中
逻辑操作:
CMP Rn,op2 //比较 Rn 与 op 2 是否相等;标识 为 Rn - op2
CMN Rn,0p2 // Rn + op2 来影响 标识位 ,以作为 后续操作 的条件判断
and r0, r1, r2 //将r1,r2按位与,将值赋给r0
orr 或 操作
eor 异或 操作
BIC Rd ,Rn , op2 位清零 将Rn 按照 op2 中为1的位 进行清零,,结果放在Rd中
TST Rn,op2 做逻辑与 ,结果不放在目标寄存器中
TEQ Rn,op2 做逻辑异或,这两个不影响cpsr
与条件码 联合使用
load / Store
LDR Rd,<addr_mode> 将存储器中的一个字装进Rd中
ldr r0,=0x80009000 此时ldr为伪指令
ldr r0,[r1] 取出r1中地址所指向内容的值 为汇编指令
STR Rd,<addr_mode> 将寄存器中的值保存到存储器中
LDR B H T S
STR B H T
B是指操作一个字节 ,从低位开始操作
H是指操作半个字,从低位开始
T 是指在用户模式下,
S是指 有符号数
没有B/H 则指操作一个字(32位)
LDM
ldmia r1! ,{r3 -r9} r1中存储了内存中的地址,将r1中地址指向的内容 分别存入r3 到 r9的寄存器 中,ia 为 每次地址增加4
stmia r1!,{r3-r9} r1中存储了内存中的地址, 将r3 -r9 的内容写入到 r1 对应的地址中,地址每次递增 4
SWP 字交换指令
swp Rd,Rm,[Rn]
swpb Rd,Rm,[Rn] 字节交换指令
跳转指令
B 跳转指令 B label //使PC = label
BL 带返回的跳转指令 BL label //使LR = PC PC = label
状态操作指令
MRS 把状态寄存器的值 传入 通用寄存器
MRS R0,CPSR//
MSR 把寄存器 的值传入 状态寄存器中,
MSR CPSR ,R0
使能IRQ:
ENABLE_IRQ
MRS R0,CPSR
BIC R0,R0,#80
MSR CPSR_C ,R0
MOV PC,LR
DISABLE_IRQ
MRS R0,CPSR
ORR R0,R0,#80
MSR CPSR_C ,R0
MOV PC,LR