第2章 IBM-PC计算机系统概述

汇编语言是一种符号化的面向机器的语言,所以介绍汇编语言编程需要基于一种机器模型。本章主要以Intel处理器为基础从CPU的内部结构、寄存器的功能、存储器组织以及外设等方面讲述IBM-PC计算机系统的构成。

2.1 Intel8086/8088CPU的功能结构

CPU在处理存储在存储器中的程序时,总是有规律地按以下步骤工作:

(1)从存储器中取出一条指令;

(2)分析指令的操作码;

(3)(如果需要)从存储器读取操作数;

(4)执行该指令;

(5)(如果指令要求)将结果写入存储器;

(6)重复(1)~(5)。

8086/8088 CPU采用了流水线结构,它将上述步骤分配给CPU内两个独立的处理单元:执行单元(EU)和总线接口单元(BIU)。执行单元主要负责指令的分析与执行工作;接口部件单元主要负责取指令和存取操作数。这两个单元并行工作,在分析和执行指令的同时进行存取操作。由于EU执行的是BIU事先从存储器中取出的指令,多数情况下取指令的时间“消失”了,从而加快了程序的运行速度。8086/8088 CPU的功能结构如图2.1所示。

图2.1 8086/8088 CPU结构框图

2.1.1 执行单元与接口部件单元

执行单元EU包括一个16位算术/逻辑单元ALU,一个16位状态标志寄存器,一组数据寄存器,一组指针和变址寄存器以及数据暂存器和EU控制电路。所有的寄存器和数据线都是16位的,以加快内部的传送过程。EU不直接同外部总线相连,它从总线接口单元BIU的指令队列中获取指令。执行指令时,若需要访问存储器或外部设备,EU就向BIU发出操作请求,由BIU完成相应的操作。

总线接口单元BIU包括一组16位段寄存器(CS、DS、ES、SS),一个16位的指令指示器,指令队列,地址加法器和总线控制电路。其中指令队列是一个内部的RAM阵列,它类似一个先进先出的栈。EU执行指令过程中,BIU始终“提前”从存储器中预取出下面可能被执行的指令填入队列,若指令队列中出现空字节,且EU又没有请求BIU进行数据的存取操作,BIU就会自动执行取指令操作,以填满指令队列。大多数情况,指令队列中始终有指令,所以EU不必等待BIU取指令,若EU执行的是一条转移指令,则BIU会使指令队列复位,从新的地址取出指令并直接送给EU执行,接着BIU会取入后续指令来重填指令队列。

寄存器在计算机中起着非常重要的作用。每个寄存器相当于运算器中的一个存储单元,但它的存取速度比存储器快得多,可以与ALU等部件保持同步。寄存器主要用于存储计算过程中所需的信息或计算的中间、最终结果。

8086/8088CPU内部工作寄存器包括14个16位的寄存器。它们按功能可分为通用寄存器、控制寄存器组和段寄存器组。寄存器结构如图2.2所示。

图2.2 寄存器结构图

1.通用寄存器

通用寄存器包括数据寄存器、地址指针和变址寄存器。

(1)数据寄存器

数据寄存器AX、BX、CX、DX主要用来保存算术运算或逻辑运算的操作数、中间结果。这些寄存器的存在,避免了每一次运算都需要访问存储器,从而节约CPU的时间。以上这四个寄存器既可以作为一个16位寄存器使用,也可以分别作为两个8位的寄存器使用。AX可分为AH(高字节8位)和AL(低字节8位),BX可分为BH、BL,CX可分为CH、CL,DX可分为DH、DL。数据寄存器的双重性使得8086/8088非常容易处理字和字节数据。

数据寄存器既有通用性,又有专用性,其用途如表2.1所示。

表2.1 数据寄存器的用途

指令中规定的专门用途,可以缩短指令代码长度或者使这些寄存器具有隐含的性质,以简化指令的书写形式。根据数据寄存器的某些专门用途,又常把AX、BX、CX、DX分别称为累加器,基址寄存器,计数寄存器和数据寄存器。

(2)地址指针及变址寄存器

包括基址指针BP、堆栈指针SP以及变址寄存器SI和DI。它们主要用于保存段内的偏移量,也可以像数据寄存器一样在运算过程中存放操作数,但只能以字(16位)为单位使用。做段内寻址时,SP称为堆栈指针寄存器,BP称为基址指针寄存器,它们都可以与SS段寄存器一起确定堆栈中的某一存储单元的物理地址。SP用来指示栈顶的偏移地址,堆栈操作的PUSH和POP指令均从SP寄存器得到现行堆栈段内的偏移量。BP可作为堆栈区中的一个基地址,以便访问堆栈中的某一存储单元。SI(源变址寄存器)、DI(目的变址寄存器)常用于字符串操作指令中保存操作数的偏移量。源操作数的偏移量存放于SI中,而目的操作数的偏移量存放于DI中。其用途如表2.2所示。

表2.2 指针和变址寄存器的用途

2.段寄存器

段寄存器用来存放段地址。段寄存器组包括代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS和附加段寄存器ES。

在8086/8088系统中,把1MB的存储空间划分为若干个逻辑段,段地址存放在段寄存器中,其中CS存放当前代码段的段地址,指令总是从这个段取出;SS存放当前堆栈的段地址,堆栈操作所处理的就是此段中的数据;DS存放当前数据段的段地址,指令中所涉及的存储器操作数就存放在此段中;ES存放当前附加段的段地址,附加段通常也用来存放存储器的操作数。关于段的概念将在第2.2节进一步讨论。

3. 指令指示器IP

指令指示器IP是一个16位的寄存器,它用于存放代码段中指令的偏移地址,IP总是包含下一条要取出的指令或当前指令的下一个字节机器码的偏移地址。根据CS中存放的代码段地址和IP的内容,形成待取指令在存储器中的20位物理地址。程序在顺序执行期间,IP存放由BIU取出的指令代码的偏移量。每当取出一个指令的一字节机器码后,IP会自动加1。应当注意,程序员不能直接访问IP的内容,但可以通过程序指令,来改变程序的执行顺序,其实质就是间接改变IP的值。

4. 程序状态字寄存器PSW

PSW(program status word)是一个16位的寄存器。8086/8088 CPU只使用了其中的9位,这9位可以分为两类:状态标志和控制标志,状态标志包括CF、PF、AF、ZF、SF和OF,其余的TF、IF、和DF为控制标志(如图2.3所示)。状态标志反映了EU执行算术或逻辑运算后的结果特征,这些特征常用来影响或控制某些后续指令执行;控制标志用来控制CPU的某些操作,它们可用程序设置或清除。

图2.3 程序状态字寄存器

(1)状态标志

CF(Carry Flag),进(借)位标志,记录算术运算时从数字有效位产生的进位或借位值。例如:执行加法或减法指令时,结果的数字有效位有进位或有借位,则CF=1;否则CF=0。另外,循环移位指令执行过程也会改变此标志。

PF(Panty Flag),偶标志,此标志反映了运算结果中“1”的个数是奇数或是偶数。当运算结果中“1”的个数为偶数时,PF=1;否则PF=0。它能够为机器中传送信息时可能产生的代码出错情况提供检验条件。

AF(Auxiliary Flag),半进(借)位标志,记录运算时第3位(半个字节)产生的进位值。例如:在执行加法运算过程中,若第3位有进位,或执行减法运算过程,第3位有借位,则AF=1;否则AF=0。该标志用于十进制算术运算指令。

ZF(Zero Flag),零标志,若运算结果为零,则ZF=1;否则ZF=0。

SF(Sign Flag),负号标志,它与运算结果的最高字有效位相同,并用来表示有符号数运算结果的符号。SF=1表示运算结果为负;SF=0,表示运算结果为正。

OF(Overflow Flag),溢出标志,当有符号数运算结果产生了溢出,则OF=1;否则OF=0。

(2)控制标志

DF(Direction Flag),方向标志,在串处理指令中,用于控制处理信息的方向。当DF=1时,每次操作后使变址寄存器SI和DI减量,使串处理从高地址向低地址方向处理;当DF=0时,则使变址寄存器SI和DI增量,使串处理从低地址向高字地址方向处理。

IF(Interrupt Flag),中断标志,IF=1时,允许CPU响应可屏蔽的外部中断请求;IF=0时,CPU对可屏蔽外部中断请求不予响应。

TF(Trap Flag),陷阱标志,用于单步方式操作。若TF=1,使CPU在每一条指令执行结束后,会自动产生一次内部中断,CPU转去执行一个中断服务程序。这种方式用于程序的测试过程。

以上是PSW中各状态位和控制位的含义,其中状态标志是由CPU根据计算的结果自动设置的,控制标志则是由系统程序或用户程序根据需要用指令来设置。

2.2 Intel8086/8088存储器的组织

2.2.1 存储单元的地址和内容

计算机存储器的基本单位是一个二进制位,每位可存储一个二进制数“0”或“1”,每8位组成一个字节,使用8086/8088 CPU的计算机系统字长为16位,由2个字节组成,位编号如下:

为了能正确存储或取得信息,给每一个字节单元指定一个编号(这个编号是唯一的),CPU就按照编号进行访问,该编号称为存储器地址,地址从0开始编号,顺序每次加1。在机器里,地址是用无符号二进制数表示的,为书写方便,常用十六进制数表示。n位二进制数可以表示2n个地址单元。为了方便,描述存储器容量大小的单位通常有:KB,1KB=210B=1024B;MB,1MB= 220B =1024×1024B等。65536个字节单元的存储容量为64KB。

2.2.2 Intel8086/8088存储器的组织

1.存储器结构

8086/8088 CPU具有1MB(1兆字节)的寻址能力,也即可以有220个存储单元来存放信息,但是由于外部数据总线宽度不同,存储器结构也不同。

8086具有16位宽的数据总线,在访问存储器时,可以访问字,也可以访问字节。8086的有些指令仅用于访问(读或写)一个字节数据,该字节数据可能存放于偶地址单元(如图2.4中0002H单元),也可能存放于奇地址单元(如图2.4中0003H单元);而另一些指令用来访问字,即16位数据,16位数据总是存放在相邻的两个单元内,且低位字节(低8位)总是存放在地址较低的单元,并把该单元地址称为该字的存储地址。例如:0002H单元中存放的字数据为6A47H;同样,0005H单元中存放的字数据为2B91H,如图2.4所示。

图2.4 字数据存储格式

从上面可以看出,字地址可以是偶数(如0002H),也可以是奇数(如0005H)。通常把存放在偶地址的字称为规则字,存放在奇地址的字称为非规则字。8086CPU的BIU是这样设计的,若访问一个字节的数据,用一个总线周期来完成操作;若访问一个字,则需用一个或两个总线周期来完成。对规则字,只需一个总线周期就可完成16位数据的传送,而对于非规则字则用相邻两个总线周期来完成该字的存取操作,这样会花费较多的时间。

2. 存储器的分段结构

对于16位字长的计算机,寄存器的长度为8或16位,16位地址可以访问的最大存储空间为64KB。而在使用8086/8088 CPU的计算机系统中,最大存储容量为1MB。由于要访问1MB需要20位地址(220=1M),用十六进制数表示1MB的地址范围应为00000H~FFFFFH,那么,在16位字长的机器里,如何能提供20位地址呢?在8086/8088 CPU的计算机系统中,采用了存储器地址分段的方法。

8086/8088 CPU把1MB的存储器空间划分为任意的一些存储段,每个段的大小可达64KB,这样段内的地址可以用16位二进制数来表示,也即可以在CPU的寄存器中进行处理。各段的大小可根据用途而定,可以是几个或几百个,乃至64KB范围内的任意个字节。段内地址连续,段与段是独立的。对段的起始地址有一定的限制,段不能从任意地址位置开始,必须是能够被16整除的地址,其特征是十六进制数表示的地址中,最低位为0(即20位地址的低4位为0)。

有了段地址是否就能直接访问存储器呢?在1MB的存储器中,每个存储器单元都有唯一的20位地址,称之为该存储单元的物理地址。CPU在访问存储器时,必须先确定所要访问的存储器单元的物理地址才能取得该单元的内容。20位物理地址由16位段地址和16位偏移地址组成。16位段地址和16位偏移地址统称为逻辑地址,程序中所使用的地址是逻辑地址。CPU在访问存储器时,根据段地址和偏移地址在BIU的地址加法电路中形成20位物理地址,其形成方法是将段地址左移4位后加偏移量,如图2.5所示。也即

图2.5 20位物理地址的形成

段地址×16d+偏移量=物理地址

对应于存储器的每个单元均有一个唯一确定的物理地址,但逻辑地址不唯一,也即一个物理地址可对应多个逻辑地址。如图2.6所示,表示物理地址为30403H的存储单元,当段地址为3000H时,偏移地址为0403H;当段地址为3040H时,偏移地址为0003H。

图2.6 逻辑地址与物理地址

在8086/8088 CPU中,有4个段寄存器:CS、DS、SS和ES。这4个段寄存器存放了CPU当前可以寻址的4个段的地址,也即可以从这四个段寄存器规定的逻辑段中存取指令代码和数据。如果CPU需要从其他的逻辑段存取指令代码或数据,那么程序必须首先改变对应段寄存器中的内容。CPU中的BIU根据要访问的地址类型从不同的来源获得存储单元的逻辑地址,如表2.3所示。

表2.3 逻辑地址的来源

指令代码总是从当前的指令代码段中取得的,IP中存有目标指令相对于这一段起点的偏移量。堆栈操作指令总是对当前堆栈段进行操作,SP中存有栈顶的偏移量。

段的位置不受任何约束,只要段起始物理地址低4位为0即可,段与段的关系可以是首尾相连,也可以完全分离,或者部分重叠或完全重叠。一般情况下,各段在存储器中的分配是由操作系统负责的。存储器分段结构有利于使用模块化软件设计技术,同时也允许编写与位置无关的程序,即可动态浮动的程序。这使得多道程序系统或多重任务系统能充分使用现有的存储器容量。

2.2.3 堆栈

堆栈是微型计算机中很重要的一个存储区,用它可暂存一些在某些特殊程序运行中需要保护的数据或地址。堆栈最典型的用途是在调用子程序时,为实现子程序的正确返回,将断点(也即调用位置)的地址和调用程序中的一些数据暂存起来。存储数据时,与8086/8088指令队列不同,指令队列采用的是“先进先出”的原则,而堆栈采用的数据存储方式类似于堆放货物,按“后进先出”或“先进后出”的原则进行数据的存取。

IBM-PC计算机系统采用了存储器分段方式,为了访问堆栈这部分存储区域,使用堆栈段来表示。堆栈段中存取数据的地址由堆栈段寄存器SS和堆栈指针SP来指示,SS段寄存器中存放的是堆栈段的首地址,SP中则存放栈顶的位置,此地址表示的是堆栈栈顶离段首地址的偏移量,数据的存取操作均在栈顶进行。堆栈段的示意图如图2.7所示。

图2.7 8086系统的堆栈

2.3 Intel80x86系列微处理器简介

2.3.1 80386微处理器

1.80386 CPU的特点

1985年10月Intel公司推出了高性能全32位微处理器80386DX,它是80X86处理器中第1个32位微处理器,使用了更先进的集成工艺,内部集成了27.5万个晶体管,时钟频率从12.5MHz至后来的33MHz。80386DX在内存管理和处理速度上比80286之前的CPU有了很大的突破,是一种功能完善高可靠性的CPU,并在目标代码上保持与8086、80286的向上兼容,还为后续的80486和Pentium等32位机奠定了基础,是CPU发展的一个里程碑,其主要特点如下:

(1)全32位结构,具有32位数据总线和地址总线,能灵活处理8位、16位、32位和64位数据类型;CPU能直接输出32位的地址信息,可直接寻址的物理空间达4GB,除了保留存储器分段管理外,还增加了内存分页管理。

(2)内部结构由总线接口单元、指令预取部件、指令译码部件、执行部件、分段部件和分页部件6个逻辑功能部件组成,6个部件都能独立操作,又可以对同一指令的不同部分同时并行操作,使多条指令重叠进行,大大提高了CPU的速度。

(3)80386可以按实地址、保护虚地址以及虚拟8086三种模式工作,前两种模式与80286相同,虚拟8086模式是80386新增加的一种模式,在这种方式下,每个任务都是用8086语义运行,从而可以运行8086的各种软件。

(4)80386增加了可测试性和调试功能,可测试特性包括自测试和对页面转换高速缓存的直接访问。

(5)为增强浮点数运算能力,Intel还推出了与之配套的浮点协处理器80387。

1988年Intel推出了介于80286和80386DX之间的一种芯片80386SX,80386SX的外部数据总线和地址总线都与80286相同,分别是16位和24位,寻址能力16MB。1990年Intel推出了80386SL和80386DL两种芯片,80386SL是基于80386SX,80386DL是基于80386DX。这两种芯片都是低功耗、节能型的,是为便携计算机和节能型台式机,增加了系统管理方式SMM(System Management Mode),当进入SMM方式后,CPU会自动降低运行速度,控制显示器和硬盘等其他部件暂停工作,进入“休眠“状态,以达到节能的目的。

2. 80386CPU寄存器结构

80386寄存器组是8086、80286寄存器组的超集。即在以前寄存器组的基础上加以扩充而成。寄存器组共有32个寄存器分为以下6类。

(1)通用寄存器

80386内部共有8个32位的通用寄存器,分别命名为:EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP,如图2.8所示。可以用来存放数据和地址,这些寄存器的低16位可以单独访问,命名为AX、BX、CX、DX、SI、DI、BP和SP。8位操作时,可以单独访问AX、BX、CX和DX的低位字节AL、BL、CL和DL,也可以单独访问高位字节AH、BH、CH和DH。这样的设置是为了和16位CPU 8086、80286保持兼容。

图2.8 通用寄存器组

(2)状态寄存器

80386状态寄存器包括2个32位的寄存器:指令指针EIP和标志寄存器EFR。

EIP——用于保存下一条待取指令的偏移地址,EIP的低16位称为IP,与8086一样,用于标识16位指令代码的位置,这为在80386上执行8086或80286程序提供了可能。特别注意:若在80386上运行16位指令代码,使用IP作为偏移地址,其最大代码段为64KB(216);若运行32位指令,使用EIP作为偏移地址,其最大代码段为4GB(232)。

EFR——(又称EFlags)32位标志寄存器,它的低16位与80286各位定义相同,在执行8086或80286指令代码时使用。EFR格式如图2.9所示。其中RF位是恢复标志(与指令断点异常相关的标志位)。若RF=1,即使遇到断点或调试故障,也不产生异常中断。VM为虚拟86模式标志,若VM=1,CPU工作在虚拟86模式下。

图2.9 EFlags寄存器新增标志

(3)段选择寄存器

80386的段选择寄存器是在80286选择寄存器基础之上新增了2个支持当前数据段的段选择寄存器FS和GS,与段选择寄存器相关联的段描述符高速缓冲器扩充到64位,如图2.10所示。

图2.10 段选择寄存器

(4)系统地址寄存器

80386有4个专用的寄存器用来保存保护模式下的表和段,这些寄存器命名为GDTR,IDTR,LDTR和TR,它们对应地保存下面的表和段,即GDT(全局描叙符表)、IDT(中断描叙符表)、LDT(局部描叙符表)、TSS(任务状态段),如图2.11所示。

图2.11 系统地址和系统段寄存器

(5)控制寄存器

80386有3个32位的控制寄存器,CR0,CR2,CR3。它们用于保存全局性质的机器状态。CR1为Intel公司保留。

(6)调试寄存器和测试寄存器

80386设置有8个调试寄存器,分别命名为DR0~DR7,其中DR0、DR1、DR2、DR3、DR6、DR7供程序员进行程序调试,DR4、DR5为Intel公司保留。

80386设置有2个测试寄存器TR6和TR7,用于存放需要测试的数据。

2.3.2 Pentium微处理器

1. Pentium CPU的特点

1993年,Intel推出了第5代的微处理器Pentium。寄存器的长度为32位,包含有64位数据总线,32位地址线。Pentium处理器集成了310万个晶体管,最初推出的初始频率是60MHz、66MHz,后来提升到200MHz以上,由于采用了很多新技术,指令系统更加丰富,规模更加庞大。

2007年11月,Intel公司公布了基于45纳米技术的全新处理器,处理器中增加了许多新的特性,如全新的SIMD流指令扩展4(SSE4),可通过47条全新指令加快包括视频编码在内的工作负载的处理速度,从而支持高清晰度画质和照片处理,以及重要的HPC和企业应用。同年,Intel公司公布了32纳米技术并展示了32纳米的晶元,并宣布2009年将投产32纳米逻辑处理器。一个句点的面积就可以容纳超过400万枚晶体管,由此可见一枚32纳米晶体管的体积之小。

2. Pentium处理器的基本结构

Pentium处理器内部结构如图2.12所示。它由总线接口部件、代码高速缓冲存储器(代码Cache)、数据高速缓冲存储器(数据Cache)、转移目标缓冲器、控制ROM部件、控制部件、指令预取部件、指令译码部件、整数运算部件、浮点数运算部件、整数及浮点数寄存器组等功能部件组成。

(1)总线接口部件

总线接口部件负责与外部存储器和I/O接口设备进行数据交换,包括地址收发器和驱动器、数据总线收发器、总线宽度控制、写缓冲、Cache控制、奇偶校验生成等。总线接口部件使用32位的地址总线和64位的数据总线与外部连接,可提供4种外部数据宽度,可以使用64位、32位、16位和8位宽度的数据总线。

(2)存储器管理部件

Pentium处理器的存储器管理部件包括段式管理和页式管理两部分。Pentium存储器虚拟地址被称为逻辑地址,其长度48位,由16位段地址和32位位移地址构成。Pentium存储器采用段页式地址转换机制,程序对主存的调入和调出是按页面进行的,通过段地址查阅段表,将表中的地址与位移地址相加后得到32位的线性地址,然后通过页面转换得到物理地址。页面转换是通过页目录和页表实现,线性地址由页目录(10位)、页号(10位)和位移地址(12位)组成,页面大小为4KB。为了加快转换速度,通常需要设置TLB表。

(3)指令预取部件

在总线部件不执行其他总线周期时,指令预取部件执行一个取指令周期,预取32个字节的指令序列送到预取缓冲部件和Cache部件。当执行部件需要指令时,指令从预取部件传送到指令译码部件。预取部件的总线优先权最低,不影响其他的总线周期。

图2.12 Pentium处理器内部结构图

(4)整数流水线

Pentium处理器内部集成了两条指令流水线,U流水线和V流水线,每个流水线均有自己的ALU、地址生成电路、数据Cache接口,可以在一个机器周期内发出两条整数指令,由于内部采用了超标量执行技术,允许两条指令以并行的方式执行。由于处理器内部采用了分支转移预测技术,出现转移时,转移目标缓冲器BTB可以保存256个转移预测,使转移预测失败的概率最小,当程序发生转移时,不因流水线的断流而影响性能。

(5)浮点流水线

浮点流水线由浮点接口、寄存器组及控制部件(FIRC)、浮点加法部件(FADD)、浮点乘法部件(FMUL)、浮点除法部件(FDIV)、浮点指数部件(FEXP)和浮点舍入部件(FRND)等部件构成。浮点流水线支持单精度(32位)、双精度(64位)、3倍精度、80位扩展精度浮点运算。

(6)Cache部件

Pentium处理器设置的片内Cache是分离的,分为指令Cache和数据Cache,每个Cache容量8KB,采用二路组相连的地址映像技术,Cache行的长度为32B。数据Cache有两个端口,分别与两个ALU交换数据,每个端口传送32位数据,也可以组合成64位数据,与浮点部件接口相连,传送浮点数。Pentium处理器支持“修改/排他/共享/无效”(modified/exclusive/shared/invalid,简称MESI)协议,数据Cache的每一行包含两个状态位,每一Cache行处于上述4种状态之一,写入数据时,先查询Cache是否命中,如命中,则根据Cache行的状态进行相应的写入数据操作,并修改(或保留)原状态位。

(7)指令译码部件

Pentium处理器采用两步流水线译码方案,可以在每一个机器周期提供一个译码完成的指令。指令译码部件从控制ROM中读出微指令序列,启动相应的控制动作,同时还有一些硬布线的微指令,在微代码执行前就开始动作。

(8)控制部件

Pentium处理器采用微指令和硬布线两种方式控制计算机各部件的工作。控制部件得到指令译码后,一部分由控制ROM中的微指令序列产生控制信号,一部分由硬布线逻辑直接产生控制信号。

3. Pentium寄存器结构

Pentium寄存器组是80386、80486寄存器组的超集。即在以前寄存器组的基础上加以扩充而成,其通用寄存器、段寄存器、系统地址寄存器、控制寄存器、调试寄存器与80386基本相同,并对标志寄存器进行了扩展,取消了测试寄存器,其功能由“模型专用寄存器”MSR(Model Special Registers)来实现。

(1)标志寄存器

在标志寄存器中,新增了AC位、VIF位、VIP位和ID位,如图2.13所示。AC——(Alignment Check)地址对齐检查标志(80486SX处理器有效)。若AC=1时进行地址对齐检查,当出现地址不对齐时会引起地址异常,只有在特权级3运行的应用程序才检查引起地址不对齐的故障。若AC=0时不进行地址对齐检查。该位主要是为与80487SX协处理器同步工作用的。

图2.13 Pentium标志寄存器

VIF——(Virtual Interrupt Flag)虚拟中断标志,是虚拟方式下中断标志位的映像。

VIP——(Virtual Interrupt Pending)虚拟中断挂起标志。与VIF配合,用于多任务环境下,给操作系统提供虚拟中断挂起信息。

ID——(Identification)标识标志。若ID=1,则表示Pentium支持CPU ID指令。CPU ID指令给系统提供Pentium微处理器有关版本号及制造商等信息。

(2)模型专用寄存器

Pentium微处理器取消了测试寄存器TR,由一组MSR替代,MSR用于执行跟踪、性能检测、测试和机器检查错误。Pentium微处理器采用两条指令RDMSR(读MSR)和WRMSR(写MSR)来访问这些寄存器,ECX中的值确定将访问该组寄存器中哪一个MSR。ECX寄存器的值与MSR寄存器的关系如表2.4所示。

表2.4 ECX寄存器与MSR寄存器的关系

2.4 外部设备

外部设备是微型计算机系统的重要组成部分。计算机运行时的程序和数据都要通过输入设备送入机器,程序运行的结果要通过输出设备送给用户,所以输入、输出设备是计算机必不可少的组成部分。对于外部设备的管理也是汇编语言的重要使用场合。外部设备与主机之间的信息交换是通过接口进行的。

1.为什么需要接口

因为计算机与外设进行数据交换时,所面对的外部设备的种类是多种多样的,可以是机械式、电子式或其他形式;输入的信息也是不相同的,可以是数字、模拟信号。不同设备的输入速度差异也相差很大,如键盘为秒级,而磁盘的速度则快得多。因此,需要一种部件能将CPU与外部设备的工作协调起来,有效完成输入、输出信息的任务,这种部件就是接口。

2.接口的组成

每一个接口都包括一组寄存器和其他辅助电路。一般来说,这些寄存器有3种不同的用途。

(1)数据寄存器

用来保存在外部设备和CPU之间传递的数据,起数据缓冲或锁存的作用。

(2)状态寄存器

用来保存外部设备或接口的状态信息(如:忙/闲状态,准备就绪状态等),以便CPU在必要时测试外设的状态,了解外设的工作情况。

(3)控制寄存器

用来接收并存放CPU发出的各种控制命令(或控制字)及其他信息。这些控制命令的作用包括设置外设或接口的工作方式、工作速度、指定某些参数及功能、启停设备工作等。

3.访问方式

为了方便CPU访问外部设备,给予外部设备中的每一个寄存器一个端口(PORT)地址(又称为端口号),这样,这些端口地址的集合又构成了一个地址空间。CPU访问时,使用专用的IN和OUT指令完成数据的传递。对于IBM PC/XT机的I/O地址空间可达64KB,可有64K个字节端口或32K个字节端口,地址范围为0000H~FFFFH。

对于用户使用外设进行数据传递,可以采用直接传送、查询中断传送或组传送等方式。在计算机系统中,用户最常用到的是两种例行程序的调用,一种为BIOS(BASIC INPUT/OUTPUT SYSTEM),另一种为DOS功能调用。它们都是系统编制的子程序,通过中断方式转入所需要的子程序执行,执行完成之后返回原来的程序继续执行。这些例行程序有的完成一次简单的外设信息传送,如从键盘输入一个字符,或送一个字符至显示器等。有的完成相对复杂的一次外设操作,如从磁盘读/写一个文件等。总之,操作系统把一些复杂的外设操作编成例行程序,使用户用简单的中断指令(INT)就可以进入这些例行程序,完成所需的外设操作。

BIOS和DOS功能调用虽然都是系统提供的例行程序。但是它们之间又有差别。BIOS存放在机器的只读存储ROM中,它的层次比DOS更低,更接近硬件。DOS功能调用是操作系统DOS的一个组成部分,在系统初始化后,常驻内存中,在它的例行程序中可以一次或多次调用BIOS以完成比BIOS更高级的功能,用户需要时,尽可能使用层次较高的DOS功能调用。但若不能满足程序需要时,就需要直接使用BIOS,如果BIOS还不能完成,则需要自行编写中断处理程序。

习题

2.1 有两个16位的字节数据和一个8位字节数据,BFD2H、92B7H、39H,分别存放于存储器的000D3H、000D7H和000D9H单元中,请画图表示出它们在存储器的存放情况。

2.2 请将下列左边项和右边的解释联系起来,在括号中填入左边对应的数字。

(1)DF( )A进位标志

(2)AF( )B偶标志

(3)CF( )C方向标志

(4)ZF( )D陷阱标志

(5)IF( )E半进(借)位标志

(6)SF( )F零标志

(7)OF( )G符号标志

(8)TF( )H溢出标志

(9)PF( )I中断标志

2.3 段地址和偏移地址为2001H、0011H的存储单元的物理地址是什么?如果段地址和偏移地址是101AH、1000H和5A00H、130CH呢?

2.4 已知(SS)=1040H,(SP)=0012H,欲将(CS)=0C2FH,(IP)=004BH,(AX)=0E3AH(SI)=4B7AH依次入栈保存。

(1)试画出椎栈有效示意图。

(2)写出入栈后SS和SP的值。

2.5 请将左边的术语与右边的定义联系起来,在括号中填入右边所示的字母。

(1)逻辑地址( )A由8位二进制组成的通用基本单元。

(2)访存空间( )B以后进先出方式工作的存储空间。

(3)字节( )C唯一能代表存储空间的每个字节单元的地址,用5位16进制表示。

(4)堆栈( )D由段基地址和偏移地址两部分组成,均用4位16进制数表示。

(5)段寄存器( )E指示下一条要执行的指令的地址。

(6)物理地址( )F CPU组成系统所能访问的存储单元总数。

(7)状态标志( )G保存各逻辑段的起始地址的寄存器,PC机。寄存器有:CS,DS,SS,ES。

(8)IP( )H记录指令操作结果的标志,共六位。

2.6 有一个由20个字组成的存储区,其起始处段地址为4701H,偏移地址为2012H。试写出该存储区首单元和末单元的物理地址。

2.7 Pentium处理器主要由哪几个功能部件组成?

2.8 Pentium处理器的Eflags寄存器比8086处理器的Flags寄存器增加哪些功能位?

2.9 请指出接口的用途是什么。