8086CPU组成(16位)
CPU包括三个部分,运算单元、数据单元和控制单元。
- 运算单元:
运算单元只管算,例如做加法、做位移等等。但是,它不知道应该算哪些数据,运算结果应该放在哪里。 - 数据单元:
数据单元包括CPU内部的缓存和寄存器组,空间很小,但是速度飞快,可以暂时存放数据和运算结果。
AX、BX、CX、DX、SP、BP、SI、DI。共8个16位通用寄存器
。
这些寄存器主要用于在计算过程中暂存数据。
其中AX、BX、CX、DX可以分成两个8位的寄存器来使用,分别是AH、AL、BH、BL、CH、CL、DH、DL,其中H就是High(高位),L就是Low(低位)的意思。 - 控制单元:
控制单元是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令。这个指令会指导运算单元取出数据单元中的某几个数据,计算出个结果,然后放在数据单元的某个地方。
IP寄存器就是指令指针寄存器
(Instruction Pointer Register),指向代码段中下一条指令的位置。CPU会根
据它来不断地将指令从内存的代码段中,加载到CPU的指令队列中,然后交给运算单元去执行。
4个16位的段寄存器
,分别是CS、DS、SS、ES
CS和DS中都存放着一个段的起始地址。代码段的偏移量在IP寄存器中,数据段的偏移量会放在通用寄存
器中。
8086的地址总线地址是20位。怎么凑够这20位呢?方法就是“起始地址*16+偏移量”
,也就是把CS和DS中的值左移4位,变成20位的,加上16位的偏移量,这样就可以得到最终20位的数据地址。
一个段最大的大小是2^16=64k - 工作过程:
CPU的控制单元里面,有一个指令指针寄存器,它里面存放的是下一条指令在内存中的地址。控制单元会不停地将代码段的指令拿进来,先放入指令寄存器。
当前的指令分两部分,一部分是做什么操作,例如是加法还是位移;一部分是操作哪些数据。
要执行这条指令,就要把第一部分交给运算单元,第二部分交给数据单元。
数据单元根据数据的地址,从数据段里读到数据寄存器里,就可以参与运算了。运算单元做完运算,产生的结果会暂存在数据单元的数据寄存器里。最终,会有指令将数据写回内存中的数据段。
32位CPU组成
- 对比16位的区别
① 通用寄存器和指令指针寄存器IP,扩展成32位的,同样也兼容16位的。
② 段寄存器(Segment Register)不兼容。CS、SS、DS、ES仍然是16位的,但是不再是段的起始地址。段的起始地址放在内存的某个地方。这个地方是一个表格,表格中的一项一项是段描述符(Segment Descriptor)
。这里面才是真正的段的起始地址。而段寄存器里面保存的是在这个表格中的哪一项,称为选择子(Selector)
。这样,将一个从段寄存器直接拿到的段起始地址,就变成了先间接地从段寄存器找到表格中的一项,再从表格中的一项中拿到段起始地址。
③ 我们将前一种模式称为实模式(Real Pattern)
,后一种模式称为保护模式 (Protected Pattern)
,通过切换模式来实现兼容.