arm架构学习
工作模式
User :用户模式,一般在执行上层应用程序的时候处于该模式(和linux用户态和内核态无关)
Fiq 快速中断模式
IRQ:中断模式
SVC:当复位或执行软中断指令后arm进入这种模式(例如刚上电或者软中断执行的时候处于该模式)
Abort: 当产生存取异常时进入这种模式
Undef: 当执行未定义的指令时ARM将进入这种模式
System: 使用和User模式相同的寄存器集的特权模式
Monitor:为了安全而拓展出的用于执行安全监控代码的模式
ARM寄存器组织
其中 r0r3 主要用于子程序间传递参数, r4r11 主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量; r12 用作子程序间scratch 寄存器,即 ip 寄存器; r13 通常用做栈指针,即 sp; r14 寄存器又被称为连接寄存器(lr),用于保存子程序以及中断的返回地址; r15 用作程序计数器(pc),由于 ARM 采用了流水线机制,当正确读取了 PC 的值后,该值为当前指令地址加 8 个字节,即 PC 指向当前指令的下两条指令地址。
CPSR和SPSR都是程序状态寄存器,其中SPSR是用来保存中断前的CPSR中的值,以便在中断返回之后恢复处理器程序状态。
r15:PC寄存器:程序计数器,用于存储当前取址指令地址
R14:链接寄存器 LR:
- 执行跳转指令的时候(b),LR会自动保存跳转指令的下一条指令,程序需要返回时将LR的值复制到PC即可实现
- 产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址,异常结束后将LR的值复制到PC
R13:栈地址
CPSR寄存器:当前程序状态寄存器
****SPSR:****程序状态保存寄存器
ARM异常处理
arm异常源:
- FIQ FIQ模式
- IRQ IRQ模式
- Resset复位电平有效 SVC模式
- Software Interrupt 执行swi命令 SVC模式
- Data Abort 数据中止 Abort模式
- Prefetch Abort 指令预取中止 Abort模式
- Undefined Instruction 遇到不能处理的指令 Undef模式
产生异常后
- 拷贝CPSR的内容到对应异常模式下的SPSR
- 修改CPSR的值:
- 修改中断禁止位禁止相应的中断
- 修改模式位进入相应的异常模式
- 修改状态位进入ARM状态
- 保存返回地址到对应异常模式下的LR
- 设置PC为相应的异常向量(异常向量表对应的地址)
异常处理完成后返回:
- 将SPSR的值复制给CPSR使程序恢复到之前的状态
- 将LR的值给PC,使程序跳转回之前的地址
异常优先级
- reset
- data abort
- fiq
- irq
- prefetch abort
- software interrupt
- undefined instruction
ARM指令集
==arm指令集==
- 所有指令都占用32bit存储空间
- 执行arm指令集时PC每次自增4
==thumb指令集==
- 所有指令都占用16bit存储空间
- 执行arm指令集时PC每次自增2
数据处理指令
1 | @数据搬移指令 |
1 | @加法指令 |
跳转与存储器访问指令
1 | 内存访问指令 |
寻址:
1 | 寄存器寻址:直接从寄存器拿值 |
多寄存器寻址:
1 | 多寄存器地址访问指令 |
栈的分类
后缀:
ea :空增
ed : 空减
fa : 满增
fd : 满减
增栈:压栈时栈指针越来越大,出栈时栈指针越来越小
减栈:压栈时栈指针越来越小,出栈时栈指针越来越大
满栈:栈指针指向最后一次压入栈中的位置,压栈时需要先移动栈指针到相邻的位置再压栈
空栈:栈指针指向最后一次压入到栈中的数据的相邻位,压栈时可以直接压栈,之后需要将栈指针移动到相邻位置
1 | 状态寄存器传送指令 : |
伪指令
1 | 伪指令: |