您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第2章 8086微处理器

第2节 8086的寄存器结构

 

  &2.3 8086的寄存器结构

  本节概述:

  8086微处理器共有14个16位寄存器,为了便于描述,现把这些寄存器分成四类:4个数据寄存器、4个指针与变址寄存器,4个段寄存器,以及一个指令指针寄存器和一个标志寄存器,如图2-3所示。

  教学目标:

  掌握各类寄存器的用法,掌握它们的指令隐含用法的操作。

  学习内容:

  数据寄存器

  指针与变址寄存器

  段寄存器

  指令指针与标志寄存器

  §2.3.1 数据寄存器(AX、BX、CX、DX)

  这4个16位的通用寄存器通常是指令系统用来执行算术和逻辑运算操作的。这些寄存器还可以当作8个8位寄存器,供指令系统在字节操作时使用。处理器执行操作时,经常要用数据寄存器暂存操作数或中间结果,访问它要比访问存储器快,有了这样一个快速存取数的地方,就可缩短处理器执行的时间。

  当作为16位数据寄存器使用时,4个数据寄存器命名分别为AX、BX、CX、DX。而作为8位寄存器使用时,分别命名为AH、AL,BH、BL,CH、CL,DH、DL。在8086CPU中,只有这4个数据寄存器中的每一个可以当作两个8位寄存器使用,其他寄存器只能作为一个完整的16位寄存器使用。

  §2.3.2 指针(SP、BP)与变址寄存器(SI、DI)

  表2-1

  程序执行过程中,要经常访问存在存储器中的操作数,所以指令要指出存储单元地址,为了缩短指令代码长度,一般不采用指令中直接给出地址方法,而将地址放在专用寄存器中(寄存器给出编码),修改寄存器内容来达到修改地址目的。这种能存放指令操作数地址的寄存器称为指针与变址寄存器。

  这4个16位的寄存器主要用来产生有效的存储器地址,或实际地址的偏移量。这些寄存器只能当作16位的寄存器来寻址。除产生有效的存储器地址外,这些寄存器还可供指令系统执行算术和逻辑操作。

  在8086的指令系统中,不是所有寄存器都能被每条指令指定的。在许多情况下,指令只能使用一个特定的寄存器或寄存器组去执行它的功能。对于执行特定操作的8086指令,寄存器有一个隐含的用法,如下表2-1所示。该表列举了寄存器隐含特定用法的指令操作。

  §2.3.3 段寄存器(CS、DS、ES、SS)

  在8086CPU中,有地址线20根,它可寻址存储空间1MB。而8086指令给出的地址编码只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。16位地址的寻址空间为64K。为次,要将1MB空间分为如干个段,每段64KB,指令可对特定段进行访问。所以在8086中有4个16位的段寄存器,它们用来识别当前可寻址的4个段:CS识别当前的代码段,DS识别当前的数据段,SS识别当前的堆栈段,而ES则识别当前的附加段。

  一条指令指定了一个段内偏移量,并且段寄存器指定了可供使用的4个段,而选择哪一段则依赖于这些便移量是如何被使用的。一个便移量可能指定下一条执行的指令是一个操作数。所有指令都是从前的代码段中取出的,因此就需要一个含有下一条执行的指令在当前代码段中的偏移量的寄存器,这个寄存器就是IP。取操作数段,一般可以用在指令前放一字节前缀的方法来指定,这个前缀指定从4个段中的哪一个段中取操作数,如果没有这样一个前缀(一般情况),操作数取自当前的数据段,除非偏移地址是从一个指针指示器的内容中计算得到的,在这种情况下,使用当前的堆栈段。若操作数是一条串指令的目的操作数,则使用当前的附加段。

  §2.3.4 指令指针寄存器(IP)和标志寄存器

  IP中的值等于下一条指令相对于当前代码段基地址的偏移量,它与CS一起构成下一条指令的实际地址。IP的值由总线接口单元BIU自动修改,程序不能直接访问它。

  标志寄存器是一个16位的寄存器,只使用其中9位,其中6位作为状态位,反映了指令的操作结果。其他3位作为控制位,用于制CPU的行为。

  §2.4 8086的存储器组织

  本节概述

  本节介绍8086的存储器组织,包括存储器的段结构,物理地址的形成方式,以及8086CPU的存储器结构。通过本节的学习,你能掌握有关8086存储器的构成,应用等知识。对8086CPU的组成有更深的理解。

  本节内容

  1.存储器的段结构

  2.物理地址的产生

  3.8086CPU的存储器接口

  §2.4.1 存储器的段结构

  8086CPU有20条地址总线,能直接访问1MB(220=1MB)的存储空间,其物理地址的范围是00000~FFFFFH。

  8086CPU内部的寄存器都是16位的,如IP、SP、BP、DI、SI等。这些寄存器对地址的运算当然就是16位的,而16位地址值的寻址范围是64KB(216=64KB),因此,把1MB存储器空间分为16个64KB的段,用段寄存器(CS、DS、ES、SS)标识当前使用的段,用16位寄存器(如IP、SP、BP、DI、SI等)的值标识相对于当前段基地址的偏移量,如图2-4所示。

  如何用段寄存器标识当前使用的段?

  用段寄存器的值(16位)表示一个段的基地址高16位,而段的基地址低4位固定为0000B,从而可以标识当前使用的段。

  "段地址:偏移量"这种表示方法称为"逻辑地址",其对应的具体存储器单元的地址称为"物理地址",如图2-5所示。

  程序的段结构:

  程序由指令(又称代码)、数据、堆栈构成,它们有不同的性质和作用。指令控制CPU完成需要的操作,如加、减、乘、除等运算,数据是被操作的对象或操作的结果,堆栈用于临时保存一些数据、地址或CPU状态。一般说来,指令、数据、堆栈分别放在存储器的不同段中,如图2-6所示。

 

  §2.4.2 物理地址的产生

  在程序设计中,为了方便,一般采用逻辑地址(16位段值:16位偏移量)。CPU根据逻辑地址找出存储器的物理地址(20位)。CPU计算物理地址的方法是:把段寄存器中的16位段值左移4位,加上偏移量,构成20位物理地址,如图2-7所示。

  物理地址的计算是由CPU的总线接口单元BIU自动完成的,BIU自动选择某个段寄存器进行计算。

  取指令时,BIU选择CS,把CS的值左移4位,加上IP提供的16位偏移量,构成指令的20位物理地址。

  读写数据时,BIU选择DS或ES,把DS/ES的值左移4位,加上寻址方式提供的16位偏移量,构成数据的20位物理地址。

  堆栈操作时,BIU选择SS,把SS的值左移4位,加上SP提供的16位偏移量,构成堆栈的20位物理地址。

  §2.4.3 8086CPU的存储器接口

  在物理连接上,8086CPU把1MB存储空间分为两个512KB的存储体(Bank):偶数地址存储体和奇数地址存储体。偶数地址存储体的数据线与CPU数据总线低8位(D7~D0)相连,奇数地址存储体的数据线与CPU数据总线高8位(D15~D8)相连。用地址A0和信号BHE区分两个存储体。

  表2-2 存储体的选择

  地址线A19~A1同时连到两个存储体上,A0=0时选中偶数地址存储体,BHE=0时选中奇数地址存储体,如图2-8所示。

由于8086CPU有16位数据总线,它与存储器之间,一次传送既可以同时传送两个字节数据,也可以单独传送一个字节数据,传送情况见表2-2所示。

  对于8088CPU,只有8位数据总线,它与存储器之间,一次传送只能传送一个字节数据。