汇编语言程序设计
上QQ阅读APP看书,第一时间看更新

第二节 Intel 8086/8088 CPU结构与可编程寄存器

一、8086/8088 CPU功能结构

处理器功能结构.mp4

Intel公司于1978年推出了标准16位微处理器8086。由于它的内部、外部数据总线宽度都为16位,产品推向市场后,当时8位接口芯片出现兼容问题,于是又生产了准16位微处理器8088,将外部数据总线改为8位,以解决与外围电路的兼容问题。8086与8088 CPU结构与原理除上述差别外,从软件设计角度几乎没有什么差别。因此,本书对8086与8088不加以区分。

Intel 8086/8088 CPU功能结构如图2-4所示。 CPU采用指令流水线结构,把访问存储器(含取指令、存取数据操作等)与执行指令分成两个独立单元:总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execute Unit)。

图2-4 Intel 8086/8088 CPU功能结构

执行单元EU的功能是从BIU的指令队列中取出指令代码,然后执行指令所规定的全部功能。如果在执行指令过程中,需要向存储器或I/O端口传送数据,EU向BIU发出访问命令,并提供访问的地址和数据。

总线接口单元BIU负责CPU与存储器及I/O端口的信息传送。具体功能是根据段寄存器CS和指令指针IP形成20位物理地址,从存储器中取出指令,并暂存在指令队列中,等待EU取走执行。如EU发出访问存储器或I/O端口的命令时,BIU根据EU提供的地址和数据,进入外部总线周期,存取数据。

由此可知,EU和BIU是既分工又合作的两个独立单元。它们的操作是并行的,分别完成不同的任务,因而大大加快了指令执行速度。

二、CPU内部寄存器组

对于汇编语言指令,被操作的数据或运算的中间结果可以放在CPU内部的寄存器中,也可以放在存储器(内存)中。尤其是CPU内部的寄存器,在指令中使用的频度最大,因为访问寄存器要比访问存储器更快捷,汇编语言程序设计者掌握CPU中各寄存器的用途是非常重要的。

Intel 8086/8088 CPU内部共有14个16位寄存器,如图2-5所示。根据其作用可分为通用寄存器、段寄存器、指令指针、标志寄存器等。

图2-5 Inter 8086/8088 CPU内部寄存器

(一)通用寄存器

通用寄存器共有8个,它们的作用是存放参加操作的数据或程序运算的结果,它们的特点是具有良好的通用性。在大多数情况下,这些寄存器可以互换地进行各种操作。例如,在程序的一条指令中把一个数据保存在BX中或是其他任意一个通用寄存器中是没有区别的。但有少数指令又规定了某些寄存器具有特定的用法。例如,在循环指令(loop)中,循环次数必须放在CX中;两个字节相乘的指令中,其中一个数必须放入AL中,而结果积隐含在AX中。因此,习惯上把CX叫作计数器,把AX叫作累加器,这就是每个寄存器用途名称的由来。

8个通用寄存器根据使用的情况可分为如下3种。

1. 数据寄存器

它包含AX、BX、CX、DX 4个寄存器,其特点是它们中的每一个,既可作为十六位寄存器来使用,也可作为两个8位寄存器单独使用。因此,这4个十六位寄存器也可以看成是8个独立的八位寄存器AH、AL、BH、BL、CH、CL、DH、DL,这些寄存器的双重性使得程序很容易处理字节和字信息。

2. 间接寻址寄存器

间接寻址寄存器由2个基址寄存器BX、BP和2个变址寄存器SI、DI构成,它们都是16位寄存器。它们的特点是可以用来存放程序中要访问的内存单元的偏移地址(使用方法见第三章),也可以作为通用寄存器使用,以存放操作数和运算结果,这一点和数据寄存器的作用是没有差别的。

3. 指针寄存器

指针寄存器包含堆栈指针SP和基指针BP,当它们作为存放地址的寄存器使用时,特定地指向内存中的堆栈段。SP的特殊性还在于调用和返回指令以及中断指令等操作都会引起SP中地址的自动改变。当然SP和BP同样可以作为数据寄存器使用。

(二)段寄存器

Intel 8086/8088 CPU将存储器划分成若干段(如图2-6所示),把将要运行的程序各部分(代码、数据等)分别放在不同的存储段中。每个存储段用一个段寄存器来指示它的首地址(即段地址)。当CPU访问某存储单元(如取指令或数据存取操作数)时,就必须明确该存储单元在哪个段寄存器指向的存储段中,同时给出该存储单元在这个存储段内的偏移地址(即偏移量)。一个存储单元与它所在段的段基址之间的距离(以字节数计)叫该存储单元的偏移地址,也叫偏移量。

图2-6 用段寄存器指明存储段

一个程序把存储器划分成多少个存储段可以是任意的,但用CS、DS、ES、SS段寄存器分别指明的段叫作当前段。在程序运行的任何时刻,最多只能有4个当前段。4个段寄存器有各自的作用,不能互换。CS一定是指向存放有指令代码的代码段,SS指向被开辟为堆栈区的堆栈段,DS和ES通常指向存放数据和工作单元的数据段。

(三)指令指针IP

IP是程序不能访问的寄存器,它与其他计算机和微处理器中程序计数器PC的作用类同,是指令的地址指针。在程序运行期间,CPU自动修改IP的值,使它始终保持为正在执行指令的下一条指令代码的起始字节的偏移量。

用户编制的程序不能直接访问IP,即不能用指令去取出IP的值或给IP设置给定值。但是某些指令的执行可以自动修改IP的内容。例如执行转移指令JMP、JNE等,把目的地址的偏移量送入IP;执行调用子程序指令CALL时,IP原有内容自动压入堆栈,把子程序入口地址偏移量自动送入IP。当从子程序返回主程序时,返回指令RET又自动从堆栈中弹回原有IP的内容送回IP。

(四)标志寄存器

8086/8088 CPU设置了1个十六位标志寄存器,用来反映微处理器在程序运行时的状态。标志寄存器中定义了9个标志位,其中6个标志位(CF、PF、AF、ZF、SF、OF)作为状态标志,状态标志随指令的执行动态改变着,记载每一条指令刚执行完后的某些特征。另外3个标志位(TF、IF、DF)作为控制标志,在执行某些指令时起控制作用。图2-7中除指明控制标志位外,其余均为状态标志位。

图2-7 标志寄存器

1. 状态标志

(1)进位标志CF(Carry Flag)。

当进行算术运算时,如最高位(对字操作是第15位,对字节操作是第7位)产生进位(加法运算)或借位(减法运算),则CF置1,否则置0。CF也可在移位类指令中使用,用它保存从最高位(左移时)或最低位(右移时)移出的代码(0或1)。

(2)奇偶标志PF(Parity Flag)。

若操作结果低八位中含有1的个数为偶数时,则PF置1,否则PF置0。PF只检查操作结果的低八位,与该指令操作数的长度无关。

(3)辅助进位标志AF(Auxiliary Carry Flag)。

当进行算术运算时,若低半字节向高半字节产生进位(加法)或借法(减法)时,则AF置1,否则置0。AF只反映运算结果的低八位,与操作数长度无关,它是用于十进制运算的调整。

(4)零标志ZF(Zero Flag)。

若运算结果各位全为0时,则ZF置1,否则置0。

(5)符号标志SF(Sign Flag)。

把运算结果视为带符号数。当运算结果为负数时,则SF置1,为正数时,则置0。所以,SF与运算结果的最高位(符号位)相一致。

(6)溢出标志OF(Overflow Flag)。

当运算的结果超过机器用补码所能表示数的范围时,则OF置1,否则置0。产生溢出一定是同号数相加或异号数相减的情况。

2. 控制标志

以下3个标志为控制标志。

(1)陷阱标志(或单步标志)TF(Trap Flag)。

当TF=1时,在执行完一条指令后就停下来(产生单步中断),然后由单步中断处理程序把TF置0。TF供调试程序用,如在调试程序debug中,可以使用单步命令,在每条指令执行后就停下来进行检查。

(2)中断标志IF(Interrupt Flag)。

当IF=1时,允许响应可屏蔽中断。相反,IF=0时,则不允许响应可屏蔽中断。可用开中断指令STI和关中断指令CLI设置IF的状态。

(3)方向标志DF(Direction Flag)。

DF为串操作指令规定增减方向。当DF=0时,串操作指令自动地使变址寄存器(SI和DI)递增(即串操作是从低地址到高地址方向进行的)。当DF=1时,则自动地使变址寄存器递减(即串操作是从高地址到低地址方向进行的)。DF的状态可用STD和CLD指令设置。