指处理器的整体的物理设计,通常是基于特定的指令集架构,包括处理器内部的组成部分、控制逻辑、寄存器组织等。
指令集就像语言(汉语、英语)一样,定义一套语言并不难,难的是你要让别人去接受你定义的语言。如果重新使用一套指令集,与之配套的编译器、操作系统、各种应用软件也都要重新编写,这样的工作量和难度,是无法想象的。
8086 处理器
x86 架构的第一款处理器,也是后来广泛应用于个人计算机的基础。
其他一些常见的 x86 架构处理器:
- 英特尔酷睿(Intel Xeon)
- 英特尔奔腾(Intel Pentium)
其核心组件包括总线接口单元 (Bus Interface Unit, BIU) 和 执行单元 (Execution Unit, EU)
算数逻辑单元
Arithmetic Logic Unit, ALU(属于 EU),本身不直接涉及指令,而是根据指令的操作码和操作数执行相应的算术和逻辑运算
以简单的计算器 (Calculator) 为例:一个简单的 4 位 CPU 由一个由下面的多路复用器组成的 ALU 组成。
根据复用器内部结构, S0 和 S1 对应不同的运算方式,S2 代表寻址模式,0 代表直接(操作数由紧随操作码之后的地址指出),1 代表立即(操作数紧随操作码之后)
- Falling edge on clock causes next instruction to be taken from memory and presented to the ALU.
- Rising edge on clock causes output of ALU to be stored by the latch (Accumulator).
将计算器拓展即可成为一个简单的微处理器
寄存器
用于暂存指令和数据,总共为 14 个,分为 6 类
通用寄存器
- ax (accumulator):累加寄存器,用于运算
- bx (base):基址寄存器,用于地址索引
- cx (count):计数寄存器,用于保存计算值
- dx (data):数据寄存器,用于数据传递
16位 | 8高位 | 8低位 |
AX | AH | AL |
BX | BH | BL |
CX | CH | CL |
DX | DH | DL |
指令指针寄存器
IP (Instruction Pointer):存储当前正在执行的指令的地址,可以看作一个程序计数器
- 当 CPU 执行完一条指令后,它会自动递增 IP,以便指向下一条指令的地址。
段寄存器
Segement Register
- CS(Code):代码段寄存器
- DS(Data):数据段寄存器
- SS(Stack):堆栈段寄存器
- ES(Extra):附加段寄存器
CPU 将
CS:IP
指向的内容当作指令执行设 CS 中的内容为 ,IP 为 ,CPU 从内存(二进制) 单元开始,执行指令。
- 相当于二进制左移 4 位(末尾补四个0) 或 十六进制左移一位(末尾补一个0)
- 读入的指令
B8 23 01
长度为 3 个字节, IP 值加 3。CS: IP 重新指向内存单元2000:0003
- CS: IP =
2000 : 0003
➡️ 20000+0000 =20003
例 1
mov
指令中的[]说明操作对象是一个内存单元,且这个内存单元的偏移地址是 0
- 它的段地址默认放在 DS 中, 指令执行时,CPU 会自动从 DS 中取出
例 2
Suppose the CS contains 12EFh.
What is the starting address in main memory of the instruction
cmp dl, 'Q'
?CS: IP =
12EFh: 002Eh
➡️ 12EF0 + 002E = 12F1E
指针寄存器
- bp:基址 (base) 指针寄存器,存储栈底地址
- sp:堆栈 (stack) 指针寄存器,存储栈顶地址
可以将一段内存当作栈来使用,CPU 将
SS:SP
指向的内容得到栈顶的地址push ax
指令执行时,将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素- 栈的存储区域为:从高地址向低地址存放,高地址在栈底,低地址趋向栈顶。
- 可以视为一个倒放的杯子,从下往上堆东西
pop ax
指令执行时,从栈顶单元中取出数据,送入寄存器中
- 栈空,SS:SP 指向栈空间最高地址单元的下一个单元。
- 执行 push 后,SS:SP 指向栈中的第一个元素。
变址寄存器
si 和 di 是 8086CPU 中和 bx 功能相近的寄存器,但 si 和 di 不能够分成两个 8 位寄存器使用。
- si (source index):源变址寄存器,存储内存操作中的源地址
- di (destination index):目的变址寄存器,存储内存操作中的目的地址
标志寄存器
Flag Register: keeps track of the result of certain calculations
- 其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
- flag 寄存器是按位起作用的,即它的每一位都有专门的含义,记录特定的信息,其中存储的信息通常被称为程序状态字 (PSW)。
- U: Undefined
- OF: Overflow flag
- DF: String direction flag
- IF: Interrupt enable flag
- TF: Single step trap flag
- SF: Sign flag MSB of result
- ZF: Zero flag, set if result=0
- AF: BCD Carry flag
- PF: Parity flag
- CF: Carry flag
例
mov ax,2
sub ax,1
执行后,结果不为0,则 zf=0
After every instruction is executed the CPU modifies a special flag register to record the effect of the instruction.
8087 处理器
最早的 x87 架构协处理器,与 Intel 8086 和 8088 处理器配套使用。
状态字寄存器
Status Word
用于指示浮点运算的状态和结果,各种标志位用于表示运算是否溢出、出现错误等情况
控制字寄存器
Control Word
用于控制浮点运算的行为,设置舍入模式、精度等
浮点寄存器栈
Register Stack
共有 ST(0) - ST(7) 八个寄存器,每个浮点寄存器可以存储一个浮点数值
通常以扩展精度(80位)的格式表示
ST(0)
是栈顶,而ST(7)
是栈底元素。每当执行浮点数操作时,数据都会被推送到 ST(0) 上,并可以对 ST(0) 进行各种运算。其他的浮点数寄存器 (ST(1) - ST(7)) 则可以用于存储其他的操作数或中间结果。