arm的寄存器:
普通:r0-r15
r0-r12 //存储任何数据
r13(sp) //栈指针寄存器(私有寄存器),当模式切换、程序跳转时,可以存储通用寄存器数值到sp指向的内存地址
r14(lr)//链接寄存器() 当程序跳转时,用来记录程序返回地址
r15(pc)//程序计数器 读操作:arm状态读取得是当前正在执行的指令地址+8
写操作:cpu会自动跳转到写入地址处执行代码
特殊:cpsr(程序当前状态寄存器)
N 31位 1表示结果为负 0表示结果为正
Z 30位 1表示结果为0 0表示结果非0
C 29位 加法 1表示存在进位 0表示没有进位 减法:1表示没有借位 0表示有借位
V 28位 溢出表示:1结果溢出 0没有溢出
运算表示位只能cpu根据运算结果自己修改,程序员不能写
E 9位 0小端 1大端
I 7位 中断控制位 1不接收中断 0接收中断
F 6位 快速中断控制位 1不接收快速中断 0接收快速中断
M 4-0位 工作模式表示域
when '10000' result = usr; // User mode
when '10001' result = fiq; // FIQ mode
when '10010' result = irq; // IRQ mode
when '10011' result = svc; // Supervisor mode
when '10110' result = mon; // Monitor mode
when '10111' result = abt; // Abort mode
when '11010' result = hyp; // Hyp mode
when '11011' result = und; // Undefined mode
when '11111' result = usr; // System mode uses User mode registers
修改模式的方法:
1.在管理模式,程序员自主修改
2.在异常发生时,cpu自动修改
spsr(保存的程序状态寄存器)保存存cpsr数值
arm的异常处理机制:
异常发生时,cpu会自动跳转到异常向量表固定位置执行代码
异常向量表:arm的异常事件处理方法集合
异常向量表基地址:0x00000000 0xffff0000 armv7可以设置在任意位置
arm一共分7中异常
0x0 reset异常
0x4 Undefined Instruction(未定义)
0x8 Supervisor Call(svc异常,软件中断)
0xc Prefetch Abort (预取中止)
0x10 Data Abort (数据中止)
0x14 not used
0x18 irq
0x1c fiq
当程序执行发生异常时,会自动跳转到异常向量表的固定位置处执行代码。