8086和8088CPU按功能可分为两个独立的部分:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit)
BIU:
完成CPU与存储器之间的信息传送总线控制IO数据传送逻辑地址与物理地址进行转换从存储器中取指令送至指令流队列排队取出执行指令时所需要的操作数,并传送给EU完成运算和操作EU
对来自指令流队列中的指令译码并执行,实施算术逻辑运算操作。BIU和EU是两个独立的部件,两个可以同时独立进行操作,形成指令流水线结构。
共有4个16位寄存器即AX,BX,CX,DX,通常用来暂存计算过程中的操作数,运算结果或者其他信息。它们既可以当做一个16位寄存器使用,也可以分成两个8位寄存器来使用,高8位分别为AH,BH,CH,DH,底8位分别为AL,BL,CL,DL
AX(accumulator):累加器,它是算术运算的主要寄存器,此外还可以作为乘,除运算及输入,输出的专用寄存器。BX(Base):基址寄存器,常用于存放存储区的起始地址。CX(Count):计数寄存器,常用于循环操作或字符操作中的计数器。DX(Data):该寄存器常与AX配合,用于双字长运算,DX存放高位字,AX存放底字位,此外还可以用于输入、输出指令中存放外部设备接口的端口地址。存放正在或正待执行的各个段的段首址,其值为相应段的段值
CS(Code Segment):代码段寄存器DS(Data Segment):数据段寄存器ES(Extra Segment):附加段寄存器SS(Stack Segment):堆栈段寄存器通常CS划定并控制当前程序区,DS和ES划定并控制数据区,SS划定并控制堆栈区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldxGuvka-1578219559686)(http://i.imgur.com/mJYGYiR.png)]
指针寄存器和变址寄存器共有4个16位寄存器,即SP,BP,SI,DI,主要用于在访问存储器单元时提供16位偏移地址
SP(Stack Pointer):堆栈指针寄存器,主要用于存放当前堆栈段的段内偏移地址,即栈顶地址BP(Base Pointer):基址指针寄存器,主要用于提供栈内某个单元的偏移地址,与SS连用可以访问堆栈中的任意一个存储单元。SI(Source Index):源变址寄存器,在串操作指令中,SI作为隐含的源变址寄存器与DS联用,以确定数据段中存储单元地址,然后根据DF标志,SI进行自动增量或自动减量。DI(Destination Index):目的变址寄存器,在串操作指令中,DI作为隐含的目的变址寄存器与ES联用,以达到在附加段中寻址的目的,然后根据DF标志,DI进行自动增量和自动减量。IP(Instruction Pointer):指令指针寄存器,用来存放代码段中指令的偏移地址。在程序运行中,IP与CS联用,以确定下一条指令的物理地址。该寄存器作为专用寄存器,一般不能用来存放其他数据
FR(Flag Register):标志寄存器,主要用于反应处理器的状态和运算结果的某些特征,包含9个标志,6个是条件码标志位,3个值控制标志位。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8GeM5nA-1578219559687)(http://i.imgur.com/o7e7jOC.png)]
**在存储器中,信息是以字节(8个二进制位)为最小存储单位,每一个字节单元分配一个唯一的存储器地址。**8088/8086CPU有20根地址线,地址从00000H开始到0FFFFFH结束。地址用无符号二进制表示。但为了便于书写,用16进制表示。
一个字数据在存储器中存于相邻的两个字单元。数据的低字节存入低地址单元,高字节存入高字节单元。因此,按地址递增方式存储一个字数据时,应先存入低字节数据,再存入高字节数据。在访问字单元时,一般给出的字单元地址的低地址
要访问一个存储器单元,必须得到该存储单元的物理地址,物理地址由段地址和偏移地址合成。(由于8086/8088用于寻址的寄存器都是16位BX,BP等,而16位寄存器只能寻址64KB的地址范围;但8086/8088CPU具有20根地址线,寻址可达1MB地址范围,即00000H~0FFFFFH之间寻址。)
**物理地址(PA : physical address)**是由8086/8088的地址引线送出的20位地址码。如果8086/8088要访问存储器的任意单元,则需要提供20位的二进制数给地址总线,才能访问。**段首址(SB:segment base)**是存储器中的每一段的起始地址,又称为基地址。**偏移地址(EA :effective address)**是相对于某段首地址的段内偏移量,用16位二进制代码表示,写成4位16进制数。**逻辑地址(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指向。