功能和结构
重点内容,需熟练掌握CPU的结构以及各个寄存器的作用,每年都会在大题中考察。
CPU基本结构
ALU
- EU(Execution Unit,执行单元):
- EU是CPU的核心功能单元,它执行指令中的实际计算和操作。
- EU包含算术逻辑单元(ALU),用于执行算术和逻辑运算,例如加法、减法、逻辑与、逻辑或等。
- EU还包括寄存器文件,用于存储和操作寄存器中的数据,这些寄存器包括通用寄存器、标志寄存器等。
- EU还包括控制单元,负责解码指令、管理数据流、控制寄存器和标志的更新,以及协调指令的执行。
- BIU(Bus Interface Unit,总线接口单元):
- BIU是CPU的一个子单元,负责与外部系统和内存之间的数据传输以及地址总线和数据总线的管理。
- BIU包含指令寄存器(IR,Instruction Register),用于存储当前正在执行的指令,以及内存地址寄存器(MAR,Memory Address Register)和内存数据寄存器(MDR,Memory Data Register),用于执行内存访问操作。
- BIU通过控制地址总线和数据总线来实现内存和I/O设备之间的数据传输,以及将指令和数据加载到EU中供执行。
寄存器
寄存器类型
- 通用寄存器(General-Purpose Registers):
AX
寄存器:累加器(Accumulator),用于执行算术和逻辑运算。BX
寄存器:基址寄存器(Base Register),通常用于存储内存地址。CX
寄存器:计数寄存器(Counter Register),用于循环计数和移位操作。DX
寄存器:数据寄存器(Data Register),用于输入/输出操作和大整数运算。
- 段寄存器(Segment Registers):
CS(Code Segment)
寄存器:代码段寄存器,存储指向代码段的地址。DS(Data Segment)
寄存器:数据段寄存器,存储指向数据段的地址。ES(Extra Segment)
寄存器:附加数据段寄存器,通常用于数据访问。SS(Stack Segment)
寄存器:堆栈段寄存器,存储指向堆栈段的地址。
- 指针寄存器(Pointer Registers):
SI
寄存器:源变址寄存器,通常用于数据传送操作。DI
寄存器:目的变址寄存器,也通常用于数据传送操作。SP
寄存器:堆栈指针寄存器,用于堆栈操作。BP
寄存器:堆栈基址寄存器,通常用于堆栈操作。
- 附加寄存器(Extra Registers):
IP(Instruction Pointer)
寄存器:指令指针寄存器,存储当前执行指令的偏移地址。FLAGS
寄存器:标志寄存器,存储有关条件和状态的信息,例如进位、零标志、溢出等。
哪些寄存器是程序员可见的:
标志寄存器(flag register)
什么时候会被设置?
标志寄存器主要有两个功能:
- 条件标志:保存指令执行结果的状态。在执行条件分支、算数和逻辑、比较或移位指令后,条件标志都会被设置。
- 控制标志:控制指令执行的行为
条件标志(conditional flags)
OF(Overflow flag)
- 溢出标志。
- 当有符号整数运算的结果太大而无法适应目标寄存器时,OF标志会设置为1,表示发生了溢出。
SF(Sign flag)
- 符号标志。
- 根据操作结果的符号位来设置,如果结果为负数,则SF被设置为1,否则为0。
ZF(Zero flag)
- 零标志。
- 当操作结果为零时,ZF标志被设置为1,否则为0。
AF(Auxiliary carry flag)
- 辅助进位标志。
- 通常用于BCD(二进制编码十进制)算术运算,指示低四位的进位。
PF(Parityh flag)
- 奇偶校验标志。
- 根据结果中二进制位1的个数是奇数还是偶数,设置PF标志。奇数个1则PF为1,偶数个1则PF为0。
CF(Carry flag)
- 进位标志。
- 当无符号整数运算的结果超出了目标寄存器的位数,CF标志被设置为1,表示发生了进位。
控制标志(control flags)
TF(Trap flag)
- 控制单步执行。
- 当TF被设置为1时,CPU将进入单步执行模式。在单步执行模式下,每执行一条指令后,CPU将引发一个单步中断,允许程序员逐条调试程序。
IF(Interrupt flag)
- 控制中断处理
- 当IF被设置为1时,CPU允许中断请求。如果IF为0,CPU将禁止所有中断请求,无论是外部硬件中断还是软件中断。
DF(Direction flag)
- 字符串操作的标志位。
- 当DF被设置为1时,字符串操作(如MOVS、LODS、STOS)在内存中向高地址方向移动。这通常用于从高地址向低地址扫描字符串。当DF被清除为0时,字符串操作在内存中向低地址方向移动。这通常用于从低地址向高地址扫描字符串。