1. 指令系统
- RISC:精简指令集指令系统 --ARM
- 寻址方式:比较少(10种以内)
- 指令集中指令的条数:100条左右
- 大的、统一的寄存器文件:装载/保存结构(Load/Store),数据处理操作只针对寄存器内容,而不直接对存储器进行操作:
统一和固定长度的指令域,简化了指令的译码,便于指令流水线设计。--即大多数指令的执行时间是相等的
- CISC:复杂指令集指令系统 -- x86, 51
- 寻址方式:比较多(10种以上)
- 指令集中指令的条数
2. 数据类型
- 字(4字节)
- 半字(2字节)
- 字节
3. 寄存器
ARM处理器有37个寄存器,在不同运行模式下处理器使用的寄存器是不完全一致
两大类:
- 31个通用32位寄存器
- 6个状态寄存器
其中R0~R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。
寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器
寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。
R13: 堆栈指针SP -- 指向堆栈栈顶位置的指针(指向栈顶元素或者栈顶插入位置)
R14: 链接寄存器LR -- 作为子程序(函数)返回用
R14为链接寄存器(LR),在结构上有两个特殊功能:
在每种模式下,模式自身的R14版本用于保存子程序返回地址;(跳转到函数之前的位置)
当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。
R15: 程序计数器PC
它指向正在取指的地址。 -- 下一条要执行的指令的位置
程序状态寄存器:CPSR
运算的结果:NZCV
- N:符号位
- Z:零位
- C:进位/借位
- V:溢出
4. 异常
异常(Exception)是指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。
异常可分为4类:中断(interrupt)、陷井(trap)、故障(fault)和终止(abort)
- 上下文切换:
a. 将CPSR保存到对应的SPSR -- 状态寄存器的保护
b. 将当前程序中使用的数据进行压栈 -- 数据保护
c. 将返回地址(当前的PC值)保存到LR中 -- 返回位置
d. 将切换的入口地址(中断向量)赋值给PC -- 实现跳转
- 异常返回(中断、函数调用结束、内循环挑战到外循环):
a. 将SPSR恢复到CPSR中 -- 状态恢复
b. 数据栈中的数据弹栈 -- 数据恢复
c. 将LR赋值给PC -- 返回
5. ATPCS
过程调用标准ATPCS(ARM-Thumb Produce Call Standard)规定了子程序间相互调用的基本规则, ATPCS规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。
寄存器使用规则:
R0-R3: 函数调用时的参数寄存器,用来存放前4个函数参数并存放返回值。在函数内如果将这些寄存器用作其他用途,将破坏其值。R0还作为函数的返回值
R4-R11: 通用变量寄存器(一般使用得比较多的是R4-R8)
R12: IP, 临时过渡寄存器,函数调用时会破坏其值
今天就到这吧,希望对大家有帮助~
本人小白一枚,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
感谢~!