80X86微处理器
一、80x86系列微处理器概况:
8086、8088、80286、80386、80486之后型号为Pentium、PentiumⅡ......
- 集成度:是指cpu芯片中所包含的晶体管数,单位为万/片。
- 主频:是指芯片所使用的主时钟频率,它直接影响计算机的运行速度。
- 数据总线:是计算机内各个组件之间传输数据传输的通道,“内部总线宽度”是CPU芯片内部数据传输的宽度(位数);“外部总线宽度”是CPU与外部交换数据时的数据宽度。显然数据总线位数越多,数据交换越快。
- 地址总线:在对存储器和I/O端口进行访问时,传送由CPU提供的要访问的存储器单元或者I/O端口地址信息的总线,其宽度决定了处理器直接访问主存容量大小。
如8086有20根地址线,使用这20根地址线上不同地址信息的组合,可直接对2020=1M个存储单元进行访问;PentiumⅡ有36根地址线,因此它可直接寻址的最大范围为236=64G。
为了满足微型计算机对存储器系统高速度、大容量、低成本的要求,目前微型计算机系统采用下图的三级存储器组织结构,即由高速缓冲器Cache、主存、外存组成。
8086有16根数据引脚,可以存取8位或16位数据;有20根地址引脚,可以直接寻址1M(220)存储单元和64K个I/O端口。在8086推出后不久,为方便原8位机用户,Intel公司很快推出了8088微处理器,其指令系统与8086完全兼容,CPU内部结构仍为16位,但外部数据总线是8位的,这样设计的目的主要是为了与原有的8位外围接口芯片兼容。同时,IBM以8088 CPU为核心组成了IBM PC、 PCIXT等准16位微型计算机,由于其性价比高,很快占领了市场。
二、8086/8088内部结构:
1.总线接口单元BIU(BUS Interface Unit)——负责完成CPU与存储器或I/O设备之间的数据传送。
BIU组成
(1)4个16位的段寄存器【代码段寄存器CS(Code Segment)、数据段寄存器DS(Data Segment)、堆栈段寄存器SS(Stack Segment)和附加数据段寄存器ES(Extra Segment);】
(2)1个16位的指针指令寄存器IP
(2)一个20位的地址加法器
(3)6个字节的指令缓冲器
(4)一个与EU通信的内部寄存器和总线控制电路。
8086CPU的地址引脚有20根,能提供20位的地址信息,可直接对1M个存储单元进行访问,但CPU内部可用来提供地址信息的寄存器都是16位的,那么如何用16位寄存器实现20位地址的寻址呢?8086/8088采用了段结构的内存管理的方法。
(1)段寄存器:将指令代码和数据分别存储在代码段、数据段、堆栈段、附加数据段中,这些段的段地址分别由段寄存器CS、DS、SS、ES提供。
代码段寄存器CS:存储程序当前使用的代码段的段地址。代码段用来存放程序的指令代码。下一条要读取指令在代码段中的偏移地址由指令指针寄存器IP提供;
数据段寄存器DS:用来存放程序当前使用的数据段的段地址。一般来说,程序中所用到的原始数据、中间结果以及最终结果都存放在数据段中;
堆栈段寄存器SS:用来存放程序当前所使用的堆栈段的段地址。堆栈是在存储器中开辟的一个特定区域;
附加数据段寄存器ES:用来存放程序当前使用的附加数据段的段地址。附加数据段通常用于存放字符串操作时的目的字符串。
(2)指令指针寄存器: 指令指针寄存器IP用来存放下一条要读取的指令在代码段中的偏移地址。IP在程序运行中能自动加1修正,从而使其始终存放的是下一条要读取的指令在代码段的偏移地址。由于CS和IP的内容决定了程序的执行顺序,因此程序员不能直接用赋值指令对其内容进行修改。有些指令能使IP和CS的值改变(如跳转指令)或使其值压入堆栈或从堆栈中弹出恢复原值(如子程序调用指令和返回指令)。
(3)20位的地址加法器: CPU提供的用来对存储单元进行访问的20位地址是由BIU中的地址加法器产生的。
存储器中每个存储单元的地址可有以下两种表示方式:
(1)逻辑地址:表达形式为段地址:段内偏移地址
段内偏移地址又称为“有效地址EA(Effective Address)。
读指令时,段地址由代码段寄存器CS提供,偏移地址由指令指针寄存器IP提供;
读取或存储操作数时,段地址由DS、ES或SS提供,段内偏移地址由指令给出。
(2)物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址。
段寄存器内容左移四位后(相当于乘以10H)得到段基址(段内第一个存储单元的物理地址)。
把段内偏移地址和段基址同时送到BIU中的地址加法器,形成一个20位的物理地址,从而实现对存储单元的访问。
**物理地址=段地址×10H+段内偏移地址 **
例如假设当前(CS)=20A8H,(IP)=2008H,那么,下一条从内存中读取的指令所在存储单元的物理地址为:20A8H×10H+ 2008H=22A88H。
对于任何一个物理地址来说,可以唯一被包含在一个逻辑段中,也可以包含在多个重叠的逻辑段中,只要能得到它所在段的首地址和段内的相对地址,就可以对它进行访问。即一个物理地址可以对应多个逻辑地址。
(4)指令队列缓冲器:8086的指令队列有6个字节,8088的指令队列有4个字节。对8086而言,当指令队列出现2个空字节,对8088而言,指令队列出现1个空字节时,BIU就自动执行一次取指令周期,将下一条要执行的指令从内存单元读入指令队列。它们采用“先进先出”原则,按顺序存放,并按顺序取到EU中去执行。
指令队列的引入使得EU和BIU可并行工作,即BIU在读指令时,并不影响EU单元执行指令,EU单元可以连续不断地直接从指令队列中取到要执行的指令代码,从而减少了CPU为取指令而等待的时间,提高了CPU的利用率,加快了整机的运行速度。
2.执行单元EU(Execution Unit)——不与系统外部直接相连,它的功能只是负责执行命令。 EU执行的指令从BIU的指令队列缓冲器中直接得到。执行指令时若需要从存储器或I/O端口读写操作数时,由EU向BIU发出请求,再由BIU对存储器或I/O端口进行访问。
EU组成
(1)16位算数逻辑单元(ALU):进行算术和逻辑运算。
(2)16位的表示寄存器FLAGS:存放CPU运算的状态和控制标志。
(3)通用寄存器:包括4个16位数据寄存器AX、BX、CX、DX和4个16位指针与变址寄存器SP、BP与SI、DI。
(4)数据暂存寄存器:暂存参加运算的数据
(5)EU控制电路:它是控制、定时与状态逻辑电路,接收从BIU中指令队列取来的指令,经过指令译码形成各种定时控制信号,对EU的各个部件实现特定的定时操作。
三、8086/8088寄存器结构:
1.通用寄存器:
(8个):包括四个数据寄存器AX(AH/AL), BX(BH/BL),CX(CH/CL),DX(DH/DL),两个地址指针寄存器(SP,BP)和两个变址寄存器(SI,DI)。
1.数据寄存器AX、BX、CX、DX
数据寄存器一般用于存放参与运算的操作数或运算结果。每个数据寄存器都是16位的,但又可将高、低8位分别作为两个独立的8位寄存器来用。高8位分别记作AH、BH、CH、DH,低8位分别记作AL,BL,CL,DL。注意:8086/8088 CPU的14个寄存器除了这4个16位寄存器能分别当作两个8位寄存器来用之外,其它寄存器都不能如此使用。
AX(Accumulator)称为累加器:用该寄存器存放运算结果可使指令简化,提高指令的执行速度。此外,所有的I/O指令都使用该寄存器与外设端口交换信息。
BX(Base)称为基址寄存器:8086/8088CPU中有两个基址寄存器BX和BP。BX用来存放操作数在内存中数据段内的偏移地址,BP用来存放操作数在堆栈段内的偏移地址。
CX(Counter)称为计数器:在设计循环程序时使用该寄存器存放循环次数,可使程序指令简化,有利于提高程序的运行速度。
DX(Data)称为数据寄存器:在寄存器间接寻址的I/O指令中存放I/O端口地址;在做双字长乘除法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位数。
2. 地址指针寄存器SP、BP
SP(Stack Pointer)称为堆栈指针寄存器。在使用堆栈操作指令(PUSH或POP)对堆栈进行操作时,每执行一次进栈或出栈操作,系统会自动将SP的内容减2或加2,以使其始终指向栈顶。
BP(Base Pointer)称为基址寄存器。作为通用寄存器,它可以用来存放数据,但更经常更重要的用途是存放操作数在堆栈段内的偏移地址。
3.变址寄存器SI、DI
SI(Source Index)称为源变址寄存器。
DI(Destination Index)称为目的变址寄存器。
这两个寄存器通常用在字符串操作时存放操作数的偏移地址,其中SI存放源串在数据段内的偏移地址,DI存放目的串在附加数据段内的偏移地址。
2.段寄存器:
为了对1M个存储单元进行管理,8086/8088对存储器进行分段管理,即将程序代码或数据分别放在代码段、数据段、堆栈段或附加数据段中,每个段最多可达64K个存储单元。段地址分别放在对应的段寄存器中,代码或数据在段内的偏移地址由有关寄存器或立即数给出。
CS(Code Segment)——代码段寄存器。用来存储程序当前使用的代码段的段地址。
DS(Data Segment)——数据段寄存器。用来存放程序当前使用的数据段的段地址。
SS(Stack Segment)——堆栈段寄存器。用来存放程序当前所使用的堆栈段的段地址。
ES(Extra Segment)——附加数据段寄存器。用来存放程序当前使用的附加数据段的段地址。
下图为段寄存器与提供段内偏移地址的寄存器之间的默认组合
3.控制寄存器:
IP(Instruction Pointer)——指令指针寄存器。用来存放下一条要读取的指令在代码段内的偏移地址。用户程序不能直接访问IP。
FLAGS——标志寄存器。它是一个16位的寄存器,但只用了其中9位,这9位包括6个状态标志位,3个控制标志位,如图所示。
1. 状态标志位(6位)
状态标志位用来反映算术和逻辑运算结果的一些特征。下面分别介绍这6个状态标志位的功能。
CF(Carry Flag)——进位标志。当进行加减运算时,若最高位发生进位或借位则CF为1,否则为0。通常用于判断无符号数运算结果是否超出了计算机所能表示的无符号数的范围。
PF(Parity Flag)——奇偶标志位。当指令执行结果的低8位中含有偶数个1时,PF为1,否则为0。
AF(Auxiliary Flag)——辅助进位标志位。当执行一条加法或减法运算指令时,若结果的低字节的低4位向高4位有进位或借位,则AF为1,否则为0。
ZF(Zero Flag)——零标志位。若当前的运算结果为0,则ZF为1,否则为0。
SF(Sign Flag)——符号标志位。当运算结果的最高位为1时,SF=1,否则为0。
OF(Overflow Flag)——溢出标志位。当运算结果超出了带符号数所能表示的数值范围,即溢出时,OF=1,否则为0。用来判断带符号数运算结果是否溢出。
例如: 设变量x=11101111B,y=11001000B,X=0101101000001010B,Y=01001100 10100011B,请问分别执行x+y和X+Y操作后标志寄存器中各状态位的状态如何?
2. 控制标志位(3位)
用来控制CPU的操作,由程序设置或清除。它们是:
TF(Trap Flag)——跟踪(陷阱)标志位。是为测试程序的方便而设置。若将TF置1,CPU处于单步工作方式。
IF(Interrupt Flag)——中断允许标志位。是用来控制可屏蔽中断的控制标志位。若将IF置1,表示允许CPU接受外部从INTR引脚上发来的可屏蔽中断请求;若用CLI指令将IF清0,则禁止CPU接受可屏蔽中断请求信号。
DF(Direction Flag)——方向标志位。若将DF置1,串操作按减地址方式进行,也就是说,从高地址开始,每操作一次地址自动递减;否则按增地址方式进行。
四、8086/8088存储器和I/O组织
<一>.8086/8088存储器组织
1.8086/8088存储器结构
8086/8088有20条地址线,可直接对1 M个存储单元进行访问。每个存储单元存放一个字节型数据,且每个存储单元都有一个20位的地址,这1 M个存储单元对应的地址为00000H~FFFFFH,如图所示。
一个存储单元中存放的信息称为该存储单元的内容。
如00001H单元的内容为9FH,记为:(00001H)=9FH。
如从地址0011FH开始的两个连续单元中存放一个字型数据,则该数据为DF46H,记为:(0011FH)=DF46H。
若存放的是双字型数据(32位二进制数),这种类型的数据要占用连续的4个存储单元,同样,低字节存放在低地址单元,高字节存放在高地址单元。如从地址E800AH开始的连续4个存储单元中存放了一个双字型数据,则该数据为66A65E65H,记为:(E800AH)=66A65E65H。
8086的1M存储空间实际上分为两个512KB的存储体,又称存储库,分别叫高位库和低位库。如下图:
地址总线A19~A1可同时对高、低位库的存储单元寻址,A0和 BHE非 用于对库的选择。
当A0=0时,选择偶数地址的低位库;
当BHE非=0时,选择奇数地址的高位库;
当两者均为0时,则同时选中高低位库。
需注意的是,对于规则字(从偶数地址开始存放的字)的读/写操作只需一个总线周期,而非规则字(从奇数地址开始存放的字)的读/写操作需两个总线周期。
在8088系统中,可直接寻址的存储空间同样也是1 MB,但其存储器的结构与8086有所不同,它的1MB 存储空间同属于一个单一的存储体,即存储体为1 M×8位。它与总线之间的连接方式很简单,其20根地址线A19~A0与8根数据线分别与8088 CPU对应的地址线和数据线相连。8088 CPU每访问一次存储器只能读/写一个字节信息,因此在8088系统的存储器中,字型数据需要两次访问存储器才能完成读/写操作。
2.存储器的段结构:
8086/8088 CPU中有关可用来存放地址的寄存器如IP、SP等都是16位的,故只能直接寻址64 KB。为了对1 M个存储单元进行管理,8086/8088采用了段结构的存储器管理方法。
8086/8088将整个存储器分为许多逻辑段,每个逻辑段的容量小于或等于64 KB,允许它们在整个存储空间中浮动,各个逻辑段之间可以紧密相连,也可以互相重叠。
4.堆栈操作:
堆栈是在存储器中开辟的一个特定区域。开辟堆栈的目的主要有以下两点:
(1) 存放指令中的操作数(变量)。此时,对操作数进行访问时,段地址由堆栈段寄存器SS来提供,操作数在该段内的偏移地址由堆栈指针SP或基址寄存器BP来提供。
(2) 保护断点和现场。此为堆栈的主要功能。
进栈和出栈操作过程:
在执行进栈和出栈操作时,段地址由堆栈段寄存器SS提供,段内偏移地址由堆栈指针寄存器SP提供,当堆栈空时,SP指向栈底。每进行一次进栈操作,SP值减2;每进行一次出栈操作,SP值加2。在进栈和出栈操作过程中,SP始终指向栈顶。
<二>.8086/8088I/O组织
8086/8088系统和外部设备之间是通过I/O接口电路来联系的。每个I/O接口都有一个或几个端口。在微机系统中每个端口分配一个地址号,称为端口地址。一个端口通常为I/O接口电路内部的一个寄存器或一组寄存器
8086/8088CPU用地址总线的低16位作为对8位I/O端口的寻址线,所以8086/8088系统可访问的8位I/O端口有65536(64K)个。两个编号相邻的8位端口可以组成一个16位的端口。
8086CPU对I/O设备的读写与对存储器的读写操作类似。当CPU与偶地址的I/O端口实现16位数据的存取操作时,可在一个总线周期内完成;当CPU与奇地址的I/O端口实现16位数据的存取操作时,要占用两个总线周期才能完成。
需要说明的是,8086/8088 CPU的I/O指令可以用16位的有效地址A15A0来寻址0000FFFFH共64 K个端口,但IBM PC系统中只使用了A9~A0 10位地址来作为I/O端口的寻址信号,因此,其I/O端口的地址仅为000 ~3FFH共1K个。