http://mcit.xjtu.edu.cn/wlkj/wykj/ch2/ch2_2_4.htm
2.2.4 8088/8086的功能结构
一、8088/8086的结构
8086与8088在结构上都是由执行单元EU和总线接口单元BIU两大部分构成。 以下是8088/8086的内部结构框图。
l 执行单元EU负责执行指令。EU在工作时不断地从指令队列取出指令代码,并完成指令 所要求的操作。它由算术逻辑单元ALU、通用寄存器REGs、标志寄存器FLAGS和EU控制部件组成。 各部件的功能如下:
ALU:即运算器,进行算术、逻辑、移位、偏移地址计算等各种运算。
FLAGS:存放运算结果的特征,如进借位、是否为零、奇偶性、溢出等。
REGs:临时存放操作数、运算结果以及操作数地址等。
EU控制部件:接收指令队列中的指令,进行指令译码、分析,形成各种控制信号,实现EU各个部件完成规定动作的控制。
l 总线接口单元BIU负责CPU与存储器、I/O接口之间的信息 (包括数据、地址、控制命令等)传送。 包括生成访问存储器所需的20位的物理地址、不断从内存中取指令并送到指令队列、以及配合EU对指定的内存单元或者外设端口进行数据存取操作。BIU由段寄存器、指令指针寄存器IP、指令队列、地址加法器以及总线控制逻辑组成。 各部件的功能如下:
总线控制逻辑:CPU与外总线之间的接口,实现指令、数据以及其他外部信息的存取。
段寄存器:存放存储器段的段基地址。
指令指针寄存器:存放当前要读取的指令的地址。它相当于前面介绍过的指令计数器PC。
指令队列:8088和8086的指令 队列长度分别为4字节和6字节,为FIFO(先进先出)结构。当EU从指令队列中取走指令,指令队列出现空字节时,BIU就自动执行一次取指令周期,从内 存中取出后续的指令代码放入队列中。当EU需要数据时,BIU根据EU给出的地址,从指定的内存单元或外设中取出数据供EU使用。当运算结束时,BIU将 运算结果送入指定的内存单元或外设。当指令队列空时,EU就等待,直到有指令为止。若BIU正在取指令,EU发出访问总线的请求,则必须等BIU取指令完 毕后,该请求才能得到响应。一般情况下,程序顺序执行,当遇到跳转指令时,BIU就使指令队列复位,从新地址取出指令,并立即传给EU去执行。指令队列在 EU和BIU之间起到了“桥梁”的作用(或者说是一个指令“传送带”,源源不断地把指令从BIU送到EU),使BIU和EU可以并行工作。
地址加法器:用来产生20位的物理地址。8086/8088的寄存器都是16位的,无法装载20位的物理地址。为了解决这个问题,8088/8086采用了将地址空间分段的方法,即将220(1MB) 的地址空间分为若干个64KB的段,然后用段基址加上段内偏移来访问物理存储器。8088/8086规定,分段总是从以16字节为单位的边界处开始,所以 段的起始地址最低四位总是0,即XXXX0H,这样每个段的基地址只需用16位便可表示。在不严格的情况下,也可以说段基址是段起始地址的高16位(若段 是以64KB为边界,则这种说法就是完全正确的)。由于段基址的这个特点,BIU在计算存储器的物理地址时,即是将段基址左移4位然后与段内偏移相加获 得。如下图所示。
二、8088/8086的内部寄存器
8088/8086内部有14个16位的寄存器。按其功能可分为三大类:通用寄存器(8个),段寄存器(4个)和控制寄存器(2个),如下图。
1. 通用寄存器
通用寄存器包括数据寄存器、地址指针寄存器和变址寄存器。
(1)数据寄存器(AX、BX、CX、DX)
数据寄存器一般用于存放参与运算的数据或运算的结果。每一个数据寄存器都是16位寄存器,但又可将高、低8位分别作为两个独立的8位寄存器使用。它们的高 8位记作AH、BH、CH、DH,低8位记作AL、BL、CL、DL。这种灵活的使用方法给编程带来极大的方便,既可以处理16位数据,也能处理8位数 据。
数据寄存器除了作为通用寄存器使用外,它们还有各自的习惯用法。
l AX(Accumulator)称为累加器,常用于存放算术逻辑运算中的操作数和结果,另外所有的I/O指令都使用AX与外设接口传送信息。
l BX(Base)称为基址寄存器,常用来存放访问内存时的基地址。
l CX(Counter)称为计数寄存器,在循环和串操作指令中用作计数器。
l DX(Data)称为数据寄存器,在寄存器间接寻址的输入输出指令中存放I/O地址。另外,在做双字长乘除法运算时,DX与AX联合起来存放一个双字长数(32位),DX存放高16位,AX存放低16位。
(2)地址指针寄存器(SP、BP)
l SP(Stack Pointer)称为堆栈指针寄存器,它在堆栈操作中存放栈顶的偏移地址,压栈或出栈操作时,SP会自动调整指向新的栈顶。
l BP(Base Pointer)称为基址指针寄存器。一般也常用来存放访问内存时的基地址。但它通常是与SS寄存器配对使用。
作为通用寄存器,SP和BP也可以存放普通操作数。但实际上,它们更经常更重要的用途是存放内存单元的偏移地址,特别是在访问堆栈时作为指向堆栈的指针(因为它们的默认段寄存器都是SS)。
(3)变址寄存器(SI、DI)
l SI(Source Index)称为源变址寄存器,常常在变址寻址方式中作为源操作数的索引指针。
l DI(Destination Index)称为目的变址寄存器,常常在变址寻址方式中作为目的操作数的索引指针。
作为通用寄存器,SI和DI也可以存放普通操作数。但大多数情况下都是用来存放内存单元的偏移地址。
2. 段寄存器(CS、SS、DS、ES)
4个16位段寄存器用来存放当前可寻址的四个段的段基地址。
l CS(Code Segment Register)称为代码段寄存器,指示当前执行程序所在存储器段。用户程序不能直接对CS进行操作。
l SS(Stack Segment Register)称为堆栈段寄存器,指示当前程序使用的堆栈所在的存储器段。
l DS(Data Segment Register)称为数据段寄存器,指示当前程序使用的数据所在的存储器段。
l ES(Extra Segment Register)称为附加段寄存器,指示当前程序使用的数据所在的另外一个存储器段。
3. 控制寄存器(IP、FLAGS)
l IP(Instruction Pointer)称为指令指针寄存器,用以存放预取指令的偏移地址。CPU取指令时总是以CS为段基址,以IP为偏移地址。每取一条指令,IP都会自动指向下一条指令。用户程序不能直接对IP进行操作。
l FLAGS称为标志寄存器,它是16位寄存器,但只使用其中的9位(包括6个状态标志和3个控制标志),如下图所示。
状态标志位记录了算术和逻辑运算结果的一些特征。如结果是否为零,是否有进借位,结果是否溢出等。
CF 进位标志位。当进行加(减)法运算时,若最高位有进(借)位时CF=1,否则CF=0。
PF 奇偶标志位。当运算结果中“1”的个数为偶数时PF=1,否则PF=0。
AF 辅助进位位。在加(减)法操作中,Bit3向Bit4有进位(借位)时AF=1,否则AF=0。
ZF 零标志位。当运算结果为零时ZF=1,否则ZF=0。
SF 符号标志位。当运算结果的最高位为1时SF=l,否则SF=0。
OF 溢出标志位。当算术运算的结果超出了带符号数的范围时OF=l,否则OF=0。
控制标志位用于设置控制条件。控制标志被设置后便对其后的操作产生控制作用。
TF 跟踪标志位。TF=1使CPU处于单步执行指令的工作方式,即每执行一条指令,就自动产生一次单步中断,从而能够逐条指令地跟踪程序的运行。
IF 中断允许标志位。IF=1使CPU可以响应可屏蔽中断请求。IF=0禁止响应可屏蔽中断请求。IF的状态对非屏蔽中断及内部中断没有影响。
DF 方向标志位。DF=1使串操作按减地址方式进行。DF=0使串操作按增地址方式进行。
【例】8088/8086 ALU执行完以下加法操作后,各状态标志位的内容是什么?
8234H + 9BCDH
解:把上述16进制数加法写成二进制数加法
1000 0010 0011 0100
+ 1001 1011 1100 1101
1 0001 1110 0000 0001
·最高位有进位,所以CF=1;
·结果中包含5个“1”,1的个数为奇数,所以PF=0;
·bit3向bit4有进位,所以AF=1;
·结果不为零,所以ZF=0;
·结果的符号位为0,所以SF=0;
·结果超出了16位有符号数的范围,所以OF=1。(从两个负数相加结果为正数也可以看出结果溢出)