620 likes | 751 Views
第一节 Intel 微处理器的概要历史. 第二章 微处理器体系与结构. 第二节 Intel 8086/8088 微处理器的结构. 第三节 Intel 80386 微处理器的结构. 第一节 Intel 微处理器的概要历史. 8086 初始芯片时钟频率为 4.77MHz 内部数据总线和外部数据总线都是 16 位 地址总线为 20 位 ,可最大寻址 1MB 的存储空间 80386 80x86 家族的第一个 32 位 处理器 内部和外部数据总线都是 32 位 地址总线也是 32 位 ,可寻址高达 4GB 内存
E N D
第一节 Intel微处理器的概要历史 第二章 微处理器体系与结构 第二节 Intel 8086/8088微处理器的结构 第三节 Intel 80386微处理器的结构
第一节 Intel微处理器的概要历史 • 8086 • 初始芯片时钟频率为4.77MHz • 内部数据总线和外部数据总线都是16位 • 地址总线为20位,可最大寻址1MB的存储空间 • 80386 • 80x86家族的第一个32位处理器 • 内部和外部数据总线都是32位 • 地址总线也是32位,可寻址高达4GB内存 • 具有实模式和保护模式外,还增加了一种叫虚拟86的工作方式,可以通过同时模拟多个8086处理器来提供多任务能力
一、执行单元与总线接口单元 第二节 INTEL 8086/8088微处理器的结构 三部分: 三、8086/8088的存储器组织 二、8086/8088的寄存器结构
8086/8088微处理器的结构相似,都由算术逻辑运算单元ALU、专用和通用寄存器、指令寄存器、指令译码器、定时器控制电路等组成。按功能可把CPU分成两大部:执行单元(Execution Unit)和总线接口单元(BusInterface Unit)如图2-1所示,图中左半部分为执行单元,简称EU。右半部分为总线接口单元,简称BIU。BIU与外部总线相连,完成与外设(或存储器)的数据传送,包括取指令操作、存储器读/写数据操作、I/O接口的读/写操作。EU通过BIU得到信息,其功能就是负责指令的执行。BIU和EU两个单元可以并行工作。这样提高CPU的工作速度。
一、执行单元与总线接口单元 1.执行单元EU 执行单元EU由8个通用寄存器、1个标志寄存器、算术逻辑运算单元ALU及EU控制电路组成;EU从BIU指令队列寄存器中获得指令和待处理数据进行操作。将指令代码译码后,发出相应的控制信息,将数据在ALU中进行运算,运算结果的特征保留在标志寄存的FLAGS中。 2.总线接口单元BIU 总线接口单元BIU包括4个段寄存器、1个指令指针寄存器、1个与EU通读寄存器。一个先入先出的6个字节(8088是4个字节)指令队列。总线控制逻辑电路及20位实际物理地址计算的加法器。
(一)、总线接口单元BIU(Bus Interface Unit) • 功能:负责与 Memory、I/O 端口传送数据。 • 取指令时,从存储器指定地址取出指令送入指令队列排队。 • 执行指令时,根据EU命令对指定存储器单元或I/O端口存取数据。
组成 • 4个段地址寄存器(CS、DS、ES、SS) • 16位指令指针寄存器IP • 20位的地址加法器(16d段地址+偏移地址=物理地址) • 6字节(8086)或4字节(8088)的指令队列 • 总线控制电路: • 处理器与外界总线联系的转接电路。包括三组总线:20 位地址总线, 16 位双向数据总线,一组控制总线。
指令队列 • 8086 的指令队列为6个字节, • 8088 的指令队列为4个字节。 • 不论是8086还是8088都会在执行指令的同时从内存中取下一条或几条指令,取来的指令放在指令队列中,使 BIU 具有预取指令的功能,是一种先进先出(FIFO)的数据结构。
指令执行顺序 • 顺序指令执行:指令队列存放紧接在执行指令后面的那一条指令。 • 执行转移指令:BIU 清除指令队列中的内容,从新的地址取入指令,立即送往执行单元,然后再从新单元开始重新填满队列。
(二)、执行单元EU ( Execution Unit ) • 功能 • 执行指令,进行全部算术逻辑运算、完全偏移地址的计算 • 向总线接口单元BIU提供指令执行结果的数据和偏移地址,并对通用寄存器和标志寄存器进行管理。 • 组成: • 4个通用寄存器:AX、BX、CX、DX • 4个专用寄存器:BP、SP、SI、DI • 标志寄存器(PSW): • 9个标志位,其中6个条件标志位用于存放结果状态, • 算术逻辑单元: • 16 位加法器,用于对寄存器和指令操作数进行算术或逻辑运算, • EU 控制系统: • 接受从总线接口单元的指令队列中取来的指令代码,对其译码和向 EU 内各有关部分发出时序命令信号,协调执行指令规定的操作。
指令的一般执行过程: 取指令 指令译码 执行指令
(三)、流水线工作方式 • 8086/8088取指部分与执行部分是分开的。 • 在一条指令的执行过程中可以取出下一条(或多条)指令,指令 在指令队列中排队; • 在一条指令执行完成后,就可以立即执行下一条指令,减少CPU为取指令而等待的时间,提高CPU的利用率和整个运行速度。 • 8086/8088微处理器: • BIU和EU分开,取指和执行可以重迭, • 大大减少了等待取指所需的时间,提高CPU的利用率。
(三)、流水线工作方式(cont.) • 对于8080与8085及较早的8位微处理器: • 程序执行由取指令和执行指令的循环来完成的。 • 每条指令执行完后CPU必须等待到下条指令取出来后才能执行。
15 8 7 0 累加器 AX AH AL BX BH BL 基址寄存器 数据 寄存器 CX CH CL 计数寄存器 通用寄存器组 DX DH DL 数据寄存器 堆栈指针寄存器 SP 基址指针寄存器 BP 指针和变址 寄存器 源变址寄存器 SI 目的变址寄存器 DI IP 指令指针寄存器 控制寄存器组 FLAGS 标志寄存器 CS 代码段寄存器 数据段寄存器 DS 段寄存器组 SS 堆栈段寄存器 ES 附加段寄存器 图2-2 8086/8088 CPU内部寄存器 二、8086/8088的寄存器结构 8086内部寄存器按其功能可分为:通用寄存器(8个),段寄存器(4个),控制寄存器(2个)。 • 8086CPU中有14个16位的寄存器。 • 8个16位通用寄存器; • 2个16位指针寄存器; • 2个16位的变址寄存器; • 4个16位的段寄存器; • 1个16位指令指针; • 1个16位标志寄存器。 • 8086/8088 CPU的内部寄存器如图2-2所示。
1.通用寄存器 通用寄存器的包括数据寄存器、地址指针寄存器和变址寄存器。 ⑴数据寄存器数据寄存器有AX、BX、CX、DX都是16位寄存器,这四个16位寄存器可分为高8位和低8位两部分使用,也就是说也可作8位寄存器使用。高8位表示成:AH、BH、CH、DH,低8位表示成:AL、BL、CL、DL。参与运算的数是16位数时,可用AX、BX、CX、DX中的任意一个描述,如果参与运算的数据是8位数时可用AH、AL、BH、BL、CH、CL、DH、DL中的任意一个描述。一般情况下,这四个数据寄存器就是用于存放参与运算的数据或运算结果的。但这四个寄存器又有自己特殊的用法。
AX(Accumulator)累加器,是指令系统中应用最多的寄存器,输入/输出只能用AX寄存器传递数据,它经常存放运算的中间结果,并参与下次运算,所以叫累加器。AX(Accumulator)累加器,是指令系统中应用最多的寄存器,输入/输出只能用AX寄存器传递数据,它经常存放运算的中间结果,并参与下次运算,所以叫累加器。 BX(base Register)基址寄存器,它通常用来存放内存的基地址,用于寄存器寻扯。 CX(count Register)计数寄存器,在循环和串操作指令中,用于计数重复次数。 DX(Data Register)数据寄存器,通常用来存放运算结果。如乘法运算后DX与AX合起来存放32位数的运算结果,其中DX存放高16位。在输入/输出操作中,可用DX作为端口地址的寄存器间接寻址。
⑵地址指针寄存器 地址指针寄存器有SP和BP两个。 SP(stack pointer)叫堆栈指示器,用于指示当前堆段中栈顶所在的存储单元地址。(堆栈在后面介绍)。 BP(base pointer)叫基址指示器,用于指示当前堆栈段中一个数据区基址的偏移地址,通过它间接寻址可对堆栈段中的某个数据进行存取。 SP和BP只能用于堆栈段,不能指示其它段。(存储器是按段管理的,后续介绍)。但SP和BP应用上是有区别的,SP可用于PUSH、POP、CALL、RET等指令,而BP不能用于这些令(后续介绍)。
⑶变址寄存器SI、DI SI(source Index)叫源变址寄存器,一般用于源操作数当前数据段中某个地址的偏移地址。 DI(Destination index)叫目标变址寄存器,一般用于目标操作数当前附加段(本数据段)中某个地址的偏移地址。 在字符串操作中,SI用于存放源串操作数的偏移地址,这个串一定是在数据段DS。DI用于存放目标串操作数的偏移地址,这个串一定是在附加段ES。 在寄存器间寻址时,经常用DI、SI加上一个位移量来改变存储器的地址,因此叫变址寄存器。 指针寄存器和变址寄存器与数据寄存器样,可以参与算术和逻辑运算,但指针寄存器和变址寄存器只能用于16位计算,不能分成8位。
2.段寄存器(segment) 段寄存器包括CS、SS、DS、ES,用于指示当前段的段基址。 CS(Code Segment)叫代码段寄存器,用于指示当前的代码段(程序段)的起始地址段基址。 DS (Date Segment)叫数据段寄存器,用于指示当前的数据段的段基址。 SS(Stack Segment)叫堆栈段寄存器,用于指示当前的堆栈段的段基址。 ES (Extra Segment)叫附加段寄存器,用于指示当前的附加段的段基址。 CS段一般用于存放CPU执行的程序代码。DS一般用于存放程序中的变量和数据。SS段一般用于存放压栈的信息。ES段一般用于存放参与运算结果。
3.控制寄存器 控制寄存器有IP和FLAGS。 ⑴IP(Instruction Pointer)叫指令指针寄存器(程序指示器)。用于存放预取指令的偏移地址。CPU从代码段中偏移地址为IP的内存单元中取出指令代码的一个字节后,IP自动加I,指向指令代码的下一个字节。用户程序不能直接访问IP。 ⑵FLAGS(Flags)叫标志寄存器,用于存放运算结果的标志。FLAGS是16位寄存器,用其中的9位来描述9个标志。通常叫标志9个标志可分为状态标志位和控制标志位。如图2-3所示。 图2-3 8086标志寄存器FLAGS
状态标志位有: CF(Corry Flag)进位标志位(借位标志位):当进行加法(或减法)运算时,若最高位发生进位来借位,则CF=1,否则CF=0。 PF( Parity Flag)寄标志位:当逻辑运算结果中“1”的个数为偶数时,PF=1,为奇数时,PF=0。 AF(Auxiliary Carry)半进位标志位:在8(16)位加减法运算中,低4(8)位向高位有进位或借位,则AF=1,否则AF=0。 ZF(Zero Flag)零标志位:当运算结查为0时,ZF=1,否则ZF=0。 SF(Sign Flag)符号标志位:当运算结果最高位是1(即函数)时,SF=1,否则SF=0。 OF(Over Flag)溢出标志位:当运算结果超出了带符号数的范围,即溢出时,OF=1,否则OF=0。8位带符号数范围是-128~+127。16位带符号数的范围是-32768~+32767。这6个状态标志位状态是计算机运算后,自动生成的不是人为赋予的,当然也可通过POPF改变各状态值。(后续介绍)
控制标志位 控制标志位被设置后,可完成某些控制操作。 TF(Trap Flag)跟踪标志位:是为调试程序而设置的。若TF=1,则使8086CPU处于单步工作方式,在这种工作方式下,CPU每执行完一条指令,就自动产生一个内部中断,处理机转去执行一个中断服务程序。检查程序中的每条指令执行情况,当TF=0时,CPU正常执行程序。 IF(Interrupt Flag)中断允许标志位(开中断标志位):若将IF设置为1时(IF=1),8086CPU开中断,CPU允许外部的可屏蔽中断源的中断请示,若将IF清零(IF=0),8086CPU关中断,CPU禁止外部可屏蔽中断的请求。 IF只对可屏蔽中断起作用,对非屏蔽中断和内部中断都不起作用。 DF(Direction Flag)方向标志位:方向标志位用于控制串操作指令中SI(或DI)的修改方向。当DF设置为1(DF=1)时,SI(或DI)减量,当DF清零(DF=0)时,SI(或DI)增量,因为SI(或DI)描述串操作的偏移地址,当SI(DI)减量时,串是由高地址向低地址方向遵序执行。后续指令中将详细介绍。
在调试程序时,DEBUG提供了测试标志位的手段,在调试程序时,DEBUG提供了测试标志位的手段, 用符号表示标志位的值,每种标志位的符号如下表: DEBUG不提供TF的符号用于单步方式操作。
例1:执行两个数的加法,分析对标志位的影响。例1:执行两个数的加法,分析对标志位的影响。 • 标志: 运算结果最高位为0 ∴SF=0; 运算结果本身≠0 ∴ZF=0 低8位中1的个数为奇数个 ∴PF=0; 最高位没有进位 ∴CF=0 第三位向第四位无进位 ∴AF=0; 次高位向最高位没有进位 ,最高位向前没有进位 , ∴OF=0。
例2 若AL = 3BH,AH = 7DH,试指出AL中的内容和AH中的内容相加、相减后,标志CF、AF、PF、SF、OF和ZF的状态。 解:(1)AL + AH 0 0 1 1 1 0 1 1 AL + 0 1 1 1 1 1 0 1 AH 1 0 1 1 1 0 0 0 由运算结果可知: CF = 0 (无进位); AF = 1(有辅助进位); PF = 1(有偶数个1); SF = D7 = 1(运算结果符号位为1);OF = 1 (同号相加,结果的符号与两操作数符号相反,有溢出); ZF = 0 (运算结果不为0)。 (2)AL – AH 0 0 1 1 1 0 1 1 AL - 0 1 1 1 1 1 0 1 AH 1 0 1 1 1 1 1 0 由运算结果可知: CF = 1(有借位); AF = 1(有辅助借位); PF = 1(有偶数个1); SF = 1(符号位为1); OF = 0(同号相减,无溢出); ZF = 0(运算结果不为0)。
(一)、存储器结构 三、8086/8088的存储器组织 (三)、信息分段存储与段寄存器 (二)、存储器的分段结构和物理地址的形成
(一)、存储器结构 8086/8088系统中存储器的每一个存储单元(字节)都有一个独立的地址编码,地址编码采用20位二进制表示,地址译码器是根据地址编码才找到目标存储单元的。 20位二进制地址编码的范围的十六进制表示为00000H~FFFFFH,最多可表示 (1MB)地址编码唯一的存储单元,把20位二进制表示的地址称为物理地址。 存储单元内容 38F04H 10110110 存储单元地址
存储单元地址:按照字节编址 内存单元的地址和内容
存储单元的内容:一个存储单元有效的信息。 • 机器字长是16位, • 大部分数据以字节为单位表示, • 一个字存入存储器占有相继的二个单元: • 低位字节存入低地址,高位字节存入高地址。 • 字单元的地址采用它的低地址来表示。 • 例: 字单元 :[0004H]=1234H, • 字节单元 :[0004H]=34H • 同一个地址既可以看作字节单元地址, • 又可看作字单元地址,需要根据使用情况确定。 • 字单元地址:可以是偶数也可以是奇数,
8086/ 8088系统的存储体结构 8086系统的存储体结构 8088系统的存储体结构
(二)、存储器的分段结构和物理地址的形成 8086有20条地址线,可以寻址1M内存空间。地址从00000H~FFFFFH。但8086CPU内部的地址寄存器都是16位的,最多能寻址64K字节,为了能寻址1M字节,8086采用分段技术。分段技术是把存储器可分成代码段CS、堆栈段SS、数据段DS和附加段ES四种。每段为64KB,段与段可以重叠,可以交叉,也可以没有联系。如图2-4所示。存储器分段管理后,每个单元的地址都可以用两个形式的地址来表示,实际地址(物理地址)和逻辑地址。
例:已知当前有效的代码段、堆栈段、数据段和附加段的段基址分别为1055H、EFF0H、250AH和8FFBH,它们在存储器中的分布情况如图2-5所示。
物理地址:是由20位地址或状态来表示的地址。即20位二进数来表示。CPU与存储器交换信息时,使用的是物理地址。物理地址:是由20位地址或状态来表示的地址。即20位二进数来表示。CPU与存储器交换信息时,使用的是物理地址。 逻辑地址:是把20位地址分成段基址和偏移地址两部分表示,即段:偏移。这两部分都是无符号的16位二进制数。例如:0001H:2000H。程序是以逻辑地址来编址的。 物理地址的形成是通过CPU内部的BIU部件中的地址加法器运算出来的,如图2-6。
从图中可看出物理地址可由下式计算: 物理地址=段基址×16+偏移地址。 2-6 8086物理地址的形成 例如:CS=2000HIP=2200H,则物理地址为:20000H+2200H=22200H。
10550H CS CS 250A0H DS 2EF00H ES 8FF00H SS [例]: 已知CS=1055H,DS=250AH,ES=2EF0H,SS=8FF0H, DS段有一操作数,其偏移地址=0204H, 1)画出各段在内存中的分布 2)指出各段首地址 3)该操作数的物理地址=? 解: 各段分布及段首址见右图所示。 操作数的物理地址为: 250AH×10H+0204H = 252A4H
四个段寄存器可以分别描述当前使用的段的起始字节单元。偏移地址可由16位寄存器来描述。一般情况下CS段的偏移地址用IP描述,SS段的偏移地址由SP和BP描述。DS段的偏移地址由BX或SI加上位移量来描述,ES段的偏移地址可由BX和DI加上位移量来描述。如图2-7所示。四个段寄存器可以分别描述当前使用的段的起始字节单元。偏移地址可由16位寄存器来描述。一般情况下CS段的偏移地址用IP描述,SS段的偏移地址由SP和BP描述。DS段的偏移地址由BX或SI加上位移量来描述,ES段的偏移地址可由BX和DI加上位移量来描述。如图2-7所示。 2-7 段寄存器和其它寄存器组合指向存储单元
段超越前缀指令 • 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段 • 默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个: • CS: ;代码段超越,使用代码段的数据 • SS: ;堆栈段超越,使用堆栈段的数据 • DS: ;数据段超越,使用数据段的数据 • ES: ;附加段超越,使用附加段的数据
段超越的示例 • 没有段超越的指令实例: • MOV AX,[2000H] ;AX←DS:[2000H] • ;从默认的DS数据段取出数据 • 采用段超越前缀的指令实例: • MOV AX,ES:[2000H] ;AX←ES:[2000H] • ;从指定的ES附加段取出数据
(三)、信息分段存储与段寄存器 逻辑地址来源
四、8086/8088系统中的堆栈 堆栈是在计算机中的RAM存储区开辟的一个特定区域,按照“后进先出”的原则组织。主要用于暂存数据和断点地址。 1.堆栈的结构 存储区的存储方式采用一端固定(称为栈底),另一端浮动(称为栈顶)的方式,即只允许在活动端进行数据的输入或删除。 2.堆栈的操作 堆栈段在存储区中的位置由堆栈段寄存器SS和堆栈指针SP来确定。SS中存放堆栈段的段基址,SP中存放栈顶的地址,此地址表示栈顶离段首址的偏移量,因此用SP指示栈元素进栈和出栈的偏移地址的变化。 SS 10000H 堆栈段首地址 … ≤64KB 11FFAH 11FFBH 11FFCH 11FFDH 11FFEH 11FFFH 栈底 SP 12000H 图2-8 8086堆栈在存储器中的分布情况
(1)建栈。 建立堆栈就是设定堆栈的段基址和栈底,用户可以通过数据传送指令把堆段的段基址送入段寄存器SS,把栈底的偏移地址送入堆栈指针寄存器SP。此时栈中无数据,是一个空栈。 若SS = 1000H,SP = 2000H,则堆栈的情况如图2-8所示,建立堆栈指令为:MOV AX,1000H MOV SS, AX MOV SP,2000H (2)入栈。 入栈就是把数据压入堆栈,又称进栈。8086微处理器的入栈操作以字为单位。入栈操作分为两步:①将堆栈指针寄存器SP的内容减2,即是栈顶向低地址方向移动一个字单元,指向新栈顶。即:SP ← SP – 2;②将一个字数据推入到SP所指向的栈顶字单元,即:[SP] ← 字数据。 注意:入栈字的低字节存入低地址单元,高字节存入高地址单元。
例2 若SS = 2000H,当前SP = 1234H,将寄存器AX中的数据7C9FH压入堆栈。操作如下:①修改SP,使其指向新栈顶,即:SP = 1232H。 ②AX的内容压入栈顶字单元。即:AL送21232H单元,AH送21233H单元。其操作如图所示。 5CH 20H (3)出栈。 出栈是从堆栈中弹出数据。出栈的操作顺序与入栈相反。①将栈顶的一个字送寄存器或存储器,即:寄存器/存储器 ← [SP];②堆栈指针寄存器SP的内容加2,指向新栈顶, 即:SP ← (SP)+ 2 若:若SS = 2000H,当前SP = 1232H,将栈顶数据弹出送寄存器AX。 设SS = 2000H AX 21232H SP 1232H 9FH 入栈操作 21233H 7CH XX 21234H a) AX 21232H 20H 出栈操作 21233H 5CH 21234H SP XX 1234H b)
一、80386微处理器的体系结构 第三节 Intel 80386微处理器的结构 二、存储器管理 三、80386的工作方式 四、中断
一、80386微处理器的体系结构 80386的主要特性