8086和8088CPU按功能可分为两个独立的部分:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit)
BIU:
EU
1. 对来自指令流队列中的指令译码并执行,实施算术逻辑运算操作。
BIU和EU是两个独立的部件,两个可以同时独立进行操作,形成指令流水线结构。
共有4个16位寄存器即AX,BX,CX,DX,通常用来暂存计算过程中的操作数,运算结果或者其他信息。它们既可以当做一个16位寄存器使用,也可以分成两个8位寄存器来使用,高8位分别为AH,BH,CH,DH,底8位分别为AL,BL,CL,DL
存放正在或正待执行的各个段的段首址,其值为相应段的段值
通常CS划定并控制当前程序区,DS和ES划定并控制数据区,SS划定并控制堆栈区。
指针寄存器和变址寄存器共有4个16位寄存器,即SP,BP,SI,DI,主要用于在访问存储器单元时提供16位偏移地址
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之间寻址。)
存储器地址分段:从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指向。