1.CPSR寄存器
cpsr中有NZCV四个位置控制异常;
N: 负数标志,在比较时候作为比较后语句执行依据;
Z: 零位标志,判断比较时候是否相等的依据;
C: 进位标志,判断十六进制是否需要进位;
V: 溢出标志,判断异常存储是否溢出;
2.处理器模式位:<MODE>
10000 USER
10010 IRQ
10111 ABORT
10011 SVC
10001 FIQ
11011 UNdefined
11111 System
3.CPSR的T位对应含义
0: ARM 32位指令 T=0;
1: Thumb 16位指令 T=1;
4.立即数含义及判定规则
立即数:一个八位的常数可以通过循环右移偶数位可以得到该数;
判定规则:
1、除去零外,仅有一位数合法;
2、除去零外,仅有二位数并且相邻(包括首尾);
3、除去零外,仅有三位数,并且相邻(包括中间有零相间);
注意: 0~255一定是立即数;
5.寄存器中值的加、减、乘
add 加法
语法:add <目标寄存器> ,<操作数1>,<操作数2>
sub 减法
语法:add <目标寄存器> ,<操作数1>,<操作数2>
mul 乘法
语法: mul <目标寄存器> ,<操作数1>,<操作数2>
6.寄存器中值的比较
cmp: <寄存器1>,<寄存器2>
ne(not equal):不等于;——通过CPSR中N位与Z位判定;
le(less equal):小于等于;——通过CPSR中N位与Z位判定;
ge(great equal):大于等于;——通过CPSR中N位与Z位判定;
lt(less equal):小于;——通过CPSR中N位判定;
gt(great than):大于;——通过CPSR中N位判定;
eq(equal):等于;——通过CPSR中Z位判定;
7.跳转指令
跳转到标签所在函数运行;
语法:
b{<cond>} <标签>
bl{<cond>} <标签>
区别:
bl跳转后会在lr寄存器中存储下条指令地址;
在流水线中会存储lr(r14)并通过Adjust对该地址进行-4操作;
8.连续位置置零操作
常规操作:
ldr r0,=0xabcd
mov r1,#7
lsl r1,r1,#1
mvn r1,r1
AND r0,r0,r1
使用bic指令操作:
bic <目标寄存器>,<操作数1>,<操作数2>
目标寄存器 = 操作数1 & (~操作数2)
例:
bic r2,r0,r1,lsl #4
9.索引
前索引:
str r0,[r1,#4] @//将r0写入地址(r1 + 4)中
ldr r0,[r1,#4] @//用r0取得地址(r1 + 4)中值
后索引:
str r0,[r1],#4 @//将r0写入地址(r1)中,然后r1 = r1 + 4;
ldr r0,[r1],#4 @//用r0取得地址(r1)中值,然后r1 = r1 + 4;
自动索引:
str r0,[r1,#4]! @//将r0写入地址(r1 + 4)中,然后r1 = r1 + 4;
ldr r0,[r1,#4]! @//用r0取得地址(r1 + 4)中值,然后r1 = r1 + 4;