收藏 分享(赏)

四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt

上传人:kpmy5893 文档编号:8873088 上传时间:2019-07-15 格式:PPT 页数:105 大小:937.50KB
下载 相关 举报
四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt_第1页
第1页 / 共105页
四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt_第2页
第2页 / 共105页
四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt_第3页
第3页 / 共105页
四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt_第4页
第4页 / 共105页
四川大学计算机学院汇编语言课件第四章 8086CPU组织结构.ppt_第5页
第5页 / 共105页
点击查看更多>>
资源描述

1、第四章 8086-8088CPU,CPU概述,CPU的特点,由运算器和控制器两部分组成; 可以进行算术和逻辑运算; 可保存较少量数据; 能对指令进行译码并执行规定的动作; 能和存储器、外设交换数据; 提供整个系统所需要的定时和控制; 可以响应其他部件发来的中断请求。,运算器,运算器是完成二进制编码的算术或逻辑运算的部件,可以实现各种算术运算和逻辑运算。运算器由累加器、通用寄存器和算术逻辑单元组成,其核心是算术逻辑单元ALU(Arithmetic and Logic Unit)。 累加器是特殊的寄存器,它既能接受来自总线的二进制信息作为参加运算的一个操作数,向算术逻辑单元ALU输送,又能存储由A

2、LU运算的中间结果和最后结果。 运算器是计算机实现高速运算的核心。它按照指令,在控制器的控制下,对信息进行算术运算、逻辑运算、移位运算等操作。,控制器,控制器(Control Unit)是全机的指挥中心,它控制各部件动作,使整个机器连续地、有条不紊地运行,实现计算机本身运行过程的自动化。控制器的具体功能是识别翻译指令代码,安排操作次序并向计算机各部件发出适当的控制信号,以便执行机器指令,使计算机能自动地、协调一致地工作。 执行程序时,控制器首先从内存中按顺序取出一条指令,并对指令进行分析,然后根据指令的内容向有关部件发出控制命令,控制它们执行规定的任务。 这样逐一执行指令,就能使计算机按照这些

3、指令组成的程序要求,自动运行。,Cpu与微机硬件系统结构,系统总线(AB,CB,DB)把硬件设备连接起来,存储器系统,微型计算机的存储器系统由内部存储器和外部存储器组成。 内存用于存放执行的程序和待处理的数据,它直接与CPU交换信息。 外存不直接与CPU相连,它主要用来保存程序和数据,通常作为辅助存储器。,内存,分类:随机存储器、只读存储器、虚拟存储器、CMOS、高速缓冲存储器。 RAM(Random Access Momory)通常用来存储用户程序和数据,机器断电后信息丢失,也称为易失性存储器。 ROM(Read Only Memory)通常用于保存系统程序,如OS和BIOS等,机器断电后信

4、息保留,也称为非易失性存储器。,CMOS也称为“小内存”,用于保存计算机当前的配置信息,如日期和时间、硬盘的格式和容量、内存容量等。这些信息也是在计算机调入操作系统之前必须知道的信息。 Cache(高速缓冲存储器)介于内存和CPU之间,它存取速度比内存快,但容量不大(8KB或16KB等),存储当前CPU正在执行的程序段落或数据。,内存,外存,外存通常用来永久存储信息,由操作系统管理。 DAS(直接访问存储)是最常用的外存储形式,如磁盘、磁带和光盘。 常见的磁盘系统有软盘和硬盘系统。 磁盘的读写是通过磁盘驱动器来完成的。 磁盘控制器负责与计算机的接口工作。,输入/输出设备,输入/输出设备I/O设

5、备的分类I/O接口的功能,常规输入/输出设备;辅助存储器;数据通信设备;专用控制设备。,实现数据缓冲;实现数据格式的变换;进行CPU与I/O设备之间的通信控制。,简称I/O设备或者外设。它们位于主机之外,用于实现计算机与外部设备或者计算机与人进行的信息交换,所以又称外围设备。,接口寄存器的功能,数据缓冲寄存器:用来暂时存放主机输出给外设的数据,或外设输入给主机的数据。即用来存放要在外设和主机间传送的数据,这种寄存器实际上起缓冲器的作用。 状态寄存器:用来保存外部设备或接口的状态信息,以便CPU在必要时测试外设状态,了解外设的工作情况。 控制或命令寄存器:接收、存放主机发来的各种命令、控制信息。

6、CPU给外设或接口的控制命令通过此寄存器送给外部设备。,8086系统组成,微机的主板结构,CPU插槽 内存插槽 芯片组 二级高级缓冲存储器 CMOS芯片 总线扩展槽,AGP显示卡插槽 外接接口插座 串行和并行端口 主板跳线 系统监控,软件与硬件的逻辑等价性,一个完整的计算机系统包含硬件和软件两大部分,硬件是计算机系统的物质基础,正是在硬件高度发展的基础上,才有软件赖以生存的空间和活动场所,没有硬件对软件的支持,软件的功能就无从谈起。 计算机的软件系统是在硬件系统的基础上,为有效地使用计算机而配置的。没有系统软件,现代计算机系统就无法正常地、有效地运行;没有应用软件,计算机就不能发挥效能。 计算

7、机系统的功能由硬件或由软件实现,现代计算机系统的硬件和软件正朝着互相渗透、互相融合的方向发展,计算机系统中没有一条明确的硬件与软件的分界线。,80x86微处理器概述,80286微处理器 80386微处理器 80486微处理器 Pentium微处理器,80x86微处理器概述,自Intel公司推出8086/8088微处理器之后,又相继推出了80286、80386、80486、Pentium等系列微处理器,每一个微处理器的推出,都给计算机世界带来创新和提高。 Intel公司的每一种新产品都兼容原来的系列产品,从而使此前开发的软件都能继续使用。,80286微处理器,与8086在目标代码级完全保持了向上

8、兼容。 在内部结构上,8086中的总线接口部件BIU在80286中又分成了地址部件AU、指令部件IU和总线部件BU,从而加快了处理器的运行速度。 芯片内具有存储管理部件MMU和保护机构。存储器管理可以实现在实地址和保护虚地址两种方式下访问存储器。,80286微处理器的内存寻址,80286的存储空间由可变长度的段组成,每个段是一个最长可达64KB的相邻字节序列。 存储空间包括物理存储器和虚拟存储器,这些段按用途可分为代码段、堆栈段、数据段和附加段等,在保护方式下,还有任务状态段TSS(Task State Segment)和描述子表段DTS(Descriptor Table Segment)。,

9、80286存储器寻址,保护方式的存储器寻址使用32位指针,包含一个16位的选择子分量和一个16位的偏移量分量。 但选择子的内容不再是一个物理存储器的地址的高16位,而是进入某一个存储器常驻表的变址值,所要求的段的24位段基地址要从存储器中的表内取得。 16位偏移量用来加到段基址上,形成24位的物理地址,80286在保护方式下的存储器寻址,80386微处理器,它的数据总线和地址总线都是32位的,能灵活处理8位、16位、32位和64位数据信息。 内部结构由总线接口单元、指令预取部件、指令译码部件、执行部件、分段部件和分页部件6个逻辑功能部件组成。 可以工作在实地址、保护虚地址以及虚拟8086三种模

10、式。 新增加了可测试特性和调试功能。,80386微处理器的功能部件,80386微处理器的工作方式,80386在实地址方式下的工作原理与8086相同,主要差别是80386可以处理32位的数据,如进行32位的寄存器的运算,以及偏移地址在64KB以内的32位的数据传送。 80386在保护方式下可以访问4G字节的物理存储空间,段的长度在启动页功能时是4G字节,不启动页功能时是1M字节,页功能是可选的。 虚拟8086方式是一种既有保护功能,又能执行8086代码的工作方式,是一种动态方式。,80386的三种工作方式之间的转换关系,80386的地址空间,逻辑地址又称虚拟地址,由一个选择子(段选择子)和一个偏

11、移量组成。偏移量即在存储器操作数的九种寻址方式中求得的有效地址。 线性地址80386芯片内的分段部件将逻辑地址空间转换为32位的线性地址空间。分段部件如何完成逻辑地址到线性地址的转换是实地址方式和保护方式的主要区别。 物理地址80386芯片内的分页部件将线性地址空间转换为物理地址空间,物理地址就是在芯片引脚上出现的地址。,80386的寄存器,80386内部共有8个32位的通用寄存器,称为EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP,这些寄存器可以用来存放数据和地址,且与8086和80286兼容。 32位的指令指针寄存器EIP用于保存下一条待取指令的偏移地址 。 32位的标志寄

12、存器EFLAGS,它的低16位与80286各位的定义相同 ,又新增了RF和VM两个标志位。,80386的段选择寄存器是在80286选择寄存器基础之上新增了两个支持当前数据段的段选择寄存器FS和GS 。 80386有四个专用的寄存器用来保存保护模式下的表和段,这些寄存器为GDTR(48位)、IDTR(48位)、LDTR(64位)和TR(64位),它们对应地保存GDT(全局描述符表)、IDT(中断描述符表)、LDT(局部描述符表)和TSS(任务状态段)的信息。,80386的寄存器,80486微处理器,80486是一种与80386完全兼容但功能更强的32位微处理器。 它采用了一系列新技术增强微处理器

13、功能,如对80386核心硬件进行改造,部分采用RISC(精简指令系统计算机)技术来加快指令的执行速度;增强总线接口部件加快了CPU从主存中存取信息的速度;把浮点运算协处理器部件、高速缓存及其控制器部件集成到CPU芯片内以加快信息的传送与处理性能。,80486微处理器的特点,芯片为网络阵列式封装,有168条引脚,数据总线与地址总线均为独立的32位。 微处理器内部的寄存器、ALU和内部数据总线都是32位。而CPU与浮点运算部件之间的数据通道为64位,CPU与Cache之间的数据通道为128位。 芯片内具有8KB的数据/指令高速缓存Cache,可为频繁访问的数据和指令提供高速缓存,从而加快CPU与存

14、储器之间的信息交换。 部分采用RISC技术,芯片上不规则的控制部分减少,缩短了指令的执行时间,大多数常用指令均可在一个时钟周期内完成。,80486微处理器的特点,支持突发总线周期操作,即一次总线周期操作可完成一个数据块的传送。 具有三种工作方式,即实地址方式、虚拟地址保护方式和虚拟8086方式。在虚拟地址保护方式下,可寻址4GB物理地址空间以及64TB虚拟地址空间。 片内集成了浮点运算部件,可支持32位、64位和80位的浮点算术运算。由于与CPU之间的数据通道总线加宽,而引线缩短,它们之间的信息交换速度也得到提高。 片内具有存储管理部件MMU,可支持对存储器地址实施管理和对存储器空间进行保护。

15、,80486的内部功能结构,80486的寄存器组,系统地址寄存器,Pentium微处理器,Pentium是Intel公司于1993年推出的第五代80x86系列微处理器,中文译名为“奔腾”。 Pentium微处理器在工作方式方面,还增加了一种“系统管理方式(SMM)”,以实现对电源和OS进行管理等高级功能。在软件方面,它兼容了80486的全部指令且有所扩充。 Intel公司在以后的研制中,又推出了Pentium MMX、Pentium、Pentium及Pentium。它们在第一代Pentium原有指令系统的基础上,又增加了一些多媒体指令MMX(Multi Media Extension),专门用

16、来处理音频、视频等数据,SSE(Streaming SIMD Extensions)和图形、图像等信息。,Pentium微处理器的特点,CISC技术与RISC技术结合 超标量体系结构 浮点指令流水线与浮点指令部件 指令转移预测部件 采用64位外部数据总线 双Cache的哈佛结构:指令与数据分开 支持多重处理 增加了系统管理方式 用硬件实现部分指令,Pentium微处理器的内部结构图,Pentium微处理器的内部寄存器,Pentium的寄存器组织可以分成三大类,即基本寄存器组、系统寄存器组和浮点寄存器组。 其中系统寄存器组只供系统程序访问,其他两组寄存器则供系统程序和应用程序共同访问。 Pent

17、ium微处理器对80486的寄存器作了一些扩充。 EFLAGS标志寄存器增加了两位:VIF(位19)和VIP(位20),它们用于控制Pentium虚拟8086方式扩充部分的虚拟中断。 控制寄存器CR0的CD位和NW位被重新定义以控制Pentium的片内高速缓存,并新增了CR4控制寄存器对80486结构扩充。 此外,还增加了几个模式专用寄存器,用于控制可测试性、执行跟踪、性能检测和机器检查错误等功能。,Pentium系列微处理器的技术发展,Pentium Pro内部设置了3条指令流水线,含36条地址线,直接寻址范围为64GB。 Pentium MMX集成了450万个晶体管,虽然片内没有二级Cac

18、he,但是其代码Cache和数据Cache均高达16KB,主频达266MHz。Pentium MMX最主要的特点是MMX(Multimedia extension)功能的加入。 Pentium 内部含有750万个晶体管,最高频率达500MHz。在结构上,它用一块印刷电路板将CPU和二级Cache封装在一起,再用外壳封装。 Pentium 内部集成了950万个晶体管,开始的工作频率为450 MHz,后来高达1GHz以上。 Pentium 内部含有4200万个晶体管,目前市场上的Pentium 主频高达3.06GHz。,Itanium微处理器简介,Itanium是Intel 公司继Pentium系

19、列微处理器后推出的具有超强能力的微处理器,国内译为“安腾”。其数据总线和地址总线都是64位,内部集成了2.2亿个晶体管,集成度达到Pentium的十倍,主要面向高档服务器和工作站。 Itanium拥有三级Cache,一级Cache包括16KB的指令Cache和16KB的数据Cache,二级Cache容量为96KB,此外,还可以外接4MB的三级Cache。 Itanium内部含有128个通用寄存器、128个浮点寄存器和64个属性寄存器。 众多寄存器使Itanium即使在峰值操作状态也能保证内部寄存器充足够用,从而减少了等待与传输,提高了效率,并且适用于多任务操作。,4.1 Intel 80x86

20、系列CPU内部结构,汇编语言建立在机器指令基础之上,是一种描述硬件运转过程的语言。每一种CPU都有自己的指令系统,因此在理解汇编语言基本概念前,必须先对计算机系统、CPU的内部结构和工作机制作一个概要的理解。,Intel 80x86系列CPU发展概况,Intel公司80x86系列微处理器 自上世纪70年代 微型计算机 1971年 4位微处理器Intel 4004;8位微处理器8008; 1973年 8080; 1974年 基于8080的PCMicrosoft公司的BASIC语言解释程序; 1977年 8085 1978年 8086、8088、80286、80386等系列CPU。 。1995年

21、Pentium等。,80x86 CPU字长,16位CPU8086、8088、80286 32位CPU80386、80486 准64位CPUPentium、P、P、P 64位CPUItanium,本课程选用的CPU类型,Intel 推出的80x86系列处理器的性能和功能越来越强。但是,从汇编语言程序角度看,8086建立的实模式和80386建立的保护模式模型到目前为止一直适用。本门课程的实模式编程以8086为例说明,Intel80x86系列微处理器性能对比,8086引足图,8086引脚信号和功能,系统总线最小模式,最小模式下计算机总线图,8086概述Intel8086是标准的16位微处理器;Int

22、el 8088是准16位微处理器,它们在内部结构上都是按16位设计的,但Intel 8088在外部引脚上和当时的8位微处理器Inter8080/8085相兼容。8086/8088不仅数据总线的位数加宽了一倍,更重要的是采用了流水线处理技术。一条指令的执行可以分为:取指令指令译码指令执行在指令执行时根据需要在存储器中存取操作数。,4.1.1 8086CPU的功能结构内部结构框图,4.2 8086CPU的功能结构内部结构组成,4.2.1 执行单元(EU) (a)组成 16位算术逻辑单元ALU; 16位状态标志寄存器FLAG; 8个16位通用寄存器组(AX,BX,CX,DX,SP,BP,SI,DI)

23、 16位数据暂存器; EU控制电路;,(b)功能 从BIU指令队列中读取指令; 由EU控制电路对指令进行译码分析,指出操作性质及对象; 在EU中计算出操作数的16位地址偏移量送给BIU,由BIU的形成20位绝对地址; 将取来的操作数经系统数据总线送ALU进行指定操作; 运算结果经内部总线送到指定位置;,(a)部件 4个16位段寄存器CS,DS,SS,ES; 16位指令偏移地址寄存器IP; 6个字节指令队列ISQ; 形成20位物理地址的加法器; 与EU通讯的内部寄存器; 总线控制逻辑;,4.2.2 总线接口单元,(b)功能: 实现CPU与存储器或I/O口之间的数据传送。 根据CSIP取指令进入指

24、令队列。 由EU从指令队列中取指令,并根据EU请求BIU将20位操作地址传送给存储器; 取来操作数经总线控制逻辑传送到内部EU数据总线,由EU完成内部操作; 操作结果若EU提出请求,则由BIU负责产生20位实际目标地址,将结果写入存储器里;,(2)总线接口单元,4.3 寄存器结构及操作,在8086/8088CPU中,把寄存器分成5大类: 1.数据寄存器; 2.地址指针寄存器; 3.段基址寄存器; 4.标志寄存器; 5.指令指针寄存器;,用来存放操作数及中间结果的通用寄存器称为数据寄存器。 16位寄存器:AX,BX,CX,DX(可以分成两个8位的使用) , SP,BP,SI,DI 8位寄存器:A

25、H,AL,BH,BL,CH,CL,DH,DL 有些存储器有特殊功能:如SP为堆栈指针指示堆栈栈顶地址;AX和AL为累加器,乘法指令中专用;BX和BP可以作为基址指针,SI和DI可以用做串操作等;CX为计数寄存器。,4.3.1 数据寄存器,4.3.2 地址指针寄存器,地址指针寄存器用于存放操作数的地址,编程时通过修改寄存器的内容达到修改地址的目的。 可以用来指示地址的寄存器有: SP:堆栈指针,指示堆栈段(关于段SS)中的栈顶位置,专门用于数据进栈和出栈的位置指示; BP:基址指针,指示堆栈段中一个数据区中的基址位置; 此外:BX,SI,DI也可以用做指示地址。,4.3.3 段基址寄存器,段基址

26、寄存器用于存放4个当前段的起始地址。4个段为:代码段CS,数据段DS,堆栈段SS和附加段ES。,4.3.3.1 存储器的段 8086/8088CPU对可寻址的1MB空间划分为很多个逻辑段,每个逻辑小于64KB,段内地址是连续的。 CPU规定4个段寄存器存放当前可寻址的段基址。 CS指示当前的代码段; DS指示当前的数据段; SS指示当前的堆栈段; ES指示当前的附加段;,4.3.3.2 逻辑地址与物理地址 (1)对存储器的任一位置的访问都是在该位置所在的段基址下进行的。 逻辑地址形式为:段基址:段内位移 (物理地址)20=(段基址)16+(段内偏移) 如:访问一个地址C85F:109A对应的实

27、际地址为C85F0+109A=C968AH (2)同一个实际地址可以采取不同的逻辑地址形式表示,即不同段可以相互重叠。例如:地址12345H可以表示为:1200:0345或1230:0045,4.3.3.3、为了方便编写程序,4个段寄存器是隐含使用的,但也允许段超越。,4.3.3.4 存储器分段结构和物理地址形成: 地址总线为20位,寻址空间为1M,每一个存储单元的地址信号均为20位二进制码,称为物理地址。 分段结构:将1M内存空间划分为若干段,最大不超过64KB;每段起始地址规定为最低4位为0,高16位为段寄存器内容(段基址),段内存储单元地址用相对于段首地址的偏移地址来表示。 分段管理给程

28、序设计带来了较大的灵活性。比如,程序中所用的数据区超过64KB,需要从不同的区域去取数据,只要在取操作数之前给DS或ES重新赋值。,思考题: 8086最多可以分为多少个段? 最少可分多少段?,4.3.3.5 8086存储器寻址与I/O寻址的区别 存储器寻址用20位地址总线AD0AD19,而I/O寻址只用16位地址总线AD0AD15;因而存储器寻址是1MB,I/O寻址是64KB; 存储器操作和I/O操作用控制线M/IO的逻辑电平高低区别; I/O端口操作时,需要用专门的指令进行操作,并且必须通过累加器(AL或AX)来完成,存储器操作可用通用寄存器完成;,4.4 状态标志寄存器,EU内有一16位状

29、态标志寄存器FLAG。,其中,状态标志有6个,控制标志有3个。,状态标志寄存器,1、状态标志位6个(1)CF:进位标志,若运算结果最高位产生进位或借位,则CF置“1”,否则置“0”。(2)AF:辅助进位标志,若低字节的第4位上产生一个进位或借位,则AF置“1”,否则置“0”。(3)ZF:零标志位,若运算结果为零,则ZF置“1”,否则清零。,状态标志寄存器,1、状态标志位(共6个)(4)SF:符号标志位,若算数运算的结果为负SF置“1”,否则清零。(5)OF:溢出标志位,有符号数算术运算结果产生溢出OF置“1”,否则清零。(6)PF:奇偶标志位,运算结果中低8位所含1的个数为偶数则PF置“1”,

30、否则清零。,状态标志寄存器,0101 0100 0011 1001+ 0100 0101 0110 10101001 1001 1010 0011,高位=1,SF=1 低8位中有4个1,PF=1 运算结果不为0,ZF=0 低4位向前有进位,AF=1 最高位向前没有进位,CF=0 两个同号数相加结果成为异号OF=1,?求各状态标志位,(四)状态标志寄存器,2、控制标志位 (1)DF:方向标志位 DF=1串操作指令以递减顺序处理数据串;DF=0以递增顺序处理数据串。 (2)IF:中断允许位 若IF=1,CPU允许接受外部可屏蔽中断请求,即开中断;IF=0关中断 (3)TF:跟踪标志位 TF=1处理

31、器处于单步工作方式,每执行完一条指令产生一个软件中断;TF=0正常工作。,4.5 指令指针寄存器IP,4.5.1、 指令指针寄存器IP指令指针寄存器IP始终指向当前代码段(CS)所要取出的下一条指令的地址。每取出一个字节指令后,IP自动加1。可以用转移指令、调用指令及中断和复位等改变IP值。,4.5.2、堆栈指针SP?问题(1)为什么需要设置堆栈?(2)堆栈的定义?(3)堆栈的种类?堆栈生成的方法?(4)堆栈的操作?,堆栈是一组寄存器或一个存储区域,用来存放调用子程序或响应中断时断点地址,以及其它寄存器的内容。 堆栈操作有两种,一种叫压入或推入(PUSH), 另一种叫弹出(POP) 。 对 8

32、086、80286 CPU来说, 每次压入或弹出一个字。 堆栈的这种“后进先出”的特点由堆栈指示器SP来控制。 SP必须具有自动步进增量和减量的功能。 在向下生成方式中,栈底高地址,栈顶低地址。当压入堆栈时,首先SP自动减2,指向新的栈顶两个空单元,然后将要压入堆栈的一个字送入栈顶两个空单元中。,8086 堆栈形式,4.5.3 堆栈的重要功能(1)调用子程序时返回点的保存和恢复在任何实用的程序中,都会使用子程序来完成一些相对独立的功能,在高级语言中是这样,在汇编语言中,仍然是这样。在汇编语言中调用子程序使用CALL指令,子程序返回主程序使用RET指令。我们在这里先不具体讨论CALL指令和RET

33、指令,只需要知道它们的大概功能。先看下面的例子。,例1堆栈对于子程序调用的作用 主程序片段: CALL PROC1 #主程序中使用CALL指令调用子程序PROC1,即跳转到PROC1的起始地址 子程序PROC1片段: RET #子程序执行完毕后使用RET指令返回主程序,按照程序的流程,CALL指令调用子程序PROC1后,必须返回到CALL指令后面那条指令的位置继续往下执行。那么在执行CALL指令时CPU必须记载紧跟它后面那一条指令的地址,否则以后就没有办法返回主程序继续执行。CALL指令在实行跳转前,会自动把当前的CS、IP寄存器中的内容按先后顺序入栈保存,此时CS、IP中的逻辑地址是指向CA

34、LL指令后面那条指令的(在取指周期中,IP已经被修改,指向了下一条指令),这就是返回点的保存。,CALL指令执行跳转后,程序流程跳转到子程序PROC1的起始地址,CPU开始执行子程序,子程序执行完后,会使用RET指令返回先前的返回点。执行RET指令时,会从栈顶出栈两个字数据按顺序恢复到IP、CS寄存器中,这就是返回点的恢复。,返回点恢复后程序流程回到主程序CALL指令后面那条指令继续往下执行。当然,在执行RET指令时,必须保证堆栈的栈顶数据和执行CALL指令后的情况一致,如果在执行RET指令前又向栈顶压入了新的数据并且没有出栈,那么RET指令将会使程序流程转移到错误的地址。,在这里我们可以看到

35、,如果没有堆栈这种硬件机制的支持,调用子程序和子程序返回都是无法实现的。,(2)中断调用时断点的保存和恢复CPU在执行程序时,经常会有来自设备接口或者CPU内部的中断信号,请求CPU执行相应的中断服务程序处理中断请求。如果CPU处理一个中断请求,就会暂停当前程序的执行,在当前指令执行完毕后就调用相应的中断服务程序(可以理解为系统提供的子程序调用,完成某些特定的功能),中断服务程序执行完毕后,会使用IRET指令返回到先前执行程序被打断的位置继续往下执行。,在执行中断调用以前,CPU会把当前CS、IP、FR中的内容入栈,这个过程就称为断点保存,为以后恢复当前程序的执行作准备。中断服务程序执行完毕后

36、,会使用IRET指令从堆栈中出栈3个字数据,按照与入栈时相反的顺序分别恢复到FR、IP、CS中,这个过程就称为断点恢复。,与子程序调用比较,中断调用多保存了一个数据到堆栈,那就是标志寄存器FR的内容。子程序调用的时刻是程序员决定的,如果程序员认为有必要保存FR,那么可以自己在程序中实现。但是中断调用的时刻不是程序员能够预知的,它可以发生在任何时刻,CPU执行程序中任何一条指令时,都有可能发生中断。,FR中标志位的意义已经在前面作了说明,前一条指令留下的标志位信息可能会直接影响到后面指令的执行结果,所以不能够因为执行中断服务程序破坏FR的本来面目。因此,中断调用比一般的子程序调用多保存了FR中的

37、内容。,通过上面的说明可以确定,如果没有堆栈的支持,中断调用和返回同样是无法实现的。,(3)用户临时保存和恢复数据 在汇编语言程序设计中,经常会遇到需要临时保存某个寄存器或者临时保存某个内存单元中内容的情况。例2子程序中,用户临时保存和恢复数据子程序: PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX RET,这个子程序中要使用AX、BX、CX、DX这四个寄存器,但是程序员不希望在返回主程序以后这四个寄存器中的内容发生改变。那么就在子程序的最开始把这四个寄存器的内容入栈,子程序执行完毕后,在执行RET指令返回主程序之前把这个

38、寄存器原先的内容从堆栈中恢复出来,返回后,主程序就不会感知到这四个寄存器曾经变化过,以后的运算也不会出错。注意程序中入栈和出栈的顺序是相反的,最先入栈的寄存器内容最后出栈,这种操作方式是堆栈后进先出的规则决定的。,如果不使用堆栈来保存这些临时需要保存的数据,那么就必须使用变量来实现,从变量的定义和使用上来看,都不如使用堆栈来得简单。上面的例子中,如果不使用堆栈,就要定义四个内存中的变量来保存数据,如果每次需要临时保存数据都这样来定义变量,就会使程序的编制过程复杂化。这也正好体现了使用堆栈保存数据的方便之处。,4.5.4 堆栈的组织堆栈段初始化完毕后,SS寄存器指示堆栈段的段基址,也就是该段的最

39、低地址,SP则指向堆栈段的最高地址+2的位置。堆栈段的最高地址称为堆栈的栈底,SP所指向的地址称为堆栈的栈顶。,刚完成初始化时,堆栈的栈顶地址高于栈底地址,是因为堆栈中还没有数据,还是一个空栈。以后,每一次入栈操作时,SP的内容就会自动减2,逐步向SS指向的地址移动。SS所指向的地址就是堆栈的上限地址,如果SP指向的栈顶越过这个地址,那么就称为堆栈溢出。为了避免堆栈溢出,程序员一定要充分估计自己所设计的程序最大要使用多少堆栈空间,在设置堆栈段的时候一定要将空间留够。,堆栈中存放的是字数据,和存放在内存中的其它字数据一样,16位数据的低8位存放在低地址单元,高8位存放在高地址单元。在程序中定义一

40、个堆栈段的格式如下:STACK1 SEGMENT PARA STACKDB 60H DUP(0) STACK1 ENDS,这个例子中定义了一个在程序中名称为STACK1的堆栈段,注意第一行的关键字,SEGMENT用于向汇编程序说明现在是在定义一个段,STACK关键字说明这个段的性质,它是一个堆栈段;DB是以字节为单位分配空间,第二行总体意思是分配60H个字节作为堆栈段STACK1的空间;,第三行用ENDS关键字来结束一个段的定义,注意SEGMENT和ENDS关键字前面必须使用相同的段名称,否则会出现汇编语法错误。第一行的PARA关键字是用于指定段起始地址特性的,段起始地址的概念和段基址有区别,

41、这部分内容将在讲述汇编语言语法时详细说明。,455 堆栈操作子程序调用、中断调用都是隐含的使用堆栈来保存和恢复数据,如果程序员要在程序中显式的使用堆栈,那么可以使用PUSH和POP指令来实现。,(1)入栈(压栈) PUSH指令是一个单操作数指令,它把指定的操作数压入堆栈。PUSH指令的操作数可以是通用寄存器、段寄存器或者字存储单元中的内容。PUSH指令的执行步骤如下:(SP)-2 SP 先修改栈顶指针,使它向低地址移动一个字单元(空的)数据 - (SP) 把数据保存至SP指向的字存储单元对于标志寄存器的入栈操作可以使用指令PUSHF,这是一个特殊的指令,和PUSH指令不同,它没有显式的操作数,

42、但是它有一个隐含的操作数,就是FR中的内容。,POP指令也是一个单操作数指令,它从堆栈的栈顶弹出一个字数据,把它保存到指定的操作数地址,操作数地址和PUSH指令一致,可以是通用寄存器、段寄存器或者字存储单元。POP指令的执行步骤如下:(SP)- 指定地址 SP当前指向的就是栈顶数据,把该数据送到指定地址保存(SP)+2 - SP 修改栈顶指针,使它向高地址移动一个字单元(栈顶下移)如果出栈数据要保存到FR中,可以使用POPF指令,这条指令也是隐含的把FR作为操作数地址。,例3通过一段由堆栈指令组成的程序片断来详细说明堆栈的操作过程。 STACK1 SEGMENT PARA STACKDB 40

43、H DUP(0) #堆栈空间为32个字 STACK1 ENDS PUSH AX #假定(AX)=0E43DH PUSH DS #假定(DS)=3638H PUSH DATAW #假定(DATAW)=0D245H PUSHF #假定(FR)=0C243H POPF POP DATAW POP DS POP AX 堆栈段STACK1初始化以后情况如下所示:,在这个例子中,再次提醒数据出栈的顺序一定要和入栈的顺序相反,否则不能恢复正确的数据。,8086CPU基本特性,1。由执行单元EU和总线接口单元BIU两部分组成; 2。流水线工作方式; 3。16位数据处理能力; 4。14个16位寄存器 5。20条存储器地址线,16条数据线,可寻址能1M字; 6。16条I/O口地址线,16条数据线,可寻址65536个16位端口。 7。存储器和I/O的数据线和地址线共用,通过M/IO的电平选择。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报