1、第2章 80x86计算机组织,2.1 80x86微处理器,80386,80486,奔腾,奔腾2代,奔腾4代,80286,8086/8088,奔腾3代,4004,2.2 计算机系统,硬件系统:三个主要组成部分,用系统总线连接。,中央处理机CPU,总线控制逻辑,接 口,接 口,内存储器,大容量 存储器,I/O设备,I/O子系统,系统总线,. . .,. . .,系统软件 核心为操作系统,包括: I/O驱动程序、文件管理程序、文本编辑程序等。 应用程序是建立在操作系统之上的,我们采用 DOS(MS-DOS 6.22 或 Windows 9.x的MS-DOS环境),开发汇编语言程序涉及到 文本编辑器
2、汇编程序 连接程序 调试程序 应用软件 微机中的应用软件丰富多彩.,软件系统:系统软件 应用软件,2.3 中央处理机,2.3.1 CPU组成它包括算术逻辑部件ALU、控制器、寄存器ALU:是运算器的核心部件,执行算术运算、逻辑运算、移位、比较等各种数据处理的操作。控制逻辑:处理程序指令,并协调各逻辑部件按一定时序工作。包括:从存储器中读取程序指令、指令译码、从存储器中取得操作数,执行指令,把结果存入存储器,以及对总线和I/O的传送控制等。工作寄存器:每一个寄存器相当于运算器中的一个存储单元,但速度比存储器快,用来存放计算过程中所需要的或得到的各种信息。,AH AL,BH BL,CH CL,DH
3、 DL,SP,BP,DI,SI,通用寄存器,运算寄存器,ALU,标志,执行部分控制电路,1 2 3 4 5 6,CS,DS,SS,ES,IP,内部 寄存器,I/O控制电路,地址加法器,20位,16位,8位,指令队列缓冲器,外总线,执行部件,总线接口部件,8086CPU结构图,寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。 寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C+语言)中,也有定义变
4、量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。 另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。 由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。,2.3.2 80x86寄存器组,80x86的程序可见寄存器组 通用寄存器 专用寄存器段寄存器,AH AX AL BH BX BLCH CX CLDH DX DLSPBP SIDIIPFLAGSCSDSSSES,8086 / 8088 / 8
5、0286寄存器,EAX EBX ECX EDX ESP EBP ESI EDIEIPEFLAGS,FS GS,31 16 15 8 7 0,16位寄存器组,32位寄存器组 32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了2个16位的段寄存器:FS和GS。,表2.1 通用寄存器的主要用途,(1)数据寄存器,数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。 AX(Accumulator)寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。BX(Base Register)寄存器称
6、为基址寄存器。常用于存放存储器地址。CX(Count Register)寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。在位操作中,当移多位时,要用CL来指明移位的位数; DX(Data Register)寄存器称为数据寄存器。常用来存放双字数据的高16位,在进行乘、除运算时,它可作为默认的操作数参与运算,亦可存放外设端口地址。,2.3.2.1 通用寄存器组,在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,
7、这些32位寄存器更具有通用性。,(2) 变址寄存器,寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),主要用于存放某个存储单元的偏移地址。SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。它们主要用于存放存储单元段内的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。,(3)指针寄存器,寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要
8、用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式(在第3章有详细介绍),为以不同的地址形式访问存储单元提供方便。,指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。,SP(Stack Pointer)为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP (Base Pointer)为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。,(1)指令指针寄存器 IP( Instruction Pointer ),指令指针寄存器:8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到
9、所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。 32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。,2.3.2.2 专用寄存器: IP、SP、FLAGS,(2)堆栈指针寄存器SP 用于存放当前堆栈段中栈顶的偏移地址,(3)标志寄存器 ( FLAGS / PSW ),15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,状态标志: 控制标志: OF 溢出标志 DF 方向标志 SF 符号标志 I F 中断标志 ZF 零标志
10、 TF 陷阱标志 CF 进位标志 AF 辅助进位标志 PF 奇偶标志,OF DF IF TF SF ZF AF PF CF,注:指令的执行与标志有很大关系。 状态标志 用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它。 控制标志 可由程序根据需要用指令设置,用于控制处理器执行指令的方式。,零标志ZF(Zero Flag),若运算结果为0,则ZF = 1,否则ZF = 0。 例如: 3AH + 7CHB6H,结果不是零:ZF = 0 86H + 7CH(1)00H,结果是零:ZF = 1 注意:ZF为1表示的结果是0,符号标志SF(Sign Flag),运算结果最高位为1,则SF
11、= 1;否则SF = 0。 例如: 3AH + 7CHB6H,最高位D71:SF = 1 86H + 7CH(1)00H,最高位D70:SF = 0有符号数据利用最高有效位表示数据的符号。所以,最高有效位就是符号标志的状态。,奇偶标志PF(Parity Flag),当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0。 例如: 3AH + 7CHB6H10110110B, 结果中有5个1,是奇数:PF = 0注意:PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。,溢出标志OF(Overflow Flag),若算术运算的结果有溢出,则OF=1;否则
12、OF0。例如: 3AH + 7CHB6H,产生溢出:OF = 1 AAH + 7CH(1)26H,没有溢出:OF = 0,辅助进位标志AF(Auxiliary Carry Flag),运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。 例如: 3AH + 7CHB6H,D3有进位:AF = 1 这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。,方向标志DF(Direction Flag),用于串操作指令中,控制地址的变化方向: 设置DF0,串操作的存储器地址自动增加; 设置DF1,串操作的存储器地址自动减少。 CLD指令复位方向标志:DF0 ST
13、D指令置位方向标志:DF1,中断允许标志IF(Interrupt-enable Flag),用于控制外部可屏蔽中断是否可以被处理器响应: 设置IF1,则允许中断; 设置IF0,则禁止中断。 CLI指令复位中断标志:IF0 STI指令置位中断标志:IF1,陷阱标志TF(Trap Flag),用于控制处理器是否进入单步操作方式: 设置TF0,处理器正常工作; 设置TF1,处理器单步执行指令。 单步执行指令处理器在每条指令执行结束时,便产生一个编号为1的内部中断。这种内部中断称为单步中断,所以TF也称为单步标志。 利用单步中断可对程序进行逐条指令的调试。 这种逐条指令调试程序的方法就是单步调试。,8
14、086/8088,IOPL,NT,80286,VM,80386,AC,80486,ID,VIP,VIF,31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,Pentium,80x86的标志寄存器(P.23),IOPL: I/O特权级 VIP:虚拟中断未决标志 NT: 嵌套任务标志 VIF:虚拟中断标志RF: 重新启动标志 VM:虚拟8086模式位AC: 对准检查方式位ID: 标识标志,2.3.2.3 段寄存器,段寄存器:8086CPU的个16位的段寄存器分别称为 代码段寄存器
15、CS,数据段寄存器DS,堆栈段寄存器SS,附加数据段寄存器ES。段寄存器用来确定该段在内存中的起始地址。段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。,CPU内部的段寄存器: CS代码段寄存器(Code Segment Register),其值为代码段的段值;代码段用来存放程序的指令序列。CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。 DS数据段寄存器(Data Segment Register),其值为数据段的段值; ES附加段寄存器(Extra Seg
16、ment Register),其值为附加数据段的段值; SS堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; FS附加段寄存器(Extra Segment Register),其值为附加数据段的段值; GS附加段寄存器(Extra Segment Register),其值为附加数据段的段值。,在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。 32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的
17、。有关规定简单描述如下:,实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。 保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。段寄存器的具体作用在此不作进一步介绍了,有兴趣的读者可参阅其它科技资料。,寄存器与存储器的比较:寄 存 器 存 储 器,在CPU内部 在CPU外部 访问速度快 访问速度慢 容量小,成本高 容量大,成本低 用名字表示 用地址表示 没有地址 地址可用各种方式形
18、成,2.4 存储器,2.4.1 存储单元的地址和内容存储单元地址 :8086系统中,为了标识和存取每一个存储单元,给每个存储单元规定一个编号,这就是存储单元地址。 存储单元的内容 :一个存储单元中存放的信息称为该存储单元的内容。注意: 存储器以字节(8 bit)为编程单位 每个字节单元都有唯一的地址编码 地址用无符号整数来表示(编程用十六进制表示) 一个字要占用相继的两个字节 低位字节存入低地址,高位字节存入高地址 字单元地址用它的低地址来表示 机器以偶地址访问(读 / 写)存储器,二进制位:存储一位二进制数:0或1。 字节:8个二进制位,D7D0。 字:16位,2个字节,D15D0。 双字:
19、32位,4个字节,D31D0。 最低有效位LSB(Least Significant Bit):指数据的最低位,即D0位; 最高有效位MSB(Most Significant Bit):指数据的最高位,对应字节、字、双字分别指D7、D15、D31位。,7 6 5 4 3 2 1 0,1 0 0 1 1 1 1 1 0000H (0000H)=9FH,0 0 1 0 0 1 1 0 0001H (0001H)=26H,0 0 0 1 1 1 1 0 0002H (0002H)=1EH,1 1 0 1 0 1 1 1 0003H (0003H)=D7H,存储器,15 14 13 12 11 10
20、9 8 7 6 5 4 3 2 1 0,字,高位字节 低位字节,1 0 0 1 1 1 1 1,0 0 1 0 0 1 1 0,(0000H)=269FH (0002H)=D71EH (0001H)=1E26H访问两次存储器,字节,在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。,字节 12340H、12341H的内容分别为:12H和34H等;字 12340H、12341H的内容分别为:3412H和5634H等;双字 12340H、12341H的
21、内容分别为:78563412H和90785634H等。,内存单元存放内容示意图,2.4.2 实模式存储器寻址,实模式实际上是为80888086而设计的工作方式,目的是解决在16位字长的机器中如何提供20位地址的问题。80286及其后微处理器除可在实模式下工作外,还可在保护模式下工作。下面,我们将首先介绍一下实模式下的存储器寻址方法 存储器地址的分段。,1、存储器的分段我们知道:计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。存储单元的物理地址是一个无符号的二进制数。但为了书写的简化,物理地址通常用十六进制
22、来表示。16位CPU内部有20根地址线,其编码区间为:00000H0FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。而16位CPU内部存放存储单元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX等)都是16位,它们的编码范围仅为:00000H0FFFFH。这样,如果用16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将无法访问。为了能用16位寄存器来有效地访问1M的存储空间,16位CPU采用了内存分段的管理模式,并引用段寄存器的概念。,16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,
23、即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。图为内存各逻辑段之间的分布情况示意图,其中有相连的段(如:C和D段)、不相连的段(如:A和B段)以及相互重叠的段(如:B和C段)。,16位微机内存分段管理示意图,(1)存储器地址的分段,20 根地址线: 地址范围 00000H FFFFFH (1MB) 机器字长16位:仅能表示地址范围 0000H FFFFH(64KB) 小段:每16个字节为一小段,共有64K个小段小段的首地址00000 H 000
24、0F H00010 H 0001F H00020 H 0002F HFFFF0 H FFFFF H 段起始地址:小段首地址段的大小: 64K 范围内的任意字节,物理地址的形成方式由于规定段地址必须是16的倍数,所以,其值的一般形式为:XXXX0H,即:前16位二进制位是变化的,后四位是固定为0。鉴于段地址的这种特性,我们可以仅保存其前16位二进制来达到保存整个段地址,其后四位可通过“左移补0”来获得。在确定了某个存储单元所属的内存段后,我们也只知道其所处内存位置的范围,还不能确定其具体位置。要想确定内存单元的具体位置,还必须知道该单元离该段地址有多远。我们通常把存储单元的实际地址与其所在段的段
25、地址之间的距离称为段内偏移,也可称为有效地址(EAEffective Address)或偏移量(Offset)等。有了段地址和偏移量,就能唯一地确定某一内存单元在存储器内的具体位置。,由此可见,存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PAPhysical Address)的计算方法如下:物理地址PA=段地址16 + 偏移量计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。图是物理地址的计算示意图。,物理地址,偏移量,段地址,存储器分段:段起始地址必须是某一小段的首地址,段的大小可以是64K范围内的任意字节。物理地址:每个存储单元的唯一的20位地址段地
26、址:段起始地址的高16位,低4位为0000B偏移地址(有效地址EA):段内相对于段起始地址的偏移值(16位)物理地址 = 16d 段地址 + 偏移地址,16 位 段 地 址,16 位 偏 移 地 址,0000,+,20 位 物 理 地 址,对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。如图所示。,物理地址和逻辑地址之间的关系,存储器的逻辑地址与物理地址,10011111,00100110,01001000,逻辑地址,段地址 : 偏移地址,1000 : 0000H,1000 : 0001H,1000 : 0002H,10
27、00 : 0003H,1000 : 0004H,1000 : 0005H,物理地址,10000H,10001H,10002H,10003H,10004H,10005H,10000011,01011100,10100010,字节内容(10000H)9FH;(10001H)26H 字内容 (10000H)269FH;(10001H)4826H,访问两次内存,在汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用其逻辑地址标识的。逻辑地址的段地址由段寄存器给出,偏移量可由寄存器(SI、DI、BP和BX等)给出,也可用符号地址或具体的数值给出。至于在指令中如何指出存储单元的逻辑地址将在第3章“寻
28、址方式”中给出详细说明。,2 段寄存器,8086有4个16位段寄存器: CS(代码段寄存器)指明代码段的起始地址 SS(堆栈段寄存器)指明堆栈段的起始地址 DS(数据段寄存器)指明数据段的起始地址 ES(附加段寄存器)指明附加段的起始地址 每个段寄存器用来确定一个段的起始地址,每种段均有各自的用途。,段寄存器的引用,段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图所示。段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。,段和
29、段寄存器的引用示意图,段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。,段和段寄存器的引用示意图,通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变
30、操作数的段寄存器(见:第3章中的强置前缀的书写格式),一般情况下,段寄存器及其指针寄存器的引用关系如下表所示。表中的“可选用的段寄存器”即是可以用强置说明这些段寄存器的值来作为其操作数地址的段地址。,对于上述规定,随着后续内容的叙述,将会对它们有更进一步理解。,存储器的逻辑分段:,存储器,64KB代码,01500H,42000H,1CD00H,段寄存器,CS DS SS ES,64KB堆栈,64KB数据,64KB附加数据,B0000H,B000H,存储器,8KB代码,2KB数据,256堆栈,02000H,04800H,04000H,0200H,0400H,0480H,CS DS SS,优点:
31、允许程序在存储器内重定位;允许实模式程序在保护模式下运行;有利于程序和数据的分离。,各段允许重叠,2.4.3 保护模式存储器寻址,80286及其后机器采用保护模式的存储寻址的原因 (1)80286及其后机器提供了16MB、4GB以及更多的存储空间,那么如何寻址呢? (2)解决了多任务处理的问题,同时支持虚拟存储器特性(程序运行时,只需把需要执行的代码从外存调入内存即可)。保护模式的存储寻址的管理方法(1)逻辑地址由选择器和偏移地址(32位、4GB)两部分组成,选择器放在段寄存器中,由操作系统管理计算段基址,再加上偏移地址,找到相应的存储单元。(2)用户设计程序时,和8086实模式存储寻址一样,
32、只需要设置段寄存器的内容即可。,支持多任务处理功能 支持虚拟存储器特性,保护模式下的存储器寻址,保护模式存储器寻址,2.5 外部设备,外部设备与主机的通信是通过外设接口(Interface)进行的,每个接口包括一组寄存器。 数据寄存器:存放外设和主机间传送的数据 状态寄存器:保存外设或接口的状态信息 命令寄存器:保存CPU发给外设或接口的控制命令外设中每个寄存器都分配一个端口(Port)地址(端口号),80x86允许有65535个8位或16位端口,构成一个独立于内存的 I / O 地址空间:0000H FFFFH。386以后有32位端口.便于用户使用外设,80x86提供了两种类型的例行程序共用户调用:BIOS 和DOS功能调用。,