1. RISC和CISC
CISC是复杂指令集,X86和X64使用的就是复杂指令集
复杂指令集注重指令的功能性,指令的周期和指令的宽度不固定
RISC是精简指令集,RISC是CISC中选取了一些比较常用的简单的指令作为精简指令集,ARM使用的就是精简指令集,但是随着架构的升级,指令也在扩充,现在的精简指令集也很大
RISC的时钟周期和指令宽度是固定的
2. Cortex-A核处理器工作模式
总结:不同的工作模式下执行的不同的代码,完成特定的功能。
3. 寄存器
注意
在c语言中,我们不能一直使用register声明变量,因为寄存器的数量有限。
寄存器是没有地址的,在ARM的汇编指令当中,每条指令的长度是固定的,以ARM-V7架构举例,它的汇编指令是32位的,地址的位数为32位,有的时候在一条指令当中使用到多个寄存器,若寄存器有地址,加上操作码和状态码等,远远超过了指令的长度。
4. ARM-V7的寄存器组织
-
每种工作模式下只能访问自己模式下对应的寄存器,不可以访问其他模式的寄存器。
user和system模式最多可以访问17个寄存器;
FIQ,IRQ,ABT,SVC,UND,MON模式最多可以访问18个寄存器;
HYP模式最多可以访问19个寄存器 -
每个寄存器都是一个32位的寄存器,寄存器没有地址,访问寄存器通过编号进行访问,
R0-R15,CPSR,SPSR。
编译最终将这些编号编译生成4位的机器码。寄存器为什么不能使用地址进行访问:
add r0, r0, r1===> 编译生成32位机器码,需要包含add,r0,r1的信息,因此寄存器是不能有地址的。(V7是32位架构) -
banked类型的寄存器属于私有的寄存器,
非banked类型的寄存器属于公有的寄存器。 -
系统模式和用户模式共用一套寄存器组织
如果此工作模式下没有对应的私有的寄存器则访问公有的寄存器。
如果此工作模式下有对应的私有的寄存器,则访问私有的寄存器,不可以访问公有的寄存器。
5. 特殊功能寄存器
5.1 R13—>栈指针寄存器
R13 ----> 别名:SP(the Stacked Pointer : 栈指针寄存器)
作用:用于保存栈顶的地址。
ARM-V7是满减栈:
减栈:入栈的时候地址是减少的,出栈的时候地址是增加的
满栈:栈指针指向栈顶元素
5.2 R14—>链接寄存器
R14---->别名:LR(the Linking Register:链接寄存器)
作用:保存返回地址,主要用于程序返回。
5.3 R15 —> 程序计数寄存器
R15—>别名:PC (the Program counter:程序计数寄存器)
作用:PC寄存器中保存的是取指指令的地址。
5.4 CPSR—> 当前程序状态寄存器
CPSR : Currented Program Statued Register:当前程序状态寄存器
作用:存储的是当前的程序的运行的状态,条件标志{C}就是根据CPSR判断,汇编代码状态位{S}位加不加表示程序的执行结果影不影响状态标志位。
N[31]位
指令的执行结果为负数,N位被自动置1,否则清0.
Z[30]位
指令的执行结果为零,Z位被自动置1,否则清0
C[29]位
加法:产生进位(上溢),C位被自动置1,否则清0.
减法:产生借位(下溢),C位被自动清0,否则置1.
32位的处理器,进位:低32位向高32位进位;
借位:低32位向高32位借位。
V[28]位
符号位发生变化,V位被自动置1,否则清0.
I[7]位:IRQ屏蔽位
I = 0 : 不屏蔽IRQ
I = 1 : 屏蔽IRQ
F[6]位 : FIQ屏蔽位
F = 0 : 不屏蔽FIQ
F = 1 : 屏蔽FIQ
T[5]位 : 状态位
T = 0 : ARM状态,执行ARM指令集
T = 1 : Thumb状态,执行Thumb指令集
M[4:0]位:模式位
10000 User mode;
10001 FIQ mode;
10011 SVC mode;
10111 Abort mode;
11011 Undfined mode;
11111 System mode;
10110 Monitor mode;
10010 IRQ mode;
11010 HYP mode;
6. 指令流水线
ARM7 ---> 3级流水线
ARM9 ---> 5级流水线
ARM11 ---> 7级流水线
Cortex-A9 ---> 13级流水线
Cortex-A53 ---> 8级流水线
ARM处理器 引入流水线的目录就是为了提高指令的执行效率
取指器:根据PC寄存器中的值,完成取指令的操作
译码器:翻译指令的功能,给大对应的执行器。
执行器:执行指令并将执行的结果写回到寄存器。
以上三个器件都是相互独立的器件,工作互补干扰,都属于单周期的器件。
8个时钟周期,执行完成了6条指令 :
指令的周期 = 8 / 6 ≈ 1T
以上指令的流水线是一个理想的指令流水线,异常或者跳转都会打断指令的流水线。