8086/8088CPU内部结构

8086/8088的功能结构

8086和8088CPU按功能可分为两个独立的部分:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit)

BIU:

  1. 完成CPU与存储器之间的信息传送
  2. 总线控制
  3. IO数据传送
  4. 逻辑地址与物理地址进行转换
  5. 从存储器中取指令送至指令流队列排队
  6. 取出执行指令时所需要的操作数,并传送给EU完成运算和操作

EU
1. 对来自指令流队列中的指令译码并执行,实施算术逻辑运算操作。

BIU和EU是两个独立的部件,两个可以同时独立进行操作,形成指令流水线结构。

8086/8088的寄存器结构

数据寄存器

共有4个16位寄存器即AX,BX,CX,DX,通常用来暂存计算过程中的操作数,运算结果或者其他信息。它们既可以当做一个16位寄存器使用,也可以分成两个8位寄存器来使用,高8位分别为AH,BH,CH,DH,底8位分别为AL,BL,CL,DL

  1. AX(accumulator):累加器,它是算术运算的主要寄存器,此外还可以作为乘,除运算及输入,输出的专用寄存器。
  2. BX(Base):基址寄存器,常用于存放存储区的起始地址。
  3. CX(Count):计数寄存器,常用于循环操作或字符操作中的计数器。
  4. DX(Data):该寄存器常与AX配合,用于双字长运算,DX存放高位字,AX存放底字位,此外还可以用于输入、输出指令中存放外部设备接口的端口地址。

段寄存器

存放正在或正待执行的各个段的段首址,其值为相应段的段值

  1. CS(Code Segment):代码段寄存器
  2. DS(Data Segment):数据段寄存器
  3. ES(Extra Segment):附加段寄存器
  4. SS(Stack Segment):堆栈段寄存器

通常CS划定并控制当前程序区,DS和ES划定并控制数据区,SS划定并控制堆栈区。

指针寄存器和变址寄存器

指针寄存器和变址寄存器共有4个16位寄存器,即SP,BP,SI,DI,主要用于在访问存储器单元时提供16位偏移地址

  1. SP(Stack Pointer):堆栈指针寄存器,主要用于存放当前堆栈段的段内偏移地址,即栈顶地址
  2. BP(Base Pointer):基址指针寄存器,主要用于提供栈内某个单元的偏移地址,与SS连用可以访问堆栈中的任意一个存储单元。
  3. SI(Source Index):源变址寄存器,在串操作指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中存储单元地址,然后根据DF标志,SI进行自动增量或自动减量。
  4. DI(Destination Index):目的变址寄存器,在串操作指令中,DI作为隐含的目的变址寄存器与ES联用,以达到在附加段中寻址的目的,然后根据DF标志,DI进行自动增量和自动减量。

控制寄存器

IP寄存器

IP(Instruction Pointer):指令指针寄存器,用来存放代码段中指令的偏移地址。在程序运行中,IP与CS联用,以确定下一条指令的物理地址。该寄存器作为专用寄存器,一般不能用来存放其他数据

FR(Flag Register):标志寄存器,主要用于反应处理器的状态和运算结果的某些特征,包含9个标志,6个是条件码标志位,3个值控制标志位。

存储器结构与堆栈

存储器结构

**在存储器中,信息是以字节(8个二进制位)为最小存储单位,每一个字节单元分配一个唯一的存储器地址。**8088/8086CPU有20根地址线,地址从00000H开始到0FFFFFH结束。地址用无符号二进制表示。但为了便于书写,用16进制表示。

一个字数据在存储器中存于相邻的两个字单元。数据的低字节存入低地址单元,高字节存入高字节单元。因此,按地址递增方式存储一个字数据时,应先存入低字节数据,再存入高字节数据。在访问字单元时,一般给出的字单元地址的低地址

要访问一个存储器单元,必须得到该存储单元的物理地址,物理地址由段地址和偏移地址合成。(由于8086/8088用于寻址的寄存器都是16位BX,BP等,而16位寄存器只能寻址64KB的地址范围;但8086/8088CPU具有20根地址线,寻址可达1MB地址范围,即00000H~0FFFFFH之间寻址。)

  1. 物理地址(PA : physical address)是由8086/8088的地址引线送出的20位地址码。如果8086/8088要访问存储器的任意单元,则需要提供20位的二进制数给地址总线,才能访问。
  2. 段首址(SB:segment base)是存储器中的每一段的起始地址,又称为基地址。
  3. 偏移地址(EA :effective address)是相对于某段首地址的段内偏移量,用16位二进制代码表示,写成4位16进制数。
  4. 逻辑地址(LA :logical address)是程序中对存储器地址的一种表示方法,由某段的段首址和段内偏移地址表示。一般写成”段首址:偏移地址”,如0B47H:0080H。

存储器地址分段:从0地址开始,把1MB的存储器分成若干段,16字节为一小段,段的起始地址必须从任一小段的首地址开始,也就是说,当一个段开始的物理地址表示成20位的二进制地址码时,最低4位是0。

每段的最小容量是16B,最大为64KB,这样段内地址就可以用16位来表示。实际上,可以根据编程的需要来确定段的大小,它可以是64KB范围内的任意多个字节。

存储器分段后,每个段的首地址保存在8088/8086内部的CS,DS,SS,ES这四个16位寄存器中,可以对段寄存器设置不同的值,指向不同的段。

物理地址=段首址×16D+偏移地址等价于物理地址=段首址×10H+偏移地址(在段首址后面加个0在与偏移地址相加)

0ABCDH:0234H:
0ABCDH×16D+0234H=ABCD0H+0234H=0ABE04H

代码段

代码段是由汇编指令组成的程序段,其各条指令组合起来可以完成各项预定的任务。代码段的段首址由CS段寄存器指向,偏移量由IP寄存器指向。

汇编程序规定,每个段都要给出一个段名,作为这个段的名称,并且该段名可以代表该段在内存的段首址。

数据段

数据段在汇编程序中可有可无,他主要用于定义数据,从而给代码段提供使用,代码段主要由指令构成主体,而数据段主要由伪指令构成主体,数据段的段首址由DS指向。

堆栈段

堆栈段在程序中可有可无,如果没有的话。堆栈段一般用于保存程序的返回地址,还可以传递参数及保存一些变量值,堆栈段的的段首址由SS指向,偏移量由SP指向。

附加段

附加段也是用于定义数据,从而给代码段使用,附加段的段首址由ES指向。

你可能感兴趣的:(8086/8088CPU内部结构)