《单片微机原理及应用备课提纲第七章课件》由会员分享,可在线阅读,更多相关《单片微机原理及应用备课提纲第七章课件(445页珍藏版)》请在金锄头文库上搜索。
1、 第七章第七章 8086CPU8086CPU与与PCPC7/22/20241 上世纪七十年代末上世纪七十年代末,IBM公司公司推出世界上第一台个人计算机推出世界上第一台个人计算机IBM PC 采用采用Intel公司的公司的8086 CPU芯片芯片 采用微软公司的采用微软公司的DOS操作系统操作系统7/22/20242当前微型计算机市场上,大多数微型计算机的当前微型计算机市场上,大多数微型计算机的微处理器都是微处理器都是Intel 8086Intel 8086的家族成员,有的家族成员,有80868086、8018680186、8028680286、8038680386、8048680486、Pe
2、ntium Pentium (8058680586)、)、 Pentium 2Pentium 2、 Pentium 3Pentium 3、 Pentium 4Pentium 4,可把,可把80868086微处理器看成基础,以微处理器看成基础,以后所推出的都有改进,但保持与后所推出的都有改进,但保持与80868086兼容,即兼容,即都具有都具有80868086的基本逻辑结构。的基本逻辑结构。以以80868086微处理器组成的微机系统已少见了,但微处理器组成的微机系统已少见了,但从学习角度出发,仍可作为基本例机学习。从学习角度出发,仍可作为基本例机学习。7/22/20243 第一节第一节 8086
3、 CPU8086 CPU7/22/20244 一一. . 结构框图结构框图 80868086微处理器是微处理器是Intel Intel 公司于公司于19781978年推出的年推出的一种高性能微处理器。集成了一种高性能微处理器。集成了2900029000个晶体管,个晶体管,采用标准的采用标准的4040条引脚的双列直插封装,数据线条引脚的双列直插封装,数据线1616位,地址线位,地址线2020位,位,7 7种基本寻址方式,种基本寻址方式,9999条基条基本指令。时钟频率有三种:本指令。时钟频率有三种:5MH5MHZ Z(80868086)、)、5MH5MHZ Z(8086-18086-1)和)和1
4、0MH10MHZ Z(8086-28086-2)。可处理内)。可处理内部软件中断和外部硬件中断,支持单处理器、部软件中断和外部硬件中断,支持单处理器、多处理器系统工作。多处理器系统工作。 为了提高程序的执行速度,充分使用总线,为了提高程序的执行速度,充分使用总线, 80868086微处理器被设计为两个独立的功能部件:微处理器被设计为两个独立的功能部件: 执行部件和总线接口部件。执行部件和总线接口部件。7/22/20245 图图7-1 8086CPU的结构框的结构框图图7/22/20246总线接口部件总线接口部件BIU(Bus Interface Unit)BIUBIU是是8086CPU8086
5、CPU与存储器和与存储器和I/OI/O设备之间的接口部件,它设备之间的接口部件,它提供了提供了1616位双向数据总线、位双向数据总线、2020位地址总线和若干条控位地址总线和若干条控制总线。制总线。BIUBIU由段寄存器、指令指针寄存器由段寄存器、指令指针寄存器IPIP、2020位地址加法器、位地址加法器、指令队列缓冲器和总线控制电路等组成。指令队列缓冲器和总线控制电路等组成。具体任务:具体任务:BIUBIU从内存储器的指定区域中取出指令送到从内存储器的指定区域中取出指令送到指令队列中去排队;从相应的内存区域或指令队列中去排队;从相应的内存区域或I/OI/O端口中取端口中取出操作数,传送给出操
6、作数,传送给EUEU。如果指令执行的结果需要存入。如果指令执行的结果需要存入内存储器,也是由内存储器,也是由BIUBIU写入相应的内存区域。写入相应的内存区域。7/22/20247(1)(1)地址加法器和段地址地址加法器和段地址 1616位的段地址左移位的段地址左移4 4位,与位,与1616位的偏移地址相加,生位的偏移地址相加,生成成2020位的物理地址。位的物理地址。7/22/20248 (2 2) 指令指针寄存器指令指针寄存器IP (Instruction Pointer) IP (Instruction Pointer) 用来控制用来控制CPUCPU的指令执行顺序,和的指令执行顺序,和C
7、SCS一起可以确定当一起可以确定当前所要取的指令在存储器中的物理地址。顺序执行程序前所要取的指令在存储器中的物理地址。顺序执行程序时,时,CPUCPU取一个指令字节,取一个指令字节,IPIP自动加自动加1 1,指向下一条要读,指向下一条要读取的字节。当取的字节。当IPIP单独改变时,发生段内转移;当单独改变时,发生段内转移;当CSCS和和IPIP同时改变时,发生段间的程序转移。同时改变时,发生段间的程序转移。(3 3) 指令队列缓冲器(先进先出的栈)指令队列缓冲器(先进先出的栈) 操作原则:操作原则: 每当每当指令队列缓冲器中存满指令队列缓冲器中存满1 1条指令后,条指令后,EUEU就就 立刻
8、开始执行。立刻开始执行。 指令队列缓冲器只要空出指令队列缓冲器只要空出2 2个指令字节时,个指令字节时,BIUBIU 便自动执行取指操作,直到填满为止。便自动执行取指操作,直到填满为止。 7/22/20249 每当每当EUEU执行一条转移、调用或返回指令后,需执行一条转移、调用或返回指令后,需 清除清除指令队列缓冲器指令队列缓冲器,并要求,并要求BIUBIU从新的地址从新的地址 开始取指令。新取的第一条指令将直接经开始取指令。新取的第一条指令将直接经指令指令 队列缓冲器送到队列缓冲器送到EUEU去执行,随后取来的指令将去执行,随后取来的指令将 填入指令队列缓冲器填入指令队列缓冲器 (4 4)总
9、线控制电路)总线控制电路概括:概括:BIUBIU的作用是负责取指令的作用是负责取指令和存取操作数。和存取操作数。7/22/202410执行部件执行部件EUExecution UnitEUEU与外部系统没有直接相连。与外部系统没有直接相连。EUEU由由ALUALU、通用寄存器、数据暂存寄存器、标志寄存器、通用寄存器、数据暂存寄存器、标志寄存器和和EUEU控制电路等组成。控制电路等组成。具体任务:从具体任务:从BIUBIU的指令队列的指令队列缓冲器缓冲器中获得指令操作码,中获得指令操作码,通过译码电路分析,发出相应的控制命令,控制通过译码电路分析,发出相应的控制命令,控制ALUALU数数据总线中数
10、据的流向。操作数经过暂存器送入据总线中数据的流向。操作数经过暂存器送入ALUALU,运,运算结果经过算结果经过ALUALU数据总线送到相应的寄存器。标志寄存数据总线送到相应的寄存器。标志寄存器根据运算结果改变状态然后执行该指令,完成指令器根据运算结果改变状态然后执行该指令,完成指令所规定的操作(主要完成算术逻辑运算及计算指令要所规定的操作(主要完成算术逻辑运算及计算指令要求寻址的所在单元地址的求寻址的所在单元地址的1616位偏移地址,并送至位偏移地址,并送至BIUBIU)EUEU还对通用寄存器、标志寄存器和指令操作数进还对通用寄存器、标志寄存器和指令操作数进行管理。行管理。7/22/20241
11、1(1)算术逻辑运算单元)算术逻辑运算单元ALU:16位的运算器位的运算器(2)标志寄存器:标志寄存器:1616位的寄存器位的寄存器(3 3)数据暂存寄存器)数据暂存寄存器(4 4)通用寄存器组)通用寄存器组(5 5)EUEU控制电路控制电路概括:概括:EUEU的作用是负责分析指的作用是负责分析指令和执行指令。令和执行指令。7/22/202412优优 点点 由于由于EUEU和和BIUBIU两部件互相独立,故两部件互相独立,故取指令和执行指令可同时进行。取指令和执行指令可同时进行。EUEU执执行的是行的是BIUBIU在前一时刻取出的指令,同在前一时刻取出的指令,同时时BIUBIU取出取出EUEU
12、下一时刻要执行的指令。下一时刻要执行的指令。所以提高了利用率和执行速度。所以提高了利用率和执行速度。7/22/2024137/22/202414二二. 寄存器结构寄存器结构 1. 通用寄存器通用寄存器 AX AX 累加器累加器 (Accumulator)(Accumulator) BX BX 基址寄存器基址寄存器 (Base Register)(Base Register) CX CX 计数寄存器计数寄存器 (Counter Register)(Counter Register) DX DX 数据寄存器数据寄存器 (Data Register)(Data Register) SP SP 堆栈指
13、针寄存器堆栈指针寄存器 (Stack Pointer Register)(Stack Pointer Register) BP BP 基址指针寄存器基址指针寄存器 (Base Pointer Register)(Base Pointer Register) SI SI 源变址寄存器源变址寄存器 (Source Index Register)(Source Index Register) DI DI 目的变址寄存器目的变址寄存器 (Destination Index Register)(Destination Index Register)7/22/202415AXAX、BXBX、CXCX、DX
14、DX均为均为1616位,既能用来寄存操作数,也位,既能用来寄存操作数,也可用于寄存中间运算的结果,可分为可用于寄存中间运算的结果,可分为2 2个独立的个独立的8 8位寄位寄存器。存器。1616位寄存器主要用于存放数据,也可用来存放地址。位寄存器主要用于存放数据,也可用来存放地址。8 8位寄存器只能用于存放数据。位寄存器只能用于存放数据。有了寄存器,可避免经常访问存储器,为编程提供方有了寄存器,可避免经常访问存储器,为编程提供方便,提高了便,提高了CPUCPU运算速度。运算速度。这些寄存器具有良好的通用性,使用灵活,称为通用这些寄存器具有良好的通用性,使用灵活,称为通用寄存器。实际上它们的结构是
15、一样的,分工不同,有寄存器。实际上它们的结构是一样的,分工不同,有些有专有用法。些有专有用法。 AXAX常用作累加器,常用作累加器,BXBX用作基址寄存器,用作基址寄存器, CXCX用作计数寄存器,用作计数寄存器,DXDX用作数据寄存器。用作数据寄存器。7/22/2024162. 2. 地址寄存器:地址寄存器:1616位,用于存放地址的偏移量。位,用于存放地址的偏移量。 堆栈指针寄存器堆栈指针寄存器SPSP:出入堆栈(:出入堆栈(PUSHPUSH和和POPPOP)用)用SPSP给给 出栈顶的偏移地址。出栈顶的偏移地址。 基址指针寄存器基址指针寄存器BPBP:存放位于堆栈段中的一个数据区:存放位
16、于堆栈段中的一个数据区 的基地址的偏移地址。的基地址的偏移地址。 源变址寄存器源变址寄存器SISI:在字符串操作指令中,源操作数的:在字符串操作指令中,源操作数的 偏移地址存放于偏移地址存放于SISI中。中。 目的变址寄存器目的变址寄存器DIDI:在字符串操作指令中,目的操作:在字符串操作指令中,目的操作 数的偏移地址存放于数的偏移地址存放于DIDI中。中。 7/22/2024173. 3. 段寄存器段寄存器 8086/80888086/8088存储器都是以字节(存储器都是以字节(8 8位)为单位组织的,位)为单位组织的,每个单元具有每个单元具有2020条地址线,存储器总共应有条地址线,存储器
17、总共应有2 22020(1M1M)字节。必须要有字节。必须要有2020条地址线才能区分条地址线才能区分1M1M内存。每个单内存。每个单元对应一个唯一的地址(元对应一个唯一的地址(00000H-FFFFFH00000H-FFFFFH)。)。 2 22020=1048576=1048576。十六进制地址十六进制地址 二进制地址二进制地址 存储器存储器 00000H 0000 0000 0000 0000 0000B xxxxxxxx 00001H 0000 0000 0000 0000 0001B xxxxxxxx 00002H 0000 0000 0000 0000 0010B xxxxxxxx
18、 00003H 0000 0000 0000 0000 0011B xxxxxxxx . . FFFFFH 1111 1111 1111 1111 1111B xxxxxxxx7/22/202418CPUCPU内部的寄存器内部的寄存器BXBX、IPIP、SPSP、BPBP、SISI、DIDI及算逻单元及算逻单元ALUALU提供地址,但它们都是提供地址,但它们都是1616位的,只能提供位的,只能提供1616位地址,位地址,如何扩大为如何扩大为2020位地址呢?位地址呢?方法:地址分段。方法:地址分段。把把1M1M字节的存储器空间分成若干个段,每个段最多有字节的存储器空间分成若干个段,每个段最多有
19、64K64K个单元,段内的地址是连续的。各段的起始地址必个单元,段内的地址是连续的。各段的起始地址必须是能被须是能被1616整除的地址,即段的起始地址的低整除的地址,即段的起始地址的低4 4位二进位二进制码必须是制码必须是0 0。一个段的起始地址的高。一个段的起始地址的高1616位称为该段的位称为该段的段地址。段地址。1M1M字节的存储器空间最多可有字节的存储器空间最多可有64K64K个段地址。个段地址。任意相邻的两个段地址相距任意相邻的两个段地址相距1616个单元。段内一个单元个单元。段内一个单元的地址可用相对于段地址的偏移量来表示,如:的地址可用相对于段地址的偏移量来表示,如:0000H0
20、000H:1234H, 1234H, 这个偏移量这个偏移量1234H1234H称为段内偏移地址,又叫称为段内偏移地址,又叫有效地址(有效地址(EAEA)。)。7/22/202419CS CS (Code Segment) Code Segment) 代码段寄存器,存放当前代码段寄存器,存放当前 程序代码段的段地址(段基址),控制程序程序代码段的段地址(段基址),控制程序 区。区。DS DS (Data Segment) Data Segment) 数据段寄存器,存放当前数据段寄存器,存放当前 数据段的段地址,控制数据区。数据段的段地址,控制数据区。SS SS (Stack Segment) S
21、tack Segment) 堆栈段寄存器,存放当前堆栈段寄存器,存放当前 堆栈段的段地址,控制堆栈区。堆栈段的段地址,控制堆栈区。ES ES (Extra Segment) Extra Segment) 附加段寄存器,存放当前附加段寄存器,存放当前 附加段的段地址,控制数据区。附加段的段地址,控制数据区。7/22/202420信息的分段存储信息的分段存储程序区:用来存放程序的指令代码。程序区:用来存放程序的指令代码。数据区:用来存放原始数据、中间结果、数据区:用来存放原始数据、中间结果、 最后运算结果等。最后运算结果等。堆栈区:用来存放压入堆栈的数据和状态堆栈区:用来存放压入堆栈的数据和状态
22、信息。信息。7/22/202421三三. . 标志寄存器和指令指针标志寄存器和指令指针指令指针指令指针IPIP(类似于(类似于8 8位位CPUCPU中中的中中的PCPC)标志寄存器标志寄存器FLAGS FLAGS 用来存放用来存放8086CPU8086CPU在工作过程中在工作过程中的状态,它是一个的状态,它是一个1616位寄存器。用九位,表示九个特位寄存器。用九位,表示九个特征,征, 其中六位反映前一次其中六位反映前一次ALUALU操作结果的状态标志,三位是操作结果的状态标志,三位是控制控制CPUCPU操作特征的控制标志。操作特征的控制标志。7/22/202422CF(Carry Flag)
23、进位标志位进位标志位加法时最高位(对字节操作时是加法时最高位(对字节操作时是D7位,对字操作时是位,对字操作时是D15位)产位)产生进位,减法时最高位产生借位,生进位,减法时最高位产生借位,则则CF=1; 否则否则CF=0。7/22/202423PF(Parity Flag) 奇偶标志位奇偶标志位如果操作结果的低如果操作结果的低8 8位中含有偶位中含有偶数个数个1 1,则,则PF=1PF=1;否则,;否则,PF=0PF=0。7/22/202424AF(Auxiliary Carry Flag) 辅助进位辅助进位标志标志加法时加法时D D3 3位有进位,或减法时位有进位,或减法时D D3 3位有
24、借位,则位有借位,则AF=1; AF=1; 否则否则AF=0AF=0。这个标志位用于实现这个标志位用于实现BCDBCD码算术码算术运算结果的调整。运算结果的调整。7/22/202425ZF(Zero Flag) ZF(Zero Flag) 零标志零标志如果运算结果各位都为零,如果运算结果各位都为零,则则ZF=1; ZF=1; 否则,否则,ZF=0ZF=0。7/22/202426SF(Sign Flag) 符号标志符号标志SFSF总是和结果的最高位(字节操总是和结果的最高位(字节操作时是作时是D D7 7位,字操作时是位,字操作时是D D1515位)位)相同。因为在补码运算时最高位相同。因为在补
25、码运算时最高位是符号位,所以运算结果为负时,是符号位,所以运算结果为负时,SF=1;SF=1;否则否则SF=0SF=0。7/22/202427OF(Overflow Flag) 溢出标志溢出标志加法:次高位有进位,最高位无进位;加法:次高位有进位,最高位无进位; 或次高位无进位,最高位有进位;则发或次高位无进位,最高位有进位;则发生溢出,生溢出,OF=1OF=1。否则无溢出,。否则无溢出,OF=0OF=0。减法:次高位有借位,最高位无借位;减法:次高位有借位,最高位无借位; 或次高位无借位,最高位有借位;则发或次高位无借位,最高位有借位;则发生溢出,生溢出,OF=1OF=1。否则无溢出,。否则
26、无溢出,OF=0OF=0。7/22/202428 例如,假定前一条指令执行加法:例如,假定前一条指令执行加法: 0010 0011 0100 0101 +) 0101 0010 0001 1001 0111 0101 0101 1110 SF=0 与结果的最高位相同与结果的最高位相同 ZF=0 运算结果不为运算结果不为0 PF=0 结果的低八位中有奇数个结果的低八位中有奇数个1 AF=0 D3向向D4无进位无进位 CF=0 最高位无进位最高位无进位 OF=0 无溢出(最高位无进位,次高位无进无溢出(最高位无进位,次高位无进 位)位)7/22/202429 例如,假定前一条指令执行加法:例如,假
27、定前一条指令执行加法: 0101 0100 0011 1001 +) 0100 0111 0110 1010 1001 1011 1010 0011 SF=1 与结果的最高位相同与结果的最高位相同 ZF=0 运算结果不为运算结果不为0 PF=1 结果的低八位中有偶数个结果的低八位中有偶数个1 AF=1 D3向向D4有进位有进位 CF=0 最高位无进位最高位无进位 OF=1 溢出(最高位无进位,次高位有进溢出(最高位无进位,次高位有进 位)位)7/22/202430 例如,假定前一条指令执行减法:例如,假定前一条指令执行减法: 0101 0100 0011 1010 -) 1111 1110 0
28、000 0000 0101 0110 0011 1010 SF=0 与结果的最高位相同与结果的最高位相同 ZF=0 运算结果不为运算结果不为0 PF=1 结果的低八位中有偶数个结果的低八位中有偶数个1 AF=0 D3向向D4无借位无借位 CF=1 最高位有借位最高位有借位 OF=0 无溢出(最高位有借位,次高位有借无溢出(最高位有借位,次高位有借 位)位)7/22/202431DF(Direction Flag) 方向标志方向标志 可用指令预置。字符串操作指令执行可用指令预置。字符串操作指令执行时受它的控制。当时受它的控制。当DF=0DF=0时,执行串操作时,执行串操作指令,变址寄存器地址自动
29、递增;当指令,变址寄存器地址自动递增;当DF=1DF=1时,变址寄存器地址自动递减。即时,变址寄存器地址自动递减。即该标志位可控制地址朝增大的方向或减该标志位可控制地址朝增大的方向或减小的方向改变小的方向改变。7/22/202432IF(Interrupt Enable Flag)中断允许标志中断允许标志 可用指令预置。可用指令预置。 当当IF=1IF=1时,时,CPUCPU可响应可屏蔽中可响应可屏蔽中断请求;断请求; 当当IF=0IF=0时,时,CPUCPU不响应可屏蔽中不响应可屏蔽中断请求。断请求。7/22/202433TF(Trap Flag) 陷井标志陷井标志 若若TF=1TF=1,则
30、,则CPUCPU处于单步执行指令工作处于单步执行指令工作方式。每执行一条指令就自动产生一次方式。每执行一条指令就自动产生一次类型类型1 1的内部中断。的内部中断。IBM PCIBM PC系统中,用系系统中,用系统调试程序统调试程序DEBUGDEBUG时,时,T T命令就是利用这命令就是利用这种中断,服务子程序的功能是显示所有种中断,服务子程序的功能是显示所有寄存器的当前值和将要执行的下一条指寄存器的当前值和将要执行的下一条指令。令。7/22/202434四四. .工作模式工作模式 1. 1. 最小工作模式:引脚最小工作模式:引脚MN/MXMN/MX接高电平。接高电平。 当利用当利用808680
31、86构成一个较小的系统时,即所连的存储器容构成一个较小的系统时,即所连的存储器容 量不大,片子不多,所要连的量不大,片子不多,所要连的I/OI/O端口也不多,这时系统端口也不多,这时系统 中只有一个中只有一个80868086微处理器,所有总线控制信号均由微处理器,所有总线控制信号均由 8086CPU8086CPU直接产生,系统所需的外加其它总线控制逻部件直接产生,系统所需的外加其它总线控制逻部件 最少。最少。 2. 2. 最大工作模式:引脚最大工作模式:引脚MN/MXMN/MX接低电平。接低电平。 若构成系统较大,要求有较大的驱动能力,这时系统中若构成系统较大,要求有较大的驱动能力,这时系统中
32、 包含两个或两个以上的微处理器。主处理器是包含两个或两个以上的微处理器。主处理器是80868086,协,协 处理器处理器80878087(用于数值运算,提高运算速度)或(用于数值运算,提高运算速度)或80898089(用于输入(用于输入/ /输出操作,提高主处理器的效率),总线控输出操作,提高主处理器的效率),总线控制器制器82888288来提供控制信号。来提供控制信号。7/22/202435 最小工作模式下的系统总线结构图最小工作模式下的系统总线结构图7/22/202436三态输出的三态输出的8 8位数据锁存器位数据锁存器Intel 8282Intel 8282引脚图引脚图7/22/2024
33、37三态输出的三态输出的8 8位数据锁存器位数据锁存器Intel 8282Intel 8282内部逻辑图内部逻辑图7/22/20243882828282有有8 8个数据输入端和个数据输入端和8 8个数据输出端,控制信个数据输出端,控制信号有两个:选通信号号有两个:选通信号STBSTB和输出允许信号和输出允许信号OEOE。STBSTB为有效高电平时,允许加在数据线为有效高电平时,允许加在数据线DIDI0 0-DI-DI7 7上的数上的数据通过锁存电路,在据通过锁存电路,在STBSTB的下降沿数据锁存。的下降沿数据锁存。OEOE为有效低电平时,允许锁存器从为有效低电平时,允许锁存器从DODO0 0
34、-DO-DO7 7上输出;上输出;OEOE为高电平时,锁存器输出为高阻抗状态。为高电平时,锁存器输出为高阻抗状态。 需要锁存的数据包括需要锁存的数据包括2020位地址和位地址和1 1位位BHEBHE信号,共信号,共需三片需三片82828282。有时需要将地址信号和有时需要将地址信号和/ /或数据信号极性反相。或数据信号极性反相。 与与82828282相对应的反相型器件为相对应的反相型器件为82838283,82838283除了输除了输出与输入反相外,其余与出与输入反相外,其余与82828282相同。相同。74LS37374LS373八位锁存器器与八位锁存器器与82828282功能相同。功能相同
35、。7/22/202439Intel 8286Intel 8286收发器引脚图收发器引脚图7/22/202440Intel 8286Intel 8286收发器内部逻辑图收发器内部逻辑图7/22/202441在小型系统中,在小型系统中, ADAD0 0-AD-AD1515可直接用作数据线。在多数情可直接用作数据线。在多数情况下,一个系统有多个接口,那么在数据线上就需要况下,一个系统有多个接口,那么在数据线上就需要使用驱动器和收发器。这样,不仅可以简化对接口的使用驱动器和收发器。这样,不仅可以简化对接口的要求,而且可以提高数据线驱动能力和承受电容负载要求,而且可以提高数据线驱动能力和承受电容负载的能
36、力,用的能力,用Intel8286Intel8286收发器。收发器。82868286有有8 8路双向缓路双向缓冲电路,冲电路,A A7 7-A-A0 0用于输入,用于输入,B B7 7-B-B0 0用于输出;也可用于输出;也可反过来,即反过来,即B B7 7-B-B0 0用于输入,用于输入,A A7 7-A-A0 0用于输出。用于输出。输出允许脚输出允许脚OEOE决定是否允许数据通过决定是否允许数据通过82868286。发送引脚发送引脚T T控制数据的流向。控制数据的流向。当当OEOE为高电平时,为高电平时,82868286在两个方向上都不能传在两个方向上都不能传送数据。送数据。当当OEOE为
37、低电平且为低电平且T T为高电平时,为高电平时, A A7 7-A-A0 0为输入;为输入;而而OEOE为低电平且为低电平且T T为低电平时,为低电平时, B B7 7-B-B0 0为输入。为输入。7/22/2024421616条数据线需用条数据线需用2 2片片82868286收发器。收发器。 ADAD0 0-AD-AD1515与与82868286的的A A端相连。端相连。 2 2片片82868286的的的的OEOE引脚与引脚与80868086的数据允许信号的数据允许信号DENDEN相连,相连, 发送引脚发送引脚T T与与80868086的数据收发信号的数据收发信号DT/RDT/R相连。相连。
38、 与与82868286的的B B端相连的端相连的1616条数据线条数据线D D0 0-D-D1515即为系统的数据总线。即为系统的数据总线。当当CPUCPU发送地址信息时,无论是读还是写,加在发送地址信息时,无论是读还是写,加在OEOE端上的端上的DENDEN信号均为高电平,使信号均为高电平,使82868286呈高阻状态,阻止地址信息通过呈高阻状态,阻止地址信息通过82868286进入系统数据总线。只有当进入系统数据总线。只有当CPUCPU撤消地址信息之后,撤消地址信息之后,DENDEN信号才由高电平变为低电平,允许数据通过信号才由高电平变为低电平,允许数据通过82868286进行传送。进行传
39、送。如果是读周期,加在如果是读周期,加在T T端的端的DT/RDT/R信号为低电平,信号为低电平,82868286进行反进行反向传送,把被访问的存储单元或向传送,把被访问的存储单元或I/OI/O端口的数据信息经过端口的数据信息经过82868286传送给传送给CPUCPU;若是写周期,;若是写周期,DT/RDT/R信号为高电平,信号为高电平,82868286进进行正向传送,把行正向传送,把CPUCPU发出的数据信息经过发出的数据信息经过82868286传送给系统数传送给系统数据总线。据总线。与与82868286相对应的反相型器件为相对应的反相型器件为82878287。 82878287除了输出与
40、输入反相外,其余与除了输出与输入反相外,其余与82868286相同。相同。74LS24574LS245八位同相三态收发器与八位同相三态收发器与82868286功能相同。功能相同。7/22/202443五五. 8086. 8086微处理器的引脚信号微处理器的引脚信号7/22/202444 数据线:数据线:D D1515-D-D0 0 用来在用来在CPUCPU和内存储器(或和内存储器(或I/OI/O设备)之间设备)之间交换信息。双向信号,三态(高电平、低电平、高阻态)。交换信息。双向信号,三态(高电平、低电平、高阻态)。 地址线:地址线:A A1919-A-A0 0 由由CPUCPU发出,用来确定
41、发出,用来确定CPUCPU要访问的内存要访问的内存单元(或单元(或I/OI/O端口)的地址信号。输出信号,三态。端口)的地址信号。输出信号,三态。 ADAD1515-AD-AD0 0:地址:地址/ /数据分时复用的输入输出信号线。由于数据分时复用的输入输出信号线。由于80868086只有只有4040只脚,于是在只脚,于是在CPUCPU内部采用分时多路开关,将低内部采用分时多路开关,将低1616位地址信号和位地址信号和1616位数据信号综合后,通过位数据信号综合后,通过1616只脚输出或输入。只脚输出或输入。通常通常CPUCPU在读写存储器和外设时,先给出地址,然后再读写数在读写存储器和外设时,
42、先给出地址,然后再读写数据,地址和数据在时序上是有先后的,据,地址和数据在时序上是有先后的,CPUCPU配上地址锁存器后,配上地址锁存器后,把地址信号锁存起来,用锁存器的输出去选通存储单元;在把地址信号锁存起来,用锁存器的输出去选通存储单元;在下一个时序间隔中,这下一个时序间隔中,这1616个脚可作为数据线,进行输入或输出个脚可作为数据线,进行输入或输出操作。操作。最小模式的引脚信号最小模式的引脚信号7/22/202445地址地址/ /状态线信号状态线信号A A1919/S/S6 6- A- A1616/S/S3 3 A A1919/S/S6 6、 A A1818/S/S5 5、A A1717
43、/S/S4 4、 A A1616/S/S3 3为分时复用的地址为分时复用的地址/ /状态线,输出、三态,在状态线,输出、三态,在8086CPU8086CPU执行指令的一个总线周执行指令的一个总线周期的期的T T1 1周期,从这周期,从这4 4条线上送出地址的最高条线上送出地址的最高4 4位(位( A A1919- -A A1616),在总线周期的其它时钟周期,送出),在总线周期的其它时钟周期,送出CPUCPU的状态信息的状态信息(S S6 6-S-S3 3),其中:),其中:S S6 6:始终为低电平,表示:始终为低电平,表示80868086当前与总线相连。当前与总线相连。S S5 5:反映标
44、志寄存器中:反映标志寄存器中IFIF的当前状态。的当前状态。S S4 4 S S3 3 用以指示哪一个段寄存器正在被使用用以指示哪一个段寄存器正在被使用 0 0 0 0 附加段寄存器附加段寄存器 ESES 0 1 0 1 堆栈段寄存器堆栈段寄存器 SSSS 1 0 1 0 代码段寄存器代码段寄存器 CSCS 1 1 1 1 数据段寄存器数据段寄存器 DSDS7/22/202446高高8 8位数据总线允许位数据总线允许/ /状态线状态线BHE/SBHE/S7 7 分时复用引脚,输出、三态,在总线周期的分时复用引脚,输出、三态,在总线周期的T T1 1状态,输出状态,输出BHEBHE;在总线周期的
45、其它状态,输出;在总线周期的其它状态,输出S S7 7。S S7 7目前还无意义。目前还无意义。 BHEBHE低电平有效,低电平有效,BHEBHE有效时表示使用高有效时表示使用高8 8位数位数据线据线ADAD1515-AD-AD8 8,否则使用低,否则使用低8 8位数据线位数据线ADAD7 7-AD-AD0 0。BHEBHE和地址总线的和地址总线的A A0 0状态组合使用以决定数据字是高字状态组合使用以决定数据字是高字节工作还是低字节工作。节工作还是低字节工作。7/22/202447控制总线控制总线控制总线是传送控制信号的一组信号线,有的控制总线是传送控制信号的一组信号线,有的是输出线,用来传
46、输是输出线,用来传输CPUCPU送到其它部件的控制送到其它部件的控制命令,有的是输入线,由外部向命令,有的是输入线,由外部向CPUCPU输入控制输入控制及请求信号。及请求信号。MN/MXMN/MX(第(第3333脚)工作方式控制线,用来控制脚)工作方式控制线,用来控制80868086的工作方式。的工作方式。MN/MXMN/MX脚接脚接+5V+5V时,时,CPUCPU处于最小模式;处于最小模式;MN/MXMN/MX脚接地时,脚接地时,CPUCPU处于最大模式。处于最大模式。7/22/202448两种模式下公用的两种模式下公用的8只控制引脚只控制引脚MN/MX(输入信号):前述(输入信号):前述R
47、D(输出信号,三态):读控制信号,低电平有效。(输出信号,三态):读控制信号,低电平有效。RD有效时,表明有效时,表明CPU正在执行从存储器或正在执行从存储器或I/O端口的端口的输入操作。输入操作。READY(输入信号):准备好信号,高电平有效。(输入信号):准备好信号,高电平有效。CPU在在T3状态的开始检查此脚,若高电平,表示存储状态的开始检查此脚,若高电平,表示存储器或器或I/O端口已准备好,可以输入或取走数据;若端口已准备好,可以输入或取走数据;若READY为低电平,表示存储器或为低电平,表示存储器或I/O端口未准备好数端口未准备好数据,据,CPU在在T3周期之后,自动插入一个或几个等
48、待周周期之后,自动插入一个或几个等待周期期TW,直到,直到READY脚变为高电平。这样可保证快速脚变为高电平。这样可保证快速的的CPU和慢速的存储器或和慢速的存储器或I/O端口之间数据的正常传送。端口之间数据的正常传送。7/22/202449INTR(输入信号):(输入信号):Interrupt 可屏蔽中断请求输入可屏蔽中断请求输入信号,高电平有效。当信号,高电平有效。当INTR为高电平时,表示外部有为高电平时,表示外部有中断请求。中断请求。CPU在每条指令的最后一个时钟周期对在每条指令的最后一个时钟周期对INTR进行测试,以便决定现行指令执行完后是否响应进行测试,以便决定现行指令执行完后是否
49、响应中断。此信号受中断。此信号受IF位控制,位控制,IF=1 响应中断;响应中断; IF=0 不不响应中断。响应中断。NMI (输入(输入信信号):号):Non-Maskable Interrupt 非屏蔽非屏蔽中断请求输入信号,上升沿有效。当该引脚输入一个中断请求输入信号,上升沿有效。当该引脚输入一个由低变高的信号时,由低变高的信号时,CPU在执行完现行指令后,立即在执行完现行指令后,立即进行中断处理。不受进行中断处理。不受IF控制,不能用软件屏蔽。控制,不能用软件屏蔽。7/22/202450TEST(输入信号):测试信号,低电平有效。当(输入信号):测试信号,低电平有效。当CPU执行执行W
50、AIT指令的操作时,每隔指令的操作时,每隔5个时钟周期对个时钟周期对TEST输输入端进行一次测试,若为高电平,入端进行一次测试,若为高电平,CPU继续处于等待继续处于等待状态,直到状态,直到TEST出现低电平时,出现低电平时,CPU才开始执行下一才开始执行下一条指令。条指令。RESET(输入信号):系统复位信号,高电平有效,(输入信号):系统复位信号,高电平有效,该信号至少要保持该信号至少要保持4个时钟周期的高电平。个时钟周期的高电平。 RESET信信号有效时,号有效时,CPU清除清除IP、DS、ES、SS、标志寄存器和、标志寄存器和指令队列为指令队列为0000H,置,置CS为为0FFFFH。
51、所以。所以8086复位之复位之后重新启动时,从存储器的后重新启动时,从存储器的FFFF0H地址开始读取和执地址开始读取和执行指令,一般在地址行指令,一般在地址FFFF0H处存放一条无条件转移指处存放一条无条件转移指令,转移到系统程序的入口处,这样,系统一旦被启令,转移到系统程序的入口处,这样,系统一旦被启动,便自动进入系统程序。动,便自动进入系统程序。BHE/S7(输出,三态):前述(输出,三态):前述7/22/202451最小工作模式下最小工作模式下8只脚的定义只脚的定义(第(第24-31脚)脚)M/IO(输出信号,三态)(输出信号,三态):存储器:存储器/IO控制信号控制信号。高电。高电平
52、时平时CPU访问存储器,低电平时访问存储器,低电平时CPU访问访问I/O端口。(三端口。(三态门是常用缓冲器的一种,双向传送,高阻断开状态)态门是常用缓冲器的一种,双向传送,高阻断开状态)DT/R (输出信号,三态):数据发送(输出信号,三态):数据发送/接收信号。接收信号。8086为了增强总线的驱动能力,可以外接驱动器,由为了增强总线的驱动能力,可以外接驱动器,由8086系系列中的收发器列中的收发器8286负责。负责。DT/R即为即为8086输出到收发器的输出到收发器的控制信号,用以控制数据的传送方向。控制信号,用以控制数据的传送方向。 高电平时高电平时CPU发送数据(写),发送数据(写),
53、 低电平时低电平时CPU接收数据(读)。接收数据(读)。DEN (输出信号,三态):(输出信号,三态):Data Enable 数据允许信数据允许信号,低电平有效。表示号,低电平有效。表示CPU准备好接收和发送数据(数准备好接收和发送数据(数据总线上有有效的数据)。据总线上有有效的数据)。7/22/202452HOLD(输入信号):总线保持请求信号,高电平有(输入信号):总线保持请求信号,高电平有效。当系统中效。当系统中CPU之外的另一个主控设备要求占用总之外的另一个主控设备要求占用总线时,通过此脚向线时,通过此脚向CPU发出一个高电平的请求信号。发出一个高电平的请求信号。(此脚用于(此脚用于
54、DMA,直接存储器存取传送方式),直接存储器存取传送方式)HLDA (输出信号):(输出信号): Hold Acknowledge 总线保持总线保持响应信号,高电平有效。这是响应信号,高电平有效。这是CPU对对HOLD请求的响请求的响应信号。当应信号。当CPU让出总线使用权时,就发出这个信号,让出总线使用权时,就发出这个信号,并让微处理器所有具有三态的引脚全部处于高阻状态,并让微处理器所有具有三态的引脚全部处于高阻状态,与外部隔离。(此脚也用于与外部隔离。(此脚也用于DMA)7/22/202453ALE(输出信号):(输出信号):Address Latch Enable 地址锁存地址锁存允许信
55、号,高电平有效。表示地址线上的地址信号有允许信号,高电平有效。表示地址线上的地址信号有效。利用它的下降沿把地址信号效。利用它的下降沿把地址信号A19-A0和和BHE信号锁信号锁存在地址锁存器中。存在地址锁存器中。INTA(输出信号)(输出信号)Interrupt Acknowledge。此信号是。此信号是CPU对外部输入的对外部输入的INTR中断请求信号的响应。在相邻中断请求信号的响应。在相邻的两个总线周期中送出两个负脉冲。的两个总线周期中送出两个负脉冲。WR(输出信号,三态):写信号,低电平有效。(输出信号,三态):写信号,低电平有效。WR有效时,表明有效时,表明CPU正在执行向存储器或正在
56、执行向存储器或I/O端口的输出端口的输出操作。操作。7/22/202454其它其它4只脚只脚CLK(输入信号)时钟信号。此信号为(输入信号)时钟信号。此信号为8086CPU提供提供基本的定时脉冲,占空比(高电平持续时间:重复周基本的定时脉冲,占空比(高电平持续时间:重复周期)期)=1:3为最佳。为最佳。VCC (输入信号)电源。(输入信号)电源。+5V10%GND 接地。接地。 两只脚(两只脚(1、20)7/22/2024558088引脚与引脚与8086引脚的不同之处引脚的不同之处8088微处理器是一种准微处理器是一种准16位处理器,其内部结构基本位处理器,其内部结构基本上与上与8086相同。
57、在推出相同。在推出8086的同时,的同时,Intel公司还推出公司还推出了了8088。推出。推出8088的主要目的是为了与当时已有的一的主要目的是为了与当时已有的一整套整套Intel外围设备接口芯片直接兼容,外围设备接口芯片直接兼容,8088的内部寄的内部寄存器、内部运算部件以及内部操作都是按存器、内部运算部件以及内部操作都是按16位设计的,位设计的,但对外数据线只有但对外数据线只有8条,即地址条,即地址/数据复用线为数据复用线为8条条AD7-AD0,而,而A15-A8为单一地址线。为单一地址线。区别:区别: 8086 M/IO(低)(低) 8088 IO/M(低)(低)还有一些小区别。还有一
58、些小区别。7/22/20245680868086的存储器管理的存储器管理存储器的分段和物理地址的形成存储器的分段和物理地址的形成 存储器的分段存储器的分段7/22/202457物理地址的形成物理地址的形成EA (Effective Address)EA (Effective Address): 有效地址、偏移地址有效地址、偏移地址每个存储单元都有一个物理地址,物理地址就是存储每个存储单元都有一个物理地址,物理地址就是存储单元的实际地址。单元的实际地址。逻辑地址的表示格式:段地址:偏移地址。逻辑地址的表示格式:段地址:偏移地址。 如如80008000:01000100表示段地址为表示段地址为80
59、00H8000H,偏移地址为,偏移地址为0100H0100H。上述格式中的段地址有时用段寄存器代替。上述格式中的段地址有时用段寄存器代替。物理地址物理地址= =段地址段地址10H +10H +偏移地址。偏移地址。 即段地址左移即段地址左移4 4位后与偏移地址相加,得位后与偏移地址相加,得2020位的物理地位的物理地址。址。段和段是互相独立的,任意相邻两个段的地址相距段和段是互相独立的,任意相邻两个段的地址相距1616个单元。段和段又是互相覆盖的。个单元。段和段又是互相覆盖的。00000000H:1234H, 0001H:1224H, 0002H:1214H H:1234H, 0001H:122
60、4H, 0002H:1214H .在存储器中对应于同一个单元。在存储器中对应于同一个单元。7/22/2024587/22/202459逻辑地址的来源逻辑地址的来源7/22/202460 段寄存器和其它寄存器组合指向存储单元段寄存器和其它寄存器组合指向存储单元7/22/2024618086系统中存储器的分体结构系统中存储器的分体结构7/22/20246280868086系统中,总容量为系统中,总容量为1MB1MB的存储器统一编址,地址的存储器统一编址,地址 为为00000H-FFFFFH00000H-FFFFFH。分为偶地址存储体和奇地址存储体,。分为偶地址存储体和奇地址存储体,各为各为512K
61、512K。一个字节数据占一个单元,可以放在偶存储体内,也一个字节数据占一个单元,可以放在偶存储体内,也可放在奇存储体内。可放在奇存储体内。存储器内两个连续的字节定义为一个字,存放时低字存储器内两个连续的字节定义为一个字,存放时低字节放在低地址,高字节放在高地址。规定低字节的地节放在低地址,高字节放在高地址。规定低字节的地址作为该字的字地址。址作为该字的字地址。字的地址是偶地址时,称字的存储是规则的。字的地址是偶地址时,称字的存储是规则的。字的地址是奇地址时,称字的存储是非规则的。字的地址是奇地址时,称字的存储是非规则的。偶存储体与系统数据总线的低偶存储体与系统数据总线的低8 8位(位(ADAD
62、7 7- AD- AD0 0)相连,)相连, 奇存储体与系统数据总线的高奇存储体与系统数据总线的高8 8位(位(ADAD1515- AD- AD8 8)相连。)相连。 选择哪一个存储体由选择哪一个存储体由BHEBHE和和A A0 0决定。决定。 各存储体内存单元的寻址由地址总线各存储体内存单元的寻址由地址总线A A1919- A- A1 1决定。决定。7/22/202463 BHE BHE低、低、A A0 0高时,访问奇存储体,读高时,访问奇存储体,读/ /写一个字节;写一个字节; A A0 0低、低、BHEBHE高时,访问偶存储体,读高时,访问偶存储体,读/ /写一个字节;写一个字节; BH
63、EBHE和和A A0 0均低时,同时访问两个存储体,读均低时,同时访问两个存储体,读/ /写一个字。写一个字。 BHEBHE和和A A0 0均高时,不传送。均高时,不传送。对于访问字节的指令,需要一个总线周期。对于访问字节的指令,需要一个总线周期。读写规则字只需一个总线周期。读写规则字只需一个总线周期。读写非规则字需要两个总线周期。读写非规则字需要两个总线周期。为了加快程序运行的速度,编程时应注意从偶地址开为了加快程序运行的速度,编程时应注意从偶地址开始存放字数据。始存放字数据。7/22/2024647/22/202465 8086 8086系统中的堆栈系统中的堆栈 堆栈是内存中的一个特殊数据
64、区,用来存放需要暂时堆栈是内存中的一个特殊数据区,用来存放需要暂时存放的数据。堆栈的一端是固定的,另一端是浮动的。存放的数据。堆栈的一端是固定的,另一端是浮动的。先进后出,后进先出。先进后出,后进先出。8086的堆栈是由段定义语句在的堆栈是由段定义语句在存储器中定义的一个段,即堆栈段。堆栈的容量存储器中定义的一个段,即堆栈段。堆栈的容量64K,64K,在存储器的在存储器的1MB1MB内浮动。内浮动。堆栈段的段地址由段寄堆栈段的段地址由段寄存器存器SS指定,栈顶地址由指定,栈顶地址由SP指定。指定。 8086的堆栈是向上的堆栈是向上生长的,生长的, 堆栈的地址下高上低。堆栈的地址下高上低。 例:
65、例:SS=2F00H,SP=0060H,则当前栈顶在存储器中,则当前栈顶在存储器中的物理地址为的物理地址为2F060H。SP的变化由的变化由CPU自动管理。堆自动管理。堆栈操作以字为单位进行,堆栈中的数据项必须按规则栈操作以字为单位进行,堆栈中的数据项必须按规则字存储,以保证每访问一次堆栈总是完成一个字的操字存储,以保证每访问一次堆栈总是完成一个字的操作。作。 PUSH 压入指令。压入指令。 POP 弹出指令。弹出指令。7/22/202466 六六. 8086的总线操作和时序的总线操作和时序微处理器是在统一的时钟信号微处理器是在统一的时钟信号CLKCLK控制下按节拍进行工作的。控制下按节拍进行
66、工作的。时钟周期:时钟周期:CPUCPU的时间基准,由计算机的主频决定。若的时间基准,由计算机的主频决定。若8086CPU8086CPU主主频是频是5MHz5MHz,则一个时钟周期为,则一个时钟周期为200ns200ns。总线周期:总线周期:CPUCPU每执行一条指令,至少要通过总线对存储器访问一每执行一条指令,至少要通过总线对存储器访问一次(取指令),次(取指令),CPUCPU通过总线对外部(存储器或通过总线对外部(存储器或I/OI/O接口)进行一接口)进行一次访问所需的时间称为一个总线周期。一个最基本的总线周期由次访问所需的时间称为一个总线周期。一个最基本的总线周期由4 4个时钟周期组成,
67、习惯称为个时钟周期组成,习惯称为4 4个状态:个状态:T T1 1状态、状态、T T2 2状态、状态、T T3 3状态、状态、T T4 4状态状态。指令周期:执行一条指令所需要的时间。不同指令的指令周期是指令周期:执行一条指令所需要的时间。不同指令的指令周期是不等的,有表可查。一个指令周期由一个或几个不等的,有表可查。一个指令周期由一个或几个总线周期组成。总线周期组成。7/22/202467基本总线周期基本总线周期在在T T1 1状态,状态,BIUBIU向分时复用总线上发出地址信息,以指向分时复用总线上发出地址信息,以指出要访问的存储单元或外设端的地址。由出要访问的存储单元或外设端的地址。由A
68、LEALE的下降沿的下降沿锁存。锁存。在在T T2 2状态,状态,CPUCPU从总线上撤消地址。从总线上撤消地址。 若为读周期,使总线的低若为读周期,使总线的低1616位成高阻状态,以便使位成高阻状态,以便使CPUCPU有足够的时间从输出地址方式转变为输入数据方式;有足够的时间从输出地址方式转变为输入数据方式; 若为写周期,则向总线的低若为写周期,则向总线的低1616位送出要写的数据,准位送出要写的数据,准备进行写操作。由于输出地址和输出数据都是写总线备进行写操作。由于输出地址和输出数据都是写总线过程,过程,CPUCPU不需要将输出方式改为输入方式,因此不需不需要将输出方式改为输入方式,因此不
69、需要缓冲时间。要缓冲时间。 高高4 4位位A A1919-A-A1616输出状态信息。输出状态信息。在在T T3 3状态,高状态,高4 4位继续提供状态信息,低位继续提供状态信息,低1616位上出现位上出现CPUCPU写出的数据,或写出的数据,或CPUCPU从存储器或端口读入的数据。从存储器或端口读入的数据。7/22/202468在有些情况下,外设或存储器速度较慢,不能及时地在有些情况下,外设或存储器速度较慢,不能及时地配合配合CPU传送数据。这时,外设或存储器会在传送数据。这时,外设或存储器会在T3前向前向CPU发出一个发出一个“数据未准备好数据未准备好”信号,即信号,即READY为低为低电
70、平,于是电平,于是CPU在在T3之后插入一个或多个附加的时钟之后插入一个或多个附加的时钟周期周期TW, TW也叫等待状态。在也叫等待状态。在TW状态时总线上的信状态时总线上的信息情况与息情况与T3状态的信息情况一样,当存储器或外设完状态的信息情况一样,当存储器或外设完成数据传送时,便发出成数据传送时,便发出“准备好准备好”信号,信号,READY为高为高电平,电平,CPU接到这一信号后,会自动脱离接到这一信号后,会自动脱离TW而进入而进入T4状态。状态。在在T T4 4状态,总线周期结束。状态,总线周期结束。如果在如果在1 1个总线周期之后不立即执行下个总线周期之后不立即执行下1 1个总线周期,
71、个总线周期,那么系统总线处于空闲状态,执行空闲周期那么系统总线处于空闲状态,执行空闲周期T Ti i,也是,也是以时钟周期以时钟周期T T为单位。为单位。7/22/202469复位和操作启动复位和操作启动 在在RESETRESET引脚上加一个具有一定宽度的正脉冲信号,引脚上加一个具有一定宽度的正脉冲信号,至少维持至少维持4 4个时钟信号的高电平。如果是上电复位,则要个时钟信号的高电平。如果是上电复位,则要求正脉冲的宽度不少于求正脉冲的宽度不少于50 50 s s。 当当RESETRESET信号进入有效高电平状态时,信号进入有效高电平状态时,8086CPU8086CPU就会结就会结束现行操作,进
72、入复位状态,直到束现行操作,进入复位状态,直到RESETRESET信号变为低电平信号变为低电平为止。在复位状态,使为止。在复位状态,使CPUCPU初始化,初始化,CPUCPU内部的各寄存器内部的各寄存器被置为初态。清除被置为初态。清除IPIP、DSDS、ESES、SSSS、标志寄存器为、标志寄存器为0000H0000H,指令队列为空,置指令队列为空,置CSCS为为0FFFFH0FFFFH。当。当RESETRESET信号变为低电平信号变为低电平后,后,CPUCPU被启动并按初始化后的条件开始执行程序。被启动并按初始化后的条件开始执行程序。7/22/2024708086读周期时序读周期时序7/22
73、/2024718086写周期时序写周期时序7/22/202472第二节第二节 80868086的指令系统的指令系统7/22/202473一一. 8086. 8086的寻址方式的寻址方式 在大多数情况下,指令中并不直接给出操作数的数在大多数情况下,指令中并不直接给出操作数的数值,而是给出操作数存放的地址或给出存储单元的地址。值,而是给出操作数存放的地址或给出存储单元的地址。 如如: MOV AX: MOV AX,BXBX 在许多情况下,操作数的地址也不直接给出,而是在许多情况下,操作数的地址也不直接给出,而是给出计算操作数地址的方法。计算机执行程序时,根据给出计算操作数地址的方法。计算机执行程序
74、时,根据指令给出的寻址方式,计算出操作数的地址,然后从该指令给出的寻址方式,计算出操作数的地址,然后从该地址中取出操作数进行指令的操作。地址中取出操作数进行指令的操作。 寻址方式分操作数的寻址方式寻址方式分操作数的寻址方式 和指令地址的寻址方式。和指令地址的寻址方式。7/22/202474操作数的寻址方式共操作数的寻址方式共5 5种:种:1. 1. 立即数寻址立即数寻址 操作数直接包含在指令中,随指令一起被放入指令队操作数直接包含在指令中,随指令一起被放入指令队 列。执行时,直接从指令队列中取出,而不必执行总列。执行时,直接从指令队列中取出,而不必执行总 线周期访问存储器。线周期访问存储器。
75、特点:速度快。特点:速度快。 例:例: MOV ALMOV AL,43H43H MOV AL MOV AL,6767 MOV AX MOV AX,1234H1234H MOV AL MOV AL,1670616706 MOV AL MOV AL,A A ;字符字符A A的的ASCIIASCII码码41H41H送入送入ALAL 注意:立即数只能作为源操作数,不能作为目的操作注意:立即数只能作为源操作数,不能作为目的操作 数。数。7/22/2024752. 2. 寄存器寻址寄存器寻址 操作数在操作数在CPUCPU的内部寄存器中,寄存器名就在指令中指的内部寄存器中,寄存器名就在指令中指 出。出。 例
76、:例:MOV ALMOV AL,BLBL MOV AX MOV AX,BXBX INC CX INC CX 16 16位操作数:位操作数:AXAX、BXBX、CXCX、DXDX、SISI、DIDI、SPSP、BPBP 8 8位操作数:位操作数:AHAH、ALAL、BHBH、BLBL、CHCH、CLCL、DHDH、DLDL寄存器寻址方式操作就在寄存器寻址方式操作就在CPUCPU内部进行,不需要使用总内部进行,不需要使用总线周期,速度快,汇编后的机器码长度最短。线周期,速度快,汇编后的机器码长度最短。一条指令中,可以对源操作数采用寄存器寻址方式,一条指令中,可以对源操作数采用寄存器寻址方式,也可以
77、对目的操作数采用寄存器寻址方式,还可以对也可以对目的操作数采用寄存器寻址方式,还可以对两者两者 都采用寄存器寻址方式。都采用寄存器寻址方式。7/22/2024763. 3. 直接寻址直接寻址操作数在存储器中的操作数在存储器中的1616位有效地址由指令直接给出,位有效地址由指令直接给出,如:如: MOV ALMOV AL,1070H 1070H ;将;将DSDS段的段的1070H1070H单元的内容送入单元的内容送入ALAL MOV AX MOV AX,1070H 1070H ;将;将DSDS段的段的1070H1070H和和1071H1071H两单元的两单元的 内容送入内容送入AXAX直接寻址时
78、,如果指令前面没有用前缀指明操作数在哪直接寻址时,如果指令前面没有用前缀指明操作数在哪一段,则默认为段寄存器是一段,则默认为段寄存器是DSDS。例如上例中,设例如上例中,设DS=2000HDS=2000H,则该指令是将物理地址为,则该指令是将物理地址为21070H21070H和和21071H21071H两单元的内容送到两单元的内容送到AXAX中。中。如果要对其它段寄存器所指出的存储区进行直接寻址,如果要对其它段寄存器所指出的存储区进行直接寻址,则指令前必须用前缀指出段寄存器名。如:则指令前必须用前缀指出段寄存器名。如: CSCS:MOV BXMOV BX,3000H 3000H ;将;将CSC
79、S段的段的3000H3000H和和 3001H3001H两单元的内容送入两单元的内容送入BXBX。 设设CS=5100HCS=5100H,则本指令的功能是将物理地址为,则本指令的功能是将物理地址为54000H54000H和和54001H54001H两单元的内容送到两单元的内容送到AXAX中。中。7/22/2024774.4.寄存器间接寻址寄存器间接寻址 采用这种寻址方式时,采用这种寻址方式时,操作数一定在存储器中,存储单元的操作数一定在存储器中,存储单元的1616位位有效地址在有效地址在SISI、DIDI、BXBX、BPBP四个寄存器中的一个,四个寄存器中的一个,即:即: BXBX BP BP
80、 EA = SI EA = SI DI DI若以若以SISI、DIDI、BXBX进行间接寻址,进行间接寻址,如果指令前面没有用前缀指明具如果指令前面没有用前缀指明具体的段寄存器,则默认的段寄存器为体的段寄存器,则默认的段寄存器为DS, DS, 操作数在现行数据段中操作数在现行数据段中;而用而用BPBP来间接寻址时,默认的的段寄存器为来间接寻址时,默认的的段寄存器为SSSS。采用寄存器间接寻址时,允许在指令中指定一个位移量。这样,采用寄存器间接寻址时,允许在指令中指定一个位移量。这样,有效地址由一个寄存器的内容加上一个位移量来得到。位移量可有效地址由一个寄存器的内容加上一个位移量来得到。位移量可
81、以为以为8 8位,也可以为位,也可以为1616位。即:位。即: BXBX BP 8 BP 8位位移量位位移量 EA = SI + 16EA = SI + 16位位移量位位移量 DIDI也可将位移量看成是一个相对值,因此把带位移量的寄存器间接也可将位移量看成是一个相对值,因此把带位移量的寄存器间接寻址叫做寄存器相对寻址寻址叫做寄存器相对寻址。7/22/202478寄存器间接寻址可以分为以下寄存器间接寻址可以分为以下4 4种:种:(1 1)数据段基址寻址:)数据段基址寻址:用用BXBX寄存器进行间接寻址时,默认的段寄存器为寄存器进行间接寻址时,默认的段寄存器为DSDS,因为,因为BXBX称为基称为
82、基址寄存器,所以这种址寄存器,所以这种寻址方式也叫寻址方式也叫数据段基址寻址。数据段基址寻址。例:例:MOV ALMOV AL,BX BX 若若 DS=2000HDS=2000H,BX=3000HBX=3000H,则物理地址为,则物理地址为23000H23000H,本指令在执行时,本指令在执行时, AL AL (23000H23000H)例:例:MOV AXMOV AX,BX BX AL AL (23000H23000H),), AH AH (23001H23001H)如果要对其它段寄存器所指的区域进行寻址,则必须在指令前用前如果要对其它段寄存器所指的区域进行寻址,则必须在指令前用前缀指出段寄
83、存器名。缀指出段寄存器名。例:例:ESES:MOV CXMOV CX,BXBX 若若 ES=3000HES=3000H,BX=2000HBX=2000H,则,则CX CX (32000H32000H)7/22/202479(2 2)堆栈段基址寻址)堆栈段基址寻址 用用BPBP寄存器进行间接寻址时,操作数默认在堆栈段中,默认寄存器进行间接寻址时,操作数默认在堆栈段中,默认 的段寄存器为的段寄存器为SSSS,因为,因为BPBP称为基址寄存器,这种称为基址寄存器,这种寻址方式叫寻址方式叫堆栈堆栈 段基址寻址。段基址寻址。 例:例:MOV AXMOV AX,BPBP 设设SS=6000HSS=6000
84、H,BP=2000HBP=2000H,则,则AL AL (62000H62000H),), AH AH (62001H62001H)。)。(3 3)变址寻址)变址寻址 SISI:源变址寄存器:源变址寄存器 DIDI:目的变址寄存器:目的变址寄存器 用用SISI和和DIDI进行间接寻址也叫变址寻址。变址寻址通常用于对数组进行间接寻址也叫变址寻址。变址寻址通常用于对数组元素和字符串操作中。元素和字符串操作中。 例:例:MOV AXMOV AX,SISI7/22/202480(4 4)基址加变址的寻址)基址加变址的寻址 通常将通常将BXBX和和BPBP称为基址寄存器,将称为基址寄存器,将SISI和和
85、DIDI称为变址寄存器,称为变址寄存器,80868086指令系统允许把基址寄存器和变址寄存器组成一种新的寻址方指令系统允许把基址寄存器和变址寄存器组成一种新的寻址方式,这就叫基址加变址的寻址,用这种寻址方式时,操作数的有效式,这就叫基址加变址的寻址,用这种寻址方式时,操作数的有效地址为一个基址寄存器(地址为一个基址寄存器(BXBX或或BPBP)的内容加上一个变址寄存器()的内容加上一个变址寄存器(SISI或或DIDI)的内容。即:)的内容。即: BX SIBX SI EA= + EA= + BP DI BP DI 例如:例如:MOV AXMOV AX,BX+SIBX+SI 设设DS=2000H
86、DS=2000H,BX=3000HBX=3000H,SI=1000HSI=1000H,则有效地址为,则有效地址为24000H24000H,本,本指令在执行时,将指令在执行时,将24000H24000H和和24001H24001H两单元的内容送入两单元的内容送入AXAX。 与与MOV AXMOV AX,BXSI BXSI 一样一样 在基址加变址的寻址方式中,只要用在基址加变址的寻址方式中,只要用BPBP,则默认的段寄存器就是,则默认的段寄存器就是SSSS,在其它情况,默认的段寄存器均为,在其它情况,默认的段寄存器均为DSDS。如果操作数不在默认段,。如果操作数不在默认段,则要用前缀指出相应的段寄
87、存器名。则要用前缀指出相应的段寄存器名。7/22/202481(5 5)基址变址且相对寻址)基址变址且相对寻址 在基址加变址的寻址方式中,也允许带一个在基址加变址的寻址方式中,也允许带一个8 8位或位或1616位的位位的位移量,构成基址变址且相对寻址方式。即:移量,构成基址变址且相对寻址方式。即: BX SI 8BX SI 8位位移量位位移量 EA= + +EA= + + BP DI 16 BP DI 16位位移量位位移量 例如:例如: MOV AXMOV AX,BX+SI+0050H BX+SI+0050H ;将;将BXBX和和SISI中的内容与中的内容与0050H0050H相相 加作为有效
88、地址加作为有效地址与与 MOV AX 0050HBXSI MOV AX 0050HBXSI 一样一样 由于基址加变址的寻址方式中,允许两个地址分量分别改变,由于基址加变址的寻址方式中,允许两个地址分量分别改变,而且有一个对段寄存器的约定规则:而且有一个对段寄存器的约定规则: 即如果基址寄存器用即如果基址寄存器用BXBX,则默认的段寄存器为,则默认的段寄存器为DSDS; 如果基址寄存器用如果基址寄存器用BPBP,则默认的段寄存器为,则默认的段寄存器为SSSS。7/22/2024825. 5. 隐含寻址(固定寻址)隐含寻址(固定寻址) 有些指令中,不仅包含操作码信息,还隐含了操作数有些指令中,不仅
89、包含操作码信息,还隐含了操作数 地址的信息。地址的信息。 例如:例如:MUL CX MUL CX 另一乘数一定在另一乘数一定在AXAX中,不在指令中出现。中,不在指令中出现。 隐含寻址的指令,不需要计算隐含寻址的指令,不需要计算EAEA,执行速度快。大,执行速度快。大 多为单字节指令,适合在微机中使用。多为单字节指令,适合在微机中使用。*指令指令地址的寻址方式在后面讲。地址的寻址方式在后面讲。*7/22/202483二二. 8086 . 8086 指令系统指令系统六大类:六大类:数据传送类指令数据传送类指令算术运算类指令算术运算类指令逻辑运算与移位类指令逻辑运算与移位类指令字符串处理指令字符串
90、处理指令控制转移类指令控制转移类指令处理器控制类指令处理器控制类指令7/22/2024841. 1. 数据传送类指令数据传送类指令可以实现可以实现CPUCPU内部寄存器之间,寄存器与存储器之间,累加器与内部寄存器之间,寄存器与存储器之间,累加器与I/OI/O端口之间的字或字节传送。端口之间的字或字节传送。(1) (1) 通用数据传送指令通用数据传送指令 1 1)最基本的传送指令)最基本的传送指令 MOVMOV 格式:格式:MOV MOV 目的操作数,源操作数目的操作数,源操作数 源操作数可为寄存器、存储器、立即数。源操作数可为寄存器、存储器、立即数。 目的操作数可为寄存器、存储器。例:目的操作
91、数可为寄存器、存储器。例: MOV ALMOV AL,BL BL MOV ES MOV ES,DX DX MOV AX MOV AX,BX BX MOV DI MOV DI,AX AX MOV CX MOV CX,1000H 1000H MOV AL MOV AL,30H30H MOV DX MOV DX,7060H7060H MOV WORD PTR SI MOV WORD PTR SI,4030H 4030H 7/22/202485使用使用MOVMOV指令的注意事项:指令的注意事项:()MOVMOV指令有两个操作数,目的操作数在前,源操作数在后,指令有两个操作数,目的操作数在前,源操作数在
92、后, 源操作数的内容送入目的操作数后,源操作数的内容不变。源操作数的内容送入目的操作数后,源操作数的内容不变。()当源操作数不是立即数时,两个操作数必须有一个是寄存器。)当源操作数不是立即数时,两个操作数必须有一个是寄存器。()MOVMOV指令可传送指令可传送8 8位数据,也可传送位数据,也可传送1616位数据,取决于指令中位数据,取决于指令中 寄存器的类型。寄存器的类型。当指令中源操作数和目的操作数都是寄存器时,当指令中源操作数和目的操作数都是寄存器时, 必须采用同样字长的寄存器。如:必须采用同样字长的寄存器。如:MOV BLMOV BL,AXAX;非法。;非法。()不能在两个内存单元间直接
93、传送数据。)不能在两个内存单元间直接传送数据。()源操作数和目的操作数不能同时为段寄存器。)源操作数和目的操作数不能同时为段寄存器。 如如 MOV SSMOV SS,DS DS 非法。非法。()段寄存器用作目的操作数时,源操作数不能是立即数。)段寄存器用作目的操作数时,源操作数不能是立即数。 MOV DSMOV DS,2000H2000H; 错错 对段寄存器赋值必须通过寄存器作中介,例如要对对段寄存器赋值必须通过寄存器作中介,例如要对DSDS赋值赋值 2000H2000H,则必须用如下指令:,则必须用如下指令: MOV AXMOV AX,2000H2000H MOV DX MOV DX,AXA
94、X()CSCS和和IPIP这两个寄存器不能用作目的操作数,也就是说这两个这两个寄存器不能用作目的操作数,也就是说这两个 寄存器的内容不能随意修改。寄存器的内容不能随意修改。7/22/2024862) 堆栈操作指令堆栈操作指令 PUSH PUSH 源源 把字压入堆栈把字压入堆栈 源操作数可为寄存器、存储器。源操作数可为寄存器、存储器。 POP POP 目标目标 把字弹出堆栈把字弹出堆栈 目的操作数可为寄存器(目的操作数可为寄存器(CSCS除外)、存储器。除外)、存储器。 先进后出。先进后出。 堆栈段地址在堆栈段地址在SSSS中,中, 堆栈当前偏移地址在堆栈当前偏移地址在SPSP寄存器中。寄存器中
95、。 PUSHPUSH的功能:的功能:SP SP-2SP SP-2 (SP+1SP+1): :(SPSP) (源)(源) 字操作。高字节在高地址,低字节在低地址。减字操作。高字节在高地址,低字节在低地址。减2 2压入,先压入,先 减再压。减再压。 POPPOP的功能:(目标)的功能:(目标) (SP+1SP+1): :(SPSP) SP SP+2SP SP+2 字操作,弹出加字操作,弹出加2 2,先弹再加。,先弹再加。7/22/202487例:例:MOV AXMOV AX,0200H0200H MOV SS MOV SS,AXAX MOV SP MOV SP,0008H0008H MOV CX
96、MOV CX,12FAH12FAH PUSH CX PUSH CX POP CX POP CX 7/22/202488使用堆栈操作指令的注意事项:使用堆栈操作指令的注意事项:()PUSHPUSH和和POPPOP指令均只能对字操作,不能进行字节操指令均只能对字操作,不能进行字节操 作。如作。如PUSH ALPUSH AL、POP BH POP BH 都是错误的。都是错误的。()段寄存器)段寄存器CSCS的值可以推入堆栈,但不能从堆栈中的值可以推入堆栈,但不能从堆栈中 弹出一个字到弹出一个字到CSCS。即。即PUSH CSPUSH CS是可以操作的,是可以操作的,POPPOP CS CS是错误的,
97、因为一旦改变了是错误的,因为一旦改变了CSCS的内容,就会导致的内容,就会导致 CPUCPU从新的从新的CSCS和和IPIP给出的毫无意义的地址中去取一给出的毫无意义的地址中去取一 条错误的指令,使程序运行错误。条错误的指令,使程序运行错误。()堆栈中的内容:先进后出。因此在保护现场和恢)堆栈中的内容:先进后出。因此在保护现场和恢 复现场时,要按照对称的次序执行一系列复现场时,要按照对称的次序执行一系列PUSHPUSH指指 令和令和POPPOP指令。指令。7/22/202489如果一个子程序的开头是这样保护现场的:如果一个子程序的开头是这样保护现场的: PUSH AXPUSH AX PUSH
98、BX PUSH BX PUSH DI PUSH DI PUSH SI PUSH SI则恢复现场时,寄存器的次序正好相反:则恢复现场时,寄存器的次序正好相反: POP SIPOP SI POP DI POP DI POP BX POP BX POP AX POP AX7/22/2024903) XCHG 交换指令交换指令 功能:实现源操作数和目的操作数的交换,既可以实功能:实现源操作数和目的操作数的交换,既可以实 现字节交换,也可以实现字交换。交换可以在两个寄现字节交换,也可以实现字交换。交换可以在两个寄 存器之间进行,也可以在寄存器和存储单元之间进存器之间进行,也可以在寄存器和存储单元之间进
99、行,但不能在两个存储单元之间进行交换。行,但不能在两个存储单元之间进行交换。 例:例: XCHG ALXCHG AL,BL BL XCHG BX XCHG BX,CX CX XCHG BX XCHG BX,1000H 1000H ;BXBX中的内容和有效地址为中的内容和有效地址为1000H1000H、 1001H1001H两单元的内容进行交换两单元的内容进行交换 使用使用XCHGXCHG指令的注意事项:指令的注意事项: ()源操作数和目的操作数不能均为内存单元。)源操作数和目的操作数不能均为内存单元。 ()CSCS和和IPIP的内容不能进行交换。的内容不能进行交换。7/22/202491(4
100、4)XLATXLAT 换码指令换码指令 功能:使累加器中的一个值变换为内存表格中的某一功能:使累加器中的一个值变换为内存表格中的某一个值,用来实现编码制的转换。使用此指令时,要求个值,用来实现编码制的转换。使用此指令时,要求BXBX寄存器指向表格的首地址,寄存器指向表格的首地址,ALAL为表格中某一项与表格首为表格中某一项与表格首地址之间的位移量,执行时将地址之间的位移量,执行时将BXBX和和ALAL中的值相加,把得中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到的值作为地址,然后将此地址所对应的单元中的值取到到ALAL中。中。 例:例: MOV BXMOV BX,4000H
101、4000H MOV AL MOV AL,5 5 XLAT XLAT 功能:功能:AL AL (BX+ALBX+AL)7/22/2024927/22/202493(2) (2) 地址传送指令地址传送指令 1 1) 取有效地址指令取有效地址指令 LEALEA Load Effective Address Load Effective Address 功能:将源操作数的有效地址送到目的操作数所在功能:将源操作数的有效地址送到目的操作数所在 的寄存器中。要求源操作数必须为内存单元地址,目的寄存器中。要求源操作数必须为内存单元地址,目 的操作数必须为一个的操作数必须为一个1616位的通用寄存器。位的通用
102、寄存器。 例:例: LEA AXLEA AX,2300H2300H;将内存单元的偏移量;将内存单元的偏移量2300H2300H送送AXAX, 指令执行后,指令执行后,AXAX中为中为2300H2300H LEA BX LEA BX,BP+SI BP+SI ;指令执行后,;指令执行后,BXBX中的内容中的内容 为为BP+SIBP+SI的值的值 LEA SPLEA SP,2000H 2000H ;指令执行后,使堆栈指针;指令执行后,使堆栈指针 为为2000H2000H7/22/2024942 2)将地址指针装入)将地址指针装入DSDS和另一寄存器指令和另一寄存器指令 LDS LDS 功能:把功能:
103、把4 4个字节的地址(其中包括一个段地址和一个字节的地址(其中包括一个段地址和一 个偏移量)传送到两个目的寄存器。个偏移量)传送到两个目的寄存器。 如:设如:设2000H2000H2003H2003H这这4 4个单元中存放着一个地址,个单元中存放着一个地址, 其中其中2000H2000H和和2001H2001H两单元中存放地址的偏移量,两单元中存放地址的偏移量, 2002H2002H和和2003H2003H两单元存放段地址。两单元存放段地址。 执行指令执行指令 LDS DILDS DI,2030H 2030H 后后 使使2030H2030H和和2031H2031H中的地址偏移量送到中的地址偏移
104、量送到DIDI, 2032H2032H和和2033H2033H中为段地址送到中为段地址送到DSDS。 3 3)将地址指针装入)将地址指针装入ESES和另一寄存器指令和另一寄存器指令 LES LES 功能:功能:LESLES指令和指令和LDSLDS指令的格式及使用方法是类似指令的格式及使用方法是类似 的,其区别在于段寄存器的,其区别在于段寄存器DSDS改成改成ESES。 LDSLDS和和LESLES这两条指令的源操作数均来自存储器,不过这两条指令的源操作数均来自存储器,不过存储器的地址可能是直接指出的,也可能是间接指出存储器的地址可能是直接指出的,也可能是间接指出的,还有可能是通过一个寄存器的内
105、容加上一个偏移的,还有可能是通过一个寄存器的内容加上一个偏移量来间接指出的。量来间接指出的。 7/22/202495(3) (3) 标志传送指令标志传送指令 1) 1) 读取标志指令读取标志指令 LAHFLAHF(Load AH with FlagsLoad AH with Flags) 将标志寄存器中的低八位传送到将标志寄存器中的低八位传送到AHAH中。即:将中。即:将SFSF、ZFZF、AFAF、PFPF和和CFCF传送到传送到AHAH寄存器的相应位,如下图所示,寄存器的相应位,如下图所示,AHAH寄存器的其余三位无意义。寄存器的其余三位无意义。7/22/2024962 2) 设置标志指令
106、设置标志指令 SAHFSAHF(Store AH into FlagsStore AH into Flags) 指令指令SAHFSAHF的功能与的功能与LAHFLAHF的功能相反,将的功能相反,将AHAH寄存器的相寄存器的相 应位传送到标志寄存器的低八位。也就是将上图中的应位传送到标志寄存器的低八位。也就是将上图中的 五个箭头的方向反过来即可。五个箭头的方向反过来即可。 为什么为什么80868086系统要提供只对标志寄存器中的低系统要提供只对标志寄存器中的低8 8位标志位标志 进行传送的指令呢?这是为了保持进行传送的指令呢?这是为了保持80868086系统对系统对8 8位微处位微处 理器理器8
107、080/80858080/8085指令系统的兼容性。在指令系统的兼容性。在8080/80858080/8085微处微处 理器中,只有理器中,只有SFSF、ZFZF、AFAF、PFPF和和CFCF五个标志位,它们五个标志位,它们 在标志寄存器中的排列次序正是现在在标志寄存器中的排列次序正是现在80868086标志寄存器标志寄存器 低低8 8位的排列次序。位的排列次序。80868086系统有了系统有了LAHFLAHF和和SAHFSAHF这两条指这两条指 令,就可以保持对令,就可以保持对8080/80858080/8085汇编语言程序的完整兼容汇编语言程序的完整兼容 性。性。7/22/202497
108、3 3)标志寄存器入栈指令)标志寄存器入栈指令 PAHFPAHF 将标志寄存器的值压入堆栈顶部,同时栈指针将标志寄存器的值压入堆栈顶部,同时栈指针SPSP的值的值 减减2 2,此指令在执行时标志寄存器的值不变。,此指令在执行时标志寄存器的值不变。 4 4)标志寄存器出栈指令)标志寄存器出栈指令 POPFPOPF 与与PUSHFPUSHF正好相反,执行时从堆栈中弹出一个字送到标正好相反,执行时从堆栈中弹出一个字送到标 志寄存器中,同时栈指针志寄存器中,同时栈指针SPSP的值加的值加2 2。 PUSHFPUSHF和和POPFPOPF指令一般用在子程序和中断处理程序的首指令一般用在子程序和中断处理程
109、序的首 尾,起保存主程序标志和恢复主程序标志的作用。尾,起保存主程序标志和恢复主程序标志的作用。7/22/202498(4) I/O(4) I/O指令(输入指令(输入/ /输出指令)输出指令) 用于完成用于完成I/OI/O端口和累加器间的数据传送,指令中给出端口和累加器间的数据传送,指令中给出I/OI/O端口的地址。端口的地址。 执行输入指令时,执行输入指令时,CPUCPU可以从一个可以从一个8 8位端口读一个字节到位端口读一个字节到 ALAL中,也可以从两个连续的中,也可以从两个连续的8 8位端口读一个字到位端口读一个字到AXAX中;中; 执行输出指令时,执行输出指令时,CPUCPU可以将可
110、以将ALAL中的一个字节写到一个中的一个字节写到一个8 8 位端口,或将位端口,或将AXAX中的一个字写到两个连续的中的一个字写到两个连续的8 8位端口。位端口。 输入输入/ /输出指令可以分为两大类:输出指令可以分为两大类: 一类是直接寻址的输入一类是直接寻址的输入/ /输出指令,输出指令, 另一类是寄存器间接寻址的输入另一类是寄存器间接寻址的输入/ /输出指令。输出指令。下面是直接寻址的输入下面是直接寻址的输入/ /输出指令的例子。输出指令的例子。 IN ALIN AL,50H 50H ;将;将50H50H端口的字节读入端口的字节读入ALAL IN AX IN AX,70H 70H ;将;
111、将70H70H、71H71H两端口值读入两端口值读入AXAX;其;其 中,中,70H70H端口内容读入端口内容读入ALAL,71H71H端口内容读入端口内容读入AHAH 7/22/202499 OUT 44H OUT 44H,AL AL ;将;将ALAL中的一个字节输出到中的一个字节输出到44H44H端口端口 OUT 80HOUT 80H,AX AX ;将;将AXAX中的内容输出到中的内容输出到80H80H、81H81H两两 端口,其中,端口,其中,ALAL中的内容输出到中的内容输出到80H80H端口,端口,AHAH中中 的内容输出到的内容输出到81H81H端口端口以下是寄存器间接寻址的输入以
112、下是寄存器间接寻址的输入/ /输出指令的例子。输出指令的例子。 MOV DXMOV DX,400H 400H ;先将端口地址送入;先将端口地址送入DXDX IN AL IN AL,DX DX ;从;从400H400H端口读一个字节到端口读一个字节到ALAL中中 IN AXIN AX,DX DX ;从;从400H400H、401H401H两个端口中读一个两个端口中读一个 字到字到AXAX中;其中,中;其中,400H400H端口中的值读入端口中的值读入ALAL,401H401H 端口中的值读入端口中的值读入AHAH OUT DX OUT DX,AL AL ;将;将ALAL中的一个字节输出到中的一个
113、字节输出到400H400H端口端口 OUT DXOUT DX,AX AX ;将;将AXAX中的内容输出到中的内容输出到400H400H、401H401H两两 端口,其中,端口,其中,ALAL中的内容输出到中的内容输出到400H400H端口,端口,AHAH中的中的 内容输出到内容输出到401H401H端口端口7/22/2024100使用输入使用输入/ /输出指令的注意事项:输出指令的注意事项: 执行输入执行输入/ /输出指令时只能用累加器输出指令时只能用累加器AXAX或或ALAL,不能用其,不能用其它寄存器。它寄存器。 使用直接寻址的输入使用直接寻址的输入/ /输出指令时,寻址范围为输出指令时,
114、寻址范围为0 0255255(FFHFFH),在一些规模较小的微机系统中,外设的),在一些规模较小的微机系统中,外设的端口号就在这个范围内,就采用这种方式。但在一些端口号就在这个范围内,就采用这种方式。但在一些功能较强的系统中,既用了功能较强的系统中,既用了0 0255255范围内的端口地址,范围内的端口地址,也用了大于也用了大于255255的端口地址,如在用的端口地址,如在用IBM PCIBM PC系列机进行系列机进行计算机网络通信、图像传送和语音识别时,只能使用计算机网络通信、图像传送和语音识别时,只能使用系中一些地址编号较大的端口,这样就不能用直接寻系中一些地址编号较大的端口,这样就不能
115、用直接寻址,必须采用间接寻址的方式。间接寻址的寻址范围址,必须采用间接寻址的方式。间接寻址的寻址范围为为0 06553565535。当然,凡是能用直接寻址输入。当然,凡是能用直接寻址输入/ /输出指令输出指令的地方,都可以用间接寻址的输入的地方,都可以用间接寻址的输入/ /输出指令,不过,输出指令,不过,用间接寻址的输入用间接寻址的输入/ /输出指令前,要用输出指令前,要用MOVMOV指令在指令在DXDX寄寄存器中设置好端口号,且只能用存器中设置好端口号,且只能用DXDX寄存器,不能用其寄存器,不能用其它寄存器。它寄存器。7/22/20241012. 2. 算术操作类指令算术操作类指令(1)
116、(1) 加法指令加法指令 1 1)不带进位位的加法指令)不带进位位的加法指令 ADDADD 格式:格式:ADD dest, src (B/W)ADD dest, src (B/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。 功能:功能:dest dest+srcdest dest+src注意:注意: 源操作数和目的操作数不能同时为内存单元。源操作数和目的操作数不能同时为内存单元。 标志位随运算结果而变化。标志位随运算结果而变化。 操作数可以是带符号数或无符号数。操作数
117、可以是带符号数或无符号数。 例:例:ADD ALADD AL,50H 50H ; AL AL+50HAL AL+50H ADD AX ADD AX,1000H 1000H ; AX AX+1000HAX AX+1000H ADD AX ADD AX,SI SI ; AX AX+SIAX AX+SI ADD BX+DI ADD BX+DI,AXAX ADD AX ADD AX,BX+2000HBX+2000H7/22/20241022 2) 带进位位的加法指令带进位位的加法指令 ADCADC格式:格式:ADC dest, src (B/W)ADC dest, src (B/W) dest des
118、t 可为寄存器可为寄存器或内存单元,或内存单元, src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。功能:功能:dest dest+src+CFdest dest+src+CF注意:注意: 源操作数和目的操作数不能同时为内存单元。源操作数和目的操作数不能同时为内存单元。 标志位随运算结果而变化。标志位随运算结果而变化。 操作数可以是带符号数或无符号数。操作数可以是带符号数或无符号数。例:例:ADC ALADC AL,50H 50H ;AL AL+50H+CFAL AL+50H+CF ADC DX ADC DX,SISI ADC BX ADC
119、BX,1000H1000H ADC AX ADC AX,SISI 7/22/20241033 3)增量指令)增量指令 INCINC格式:格式:INC dest INC dest (B/WB/W)dest dest 可为寄存器可为寄存器或内存单元,或内存单元,功能:功能:dest dest+1dest dest+1注意:注意: 单操作数指令。单操作数指令。 不影响标志位不影响标志位CFCF。 常用于修改地址指针和用作加常用于修改地址指针和用作加1 1计数。计数。例:例:INC AL INC AL ; AL AL+1AL AL+1 INC BYTE PTR DI+100H INC BYTE PTR
120、 DI+100H 7/22/2024104(2) (2) 减法指令减法指令 1 1)不带借位的减法指令)不带借位的减法指令 SUBSUB格式:格式:SUB dest, src (B/W)SUB dest, src (B/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。功能:功能:dest dest-srcdest dest-src注意:注意: 源操作数和目的操作数不能同时为内存单元。源操作数和目的操作数不能同时为内存单元。 标志位随运算结果而变化。标志位随运算结果而变化
121、。 操作数可以是带符号数或无符号数。操作数可以是带符号数或无符号数。 例:例:SUB CXSUB CX,BXBX; CX CX-BXCX CX-BX7/22/20241052 2)带借位的减法指令)带借位的减法指令 SBBSBB 格式:格式:SBB dest, src (B/W)SBB dest, src (B/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。功能:功能:dest dest- src -CFdest dest- src -CF注意:注意: 源操作数和目的
122、操作数不能同时为内存单元。源操作数和目的操作数不能同时为内存单元。 标志位随运算结果而变化。标志位随运算结果而变化。 操作数可以是带符号数或无符号数。操作数可以是带符号数或无符号数。例:例:SBB CXSBB CX,BXBX; CX CX-BX-CFCX CX-BX-CF7/22/2024106(3 3) 减减1 1指令指令 DECDEC 格式:格式: DEC dest DEC dest (B/WB/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, 功能:功能:dest dest-1dest dest-1 注意:注意: 单操作数指令。单操作数指令。 不影响标志位不影响标志
123、位CFCF。 常用于修改地址指针和用作减常用于修改地址指针和用作减1 1计数。计数。 例:例: DEC AL DEC AL ; AL AL-1AL AL-17/22/2024107 4 4)求补(变负)指令)求补(变负)指令 NEG NEG 格式:格式: NEG dest NEG dest (B/WB/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, 功能:功能:dest 0-destdest 0-dest, 即求反加即求反加1 1 注意:标志位随运算结果而变化。注意:标志位随运算结果而变化。 例:例:NEG AXNEG AX; AX 0-AXAX 0-AX 5 5)比较
124、指令)比较指令 CMP CMP 格式:格式:CMP dest, src (B/W)CMP dest, src (B/W) dest dest 可为寄存器可为寄存器或内存单元,或内存单元, src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。 功能:功能:dest-srcdest-src 注意:注意:dest-srcdest-src后,两个操作数的内容不变,仅影响后,两个操作数的内容不变,仅影响 标志位。标志位。 例:例:CMP CXCMP CX,BXBX; CX-BX CX-BX 使标志位产生变化。使标志位产生变化。7/22/2024108(3
125、) (3) 乘法指令乘法指令 1 1)无符号数乘法指令)无符号数乘法指令 MULMUL 格式:格式: MUL src MUL src (B/WB/W) 如果两个八位数相乘,会得到一个如果两个八位数相乘,会得到一个1616位的乘积,这位的乘积,这 时有一个乘数一定放在时有一个乘数一定放在ALAL中,乘积放在中,乘积放在AXAX中。中。 例:例: MUL BLMUL BL; AX AL*BLAX AL*BL 隐含寻址,隐含寻址,ALAL在指令中不出现。在指令中不出现。 如果两个如果两个1616位数相乘,会得到一个位数相乘,会得到一个3232位的乘积,这位的乘积,这 时有一个乘数一定放在时有一个乘数
126、一定放在AXAX中,乘积的高中,乘积的高1616位放在位放在DXDX 中,低中,低1616位放在位放在AXAX中。中。 例:例: MUL CXMUL CX; (DXDX:AXAX) AX*CXAX*CX 隐含寻址,隐含寻址,AXAX在指令中不出现。在指令中不出现。7/22/20241097/22/2024110注意:注意: 结果影响结果影响CFCF、OFOF,其余状态位都不确定。,其余状态位都不确定。 当乘积的高半部分当乘积的高半部分=0=0时,时, CF 0CF 0,OF 0OF 0,表示高半部分无有效数,表示高半部分无有效数 字。否则,字。否则, CF 1CF 1,OF 1OF 1。 2
127、2)带符号数乘法指令)带符号数乘法指令 IMULIMUL 格式:格式: IMUL src IMUL src (B/WB/W) 与与MULMUL相同。相同。7/22/2024111(4) 除法指令除法指令 1) 无符号数除法指令无符号数除法指令DIV格式:格式: DIV src DIV src (B/WB/W) srcsrc是除数,可以是寄存器或存储器,但决不能是是除数,可以是寄存器或存储器,但决不能是立即数;被除数、商和余数都是隐含的,所有操作数都立即数;被除数、商和余数都是隐含的,所有操作数都是无符号数。是无符号数。 如果如果 字字/ /字节字节 即即1616位位/8/8位,被除数一定在位,
128、被除数一定在AXAX中。中。例:例:DIV BLDIV BL;AX / BLAX / BL, 得商得商 ALAL; 余数余数 AHAH。 如果是如果是3232位位/16/16位,位, 仍是隐含寻址,被除数一定在仍是隐含寻址,被除数一定在 (DXDX:AXAX)中。操作数中是)中。操作数中是1616位的除数。位的除数。例:例:DIV BXDIV BX; ( DXDX:AX AX )/ BX / BX 商商 AXAX; 余数余数 DXDX。7/22/20241127/22/2024113注意:注意: 所有的状态位都是不确定的。所有的状态位都是不确定的。 当发生商溢出时,当发生商溢出时,CPU会产生
129、除法中断以进行出错会产生除法中断以进行出错 处理,此时所得的商和余数均不确定。处理,此时所得的商和余数均不确定。 2)带符号数除法指令)带符号数除法指令IDIV格式:格式: IDIV src IDIV src (B/WB/W)与与DIVDIV相同。相同。注意:余数的符号和被除数的符号相同。注意:余数的符号和被除数的符号相同。7/22/20241143) 字节转换为字指令字节转换为字指令 CBW格式:格式:CBW Convert Byte to Word功能:隐含的操作数为功能:隐含的操作数为ALAL,把,把ALAL中的符号位扩展到中的符号位扩展到AHAH,即将一个字节的带符号数扩展成一个字。即
130、将一个字节的带符号数扩展成一个字。 例:若有例:若有 AL=05HAL=05H, BX=0345HBX=0345H,现要把这两个带符,现要把这两个带符 号数相加,可用以下两条指令:号数相加,可用以下两条指令: CBW CBW ;把;把ALAL的符号位扩展到的符号位扩展到AHAH,则,则AX=0005HAX=0005H ADD AX ADD AX,BX BX ;AX AX+BXAX AX+BX例:若(例:若(ALAL)=85H=10000101B=85H=10000101B, 为负数,则为负数,则 CBW CBW ;把;把ALAL的符号位扩展到的符号位扩展到AHAH,则,则AX=FF85HAX=
131、FF85H ADD AX ADD AX,BX BX ;结果;结果AX=FF85H+0345H=02CAHAX=FF85H+0345H=02CAH 注意:不影响状态位。注意:不影响状态位。7/22/20241154) 字转换为双字指令字转换为双字指令 CWD格式:格式:CWD Convert Word to Double Word功能:隐含的操作数为功能:隐含的操作数为AX例:例: MOV AX,834EH CWD则执行这两条指令后,则执行这两条指令后,DX=FFFFH, AX=834EH。注意:不影响状态位。注意:不影响状态位。7/22/2024116(5) (5) 十进制调整指令十进制调整指
132、令 1 1)AAAAAA指令(加法的指令(加法的ASCIIASCII码调整指令)码调整指令)Unpacked BCDASCII Adjust for AdditionUnpacked BCDASCII Adjust for AdditionAAAAAA指令必须紧跟在指令必须紧跟在ADDADD、ADCADC指令之后。指令之后。本指令可对两个分离式本指令可对两个分离式BCDBCD码相加后的结果(该结果应码相加后的结果(该结果应在在ALAL中)进行调整,从而产生用分离式中)进行调整,从而产生用分离式BCDBCD码表示的和。码表示的和。两个分离式两个分离式BCDBCD码可以用码可以用ADDADD指令相
133、加,如要得到的结指令相加,如要得到的结果也是分离式果也是分离式BCDBCD码,则必须在加法指令之后,紧接着码,则必须在加法指令之后,紧接着用一条用一条AAAAAA指令进行调整(即加指令进行调整(即加6 6修正),才能在修正),才能在AXAX中中得到正确的结果。得到正确的结果。例:例:6 6的分离式的分离式BCDBCD码为码为0000011000000110,7 7的分离式的分离式BCDBCD码为码为0000011100000111,两数之和为,两数之和为1313。因加法是按二进制规则进。因加法是按二进制规则进行的,行的,ALAL中的和应为中的和应为0000110100001101。但其正确的分
134、离式。但其正确的分离式BCDBCD码结果应该在码结果应该在AHAH中为中为0000000100000001,ALAL中为中为0000001100000011。用。用AAAAAA指令对指令对ALAL中的二进制和中的二进制和0000110100001101进行调整就能得到进行调整就能得到正确的分离式正确的分离式BCDBCD码结果。码结果。AAAAAA指令会影响标志位指令会影响标志位AFAF和和CFCF,但对标志,但对标志OFOF、PFPF、SFSF和和ZFZF未定义。未定义。7/22/20241172 2)DAADAA指令(指令(加法的十进制调整指令)加法的十进制调整指令) Decimal Adj
135、ust for Addition Decimal Adjust for Addition DAADAA指令必须紧跟在指令必须紧跟在ADDADD、ADCADC指令之后。指令之后。本指令可对两个组合式本指令可对两个组合式BCDBCD码相加后的结果(该结果应码相加后的结果(该结果应在在ALAL中)进行调整,从而产生用组合式中)进行调整,从而产生用组合式BCDBCD码表示的和。码表示的和。两个组合式两个组合式BCDBCD码可以直接用码可以直接用ADDADD指令相加(必须有一指令相加(必须有一个数在个数在ALAL中),如要得到的结果也是组合式中),如要得到的结果也是组合式BCDBCD码,则码,则必须在必
136、须在ADDADD或或ADCADC指令之后,紧接着用一条指令之后,紧接着用一条DAADAA指令进行指令进行调整,才能在调整,才能在ALAL中得到正确的结果。中得到正确的结果。例:如例:如5656的组合式的组合式BCDBCD码为码为0101011001010110,7777的组合式的组合式BCDBCD码为码为0111011101110111,两数相加之和为,两数相加之和为133133。因加法是按二进。因加法是按二进制规则进行的,制规则进行的,ALAL中的和应为中的和应为1100110111001101。但其正确的。但其正确的组合式组合式BCDBCD码结果在码结果在ALAL中应为中应为0011001
137、100110011(另有一进位)。(另有一进位)。用用DAADAA指令对指令对ALAL中的二进制和中的二进制和1100110111001101进行调整就能得进行调整就能得到正确的组合式到正确的组合式BCDBCD码结果。码结果。DAADAA指令会影响标志位指令会影响标志位AFAF、CFCF、PFPF、SFSF和和ZFZF,对标志位,对标志位OFOF未定义。未定义。7/22/20241183 3)AASAAS指令(减法的指令(减法的ASCIIASCII码调整指令)码调整指令) Unpacked BCDASCIIAdjust for SubtractionUnpacked BCDASCIIAdjus
138、t for SubtractionAASAAS指令必须紧跟在指令必须紧跟在SUBSUB、SBBSBB指令之后。指令之后。本指令与本指令与AAAAAA指令类似。可对两个分离式指令类似。可对两个分离式BCDBCD码相减后码相减后的结果(该结果应在的结果(该结果应在ALAL中)进行调整,从而产生用分中)进行调整,从而产生用分离式离式BCDBCD码表示的差。码表示的差。两个分离式两个分离式BCDBCD码可以直接相减,如要得到的结果也是码可以直接相减,如要得到的结果也是分离式分离式BCDBCD码,则必须在减法指令之后,紧接着用一条码,则必须在减法指令之后,紧接着用一条AASAAS指令进行调整(减指令进行
139、调整(减6 6修正),才能在修正),才能在AXAX中得到正确中得到正确的结果。的结果。AASAAS指令会影响标志位指令会影响标志位AFAF和和CFCF,但对标志,但对标志OFOF、PFPF、SFSF和和ZFZF未定义。未定义。7/22/20241194 4)DASDAS指令(减法的十进制调整指令)指令(减法的十进制调整指令) Decimal Adjust for Subtraction Decimal Adjust for Subtraction DASDAS指令必须紧跟在指令必须紧跟在SUBSUB、SBBSBB指令后。指令后。本指令与本指令与DAADAA指令类似。可对两个组合式指令类似。可对
140、两个组合式BCDBCD码相减后码相减后的结果(该结果在的结果(该结果在ALAL中)进行中)进行减减6 6修正修正,从而产生用组,从而产生用组合式合式BCDBCD码表示的差。码表示的差。两个组合式两个组合式BCDBCD码可以直接相减,如要得到的结果也是码可以直接相减,如要得到的结果也是组合式组合式BCDBCD码,则必须在码,则必须在SUBSUB或或SBBSBB指令之后,紧接着用指令之后,紧接着用一条一条DASDAS指令进行调整,才能在指令进行调整,才能在ALAL中得到正确的结果。中得到正确的结果。DASDAS指令会影响标志位指令会影响标志位AFAF、CFCF、PFPF、SFSF和和ZFZF,对标
141、志位,对标志位OFOF未定义。未定义。7/22/20241205)AAM指令(乘法的指令(乘法的ASCII码调整指令)码调整指令) Unpacked BCDASCIIAdjust for MultiplyUnpacked BCDASCIIAdjust for Multiply本指令可对两个分离式本指令可对两个分离式BCDBCD码相乘后的结果(该结果应在码相乘后的结果(该结果应在AXAX中)进中)进行调整,从而在行调整,从而在AXAX中得到用分离式中得到用分离式BCDBCD码表示的积。码表示的积。两个分离式两个分离式BCDBCD码可以直接相乘,但必须在码可以直接相乘,但必须在MULMUL指令之后
142、,紧接着指令之后,紧接着用一条用一条AAMAAM指令进行调整,才能在指令进行调整,才能在AXAX中得到正确的用分离式中得到正确的用分离式BCDBCD码码表示的结果。表示的结果。AAMAAM指令调整的操作为:指令调整的操作为:AH AL/0AH AH AL/0AH (ALAL被被OAHOAH除的商除的商 AHAH)AL AL%0AH AL AL%0AH (ALAL被被OAHOAH除的余数除的余数 ALAL)现以例说明:现以例说明:6 6的分离式的分离式BCDBCD码为码为0000011000000110,7 7的分离式的分离式BCDBCD码为码为0000011100000111,按二进制的规则相
143、乘,乘积的有效数在,按二进制的规则相乘,乘积的有效数在ALAL中,其值为中,其值为0010101000101010,即用二进制数表示的乘积,即用二进制数表示的乘积4242。现要在。现要在AXAX中得到用分离中得到用分离式式BCDBCD码表示的乘积,则码表示的乘积,则AHAH中应为乘积中应为乘积4242的十位数值的十位数值0000010000000100,ALAL中应为乘积中应为乘积4242的个位数值的个位数值0000001000000010,就必须进行调整。用,就必须进行调整。用AAAAAA指令指令经上面所规定的调整就可以得到正确的用分离式经上面所规定的调整就可以得到正确的用分离式BCDBCD
144、码表示的结果。码表示的结果。本指令影响标志位本指令影响标志位PFPF、SFSF、ZFZF,但对标志位,但对标志位AFAF、CFCF、OFOF未定义。未定义。7/22/20241216 6)AADAAD指令(除法的指令(除法的ASCIIASCII码调整指令)码调整指令)Unpacked BCDASCIIAdjust for DivisionUnpacked BCDASCIIAdjust for Division本指令能把在本指令能把在AXAX中的两位用分离式中的两位用分离式BCDBCD码表示的数在除以另一个用码表示的数在除以另一个用分离式分离式BCDBCD码表示的数之前进行调整,这样在相除之后可
145、以得到正码表示的数之前进行调整,这样在相除之后可以得到正确的用分离式确的用分离式BCDBCD码表示的商。码表示的商。例:如在例:如在AXAX中的被除数为中的被除数为6262,用分离式,用分离式BCDBCD码表示为:码表示为: AH ALAH AL 00000110 00000010 00000110 00000010 除数为除数为8 8,用分离式,用分离式BCDBCD码表示为码表示为0000100000001000,在相除之前必须先调,在相除之前必须先调整,使被除数整,使被除数6262以二进制形式集中在以二进制形式集中在ALAL中,即调整为:中,即调整为: AH ALAH AL 0000000
146、0 00111110 00000000 00111110再用二进制除法指令再用二进制除法指令DIVDIV相除,相除以后,以分离式相除,相除以后,以分离式BCDBCD码表示的码表示的商在商在ALAL中,余数在中,余数在AHAH中。中。80868086允许两个分离式允许两个分离式BCDBCD码直接相除,但在相除之前,先用码直接相除,但在相除之前,先用AADAAD指指令,然后再用除法指令,则相除以后的商送至令,然后再用除法指令,则相除以后的商送至ALAL中,余数送至中,余数送至AHAH中。中。AHAH和和ALAL的高半字节全为的高半字节全为0 0。本指令影响标志位本指令影响标志位PFPF、SFSF、
147、ZFZF,但对标志位,但对标志位AFAF、CFCF、OFOF未定义。未定义。7/22/20241223. 3. 位处理类指令位处理类指令(1) (1) 逻辑操作指令逻辑操作指令 1 1)逻辑)逻辑“与与”指令指令 ANDAND格式:格式:AND dest, src (B/W)AND dest, src (B/W)dest dest 可为寄存器可为寄存器或内存单元,或内存单元,src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即数。位立即数。 功能:功能:dest destdest dest与与srcsrc注意:注意: 两个操作数不能同时为内存单元。两个操作数
148、不能同时为内存单元。 标志位标志位SFSF、ZFZF和和PFPF随运算结果变化,随运算结果变化, CF 0CF 0,OF 0OF 0,而,而AFAF不确定。不确定。 例:例:AND ALAND AL,0FH0FH AND AX AND AX,BXBX AND DX AND DX,BX+SIBX+SI7/22/2024123 2) 逻辑逻辑“或或”指令指令 OR 格式:格式:OR dest, src (B/W)OR dest, src (B/W)dest dest 可为寄存器可为寄存器或内存单元,或内存单元,src src 可为寄存器可为寄存器、内存单元、内存单元或或8 8位、位、1616位立即
149、数。位立即数。功能:功能:dest destdest dest或或srcsrc注意:注意: 两个操作数不能同时为内存单元。两个操作数不能同时为内存单元。 标志位标志位SFSF、ZFZF和和PFPF随运算结果变化,随运算结果变化, CF 0CF 0,OF 0OF 0,而,而AFAF不确定。不确定。 例:例: OR AX,000FH7/22/2024124 3)逻辑)逻辑“异或异或”指令指令XOR格式:格式:XOR dest, src (B/W)XOR dest, src (B/W)dest dest 可为寄存器可为寄存器或内存单元,或内存单元,src src 可为寄存器可为寄存器、内存单元、内存
150、单元或或8 8位、位、1616位立即数。位立即数。 功能:功能:dest dest dest dest 异或异或 srcsrc注意:注意: 两个操作数不能同时为内存单元。两个操作数不能同时为内存单元。 标志位标志位SFSF、ZFZF和和PFPF随运算结果变化,随运算结果变化, CF 0CF 0, OF 0OF 0,而,而AFAF不确定。不确定。例:例:XOR ALXOR AL,0FH0FH XOR AX XOR AX,AXAX; AXAX清清0 07/22/2024125 4)逻辑)逻辑“非非”指令指令 NOT 格式:格式:NOT dest (B/W)NOT dest (B/W)dest de
151、st 可为寄存器可为寄存器或内存单元,或内存单元,功能:功能:dest destdest dest按位取反按位取反注意:注意:NOT NOT 指令不影响标志位。指令不影响标志位。 例:例:NOT ALNOT AL NOT BX NOT BX NOT WORD PTR 1000H NOT WORD PTR 1000H7/22/2024126 5 5)测试指令)测试指令 TEST TEST 格式:格式:TEST dest, src (B/W)TEST dest, src (B/W)dest dest 可为寄存器可为寄存器或内存单元,或内存单元,src src 可为寄存器可为寄存器、内存单元、内存单
152、元或或8 8位、位、 1616位立即数。位立即数。功能:功能: dest dest 与与 srcsrc注意:注意: dest dest 与与 srcsrc后,两个操作数的内容不变;后,两个操作数的内容不变; 标志位标志位SFSF、ZFZF和和PFPF随运算结果变化,随运算结果变化, CF 0CF 0,OF 0OF 0,而,而AFAF不确定。不确定。例:例:TEST AXTEST AX,8000H8000H TEST AL TEST AL,01H01H TEST TEST与与ANDAND之区别类似于之区别类似于CMPCMP与与SUBSUB之区别。之区别。7/22/2024127例子:例子: AN
153、D AL,0FH ;AL中的高中的高4位清位清0 OR AL,0FH ;AL中的低中的低4位置位置1 XOR AL,0FH ; AL中的低中的低4位求反位求反 TEST AL,0FH ;检查;检查AL中的低中的低4位是位是 否全为否全为07/22/2024128(2) (2) 移位指令移位指令 1 1)算术左移指令)算术左移指令 SAL (Shift Arithmetic Left)SAL (Shift Arithmetic Left) 格式:格式:SAR dest, Count (B/W)SAR dest, Count (B/W) 式中式中destdest是移位对象,可为寄存器是移位对象,可
154、为寄存器或存储单元,或存储单元,Count Count 是移位次数,是移位次数, 当移位次数当移位次数=1=1时,时,CountCount写为写为1 1, 当移位次数当移位次数11时,时,CountCount写为写为CLCL,CLCL中存放移位次数。中存放移位次数。 例:例:SAL ALSAL AL,1 1 例:例:MOV CLMOV CL,2 2 SAL AL SAL AL,CL CL 算术移位指令在执行时,将操作数看作有符号数进行移算术移位指令在执行时,将操作数看作有符号数进行移位。左移位。左移1 1次,相当于乘以次,相当于乘以2 2,最低位补,最低位补0 0,最高位进入,最高位进入CFC
155、F。 7/22/2024129 2 2)算术右移指令)算术右移指令 SAR (Shift Arithmetic Right)SAR (Shift Arithmetic Right) 格式:格式:SAR dest, Count (B/W)SAR dest, Count (B/W) 算术移位指令在执行时,将操作数看作有符号数进算术移位指令在执行时,将操作数看作有符号数进 行移位。右移行移位。右移1 1次,相当于除以次,相当于除以2 2。 符号位在右移前后保持不变。符号位在右移前后保持不变。 3 3)逻辑左移指令)逻辑左移指令 SHL SHL (Shift Logic LeftShift Logic
156、 Left) 格式:格式:SHL dest,Count (B/W)SHL dest,Count (B/W) 逻辑移位指令在执行时,将操作数看作无符号数进逻辑移位指令在执行时,将操作数看作无符号数进 行移位。左移行移位。左移1 1次,相当于乘以次,相当于乘以2 2。 SHLSHL与与算术左移指令算术左移指令SHLSHL完全相同。完全相同。 4 4)逻辑右移指令)逻辑右移指令 SHR SHR (Shift Arithmetic RightShift Arithmetic Right) 格式:格式:SHR dest, Count (B/W)SHR dest, Count (B/W) 逻辑移位指令在执
157、行时,将操作数看作无符号数进逻辑移位指令在执行时,将操作数看作无符号数进 行移位。右移行移位。右移1 1次,相当于除以次,相当于除以2 2,最高位添,最高位添0 0。7/22/2024130注意:这四条指令注意:这四条指令 标志状态位标志状态位CFCF、SFSF、ZFZF和和PFPF随运算结果变化。随运算结果变化。 AFAF为任意值。为任意值。 SALSAL和和SHLSHL的的OFOF的变化如下:的变化如下: 当移位次数当移位次数 CountCount为为1 1时,时, 若移位前后若移位前后destdest的最高位不相同,的最高位不相同, 则则 OF 1OF 1(溢出),(溢出), 否则否则
158、OF 0OF 0(不溢出);(不溢出); 当移位次数当移位次数11时,时, OFOF是不确定的。是不确定的。7/22/20241317/22/2024132 5 5) 不带进位位的循环左移指令不带进位位的循环左移指令 ROL ROL (Rotate LeftRotate Left) 格式:格式:ROL dest, Count (B/W)ROL dest, Count (B/W) 6 6)不带进位位的循环右移指令)不带进位位的循环右移指令 ROR ROR (Rotate RightRotate Right) 格式:格式:ROR dest, Count (B/W)ROR dest, Count (
159、B/W) 7 7)带进位位的循环左移指令)带进位位的循环左移指令 RCLRCL ( Rotate through CF LeftRotate through CF Left) 格式:格式:RCL dest, Count (B/W)RCL dest, Count (B/W) 8 8)带进位位的循环右移指令)带进位位的循环右移指令 RCRRCR (Rotate through CF RightRotate through CF Right) 格式:格式:RCR dest, Count (B/W)RCR dest, Count (B/W)7/22/20241337/22/2024134注意:注意:这
160、四条指令这四条指令 CF随操作结果而变化;随操作结果而变化; OF的变化同前述;不管是左移还是的变化同前述;不管是左移还是 右移,只要符号位发生变化,就是右移,只要符号位发生变化,就是 溢出。溢出。 不影响不影响SF、ZF和和PF。 AFAF为任意值。为任意值。7/22/20241354. 字符串操作指令字符串操作指令字符串操作指令就是用一条指令实现对一串字符或数字符串操作指令就是用一条指令实现对一串字符或数据的操作。据的操作。80868086一共有五种基本的字符串操作指令,一共有五种基本的字符串操作指令,其特点是:其特点是:可以对字节串进行操作,也可以对字串进行操作。可以对字节串进行操作,也
161、可以对字串进行操作。所有的字符串操作指令都用寄存器所有的字符串操作指令都用寄存器SISI对源操数进行间对源操数进行间 接寻址,并且假定是在接寻址,并且假定是在DSDS段中;都用寄存器段中;都用寄存器DIDI对目的对目的 操作数进行间接寻址,并且假定是在操作数进行间接寻址,并且假定是在ESES段中。在所有段中。在所有 指令中,字符串操作指令是唯一一组源操作数和目的指令中,字符串操作指令是唯一一组源操作数和目的 操作数都在存储器中的指令。操作数都在存储器中的指令。7/22/2024136字符串操作时,地址的修改与方向标志字符串操作时,地址的修改与方向标志DFDF有关。有关。当当DF=1DF=1时,
162、时,SISI和和DIDI作自动减量修改;当作自动减量修改;当DF=0DF=0时,时,SISI和和DIDI作自动增量修改。作自动增量修改。在同一个段内进行字符串传送时,应该将数据在同一个段内进行字符串传送时,应该将数据段段地址和附加段段地址设置成相同数值,即段段地址和附加段段地址设置成相同数值,即DS=ESDS=ES。此时,仍由。此时,仍由SISI和和DIDI分别指出源字符串分别指出源字符串操作数和目的字符串操作数的偏移地址。操作数和目的字符串操作数的偏移地址。字符串的长度放在字符串的长度放在CXCX寄存器中。寄存器中。通过重复前缀来实现字符串操作。通过重复前缀来实现字符串操作。7/22/202
163、4137五种基本的字符串操作指令五种基本的字符串操作指令1)1)字符串传送指令字符串传送指令MOVSB/MOVSWMOVSB/MOVSW(Move StringMove String) (ESES:DIDI) (DSDS:SISI) (B/W)(B/W) 不影响标志位,然后修改不影响标志位,然后修改SISI和和DIDI,指向下一个元素。,指向下一个元素。 MOVSBMOVSB用于字节传送,用于字节传送,MOVSWMOVSW用于字传送。用于字传送。 例:例: MOV SIMOV SI,1000H 1000H ;源地址为;源地址为1000H1000H MOV DI MOV DI,2000H 200
164、0H ;目的地址为;目的地址为2000H2000H MOV CX MOV CX,100 100 ;字节数为;字节数为100100 AGAIN AGAIN: MOV ALMOV AL,SISI MOV DI MOV DI,ALAL INC SI INC SI INC DI INC DI DEC CX DEC CX JNZ AGAIN JNZ AGAIN 7/22/2024138 可简化为:可简化为: MOV SIMOV SI,1000H 1000H MOV DI MOV DI,2000H 2000H MOV CX MOV CX,100 100 CLD CLD AGAIN: MOVSB AGAIN
165、: MOVSB LOOP AGAIN LOOP AGAIN 再简化为:再简化为: MOV SIMOV SI,1000H 1000H MOV DI MOV DI,2000H 2000H MOV CX MOV CX,100 100 CLD CLD REP MOVSB REP MOVSB 7/22/20241397/22/2024140 2 2)取字符串指令)取字符串指令LODSB/LODSWLODSB/LODSW(Load StringLoad String) AL AL (DSDS:SISI) 字节操作字节操作 或或 AX AX (DSDS:SISI) 字操作字操作 不影响标志位,然后修改不影响
166、标志位,然后修改SISI,指向下一个元素。,指向下一个元素。 3 3)存字符串指令)存字符串指令STOSB/STOSWSTOSB/STOSW(Store StringStore String) (ESES:DIDI) AL AL 字节操作字节操作 (ESES:DIDI) AX AX 字操作字操作 不影响标志位,然后修改不影响标志位,然后修改DIDI,指向下一个元素。,指向下一个元素。 例:使例:使0404H开始的开始的256个单元清个单元清0。 CLD MOV DI, 0404H MOV CX,0080H XOR AX,AX REP STOSW7/22/2024141 4 4)字符串比较指令字
167、符串比较指令CMPSB/CMPSWCMPSB/CMPSW(CompareCompare String String) (DSDS:SISI)- -(ESES:DIDI) (B/WB/W) 根据比较的结果建立标志,但不改变操作数。然后根据比较的结果建立标志,但不改变操作数。然后 修改修改SISI和和DIDI,指向下一个元素。,指向下一个元素。 5 5)字符串扫描指令)字符串扫描指令SCASB/SCASWSCASB/SCASW(Scan StringScan String) AL-AL-(ESES:DIDI) 字节操作字节操作 AX-AX-(ESES:DIDI) 字操作字操作 根据比较的结果建立标
168、志,但不改变操作数。然后根据比较的结果建立标志,但不改变操作数。然后 修改修改DIDI,指向下一个元素。,指向下一个元素。7/22/2024142 字符串操作指令除了有上述五种功能外,还可以实现地字符串操作指令除了有上述五种功能外,还可以实现地址指针址指针SISI和和DIDI的自动修改,这对实现循环提供了方便,但每的自动修改,这对实现循环提供了方便,但每条字符串操作指令仍只能执行一次。只有加上重复前缀以条字符串操作指令仍只能执行一次。只有加上重复前缀以后,该字符串操作指令才能重复执行,直到某个条件满足为后,该字符串操作指令才能重复执行,直到某个条件满足为止。重复前缀有以下三种形式:止。重复前缀
169、有以下三种形式: REPREP REPE/REPZ REPE/REPZ REPNE/REPNZ REPNE/REPNZ。 REPREP是是REPEATREPEAT的缩写,的缩写,REPREP可添加在可添加在MOVSMOVS和和STOSSTOS之前,之前,即即REP MOVSREP MOVS和和REP STOSREP STOS,这时可无条件重复地执行,这时可无条件重复地执行CX-1CX-1,直到直到CX=0CX=0。 REPE/REPZREPE/REPZ添加在添加在CMPSCMPS和和SCASSCAS之前,要重复执行之前,要重复执行CMPSCMPS或或SCASSCAS,必须满足,必须满足CX0C
170、X0且且ZF=1ZF=1两个条件,每执行两个条件,每执行一次一次CXCX要减要减1 1。7/22/2024143 CX0 CX0和和ZF=1ZF=1这两个条件只要有一个不满足,则重这两个条件只要有一个不满足,则重复停止,字符串指令结束。复停止,字符串指令结束。 REPNE/REPNZREPNE/REPNZ也添加在也添加在CMPSCMPS和和SCASSCAS之前,当之前,当 CX0CX0且且ZF=0ZF=0时,重复执行时,重复执行CMPSCMPS或或SCASSCAS,每执行一次,每执行一次CXCX 减减1 1,CX0CX0和和ZF=0ZF=0这两个条件只要有一个不满足,则重这两个条件只要有一个不
171、满足,则重 复停止,字符串指令结束。复停止,字符串指令结束。 REPE/REPZREPE/REPZ和和REPNE/REPNZREPNE/REPNZ的用途是不同的:的用途是不同的: 如果已知两个数据块的内容基本上是相同的,若要如果已知两个数据块的内容基本上是相同的,若要 找出其中不同的地方,则应在找出其中不同的地方,则应在CMPSCMPS或或SCASSCAS指令前使用指令前使用 REPE/REPZREPE/REPZ前缀。前缀。 如果已知两个数据块的内容基本上是不同的,若要如果已知两个数据块的内容基本上是不同的,若要 找出其中相同的地方,则应在找出其中相同的地方,则应在CMPSCMPS或或SCAS
172、SCAS指令前使用指令前使用 REPNE/REPNZREPNE/REPNZ前缀。前缀。 字符串指令字符串指令LODSLODS是不加前缀的。是不加前缀的。7/22/2024144例:检验一段被传送过的数据是否与源字符串完全相同。例:检验一段被传送过的数据是否与源字符串完全相同。 CLD MOV CX,100 ;初始化;初始化 MOV SI,2400H MOV DI,1200H REPE CMPSB ;串比较,直到有一个数不相等或比较完;串比较,直到有一个数不相等或比较完 AND CX,0FFH JZ EQQ DEC SI MOV BX,SI ;第一个不相同字节偏移地址;第一个不相同字节偏移地址
173、BX MOV AL,SI ;第一个不相同字节内容;第一个不相同字节内容 AL JMP STP EQQ: MOV BX,0 ;两串完全相同,;两串完全相同,BX=0 STP: HLT 执行完上述程序,若两串相同,则执行完上述程序,若两串相同,则BX寄存器内容为零;若两串寄存器内容为零;若两串不同,则不同,则BX指向源串中第一个不相同字节的地址,该字节的内容保指向源串中第一个不相同字节的地址,该字节的内容保留在留在AL寄存器中。寄存器中。7/22/2024145例:在某字符串中查找是否存在例:在某字符串中查找是否存在“$”字符。若存在,则字符。若存在,则将将 “$”字符所在地址送入字符所在地址送入
174、BX寄存器,否则将寄存器,否则将BX寄存器寄存器 清零。清零。 CLD ; 清除方向标志清除方向标志DF MOV DI,0100H ;送目标串首元素偏移地;送目标串首元素偏移地 址址 MOV AL,$ ;关键字;关键字 AL REPNE SCASB ;找关键字;找关键字 AND CX,0FFH JZ ZER DEC DI MOV BX,DI ;关键字所在地址;关键字所在地址 BX JMP STP ZER: MOV BX,0 ;未找到,;未找到,0 BX STP: HLT7/22/2024146例:在字符串例:在字符串STRINGSTRING中查找字符中查找字符A A,若查找不到则,若查找不到则
175、 转向转向NOT FOUNDNOT FOUND。 CLDCLD MOV AX MOV AX,SEG STRINGSEG STRING MOV ES MOV ES,AXAX MOV DI MOV DI,OFFSET STRINGOFFSET STRING MOV CX MOV CX,LENGTH BUFDATLENGTH BUFDAT MOV AL MOV AL,A A REPNE SCASB REPNE SCASB JNE NOT FOUND JNE NOT FOUND 在此程序段中,指令在此程序段中,指令REPNE SCASBREPNE SCASB将重复地将将重复地将ALAL的内的内容与容与
176、DIDI所指的单元的内容相比较,并修正所指的单元的内容相比较,并修正DIDI和和CXCX的值,的值,直到直到CX=0CX=0或或ALAL的内容与的内容与DIDI所指的单元的内容相同所指的单元的内容相同(ZF=1ZF=1,表示找到字符,表示找到字符A A了)为止。了)为止。7/22/20241475. 5. 控制转移类指令控制转移类指令 使程序不再顺序执行,而转移到相应的目使程序不再顺序执行,而转移到相应的目的地址:的地址: . . .( (标号)标号)STARTSTART: . . . . . JMP START JMP START . .无条件地转移到所指的目的地址无条件地转移到所指的目的地
177、址7/22/2024148(1) 无条件转移指令无条件转移指令 1 1)JMPJMP指令指令 分段内转移和段间转移两种。分段内转移和段间转移两种。 段内转移:段内转移:CSCS不变,仅不变,仅IPIP变。变。 段间转移:段间转移:CSCS和和IPIP均变。均变。分直接转移和间接转移两种。分直接转移和间接转移两种。 直接转移:无条件地转移到所指示的目的地址。直接转移:无条件地转移到所指示的目的地址。 短程转移:短程转移:JMP SHORT STARTJMP SHORT START 近程转移:近程转移:JMP JMP (NEAR PTRNEAR PTR) STARTSTART 远程转移:远程转移:
178、JMP FAR PTR STARTJMP FAR PTR START 间接转移:由寄存器或存储器给出目的地址。间接转移:由寄存器或存储器给出目的地址。 段内间接转移:段内间接转移:JMP BXJMP BX,JMP WORD PTR JMP WORD PTR BXBX 段间间接转移:段间间接转移:JMP DWORD PTR BXJMP DWORD PTR BX7/22/2024149 短程转移短程转移 JMP SHORT STARTJMP SHORT START 转移到的标号地址与转移到的标号地址与JMP JMP 指令所处地址的距离应在指令所处地址的距离应在 -128-+127-128-+127
179、范围内。(范围内。(1 1个字节的位移,个字节的位移,8 8位)位) 近程转移近程转移 JMP JMP (NEAR PTRNEAR PTR) STARTSTART 转移到的目的地址与转移到的目的地址与JMP JMP 指令应处于同一地址段范围指令应处于同一地址段范围 内。(内。(1 1个字的位移,个字的位移,1616位)位) 远程转移远程转移 JMP FAR PTR STARTJMP FAR PTR START 是段间转移,转移到的目的地址与是段间转移,转移到的目的地址与JMP JMP 指令所在地址指令所在地址 不在同一段内。执行时不在同一段内。执行时CSCS和和IPIP内容均发生变化。内容均发
180、生变化。 段内间接转移(寄存器寻址)段内间接转移(寄存器寻址) 指令中给出寄存器名,该寄存器的内容即转移的目指令中给出寄存器名,该寄存器的内容即转移的目 的地址。例:的地址。例:JMP BXJMP BX BX BX的内容送入的内容送入IPIP,而,而CSCS值不变。值不变。 用用AXAX、CXCX、DXDX、SPSP、BPBP、SISI、DIDI均可,用均可,用BXBX较多。较多。7/22/2024150 段内间接转移(存储器寻址)段内间接转移(存储器寻址) 例:例:JMP BXJMP BX 指令中给出的指令中给出的BXBX的内容假定为的内容假定为4000H4000H,它不是要转移,它不是要转
181、移去的目的地址,而是内存储器单元的有效地址去的目的地址,而是内存储器单元的有效地址EAEA,与段,与段地址一起构成物理地址,该物理地址所指的内存单元的地址一起构成物理地址,该物理地址所指的内存单元的内容才是转移去的目的地址。内容才是转移去的目的地址。 例:例:JMP WORD PTR BXJMP WORD PTR BX 如果如果 BX=4000HBX=4000H, DS=2000HDS=2000H,产生物理地址,产生物理地址 24000H24000H, 则则24000H24000H单元的内容送入单元的内容送入IPIP的低的低8 8位,位, 24001H24001H单元的内容送入单元的内容送入I
182、PIP的高的高8 8位,位, IPIP的的1616位内容才是要转移去的地址。位内容才是要转移去的地址。7/22/2024151 段间间接转移段间间接转移(存储器寻址)(存储器寻址) 例:例:JMP DWORD PTR BXJMP DWORD PTR BX 如果如果 BX=4000HBX=4000H, DS=2000HDS=2000H,产生物理地址,产生物理地址24000H24000H, 则则24000H24000H单元的内容送入单元的内容送入IPIP的低的低8 8位,位, 24001H24001H单元的内容送入单元的内容送入IPIP的高的高8 8位,位, 24002H24002H单元的内容送入
183、单元的内容送入CSCS的低的低8 8位,位, 24003H24003H单元的内容送入单元的内容送入CSCS的高的高8 8位,位, CSCS和和IPIP的内容是要转移去的地址。的内容是要转移去的地址。 中的寄存器可以是中的寄存器可以是BXBX、BPBP、DIDI、SISI,也可以是任,也可以是任 一寄存器加上位移量,也可用变量加上寄存器来表示。一寄存器加上位移量,也可用变量加上寄存器来表示。 如:如:JMP DISPBX JMP DISPBX 即即JMP BX+DISPJMP BX+DISP7/22/2024152 2 2)CALLCALL指令(调用过程、子程序)指令(调用过程、子程序) 格式与
184、格式与JMPJMP类似,但调用完后要回到原程序(断点处)。类似,但调用完后要回到原程序(断点处)。 断点要保存,即将断点要保存,即将CALLCALL指令的下一条指令的指令的下一条指令的CSCS及及IPIP进堆栈进堆栈 保存,以供返回时用(若段内调用,只需保存保存,以供返回时用(若段内调用,只需保存IPIP) 3 3)RET RET 指令指令 (从过程、子程序返回)(从过程、子程序返回) 功能:一个过程(子程序)执行完后,控制程序返回到功能:一个过程(子程序)执行完后,控制程序返回到 主程序的断点处(主程序的断点处(CALLCALL指令的下一条指令处)继续往下执指令的下一条指令处)继续往下执 行
185、,即当行,即当RETRET指令执行后,主程序的断点地址已送入指令执行后,主程序的断点地址已送入IPIP和和 CSCS中,而堆栈已恢复到调用前的状态。中,而堆栈已恢复到调用前的状态。 段内返回指令:段内返回指令:RETRET 段间返回指令:段间返回指令:RETFRETF7/22/2024153(2) 条件转移指令条件转移指令 根据标志寄存器中各标志位根据标志寄存器中各标志位CFCF、ZFZF、SFSF、PFPF和和OFOF的状的状态,决定程序是否转移,每条指令的测试条件如表所态,决定程序是否转移,每条指令的测试条件如表所示。若满足条件,则转移到所规定的目标;若条件不示。若满足条件,则转移到所规定
186、的目标;若条件不满足,则继续顺序执行。所有的条件转移指令满足,则继续顺序执行。所有的条件转移指令全全都是都是段内转移,且为短跳转,即目的地址必须在当前段内,段内转移,且为短跳转,即目的地址必须在当前段内,并以当前的并以当前的IPIP内容为基准,其位移必须在内容为基准,其位移必须在-128-128+127+127范围内,不象范围内,不象JMPJMP指令可以转移到内存的任何一个位置指令可以转移到内存的任何一个位置上。若要求转移范围超出上。若要求转移范围超出-128-128+127+127个字节时,需将个字节时,需将条件转移指令与无条件转移指令结合起来使用。条件转移指令与无条件转移指令结合起来使用。
187、见表见表7-47-47/22/20241547/22/2024155(3) (3) 循环控制指令循环控制指令 用来管理软件循环的重复过程,以用来管理软件循环的重复过程,以CXCX寄存器作寄存器作 为计数器,先判断为计数器,先判断CX-1CX-1是否为是否为0 0,不为,不为0 0时转移到目时转移到目 标地址,其目标地址以标地址,其目标地址以“标号标号”表示,都是段内转表示,都是段内转 移中的短跳转,即目标地址与当前地址的距离为移中的短跳转,即目标地址与当前地址的距离为 -128-128+127+127字节。字节。 1 1) LOOPLOOP指令指令 格式:格式:LOOP destLOOP de
188、st 式中,式中,dest dest 为程序转移的目标地址。为程序转移的目标地址。 功能:功能:CX CX-1CX CX-1 若若CXCX不等于不等于0 0,则转到,则转到destdest所指的指令;所指的指令; 若若CX=0CX=0,则顺序执行下一条指令。,则顺序执行下一条指令。 注意:不影响标志位。注意:不影响标志位。 可以看作如下两条指令的组合:可以看作如下两条指令的组合: DEC CXDEC CX JNZ dest JNZ dest 7/22/2024156 2 2)LOOPE/LOOPZ LOOPE/LOOPZ 指令指令 格式:格式:LOOPE dest / LOOPZ destLO
189、OPE dest / LOOPZ dest 功能:功能:CX CX-1CX CX-1 若若CXCX不等于不等于0 0,且,且ZF=1ZF=1,则转到,则转到destdest所指的指令;所指的指令; 若若CX=0CX=0,或,或ZF=0ZF=0,则顺序执行下一条指令。,则顺序执行下一条指令。 注意:不影响标志位。注意:不影响标志位。 3 3)LOOPNE/LOOPNZ LOOPNE/LOOPNZ 指令指令 格式:格式:LOOPNE dest / LOOPNZ destLOOPNE dest / LOOPNZ dest 功能:功能:CX CX-1CX CX-1 若若CXCX不等于不等于0 0,且,
190、且ZF=0ZF=0,则转到,则转到destdest所指的指令;所指的指令; 若若CX=0CX=0,或,或ZF=1ZF=1,则顺序执行下一条指令。,则顺序执行下一条指令。 注意:不影响标志位。注意:不影响标志位。 4 4)JCXZJCXZ指令指令 格式:格式:JCXZ destJCXZ dest 功能:若功能:若CX=0CX=0,则转移到,则转移到destdest所指的指令;所指的指令; 若若CXCX不等于不等于0 0,则顺序执行下一条指令。,则顺序执行下一条指令。 此指令不对此指令不对CXCX寄存器的内容进行操作,只是根据寄存器的内容进行操作,只是根据CXCX的内容进的内容进 行判断。行判断。
191、7/22/2024157(4(4)中断指令及中断返回指令)中断指令及中断返回指令 1) 1) 中断指令中断指令INTINT 中断指令的格式为INT n,式中n为中断类型号。当程序执行到该指令时,便中断当前程序的执行,使CPU转到一个中断服务程序。此时,首先将标志寄存器的一个字压入堆栈,并且清除标志位IF和TF,清除IF的目的是使进入中断服务程序的过程不被外面的其它中断所打断,清除TF是避免进入中断服务程序后按单步执行;接着,CPU将主程序断点下一条指令的段地址CS压入堆栈,偏移地址IP压入堆栈,这样就完整地保护了中断点的状态,以便返回。保护好断点之后,就转向中断向量地址。从n4和n4+1地址中
192、取一个字放入IP;再从n4+2和n4+3地址中取一个字放入CS。此后就从该中断起始地址开始执行中断服务程序。 2)2)中断返回指令中断返回指令IRETIRET 中断服务程序结束时,要执行一条中断返回指令IRET,才可返回原程序。在执行IRET指令时,将从堆栈中先后取出刚才压入的CS、IP和标志寄存器的内容,并恢复到相应的寄存器中。这样就又可以从原中断点开始执行了。 3) 3) 溢出中断指令溢出中断指令INTOINTO 当溢出标志位OF=1时,便进入溢出中断处理程序。其中断处理过程和INT指令的过程相同。7/22/20241586. 处理器控制类指令处理器控制类指令(1)标志位操作指令)标志位操
193、作指令 STC 指令指令 CF 置置1,不影响其它标志位,不影响其它标志位 CLC 指令指令 CF 清清0,不影响其它标志位,不影响其它标志位 CMC 指令指令 CF取反,不影响其它标志位取反,不影响其它标志位 STD 指令指令 DF 置置1,不影响其它标志位,不影响其它标志位 CLD 指令指令 DF 清清0,不影响其它标志位,不影响其它标志位 STI 指令指令 IF 置置1,不影响其它标志位,不影响其它标志位 CLI 指令指令 IF 清清0,不影响其它标志位,不影响其它标志位7/22/2024159(2)处理器暂停指令)处理器暂停指令 HLT 使CPU进入暂停状态,直到有复位(RESET)信
194、号 或外部中断请求时,退出暂停状态。(3)处理器脱离指令)处理器脱离指令 ESC ESC指令也称为交权指令,8086工作于最大模式 时,CPU要调用协处理器工作。协处理器在系统加电 工作以后,会不断检测8086是否需要自己协助工 作,当发现有ESC指令时,便马上响应。可见ESC指 令是CPU调用协处理器工作的联络手段。(4)处理器等待指令)处理器等待指令 WAIT 执行WAIT指令时,CPU每隔5个时钟周期 测试一 次TEST引脚,若为高电平,CPU处于等待状态;若 为低电平,CPU退出等待状态,而顺序执行下一条 指令。不影响标志位。7/22/2024160(5 5)总线封锁指令)总线封锁指令
195、 LOCK LOCK LOCK指令实际上不是一条独立的指令,它常用作指 令前缀加在其它指令的前面。带有LOCK前缀的指令, 在执行过程中禁止其它协处理器使用总线。LOCK指 令不影响任何标志。(6 6)空操作指令)空操作指令 NOPNOP NOP是一条空操作指令,CPU执行NOP指令时,不做 任何具体的功能操作,也不影响标志位,仅占用三 个时钟周期的时间,故称为空操作指令。NOP指令 常用于程序调试时插在其它指令之间用以延时。7/22/2024161第三节第三节 汇编语言程序汇编语言程序7/22/2024162一一. 基基 本本 概概 念念1. 1. 汇编语言中语句的组成汇编语言中语句的组成
196、汇编语言程序是由一条条语句组成的,语句则由名名称、操作码、操作数和注释称、操作码、操作数和注释四部分组成。如下所示: 名称 空格或冒号(:) 操作助记符 空格 操作数;注释 例如: BEGIN:ADD AX,1234H DATA1 DB 11H,22H,33H,44H,55H 现将各部分简要说明如下: 名称名称: : 语句中的名称是一个标识符,可由字母(A,B,C,Z;a,b, c, ,z )、数字(0, 1,2,,9)及特殊符号(?,$)等组成,但 名称必须由字母开头,数字不能用作第一个字符。构 成名称的字符总数最多可有31个,若超过31个,则31 个以后的字符无效。7/22/2024163
197、并不是所有的语句都要有名称,但若语句带有名称,那么名称表示的是它后面各项在内存储器存放的第一个单元的地址(包括该名称所在段的段地址和段内的偏移地址)。名称与操作码之间的分隔可以是空格,也可以是冒号。当以冒号分隔时,该名称代表一个标号;当以空格分隔时,该名称可能是标号,也可能是变量。上面两例中的BEGIN是标号,DATA1是变量。操作助记符操作助记符: : 操作助记符指出该语句的基本操作功能,也称为操作码。每条语句都必须有操作码,操作码是汇编语言中规定了明确含义的一组符号,不能随意使用。例如上面例子中的ADD是加法的操作码,DB则是定义字节变量的伪指令助记符。7/22/2024164操作数操作数
198、: : 操作数不是每条语句所必须的。若语句为指令,可以没有操作数,也可以有12个操作数。如上例中的第一条语句,有2个操作数。若语句为伪指令,则可以有多个操作数。如上例中的第二条语句,有4个操作数。当语句中有2个以上的操作数时,操作数之间应用逗号“,”分开,而操作数与操作码之间必须以空格分开。注释注释: : 注释仅用作语句或程序段的说明,它不是程序的可执行部分,汇编时不形成任何目标码,注释必须以分号“;”开头,它可以作为语句的一部分,也可以作为一个单独的语句。7/22/20241652. 2. 汇编语言中语句的常数与表达式汇编语言中语句的常数与表达式 (1 1)常数)常数 常数可以分为数值常数和
199、字符串常数两类。数值常 数有二进制数、八进制数、十进制数和十六进制数 等几种不同的表示形式。字符串常数则是由单引 “”括起来的一串字符,引号内不论是字母还是数 字,表示的均为其ASCII码。8086汇编语言中的数值 常数的第一位必须是数字,否则汇编时将被看成是标 识符。例如十六进制数FFFFH应表示成0FFFFH。 (2 2)表达式)表达式 表达式由操作数和操作符组成,在汇编时一个表达 式得到一个值。操作数可以是常数或标识符,也可 以是子表达式。操作符可以分为算术操作符、逻辑算术操作符、逻辑 操作符、关系操作符、属性操作符操作符、关系操作符、属性操作符等。7/22/2024166 算术操作符算
200、术操作符主要有:+、-、*、/、MOD。 这些算术操作符都对两个数据进行运算,得到 的结果也是数据。MOD是取模运算,即取两数相除 的余数,该两数的值必须为正整数。例如: 20 MOD 7 ; 结果为6 0B5H MOD 10H ; 结果为5 逻辑操作符逻辑操作符有:AND(逻辑与)、OR(逻辑或)、 NOT(逻辑非)、XOR(逻辑异或)。 逻辑操作符只能对常数进行运算,得到的结果 也是常数。例如: NOT FFH =00H 77H AND 84H =04H 上述四个逻辑操作符同时也是8086指令中的 操作助记符,也就是说,AND、OR、NOT和XOR既可 用作8086的操作助记符,又可用作汇
201、编语言的逻 辑操作符,但两者不会造成混淆。因为操作助记 符是在程序执行时进行运算的,逻辑操作符则是 在汇编过程中进行运算的。7/22/2024167 例如:AND AL,0CH OR 0FH 其中AND是指令的操作助记符, 而OR是逻辑逻辑操作符。 关系操作符关系操作符有:EQ(相等)、NE(不等)、LT (小于)、GT(大于)、LE(小于或等于)、GT (大于或等于)。 参与关系运算的两个操作数必须都是数据。 当关系成立时,其结果全为1; 当关系不成立时,其结果全为0。 例如指令MOV AL,COUNT LT 20,其中COUNT LT 20为表达式,其中LT为关系操作符“小 于”,假定CO
202、UNT已定义为10,由于1020,即 表达式是成立的,汇编时将该表达式汇编成0FFH (即“真”,TRUE, 全“1”),该指令按MOV AL,0FFH汇编成机器码供程序运行。7/22/2024168 若指令为MOV AL,COUNT GT 20,其中GT为关 系操作符“大于”, 假定COUNT仍为10,表 达式是不成立的,汇编时将该表达式汇编成 00H(即“假”,FALSE, 全“0”)。 表达式不能构成单独的语句,只能是语句的一部分, 例如: MOV AX,BUF+2 ADD AL,VAL AND 0FH JMP AGAIN+3 MOV BL,VB LE VA 上面几句语句中都含有表达式,
203、表达式中的标识符可以是变量名也可以是标号,语句中表达式的求值不是在执行指令时完成的,而是在对源程序进行汇编时完成的。7/22/20241693. 3. 标号、变量及伪指令标号、变量及伪指令 标号是由标识符表示的指令的名称。用以指示对应 指令的地址。 标号有三个属性:段地址、偏移地址和类型段地址、偏移地址和类型。标号的段地址和偏移地址属性是指该标号对应的指令所在段的段地址和段内的偏移地址。标号的类型属性有两种:NEAR和FAR。标号定义成NEAR类型时,表示该标号在段内使用;而定义成FAR类型则表示该标号可以在段间使用。标号的基本定义方法是在指令的操作码前加上标识符和冒号,该标识符就是我们所要定
204、义的标号。 例如: START:PUSH DS 这里,START为一标号,它代表了指令PUSH的地址,标号可以作为程序转移指令要转向的地址。 7/22/2024170汇编语言中的变量是通过伪指令定义的,伪指令的格式如下: 变量名 DB 表达式; 定义字节变量 变量名 DW 表达式; 定义字变量 变量名 DD 表达式; 定义双字变量 变量名 DQ 表达式; 定义长字变量 变量名 DT 表达式; 定义一个十字节的变量 变量名是是一个标识符,其定义与上面指出的语句中的名称一样,但变量名后面不能加冒号,只能用空格。变量的类型与伪指令DB、DW、DD、DQ、DT有关,它们分别定义了单字节变量(或称字节变
205、量)、双字节变量(或称字变量)、4字节变量(或称双字变量)、8字节变量(或称长字变量)和10字节变量。7/22/2024171变量具有下列属性:变量具有下列属性: (1) (1) 段地址(段地址(SEGSEG):):变量所在段的段地址。 (2) (2) 偏移地址(偏移地址(OFFSETOFFSET):):变量所在段的偏移地址。 (3) (3) 类型(类型(TYPETYPE):):变量的类型是所定义的每个变量 所占据的字节数,对于DB、DW、DD、DQ和DT所定 义的变量,其类型分别为1、2、4、8和10。 (4) (4) 长度(长度(LENGTHLENGTH):):变量定义语句中,所定义变量
206、的个数。 (5) (5) 大小(大小(SIZESIZE):):变量定义语句中,分配给同一变 量名的所有变量的总的字节数。 综上所述,对于汇编程序来说,标号和变量是类似的,都代表存储单元的符号地址,只是标号对应的存储单元存放的是指令,而变量对应的存储单元存放的是数据。7/22/20241724. 4. 属性操作符属性操作符 前面介绍的算术操作符、逻辑操作符和关系操作 符的操作对象都是数字数据。下面介绍用来获取属性 或重新某种属性的操作符及其相应的表达式。 (1) (1) 获取属性的操作符获取属性的操作符 标号和变量一旦定义,它们都具有相应的属性, 获取属性的操作符及其表达式如下: SEGSEG
207、SEG 变量名或标号 取出变量名或标号所 在段的段地址 OFFSET OFFSET OFFSET 变量名或标号 取出变量名或 标号所在段的偏移地址 TYPE TYPE TYPE 变量名或标号 取出变量名或标 号的类型 LENGTHLENGTH LENGTH 变量名 取出变量的长度 SIZESIZE SIZE 变量名 取出变量的大小 这些表达式与前述运算表达式一样,不能构成单独的语句,只能是语句的一个成份,表达式的求值也 是在汇编过程中完成的。7/22/2024173 (2) PTR (2) PTR操作符操作符 格式:类型格式:类型 PTR PTR 表达式表达式 格式中的类型可以是:BYTE、W
208、ORD、DWORD、 NEAR和FAR。其中BYTE、WORD和DWORD是变量类型, NEAR和FAR是标号类型。格式中的表达式可以是变 量名、标号或其它地址表达式。 PTR操作符的功能是用来重新定义已定义的变量 和标号的类型。假设变量DAT1是字变量,若程序中 需将它作为字节变量使用时,必须用PTR操作来重 新定义其类型,即BYTE PTR DAT1,于是将DAT1重 新定义为字节类型。当然这仅在该语句中作为字节 变量使用,DAT1原来定义的字变量类型并没有修 改。7/22/20241745. 80865. 8086源程序的完整结构及伪指令源程序的完整结构及伪指令 8086/8088的地址
209、空间是分段结构的,程序中出现 的数据、代码及用到的堆栈都必须纳入某个段中。那 么,怎么说明汇编语言源程序中哪些内容属于数据 段,哪些内容属于代码段呢?这是由汇编系统中提供 的伪指令来实现的。下面先介绍构成完整程序的有关 伪指令。 (1) 段定义伪指令SEGMENT和ENDS 格式:段名 SEGMENT 定位类型组合类型类别 指令语句或伪指令语句 段名 ENDS 段名:段名是所定义的段的名称,其构成规则与语句中的名称是一样的。段名除了有段地址和偏移地址的属性以外,还有定位类型、 组合类型和类别三个属性。方括号表示这三项是可以省略的。格式中SEGMENT到ENDS之间的省略部分是该段的具体内容。7
210、/22/2024175 定位类型:表示该段的起始边界要求。其类型有PAGE、PARA、WORD和BYTE四种。这四种类型的边界地址的要求如下: PAGE = 0 0 0 0 0 0 0 0 PARA = 0 0 0 0 WORD = 0 BYTE = 即它们的边界地址(20位地址)分别可以被256、16、2、1除尽,分别称为以页、节、字、字节为边界。如果是BYTE型,表示段起始地址可位于任何地方;如果是WORD型,表示段起始地址必须位于偶地址。 当定位类型不写时,隐含值为PARA。 7/22/2024176 组合类型:表示段与段之间的连接,有以下六种选择: ()PUBLIC:段连接时将与其它同
211、名段依次相连, 其连接次序由连接程序确定。 ()COMMON:段连接时将与其它同名段有相同的段 地址,即共享相同的存储区,亦即各段会产生 覆盖,可节省内存容量。 ()AT 表达式:表示段的起始地址可定位于表达式 所示的“节”边界上。 ()STACK:仅用于堆栈段,使同名段都连接成一个 连续段,且系统自动对SS和SP初始化。 ()MEMORY:表明连接时应把本段装在被连接的其 它所有段之上(地址高端),如果有多个段选 择MEMORY,只汇编程序遇到的第一个段才认为 是MEMORY段,而其它段则当成COMMON段。 ()NONE:表示本段与其它段没有连接关系,各段 都有自己的段地址。当组合类型不写
212、时,隐含 值为NONE。7/22/2024177类别:类别必须用单引号括起来。在定位时,连接程序将不同模块中具有相同类别的各段集中在一起,形成一个统一的物理段。段定义以SEGMENT伪指令开头,以ENDS伪指令结束。在同一段定义中,SEGMENT与ENDS前的段名必须一致。同一个程序中有堆栈段、数据段和代码段,有时还有附加段。这些段是通过多次段定义实现 的。一个源程序中典型的段结构可以为: DATA SEGMENT 定义数据段 DATA ENDS STACK SEGMENT 定义堆栈段 STACK ENDS 7/22/2024178 DATA1 SEGMENT 定义附加段 DATA1 ENDS
213、 CODE SEGMENT 定义代码段 CODE ENDS7/22/2024179(2)设定段寄存器伪指令ASSUME 格式:ASSUME 段寄存器:名称,段寄存器:名称, 格式中的段寄存器可以为CS、DS、ES及SS,方括号中的内 容可以省略,所以ASSUME伪指令既可以同时说明四个段寄 存器,也可以只说明一个或两个段寄存器。如: ASSUME CS:CODE,DS:DATA ASSUME伪指令是使源程序中的段与段寄存器发生联系。 它告诉汇编程序各个段寄存器当前存放的是哪个段的段地 址,代码段的段地址存放于CS寄存器中,数据段的段地址 存放于DS寄存器中,堆栈段的段地址存放于SS寄存器中,
214、这是因为,汇编程序在汇编源程序的每一条指令时需要这 一点。当各段的段地址都按隐含的关系存入相应的段寄存 器后,汇编程序将按段地址正常隐含的关系将该指令汇编 成机器码。 7/22/2024180 由于ASSUME伪指令只是指明某一段地址应该存放于哪一个段寄存器中,并没有包含将段地址送入该段寄存器的操作,因此要将真实的段地址装入段寄存器,还需用汇编指令来实现,这一步决不可少。即: MOV AX,DATA MOV DS,AX 上式中DATA是段名,将数据段的段地址经AX送入段寄存器DS。DOS的装入程序在装入执行时,将把CS初始化为正确的代码段段地址,把SS初始化为正确的堆栈段段地址,因此用户在源程
215、序中不必再设置。但是在装入程序中DS寄存器被用作其它用途,因此必须用上述两条指令对DS初始化,以装入用户的数据段地址。如使用附加段,也要用MOV指令给ES赋予段地址。 7/22/2024181(3) 定义过程的伪指令PROC和ENDP 在程序设计中,可将具有一定功能的程序段看作一个过程(相当于一个子程序)。它可以被别的程序调用(用CALL指令),或由JMP指令转移到此;也可以作为中断处理程序,在中断响应后转此执行。过程是由伪指令PROC和ENDP来定义的,其格式为: 过程名 PROC 类型 RET 过程名 ENDP 格式中的过程名是为过程所起的名称,不能省略。过程的类型有NEAR和FAR两种,
216、使用NEAR表示近过程,即段内调用;使用FAR表示远过程,即段间调用;如果过程缺省类型,则该过程就默认为近过程。RET是返回指令,ENDP表示过程结束。过程可以嵌套,即一个过程可以调用另一个过程。过程也可以递归使用,即过程可以调用过程本身。7/22/2024182 (4)汇编结束伪指令END 格式:END 表达式 END伪指令标志整个源程序的结束。它告诉汇编程序,源程序汇编到此结束。所以,每条单独汇编的源程序的结尾必须有END伪指令。格式中的表达式是该程序运行时的启动地址,它通常是一条可执行语句的标号。 (5) ORG 伪指令 格式:ORG 表达式 格式中的表达式的值是一个二字节的无符号数。伪
217、指令ORG用来规定目标程序存放单元的偏移地址。比如,如果在源程序的第一条指令前用了伪指令ORG 200H,这表示汇编程序将把指令指针IP的值置成200H,即目标程序的第一个字节放在200H处,后面的内容顺序存放,除非遇上了另一个ORG语句。这样在对程序进行调试时有利于跟踪。7/22/2024183二二. 8086. 8086汇编语言程序设计汇编语言程序设计1. 1. 顺序程序顺序程序 顺序程序是最简单的一种程序结构,程序是按指令的 排列顺序执行的。 例例7-17-1 写出计算y=a*b+c-18的程序。题中a、b、c分 别为三个带符号的8位二进制数。 程序中的数据(如题中的a、b、c、18以及
218、结果y)应存放于数据段,通常是以变量定义的方式开辟内存空间。应考虑在程序中采用何种寻址方式取出数据。如运算过程中产生的中间结果不多,中间结果可存放于寄存器内,如本例所示;产生的中间结果较多时,可以分配内存单元作为工作单元,这些工作单元也可设在数据段中;中间结果也可用堆栈来保存。7/22/2024184程序如下(假定a、b、c的数值分别为34H、56H、E7H):DATA SEGMENT DAT1 DB 34HDAT2 DB 56HDAT3 DB 0E7HCC EQU 18DATY DW ?DATA ENDSSTACK SEGMENT STACK DW 256 DUP(?)STACK ENDSC
219、ODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AL,DAT1 ;从数据段取数据a 7/22/2024185 MOV BL,DAT2 ;从数据段取数据b IMUL BL ;完成a*b运算,结果在AX中 MOV BX,AX ;为了下一步运算,将a*b的 结果暂存于BX MOV AL,DAT3 ;从数据段取数据c CBW ;c是8位数据,必须扩展成16 位,才能与16位的a*b相加 ADD AX,BX ;完成a*b+c运算 SUB AX,CC ;完成a*b+c-18运算 MOV DATY,AX
220、;将结果存入字变量DATY 对应的内存单元中 MOV AH,4CH ;返回DOS操作系统 INT 21H CODE ENDS END START7/22/2024186 注意上面程序中指令MOV AX,DATA和MOV AL,DAT1在寻址方式上的区别。式中DATA是段名,DAT1是变量名。MOV AX,DATA是立即寻址方式,它是将DATA段的段地址送入AX;而MOV AL,DAT1是直接寻址,是将以DAT1的内容为偏移地址的内存单元的内容送入AL中。 指令INT 21H 是系统功能调用指令,当调用前AH的内容为4CH时,该指令即完成返回DOS操 作系统的功能。7/22/2024187例例7
221、-27-2:内存中变量TABLESQ开始的16个单元连续存放着0到15的平方值,任给一数x(0至15间)在XX单元中,要求查表求出其平方值,将结果存入YY单元中。 首先在数据段中建立平方表,然后用程序找到x2在平方表中的位置,即计算表地址,这里,表地址=表起始地址+ x。这种方法可以提高运算速度,但存放表格需占用内存空间。 程序如下: DATA SEGMENT TABLESQ DB 0,1,4,9,16,25,36,49,64,81,100,121, 144,169,196,225 XX DB ? YY DB ? DATA ENDS STACK SEGMENT STACK DB 50 DUP(
222、?) STACK ENDS7/22/2024188 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLESQ ;取平方表的 起始偏移地址 MOV AH,0 MOV AL,XX ;取已知数x ADD BX,AX ;计算表地址 MOV AL,BX ;从表中得到x的平方数 MOV YY,AL ;存结果 MOV AH,4CH INT 21H CODE ENDS END START7/22/2024189例例7-37-3:编写一个程序,求某数N的整数平方根值,N的取值范围
223、为1125。本题仍然采用查表法,先把1125各数的整数平方根值算好,如书上表7-7所示. 然后将这组平方根值依次存入内存的连续区域,若其 首地址为SQUL,当程序中要求某数N的平方根时,可以通过式ADR=SQTL+N-11算出存放该数平方根值的偏移地址ADR,从ADR对应单元中取得N的平方根值。这样,计算N的平方根便转化为根据N计算地址的问题。 程序如下: DATA1 SEGMENT NUM DW 0CH SQU DB ? DATA1 ENDS DATA2 SEGMENT SQTL DB 03,04,04,04,04,04,04,04,04, 05,05,05,05,05,05,05 DATA
224、2 ENDS7/22/2024190 CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX LEA SI,NUM ;取数N的偏移地址 MOV BX,SI ;用寄存器间接寻址 的方式取数N MOV AL,SQTLBX-11 ;从SQTL中取N的 平方根 MOV SI+2,AL ;存结果 MOV AH,4CH INT 21H CODE ENDS END START 7/22/2024191 程序中采用了两个数据段DATA1和DATA2,DATA1中存放的是
225、要求平方根的某数N及结果数据,DATA2中存放的是1125的平方根表,DATA2也称为附加段。在代码段中,由伪指令ASSUME指出DATA1的段地址在DS中,DATA2的段地址在ES中,当程序执行到MOV AL,SQTLBX-11时,其段地址将取ES的内容,而不是DS的内容,这是因为在汇编时形成的机器码中已有段前缀字节加以说明,而这一点正是由于伪指令ASSUME告诉了汇编程序,变量SQTL的段地址在ES中。 指令MOV AL,SQTLBX-11采用的是寄存器相对寻址,SQTL的偏移地址就是相对值,所求平方根的偏移地址EA=BX-11+OFFSET SQTL。7/22/2024192例例7-47
226、-4:把分离式BCD数转换为组合式BCD数,被转换数0109H存放在DAT1中,转换后的数存回DAT1单元。 程序段如下: DAT1 DW 0109H MOV AX,DAT1 ;取被转换数0109H MOV CL,4 ;设置移位次数 SAL AH,CL ;执行后AH=10H ROL AX,CL ;执行后AX=0091H ROL AL,CL ;执行后AL=19H MOV BYTE PTR DAT1,AL ;将转换结果存回 DAT1单元。 7/22/20241932.2.分支程序分支程序 例例7-57-5:有一函数: 1, 当x0 y = 0, 当x=0 -1, 当xEDIT .ASM注:其中XX
227、X是要进行编辑的源程序名,第一次生 成时可任取。 键入的英文字母大、小写均可。 若不输入程序名(即C:EDIT ),在进入 EDIT后屏幕会提示输入程序名。 常用操作见补充教材p.68开始。7/22/2024270用用MASMMASM命令建立命令建立.OBJ.OBJ文件文件在屏幕上能生成的文件有三个,逐项进行询问和回答: Object filename.OBJ: Source ListingNul.LST: Cross-referenceNul.CRF: 第一项 询问生成的目标程序文件名(这是一定要的),若目标程序文件名仍为(即与源程序同名),则在该项冒号后按“回车”键即可,若目标程序文件名改
228、为YYY,则在该项冒号后键入新名YYY,再按“回车”键即可。7/22/2024271 第二项 询问是否需要生成源程序清单和符号表文件。这里的源程序清单除全部源程序外还有各语句行的行号、段内偏移量和相应指令的机器码。符号表则列出了段名、符号名和它们的属性。若需要生成此文件,就在该项冒号后键入文件名(可与源程序同名为,亦可另起新名YYY),然后再按“回车”键即可。若不需要生成此文件,则可直接按“回车”键。 第三项 询问是否需要生成.CRF文件(交叉索引文件),若需要就在该项冒号后键入文件名(可与源程序同名为,亦可为新名YYY),再按“回车”键即可。若不需要就在该项冒号后按“回车”键。(注:对一般程
229、序来说,.CRF文件是不需要的)7/22/2024272 以上三项询问回答结束后,就可对源程序进行汇编。当MASM发现源程序有错(语法错误),就在屏幕上显示所有出错行的行号及错误性质,并列出错误的性质(分为警告性错误和严重错误两种),当存在严重错误时,MASM无法对源程序进行汇编,这就需要重新从EDIT开始修改源程序,然后再用MASM进行汇编,如此反复进行,直到没有错误,才算汇编通过,生成了目标程序文件。7/22/2024273用用LINKLINK命令产生命令产生.EXE.EXE文件文件 由于目标文件用的是浮动地址,它不能直接上机执行,并且它往往要用到机器中的库函数,所以就需要用LINK程序来
230、进行链接并生成执行文件.EXE和列表文件.MAP。C:LINK (注意:无需扩展名) 在屏幕上需询问回答的共有三项: Run File .EXE: List File Nul.MAP: Libraries .LIB: 第一项 询问生成的执行程序文件名(这是一定要的),若执行程序文件名仍为,则在该项冒号后按“回车”键,若要改名为YYY,则在该项冒号后键入新名YYY,再按“回车”键。7/22/2024274 第二项 询问是否需要生成列表文件(列表文件MAP给出每个段在存储器中的分配情况,即首址、末址和长度)。若需要就在该项冒号后键入文件名(可与源程序同名为,亦可另起新名YYY),然后再按“回车”键
231、。若不需要生成此列表文件,则在该项冒号后按“回车”键。 第三项 询问程序中需用到的库文件情况,若需要就在该项冒号后键入需用到的库文件名,再按“回车”键。若不需要就在该项冒号后按“回车”键。 从LINK过程的提示信息中,可看到最后给出一个“无堆栈段”的警告性错误,这并不影响程序的执行,从而无需修正。当然,如果源程序中设置了堆栈段,则无此提示信息。7/22/2024275程序的执行程序的执行 C: 7/22/2024276 大部分程序必须经过调试才能纠正程序设计中的错误,从而得到正确的结果。所谓调试阶段,就是用调试程序(DEBUG程序)发现错误,再经过EDITMASMLINKDEBUG,反复进行,
232、直到调试通过。7/22/2024277用用DEBUG程序进行调试程序进行调试C:DEBUG .EXE 在屏幕的下一行行首显示提示符“-”,表示已进入调试程序,接着就可用DEBUG的各种命令来进行调试。7/22/2024278常用调试命令的格式和功能常用调试命令的格式和功能(1)显示和修改寄存器内容: R 显示所有寄存器的内容及各标志位 的状态,见p.72表。 R reg 显示单个寄存器的内容,可修 改。 示例: -R AX -RF 显示标志寄存器的内容,可修改。7/22/2024279(2)反汇编被调试的程序:U 将当前CS:IP所指的地址开始反汇编32个字节。若前面已用过U命令,那么将从上次
233、反汇编的最后一个地址的下一个地址开始反汇编。U 地址 此地址是反汇编开始的地址。 示例:-U 0200 从CS:0200处开始反汇编。U 地址1 地址2 地址1是反汇编的开始地址,地址2是反汇编的结束地址。7/22/2024280 示例:-U 00 3C 实际上是U 0000 003C 示例:-U 04BA:0100 0108 -U 04BA:0100 L9 这两条命令是等效的。注:反汇编显示的内容为一段程序,包括所在内存单元地址、机器码及用助记符表示的指令。这些指令中原来源程序中的标号、变量等在这里都用实际数值表示。注:参数间应有空格隔开。注:在DEBUG环境下,所键入的数均被看作是十六进制
234、的,若输入的是十进制,必须带后缀D。7/22/2024281(3)设置断点并并启动运行: a. -G 从当前CS:IP所指地址开始运行,直到程序结束。 b. G=地址 给出启动地址,从指定地址开始运行,直到程序结束。 c. G=地址1,地址2 地址1是指定的启动地址,到地址2程序暂停,返回到 DEBUG状态,并显示断点处各寄存器的内容。 d. G 地址 此地址是断点地址,启动地址将由当前CS:IP所指地址 开始。 注:启动命令中没有给出代码段的段地址,即默认其段 地址就在CS中,否则在命令中给出段地址,如: G=段地址:偏移地址 若未设断点地址,则执行至程序结束,并显示: Program te
235、rminated normally7/22/2024282(4)显示内存单元的内容: a. D 段地址:偏移地址 显示从指定地址开始共128个内存单元字节 的内容, 若未指定地址(即-D),则显示上一个D 命令已显示过的后续内存单元的内容。 例:-D 2000:0000 -D DS:0000 b. D 段地址:偏移地址1 偏移地址2 显示从偏移地址1到偏移地址2的所有内存单 元的内容。 例:-D DS:0100 0109 显示DS:0100H开始的 10个单元的内容。7/22/2024283(5) 5) 修改内存单元的内容: a. E 段地址:偏移地址 修改一个地址单元的内容。给出命令后屏幕将
236、显示该单元内容,若不作更改,则可直接按回车或空格键,若需要更改内容,则打入新的值后按回车或空格键。当按回车键时,表示修改命令结束;当按空格键时,表示要继续显示和修改下一单元内容,从而屏幕上给出下一单元内容,接着可按上面的两种方式回答,当按回车键时,此命令的操作结束。 b. F 段地址:偏移地址1 偏移地址2 XX 将地址1 到地址2为止的所有单元中都送入后面送入的2位十六进制数(XX)。 例:-F DS:00 1F FF 把DS:00DS:1FH 共32个字节的内容都改为FFH。7/22/2024284(6)单步执行命令(逐条跟踪): -T 从当前CS:IP开始跟踪,逐条显示所有寄 存器的当前
237、内容和标志位状态,以及下一 条要执行的指令和涉及的数据区内存单元 内容。(7)多条指令跟踪 -T3 从当前地址往下执行三条指令。(8)从DEBUG中退出 -Q 从DEBUG中退出,返回DOS。7/22/2024285第四节第四节 存储器存储器7/22/2024286一.存储器芯片与CPU的连接 1. 存储器芯片的片选 在存储器系统中,实现片选控制的方法有三种,即全译码法、部分译码法和线选法。 (1)全译码法 CPU的所有地址线都参加译码,因此存储器芯片中的每个单元都有唯一确定的地址。 (2)部分译码法 CPU的部分地址线未参加译码,因此存储器芯片中的每个单元有多个地址相对应。 (3)线选法 如
238、果系统中所要求的存储器容量较小,可不用译码器,用一根高位地址线直接连接芯片的片选端, 达到片选目的, 此时存储器的每个单元将有更多个地址相对应, “地址重叠”更严重。7/22/2024287 2. 偶存储体和奇存储体 8086是16位微处理器,可一次访问一个字(两个字节,16位),也可一次访问一个字节. 它1M字节的存储器空间分成两个512KB的存储体-偶存储体和奇存储体.偶存储体同8086低8位数据线D7D0相连,奇存储体同8086的高8位数据线D15D8相连,8086地址线的A19A1同两个存储体中的地址线A18A0相连,8086的最低位地址线A0和“总线高允许”BHE用来选择存储体,如图
239、7-13所示。 当8086访问字时,如地址为偶地址,称为对齐的字,可用一个总线周期访问; ,如地址为奇地址,称为未对齐的字,就要用两个连续的总线周期才能访问,前一周期用D15D8传送(读/写)字的低字节,后一周期用D7D0传送字的高字节,7/22/20242887/22/2024289 3. 存储器芯片的地址范围 图7-14是8086 CPU与半导体存储器芯片的接口图,其中芯片#1#8为SRAM芯片6116,#9#16为EPROM芯片2732。现分析该电路的工作特性,计算RAM区和ROM区的地址范围。 (1)8086 CPU是16位微处理器,内存为字节编址,一个字(16位)存放在两个以字节编址
240、的内存单元中,存储区必须奇偶分体,如图中RAM区中#1、#3、#5和#7四个RAM芯片构成偶存储体,数据线接D0D7;#2、#4、#6和#8四个RAM芯片构成奇存储体,数据线接D8D15。同理,ROM区中#9、#11、#13和#15四个ROM芯片构成偶存储体,数据线接D0D7;#10、#12、#14和#16四个ROM芯片构成奇存储体,数据线接D8D15。 (2)8086 CPU的21条双重总线BHE/S7、AD0AD15以及A16/S3A19/S6必须经过锁存器锁存,本例采用三片74LS373。74LS373有两个控制端G和OE,G为锁存允许信号,接8086 CPU的ALE(地址锁存允7/22
241、/20242907/22/2024291 许)。在T1时刻,ALE为高电平,将21条双重总线中的BHE和A0A19打入74LS373,T1结束时,ALE的下降沿将BHE和A0A19锁存,保持到下一总线周期的T1时刻。BHE和A0A19送到译码器74LS138(#17、#18和#19)和各存储器芯片。OE接地,保证74LS373输出有效信息。 (3)8086 CPU的16条地址数据双重总线AD0AD15经过两片74LS245(数据收发器)送到各存储器芯片。74LS245有两个控制G和DIR。G为使能端,低电平有效,由8086的DEN(数据允许)信号控制。DIR为方向端,DIR低电平时,传送方向为
242、B到A;DIR高电平时,传送方向为A到B,由8086的DT/R(数据发送/接收)控制。当DT/R为低电平时,8086接收数据,而对74LS245而言,是由B到A;当DT/R为高电平时,8086发送数据,而对74LS245而言,是由A到B。 (4)SRAM的译码电路由译码器74LS138(#17和#18)构成,#17芯片负责SRAM 6116的偶存储体#1、#3、#5、#7的片选译码,6116的11条地址线A0A10同7/22/2024292 CPU经锁存后的地址线A1A11连接,A12A14同译码器74LS138的地址输入端A、B、C连接,#17的三个使能控制端为G1、G2A、G2B,G1为高
243、电平有效,同8086 CPU的M/IO和A15连接,当M/IO为高电平、A15为低电平时,允许译码器工作;G2A为低电平有效,同与门2的输出相连,与门2的输入为CPU的WR和RD,只要8086 CPU有读或写操作时,WR和RD有一个为低电平,G2A即为有效低电平,允许译码器工作;G2B也为低电平有效,同地址线A0相连,当A0为低电平,即8086 CPU执行偶地址读写时,G2B为有效低电平,允许译码器工作;上述G1、G2A、G2B的有效电平必须同时满足,译码器才能工作。因此,对74LS138 #17芯片而言,只有当8086 CPU执行偶地址的存储器读写时,译码器才能正常译码,至于究竟选中#1、#
244、3、#5、#7的哪一片,则由74LS138 #17芯片的输入端A、B、C(即 A12、A13、A14)决定。#18芯片负责SRAM 6116的奇存储体#2、#4、#6、#8的片选译码,除G2B通BHE(总线高允许,低电平有效)连接外,其余与#17芯片相同。#18芯片的正常译码条件是8086 CPU执行奇地址的数据读写。 7/22/2024293(5)根据分析计算,可得SRAM各芯片的地址范围如下: #1 00000H00FFFH中的偶地址区 #2 00000H00FFFH中的奇地址区 #3 01000H01FFFH中的偶地址区 #4 01000H01FFFH中的奇地址区 #5 02000H02
245、FFFH中的偶地址区 #6 02000H02FFFH中的奇地址区 #7 03000H03FFFH中的偶地址区 #8 03000H03FFFH中的奇地址区 整个RAM区的地址范围为OOOOOH03FFFH,共占 16K。 注意:A19A16未参与译码,为部分译码,有地址重叠。这里将A19A16假定为全0。 7/22/2024294(6)EPROM的译码电路由译码器74LS138(#19)构成,与SRAM的区别在于:EPROM2732有12根地址线A0A11,同CPU总线中的A1A12相连,构成片内12位地址译码。而74LS138(#19)芯片的三个地址输入端A、B、C分别接A13A15。74LS
246、138(#19)芯片的G1端接M/IO,当存储器操作时,G1有效。G2A与RD相连,说明2732在读操作时选通。G2A同与非门1的输出相连,而与非门1的输入为A16A19,当A16A19为全“1”时,G2B为低电平有效,#19能正常译码,说明在EPROM译码中,A19A13这7根地址线参加了片外译码。74LS138(#19)芯片的译码输出同2732各芯片的OE(输出允许端)相连。2732芯片中,#15、#13、#11、#9这四片的片选端CE同8086 CPU地址线A0相连,只有当A0=0时,这四片EPROM才能进行读操作,即偶存储体的读操作;而#16、#14、#12、#10这四片的CE端同80
247、86 CPU的BHE相连,只有当A0=1时(高8位数据总线工作),这四片EPROM才能进行读操作,即奇存储体的读操作。7/22/2024295(7)根据分析计算,可得2732 EPROM各芯片的地址范 围如下: #9 FE000HFFFFFH中的偶地址区 #10 FE000HFFFFFH中的奇地址区 #11 FC000HFDFFFH中的偶地址区 #12 FC000HFDFFFH中的奇地址区 #13 FA000HFBFFFH中的偶地址区 #14 FA000HFBFFFH中的奇地址区 #15 F8000HF9FFFH中的偶地址区 #16 F8000HF9FFFH中的奇地址区 整个ROM区的地址范围
248、为F8OOOHFFFFFH,共占 32K。7/22/2024296二. 存储系统的层次结构 在现代高性能的计算机系统中,对存储器既要求速度快,又要求容量大,同时价格又要合理。仅仅用一种技术组成的单一存储器是不可能同时满足上述要求的,只有采用层次结构,才能解决存储器高速度、大容量和合理成本三者的矛盾。存储系统的层次结构如图7-15所示。图中自上至下存取速度递减,存储容量递增,成本依次降低。 从图7-15可见,把各种速度不同、性能不同、价格不同、存储技术不同的存储设备,组成几层存储器,各层存储设备间通过管理软件和相应硬件组合成统一的整体,形成一个体系。这个体系有足够大的存储空间,且在不提高存储器总
249、价格的前提下,最大限度地与CPU速度相匹配,从而获得优良的性能价格比,从这一概念出发组成的存储体系就是存储系统的层次结构。 7/22/2024297 图7-15 存储系统的层次结构7/22/2024298 现代计算机中最常采用的两种存储层次是:主存-辅存、高速缓冲存储器-主存。1. 主存主存-辅存存储层次辅存存储层次 如图7-16所示。辅存是外部设备的一部分,其编址与主存编址无关。操作系统的发展使得程序员尽可能摆脱主存、辅存之间的地址定位,同时形成了支持这些功能的“辅助软硬件”,通过软、硬件结合,把主存和辅存统一成一个整体,形成一个主存-辅存存储层次。从整体上看,其存取速度接近于主存的存取速度
250、,其存储容量则接近于辅存的存储容量,而存储每位信息的平均价格则接近于廉价的辅存平均价格。这种系统的不断发展和完善,逐步形成了现在广泛使用的虚拟存储器系统。主存-辅存存储层次解决了存储器的大容量要求和低成本之间的矛盾。 7/22/2024299 图 7-16 主存-辅存存储层次 图 7-17 Cache-主存存储层次7/22/2024300 2. Cache-主存存储层次主存存储层次 随着计算机的不断发展,CPU与主存储器速度匹配的矛盾越来越突出,主存的速度成为限制CPU速度的重要因素。又如访问存储器时插入等待周期,等于降低了CPU的运行速度。为了加快CPU的速度,在CPU与主存之间增加一级或两
251、级高速小容量存储器,即高速缓冲存储器,简称Cache,组成Cache-主存存储层次,如图7-17所示。虽然Cache容量相对较小,但存取速度与CPU工作速度相当。在Cache-主存存储层次中,运行程序存放在主存中,而在Cache中存放最近访问和将要访问的指令和数据,它们是主存中相应内容的副本。当CPU访问存储器时,Cache控制器首先验证被访问存储单元的内容是否已在Cache 中,若已在Cache 中,则立即访问Cache进行存取,称此次访问高速缓存命中(hit)。只有要访问的内存单元内容不在Cache中,CPU才去访问内存,同时将所访问的内容及相关数据块复制到Cache中,这称为访问Cach
252、e未命中。以后CPU查找此信息时可以只访问Cache,而不必再访问内存。由于Cache容量7/22/2024301 较小,当它爆满时,则应按某种调度算法更新Cache中的内容。这种方法可减少CPU访问内存的次数。 命中率是命中Cache的访问次数与CPU访问次数的百分比。命中率与Cache的容量和物理结构、缓存淘汰算法以及运行程序等有关。通常,当Cache容量为32KB时,其命中率为86%,而当容量为64KB时,命中率接近92%。一般来说,CPU对当Cache访问的命中率在90%以上,甚至高达99%。为了提高命中率,Cache控制器将主存划分成块(页),Cache与主存间交换信息总是以字块(或
253、页)为单位,Cache中可容纳一定数量的字块(或页)。Cache及其控制逻辑都是用硬件来实现的。Cache是由SRAM芯片组成的,主存储器则由DRAM组成。 在80386微机中配有32KB或64KB的SRAM作为Cache,并配有Cache控制器82385;80486则将一个配有82385控制器和8KB高速缓存与80486微处理器一起集成于同一个芯片内;Pentium微处理器内含有2个8KB的高速缓存用作指令Cache和数据 Cache。 7/22/2024302三三. 虚拟存储器虚拟存储器 一台计算机的主存容量有限,因此在大多数情况下,程序和数据都存放在大容量的辅存中,当需要时才把它们从辅存
254、传到内存,然后执行。有时一个程序和数据比主存的容量还大,就无法运行。为了解决此类问题,需要采用虚拟存储器。在具有虚拟存储器的系统中,程序运行时,存储管理软件和辅助硬件会把辅存中的程序分块,一块块自动调入主存,由CPU执行,让用户觉得具有一个容量相当大的存储器,而不受主存容量的限制,但实际上CPU只能执行调入主存的程序,因此称这样的存储系统为“虚拟存储器”。虚存的内容装在磁盘中。 虚拟存储器是建立在主存-辅存物理结构基础之上,由附加硬件装置及操作系统存储管理软件组成的一种存储体系。虚拟存储器的辅存部分能像主存一样让用户使用。CPU在执行程序时产生的逻辑地址叫“虚地址”(即虚拟地址),虚地址对应的
255、存储7/22/2024303 空间称为“虚存空间”。实际的主存单元的地址则称为“实地址”(即主存地址),实地址对应的是“主存空间”。虚地址对应的范围要比实地址大得多。CPU以虚地址访问主存,找出虚地址和实地址之间的对应关系,判断这个虚地址指示的存储单元内容是否已装入主存;如不在主存,计算机则把相应的程序块从辅存调入主存,并且把程序虚地址变成实地址,覆盖原先存在的一部分程序后继续运行。 虚地址和实地址之间的变换是由硬件负责完成的,而软件则负责页面管理、实存管理,以及主存和辅存之间信息的自动调度等。 虚拟存储器可分为段式虚拟存储器、页式虚拟存储器和段页式虚拟存储器三种。7/22/2024304四四
256、. PC内存系统实例内存系统实例 个人计算机是现在用得最多的一种计算机,下面以IBM PC/XT为例说明内存系统的组织情况。1. 存储空间的分配 在IBM PC/XT 中主CPU是8088,它有20根地址线,可寻址的物理空间为1M字节。其地址范围为00000HFFFFFH。该1M字节空间可分成三个区域:RAM区、保留区和ROM区。如图7-18所示。图7-18 IBM PC/XT 中存储空间的分配7/22/2024305 存储空间的低地址区,即0640KB是RAM区,每个存储单元存放一个字节的数据,这个区域是用户存储器的主要工作区域,其中256KB安装在底板(系统板)上,其余的内存根据需要在扩展
257、槽中用外扩的方式实现。 紧接着的128KRAM称为保留区,其地址为A0000HBFFFFH,这区域主要用于系统在显示字符或图形时作为缓冲区,所以又叫显示缓冲区。此区域根据具体机器有所不同,如只作单色字符显示,只需要4KB,规定占用B0000HB0FFFH地址段;作彩色显示时使用B8000HB0FFFH范围中的16KB。随着显示分辨率的提高,显示缓冲区的范围也将扩大。 存储空间的最后256K是系统的ROM区。其中前192KB存放系统的控制ROM。C0000HC7FFFH的区域存放高分辨率显示适配器的控制ROM;C8000H开始的区域存放固定磁盘驱动器适配器的控制ROM。如果用户另要扩展,可以使用
258、这192KB中尚未使用的区域。当然扩展要在扩展槽中进行。系统中最后64KB存储器是基本系统ROM区。IBM PC/XT一般在该区域安装了40KB的基本ROM,其中8KB为BIOS,32KB为ROM BASIC。7/22/20243062. ROM子系统 计算机系统在通电后要能自动启动,就必须把初始化程序和引导程序放在ROM中。IBM PC/XT 中的初始化程序和引导程序一般安装在系统板上的40KB的ROM中,它们占用存储器的最高端地址。其中有32KB的ROM BASIC,给用户提供一种最基本的编程语言;另外8KB是基本输入输出系统BIOS。占用地址FE000HFFFFFH。系统板上的40KB
259、ROM信息装在两块ROM芯片中,一块是8KB的芯片,内装固化BASIC的前8KB;另一块是32KB的芯片,内装固化BASIC的后24KB及BIOS。3. RAM子系统 IBM PC/XT中,RAM 的最大容量为640KB,采用的是64K1位的芯片,故整个RAM分成若干个组,每组为64KB,即用9片64K1位的芯片,其中8位组成字节,第9片用作奇偶校验。IBM PC/XT的系统板上安装256KB的RAM,即由4组每组9片64K1位的芯片构成。7/22/2024307五五. 外存储器外存储器 外存储器是用来存放当前暂不参与运算的程序、数据和文件,以及一些永久性保存的程序、数据和文件,在CPU需要处
260、理时再成批地同内存储器交换,其特点是容量大、价格低,但存取速度较慢,常用的外存储器有软磁盘、硬磁盘、磁带机、光盘、存储卡等。 1. 磁盘存储器 (1) 软磁盘子系统。软磁盘存储器具有价格低、体积小、结构简单、数据传输快、容易维护以及对使用环境要求不高等优点。软磁盘子系统由软磁盘、软盘驱动器和软盘适配器三部分组成。 1) 软磁盘简称软盘。 2) 软盘驱动器 3) 软盘适配器 (2)硬磁盘子系统7/22/20243082. 光盘存储器 光盘存储器是一种利用激光的单色性和相干性,把数据信息通过聚焦激光束在盘式介质上非接触地记录高密度信息的新型存储器。与磁盘相比,由于光盘存储器具有记录密度高、存储容量
261、大、数据传输速度快、信息保存时间长、制造成本低、易于大量复制、工作稳定可靠且使用环境要求低等特点,已广泛应用于存储和管理各种数字化信息。例如用作计算机外存、磁盘机的后援设备、工作站、大型数据系统、办公自动化系统中的文件和图像的存档与检索、影视信息的存储等领域。而且光盘不需要固定在光盘驱动器中,容易更换,因此其存储容量是无限的。目前,大直径(14英寸)光盘的容量可达10GB,中容量(812英寸)的可达7002000MB,小容量(25.25英寸)光盘也可达100MB,计算机中广泛使用的5.25英寸只读光盘容量为650MB。所以,相同尺寸的光盘要比磁盘的容量大10100倍,光盘的数据传输速度可达几十
262、MB/s量级,寿命一般在十年以上。7/22/2024309目前,光盘按读写类型可分为以下几种:(1) 只读型光盘 只读型光盘是由光盘生产厂家将视频、音频或数字信息预先用激光束蚀刻在盘片上,用户使用时只能读出不能再改写。如激光视盘(LV)、激光唱盘(CD、MD)、照相CD、小影碟VCD、数字视盘DVD、计算机系统中使用的CD-ROM等均属这一类,目前这类光盘的应用以相当广泛。(2) 一次写入型光盘 一次写入型光盘是指允许用户写入数据、但只能写一次、可多次反复读出但不能擦除的光盘。要修改的数据只能追记在盘片的空白处。它适用于不需要修改的大型数据库系统存储图像、文件资料或开发的应用软件。人们平常用来
263、复制软件的光盘就属此类。(3) 可读可写型光盘 可读可写型光盘早期是改写型,后来发展成重写型,其原理是利用激光照射引起介质的可逆物理变化来记录信息,因此既可写入又可擦除。按存储介质工作机理的不同又可分为相变光盘和磁化光盘。7/22/20243103. 存储卡 随着集成电路技术的不断发展,存储器芯片的集成度越来越高。现已出现了利用半导体存储器构成的外存储器卡,它们具有集成度高、体积小、速度快、可靠性高、使用方便等优点。 (1) EEPROM卡 简单IC卡 智能IC卡 大容量存储卡 (2) SRAM存储卡 (3) DRAM存储卡4. 磁带存储器7/22/2024311第五节第五节 可编程接口芯片及
264、应用可编程接口芯片及应用7/22/2024312一.一.80868086中断系统中断系统 1. 中断类型 8086有功能很强的中断功能,可以处理256种中断.这些 中断分成两大类:外部中断和内部中断。 参阅图7-20 (1) 外部中断 由微机外部硬件的请求产生的中断,又叫 硬件中断。 1)可屏蔽中断 INTR (Interrupt) 可屏蔽中断的请求信号是通过INTR引脚进入的,高 电平有效。用户可以用指令改变中断允许标志IF的状 态,以禁止中断或允许中断。若IF=1,则CPU在执行完 当前指令后,响应中断请求;若IF=0,则CPU不予响应。 7/22/2024313 图图7-20 8086的
265、中断分类的中断分类7/22/2024314 可屏蔽中断通常用于各种外部设备的中断。微型 计算机的外设有硬盘、键盘、显示器和打印机等。 这些外设通过中断控制器8259A与CPU相连,8259A 接收来自外设的中断请求,并向CPU发出中断请 求。以IBM PC机为例,其8259A的IR0IR7中断源 安排如表7-9所示 2)不可屏蔽中断 NMI (Non-Maskable Interrupt) 不可屏蔽中断的请求信号是通过CPU的NMI引脚进 入的,上升沿有效。用户不能用软件加以屏蔽, 即不受IF的控制。当NMI引脚上有中断请求时, CPU便在执行完当前指令后,一定会立即予以响应 的。这种中断通常
266、用来处理系统的重大事故,如 系统停电、存储器读写出错或总线奇偶位错误 等。7/22/20243157/22/2024316 (2) 内部中断 内部中断是通过软件调用的不可屏蔽的中断。内部 中断通常是由下面三种情况引起的。 1)由于CPU的某些错误引起的中断 CPU在执行程序时,若出现运算错误,CPU就以中 断方式中止正在运行的程序,待用户改正错误后, 再重新运行。 除法出错中断(0型中断) 在执行除法指令DIV或IDIV后,若除数为0,所得 的商超出了目标寄存器的范围,则CPU立即产生0 型中断。 溢出中断(4型中断) 如果上一条指令(如加、减法指令等算术指令) 执行后使溢出标志位OF=1,那
267、么执行紧跟在后面 的溢出中断指令INTO后,立即产生4型中断,系统 给出出错标志。如果OF=0,则无溢出,程序顺序 执行。 7/22/2024317 2)为调试程序设置的中断 一个程序编好后,必须上机调试。在调试的过程 中,为了检查中间结果或寻找程序中的问题,往往 需要在程序中设置断点或进行单步工作,这些功能 都是由中断系统来实现的。 单步中断(1型中断) CPU内标志寄存器中有一位TF标志陷井 (trap)标志,CPU每执行完一条指令都检测TF 的状态。如果发现TF=1,CPU就产生1型中断。 这种中断方法,常被用来作为调试程序的单步 操作手段,所以称为单步中断或陷井中断。使 用此中断,可以
268、用一条一条指令跟踪程序的流 程,观察CPU每执行一条指令后,各个寄存器及 有关存储单元的变化,从而找出产生错误的原 因。 7/22/2024318 断点中断(3型中断) CPU执行INT3指令而产生的中断称为断点中断。断点 中断也是供调试程序使用的。在调试程序时,通常 把程序按功能分成几段,然后每段设一个断点。当 CPU执行到断点时产生中断,这时用户便可以检查各 寄存器及有关存储单元的内容。 3)INT n 指令中断 8086指令系统中有一条INT指令,当执行完这条指令就立即产生中断,编在该指令中的中断类型码n告诉CPU调用哪个服务程序来处理这个中断。n从 20H-FFH(255),由用户决定
269、;5-1FH保留给系统开发。如 INT 21H 就是DOS系统功能调用,当AH中设置不同值时,该指令将完成不同的功能。7/22/2024319 2 中断优先级 中断 优先级 除法错(0型) 最高 断点中断(3型) 溢出中断(4型) INT n 指令中断 NMI(2型) INTR 单步中断(1型) 最低7/22/2024320 3. 中断向量和中断向量表 CPU响应中断后,如何找到对应的中断服务程序呢?关键就在找到其入口地址(入口地址又叫中断向量或中断指针)。8086系统将256种类型的中断服务程序的入口地址依次存放在一张表中,这张表叫中断服务程序入口地址表(即中断向量表)。此表安排在内存的开始
270、的前1024个单元,即地址为00000H003FFH的区间。它可以容纳256个中断向量,每个中断向量占用四个字节,其中两个低字节用来存放相应中断服务程序入口地址的IP值(偏移地址),两个高字节用来存放入口地址的CS值(段地址)。各服务程序入口地址的CS和IP在表中按中断类型号的顺序存放,如图7-21所示。 由图7-21可知,8086系统中的256个中断可分为下面三类: (1) 专用中断(类型04) 专用中断已有统一的规定,分别对应于除法出错、 单步中断、不可屏蔽中断、断点中断和溢出中断, 用户是不能修改的。7/22/2024321图7-21 8086的中断向量表7/22/2024322 (2)
271、 系统保留的中断(类型531) 这些是提供给系统使用的中断。其中有些没有使 用,但为了保持系统之间的兼容性以及与将来的 Intel系统的兼容,用户不能对这些中断自行定义。 (3) 用户定义的中断类(类型32255) 这类中断原则上可以由用户自行定义。可定义为内 部中断,由INT n指令引入;也可通过INTR引脚直接 引入;或通过8259A引入可屏蔽中断。使用时,用户 要自行装入相应的中断向量。这类中断中有些已由 系统分配了固定的用途,如类型号为21H的中断已定 义为DOS的系统功能调用。 在中断向量表中如何确定每个中断向量存放的位置呢?采用的方法是:将中断类型码n乘4,得到向量地址,以此地址为
272、基准,在向量表中连续取四个单元的内容,将前两个单元存放的偏移地址送IP寄存器,后两个单元存放的段地址送CS寄存器,从而转向中断服务程序。7/22/2024323 4中断向量的装入与修改 中断向量并不是常驻内存的,而是开机上电时,由系统软件将其装入内存中指定的中断向量表中。若系统(如单板机)未配置系统软件,就应由用户自行安装(用MOV指令)。在PC机中,则采用中断向量修改的方法,即利用DOS功能调用INT 21H中的35H号和25H号功能。 58086CPU中断响应的过程 8086CPU中断响应的过程如图7-22所示。CPU按优先级别的高低次序,先响应内部中断,其次是不可屏蔽中断和可屏蔽中断,最
273、后才响应单步中断。 当外设要求CPU为它服务时,向CPU送出一个有效的中断请求信号,实际上这是一个电平信号,加到CPU的中断请求输入端。这个电平信号必须保持到被CPU发现;而CPU响应后,应当把该请求电平去掉,这样才能保证CPU不会对同一个请求多次响应。在使用可编程中断控制器(如8259A)时,CPU的中断响应信号能做到这一点。若用户自己做中断请求硬件,则必须注意这个问题。 7/22/2024324 CPU在每条指令执行的最后一个时钟周期检测中断请求输入端有无请求发生,如果外设发出了可屏蔽中断请求,即CPU的INTR端上有请求信号,必须满足以下四个条件,才能响应。 (1) CPU执行完当前指令
274、。 (2) CPU处于开中断状态,即IF=1。 (3) 没有发生复位(RESET)、保持(HOLD)。在复位 或保持时,CPU不工作,不可能响应中断请求。 (4) 没有内部中断和不可屏蔽中断请求,因为内部中 断和不可屏蔽中断请求的优先级比可屏蔽中断高.CPU响应可屏蔽中断请求的过程如下(参考图7-22): (1) 在中断响应信号INTA端相继发出两个负脉冲,第一个INTA脉冲通知外设,CPU已接受了中断请求;第二个INTA脉冲控制外部中断控制逻辑把中断类型号置于数据总线并进入CPU。 (2) 把标志寄存器FLAG的内容压入堆栈保护。 7/22/2024325图7-22 8086中断响应的过程7
275、/22/2024326 (3) 把FLAG中的中断允许标志IF的状态存放在暂存寄存器TEMP内。 (4) 将IF和单步标志TF均置0,从而禁止在中断响应过程中其它可屏蔽中断进入,也禁止单步中断。 (5) 将CS和IP的内容压入堆栈,即保存了断点地址。 (6) 查中断向量表,将中断服务程序的入口地址置入IP和CS (7) 以CS和IP的内容所算出的地址作为入口地址,转向中断服务程序。 (8) 执行完中断服务程序,在返回之前应恢复现场,即CS、IP、FLAG的内容从堆栈中弹出返回。最后开中断,返回主程序 如果是不可屏蔽中断,则中断类型号是固定的;如果是软件中断,则类型号由指令的操作数决定;都不经过
276、上述第(1)步,直接进入第(2)(8)步。 7/22/2024327 二可编程中断控制器二可编程中断控制器8259A Intel 8259A是一种可编程中断控制器,一个8259A可以管理八级中断,多个8259A通过级联,最多可以管理64级中断。8259A可以与8080、8085、8086、8088等多种微处理器配合组成中断系统。IBM PC的主机板中用了一片8259A芯片,除作为中断优先控制器外,还常常作为系统总线控制逻辑的组成部分。 1. 内部结构 8259A的引脚图和内部结构框图分别如如图7-23、图7-24所示。 7/22/20243287/22/2024329由图7-24可见,8259
277、A由八个基本部分组成,它们是:(1) 八位中断请求寄存器IRR(Interrupt Request Register) 中断请求寄存器与外部接口(外部设备)的中断请求线相连,外设通过IR0IR7向8259A请求中断服务,并把中断请求信号锁存在中断请求寄存器里。触发方式有两种:正跳变边沿触发和高电平触发,但无论采用何种触发,中断请求信号的高电平状态必须保持到第一个中断响应信号INTA有效之后,否则中断请求信号将丢失。(2) 八位中断屏蔽寄存器IMR(Interrupt Mask Register) 中断屏蔽寄存器用来设置中断请求的屏蔽信息,由程序写入,与八个中断源一一对应。如果某一位或某几位为“
278、1”时,则对应的中断请求被屏蔽,即对该中断源的请求不予理睬;若IMR为“0”,则不屏蔽。每个屏蔽位的状态都是独立的,不管哪个中断源被屏蔽,都不会影响其它中断源的正常工作。7/22/2024330(3) 优先权判别器PR(Priority) 优先权判别器是根据IRR中各中断请求的优先级别和IMR中屏蔽寄存器的情况,选取具有最高优先级别的中断请求,送入ISR,与正在服务的中断进行比较。假定新的中断比正在服务的中断优先级别高,则优先权判别器就使INT线为高电平,向CPU提出中断申请,并在中断响应时将它记入ISR的对应位中;如果新的中断请求的优先级别等于或低于正在服务中的中断优先级别,则优先权判别器不
279、再提出申请。(4) 八位正在服务寄存器ISR(In-service Register) 正在服务寄存器用来保存正在处理的中断,使相应位置“1”。当ISR为全“0”时,表示CPU正执行正常程序,无中断服务。ISR的八位与IRR的位是一一对应的。7/22/2024331(5) 数据总线缓冲器 这是一个八位三态双向缓冲器。8259A内部各寄存器通过此缓冲器与外部数据总线相连,它传输来自CPU的各种命令参数,将自身的状态及中断向量送到数据总线上。(6) 读/写逻辑 该部件接收来自CPU的读/写命令,控制内部各寄存器与CPU之间的通信。操作过程来自CPU的CS、RD、WR、A0四个信号。CS为8259A
280、的片选信号,CS有效时芯片被选中。RD、WR两个信号在某一时刻只能有一个信号有效,它指明了操作的读写性质。A0常与系统地址总线线相连,根据此线输入为0或1的不同,选定片内不同的寄存器进行读写操作。也就是说,8259A中的各寄存器占用两个I/O端口地址,全部地址值由CS和A0位的状态决定。 CS应连到地址译码器的输出端,而A0通常是和地址总线的A0或A1相连,当8259A用于8088 CPU时,A0常和地址总线的A0相连;当8259A用于8086 CPU时,A0常和地址总线的A1相连。 7/22/2024332(7) 控制逻辑 根据中断请求寄存器IRR的情况和优先权判别器PR的判定结果,8259
281、A内部的控制电路向8259A内部其它部件发出控制信号,向CPU发出中断请求信号INT,接收来自CPU来的中断响应信号INTA,控制8259A进入中断服务状态。(8) 级联缓冲器/比较器 一片8259A只能接收八级中断,当超过八级时,可用多片8259A级联使用,构成主从关系,一片8259A作为主片,其余作为从片,最多可扩展至64级。此时各从片8259A的INT脚与主片8259A的IRX相连,而它们的三个级联信号CAS0CAS2分别互连起来。SP/EN是 “从编程/缓冲器允许”双功能信号7/22/2024333 2. 引脚定义 D0D7:双向三态数据线,与系统数据总线相连,用作CPU和8259A之
282、间传送数据及命令。 IR0IR7:八个中断请求输入端,接收来自外设中断源的中断请求信号。 INT:8259A的中断请求输出信号,送至CPU的中断请求线。 INTA:中断响应信号,接收来自CPU的中断响应脉冲INTA。 CS:片选信号,低电平有效。此信号有效时,才能实现CPU对8259A的写或读操作,通常在系统中连地址译码器的输出端。 WR:写命令信号,低电平有效,允许CPU向8259A写入命令字。 RD:读命令信号,低电平有效,允许CPU读取8259A中寄存器的内容。 7/22/2024334 A0:8259A内部寄存器的选择信号,它的不同状态,对应不同的内部寄存器。使用中连接到地址总线的某一
283、位,如A1或A0。 CAS0CAS2:级联控制线。当多片8259A级联工作时,其中一片为主片,其余均为从片。主片的CAS0CAS2作为输出,连接到从片的CAS0CAS2上。当某从片提出中断请求时,主片8259A通过CAS0CAS2给从片送出相应的编码,使从片的中断被允许。当8259A单片使用时,不使用这些引脚。 SP/EN:双重功能信号。当8259A工作在缓冲方式时,它是输出信号,控制缓冲器的传送方向;当8259A工作在非缓冲方式时,它是输入信号,用于规定8259A是主片(SP=1)还是从片(SP=0)。在只有一片8259A的系统中,该引脚接高电平。7/22/2024335 38259A的工作
284、方式 (1)设置优先级的方式 1) 全嵌套方式 若8259A初始化后没有设置其它优先级方式,就自动进入全嵌套方式。在此方式下,8259A的中断具有固定的八级优先排列顺序,IR0最高,IR7最低。高优先级中断可以中断低优先级的服务,实现中断嵌套。全嵌套方式是8259A最常用的方式。 2) 特殊全嵌套方式 特殊全嵌套方式与全嵌套方式基本相同,区别是:特殊全嵌套方式处理某一级中断时,如果有同级的中断请求,也会给予响应。而在全嵌套方式中,只有对更高级别的中断请求才会进行嵌套,对同级别的中断请求不会响应。特殊全嵌套方式主要用在8259A的级联系统中,将主片设置于特殊全嵌套方式,而从片处于其它的优先级方式
285、。这样,当来自某一从片的中断请求正在处理时,系统既对来自主片的优先级较高的其它中断请求开放,又能对来自同一从片的较高优7/22/2024336 先级请求开放。从从片的角度看,新的中断请求一定比当前正在处理的中断优先级别高,但从主片的角度看,这两个中断请求具有相同的优先级别,因为它们是从同一输入端引入的,特殊全嵌套方式却能加以区分,而全嵌套方式是无法区分的。特殊全嵌套方式是专门为8259A级联系统提供的,用来确认从片内部优先级的工作方式。 3) 优先级自动循环方式 上述两种方式中,中断请求IR0-IR7的优先级是固定不变的,在某些情况下需要改变这种优先级。如系统中有几个中断源优先级相等,希望优先
286、级次序循环变化,使中断请求IR0-IR7轮流具有最高的优先级,就采用优先级自动循环方式。这样,当某一级中断被处理完毕后,它的优先级别就被修改为最低,而最高优先级分配给该中断的下一级。如现在CPU正在为IR0服务,待服务完毕后,IR0变为最低优先级,而IR1为最高优先级,IR2为次高优先级,依次类推。7/22/2024337 4) 优先级特殊循环方式 优先级特殊循环方式和优先级自动循环方式相比,只有一点不同,就是在特殊循环方式中,一开始的最低优先级是由编程确定的,从而最高优先级也由此而定。比如,确定IR3为最低优先级,那么IR4就是最高优先级。而在优先级自动循环方式中,一开始的最高优先级一定是I
287、R0。 (2) 屏蔽中断源的方式 1) 普通屏蔽方式 在普通屏蔽方式中,8259A的每个中断请求输入端都可以通过对应屏蔽位的设置被屏蔽,从而使这个中断请求不能从8259A送到CPU。当然,对中断的屏蔽总是暂时的,过了一定的时间,程序中又需要撤消屏蔽。比如,在计算机网络通信中,接收中断的优先级比较高,当一个计算机工作站进行信息发送时,一般对接收中断要进行屏蔽,以免本站的发送过程被打断,而在完成本站的发送过程后,要立即开中断,以免其它站点往本站的发送过程迟迟得不到回答。7/22/2024338 2)特殊屏蔽方式 有时在执行中断处理程序的的某一部分时,希望禁止较低优先级的中断请求,在执行中断处理程序
288、的的另一部分时,又能将其开放,自然可以用中断屏蔽寄存器来达到这一要求。但问题是每当一个中断请求被响应时,就会使当前中断服务寄存器ISR的对应位置1,只要中断处理程序没有发出中断结束命令EOI,ISR的对应位就不会复位,8259A就会据此禁止所有优先级比它低的中断请求。采用特殊屏蔽方式,就会使ISR的对应位自动清0,这样就不只屏蔽了当前正在处理的这级中断,而且开放了其它级别较低的中断。 (3) 结束中断处理的方式 当一个中断请求得到响应时,8259A都会在ISR中将相应位设置为1,为优先权判别器的工作提供比较的依据。当中断处理程序结束时,必须使该位清0,否则,8259A的中断控制功能就会不正常,
289、这个使ISR中的对应位清0的动作就是中断结束处理。共有三种中断结束方式:7/22/2024339 1) 中断自动结束方式 在这种方式,系统一进入中断过程,8259A就自动将ISR中的对应位清0,尽管系统正在进行中断服务,但ISR中对应位的高电平指示已被取消,好像中断服务已经结束。这是最简单的中断结束方式,主要是怕程序员忘了在中断服务程序中给出中断结束命令而设立的。这种方式虽然简单,但也有缺点。如果又出现了新的中断请求,不管级别如何,只要CPU允许中断,都将打断正在执行的中断服务而被优先执行,这显然是不合理的。因此这种方式只能用在系统中只有一片8259A且多个中断不会嵌套的情况。 2) 一般的中
290、断结束方式 当中断服务处理完毕,给8259A送一般的中断结束命令(EOI),8259A就将ISR中级别最高的置1位清0,因为在全嵌套方式中ISR中级别最高的置1位对应于最后一次被响应的中断,也就是当前正在处理的中断,所以ISR中级别最高的置1位复位相当于结束了当前正在处理的中断。7/22/2024340 3) 特殊的中断结束方式 在非全嵌套的情况下,用当前ISR是无法确定哪一级中断是最后响应和处理的,也就是说无法确定当前正在处理的中断是哪级中断,这时就要采用特殊的中断结束方式。 操作字会指出要清除ISR的哪一位,然后结束中断。 在级联的方式下,一般不用中断自动结束方式,而用一般的中断结束方式或
291、特殊的中断结束方式。一个中断处理程序束时都必须发两次中断结束命令,一次是对主片发的,另一次是对从片发的。 (4) 连接系统总线的方式 1) 缓冲方式 在多片8259A级联的大系统中,8259A通过总线驱动器和数据总线相连。 2) 非缓冲方式 在系统中只有单片8259A或片数不多的级联方式中,将8259A直接与数据总线相连。 7/22/2024341(5) 引入中断请求的方式 1) 边沿触发方式 2) 电平触发方式 3) 中断查询方式 这是一种用软件查询方法来响应与8259A相连接的中断请求,一般用在多于64级中断或多个模块的场合。此时8259A的INT引脚不连接到CPU的INTR引脚,或者CP
292、U正处于关中断状态,所以CPU不能响应从8259A来的中断请求。这时CPU若要了解有无中断请求,必须先用操作命令字发查询命令到8259A,然后再读取IRR寄存器的状态,并识别当前有无中断请求及优先级最高的中断请求。 7/22/2024342(6) 8259A的工作顺序 1) 一条或多条中断请求(IR0IR7)变为高电平,使IRR相应位置1; 2) 8259A接受这些请求,分析它们的优先级,向CPU发出中断请求信号INT; 3) 若CPU处在开中断状态,则响应中断请求,并以INTA脉冲作为回答; 4) 8259A接受来自CPU的第一个INTA脉冲,最高优先级所对应的的ISR相应位置1,相 应的I
293、RR位复位; 5) 8259A接受来自CPU的第二个INTA脉冲,向CPU发出中断类型码; 至此,8259A已完成整个中断响应周期。在中断自动结束方式中,当第二个INTA脉冲结束时,ISR位被复位;在其它情况,ISR位置位,直到中断服务程序结束。7/22/2024343 48259A的命令字及其编程 8259A是使用非常灵活、适用面广的中断控制器,它的这些优点来源于芯片的可编程特性 。要想用好8259A,除了必须正确地将它接入系统,还必须正确理解8259A的各种工作方式,并据此对它进行正确的编程。全部编程分成两大部分:初始化编程和操作编程。 初始化编程是一个芯片开始正常工作前必须进行的步骤,它
294、使芯片处于一个规定的基本工作方式上。而操作编程可以在初始化编程后的任何时刻进行,使8259A能在指定的某一具体方式下运行。编程的过程都是通过由CPU向8259A写入各种命令字来完成的,写入后这些内容都存储在8259A内部的寄存器中。7/22/2024344(1)初始化命令字及其编程 初始化命令字(ICWICW,Initialization Command Word)共有四个,它们分别标记为ICW1ICW4,每个命令字长度为一个字节,写入初始化命令字应按如图7-17所示的次序进行。首先写入ICW1,然后依次写入ICW2、ICW3和ICW4,在有些工作方式下可以不写ICW3或ICW4,这都是由设置
295、在ICW1中的一些特定位规定的(实际上就是规定的某些工作方式)。初始化命令字一旦设定,在系统工作过程中不再改变。CPU用A0寻址8259A的端口共两个,一个偶地址,A0=0;一个奇地址,A0=1。 1)ICW1 ICW1是芯片控制初始化命令字,必须写入偶地址端口,即A0=0。具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 1 LTIM ADI SNGL IC4 D7 D7D5D5 在8086/8088系统中不用,无关项,可填0,也可填1,一般设置为0。 7/22/2024345图7-25 初始化过程7/22/2024346D4=1D4=1 此位是ICW1的标志位,表示当前设置的
296、是ICW1,而不是OCW2和OCW3(OCW2和OCW3这两个命令字也要求写入偶地址端口,即A0也等于0)。D3D3(LTIMLTIM) 设置中断请求信号的触发方式。D3=1为电平触发,D3=0为上升沿触发。D2D2(ADIADI) 此位在8086/8088系统中无意义,填0。D1D1(SNGLSNGL)单片方式或级联方式。D1=1表示系统中只有一片8259A,D1=0表示系统中有多片 8259A,D0D0(IC4IC4) 此位用来指出后面是否将设置ICW4,如果还要使用ICW4,则IC4必须填1,否8259A不予辩认ICW4。在8086/8088系统中,ICW4是必须使用的,故IC4必定为1
297、。例 某8086微机系统中,使用单片8259A,中断请求信号为上升沿触发,需要设置ICW4,端口地址为20H、21H,则其初始化命令字ICW1应为:00010011B=13H,设置ICW1的指令为: MOV AL,13H OUT 20H,AL 7/22/2024347 2) ICW2 ICW2设置可屏蔽中断类型码的基值(即高五位内容),必须紧跟在ICW1后写入。ICW2必须写入奇地址端口,即A0=1。具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 T7 T6 T5 T4 T3 0 0 0 8259A在CPU的第二个INTA脉冲期间向CPU发出8位中断类型码,该类型码由两部分构成
298、。其中高五位T7T3由用户通过编程确定,就是ICW2的内容,低三位由8259A内部电路自动产生,分别对应于个中断请求信号IR0IR7的编号(即IR0为000,IR1为001,.,IR7为111)。 例 某PC机中8个可屏蔽中断请求信号IR0IR7的类型码为08H0FH,A0=1,端口地址为21H,则初始化命令字ICW2应为:00001000B=13H,设置ICW2的指令为: MOV AL,08H OUT 21H,AL7/22/2024348 3) ICW3 ICW3是标识主片/从片的初始化命令字,必须写入奇地址端口,即A0=1。 ICW3仅用于8259A的级联方式,若系统中只有一片8259A,
299、则不用设置ICW3。当多片8259A级联时,ICW3用来指出主片上连接从片以及从片连接到主片的情况,所以ICW3有两种格式。 ()主片的ICW3格式 D7 D6 D5 D4 D3 D2 D1 D0 IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0 0:表示IRi上未接8259A从片 1:表示IRi上接有8259A从片 例 若ICW3=0FH,则表示IR3IR0 引脚上均接有从片,IR7IR4 引脚上没有接从片。7/22/2024349()从片的ICW3格式 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 ID2 ID1 ID0 000 从片接入主片的IR0 0
300、01 从片接入主片的IR1 010 从片接入主片的IR2 ID2ID1ID0= 011 从片接入主片的IR3 100 从片接入主片的IR4 101 从片接入主片的IR5 110 从片接入主片的IR6 111 从片接入主片的IR7 7/22/2024350例 某8086微机系统中,主片8259A的IR2和IR6引脚上分别接有从片8259A,则主、从片的ICW3初始化命令字设置如下: 主片的初始化命令字(端口地址设为20H、21H): MOV AL,44H ;44H为主片的ICW3,表示其IR6和IR2引脚上接有从片8259A OUT 21H,AL ;将ICW3写入奇地址端口 从片1的初始化命令字
301、(端口地址设为30H、31H): MOV AL,02H OUT 31H,AL 从片2的初始化命令字(端口地址设为40H、41H): MOV AL,06H OUT 41H,AL 7/22/2024351 4) ICW4 当ICW1中的D0(IC4)=1时,初始化8259A时需写入ICW4。ICW4写入奇地址端口,具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 SFNM BUF M/S AEOI PMD7D7D5 D5 这三位总是为0,作为ICW4的标识码。D4D4(SFNMSFNM) SFNM=1,表示当前8259A工作于特殊全嵌套方式; SFNM=0,表示当前825
302、9A工作于普通全嵌套方式。 D3D3(BUFBUF) 设置8259A与系统的连接方式。若BUF=1,表示采用缓冲方式,此时引脚SP/EN作为8259A的输出信号,在8259A与CPU之间传输数据时,SP/EN使数据总线驱动器启动;若BUF=0,表示采用非缓冲方式,引脚SP/EN作为8259A的输入信号,表示8259A不通过总线驱动器和数据总线相连,当8259A为主片时,SP/EN接高电平,为从片时,SP/EN接地。7/22/2024352D2D2(M/SM/S) 级联方式设置。在缓冲方式下用来表示本片是主片还是从片。即BUF=1时,如果N/S为1,则表示本片是主片;如N/S为0,则表示本片是从
303、片。当BUF=0时,M/S不起作用,可为1,也可为0。D1D1(AEOIAEOI) 中断结束方式设置位。如AEOI=1,则设置为中断自动结束方式。在这种方式,当第二个INTA脉冲结束时,当ISR中的相应位会自动清除。所以,一进入中断,在8259A看来,中断处理的过程似乎就结束了,从而允许其它中断请求进入。D0D0(PMPM):若PM=1,表示当前8259A用于8086/8088系统;若PM=0,则表示当前8259A用于8080或8085系统。7/22/2024353(2)操作命令字及其编程 操作命令字(OCWOCW,Operation Command Word )共有三个,分别为OCW1OCW
304、3,每个命令字长度也是一个字节。在CPU对8259A进行初始化编程后,8259A就进入了工作状态,它可以接收来自IR端的中断请求。操作命令字可以在此后的任何时候写入,没有固定的顺序,且可多次改变,以根据程序进展情况变更一些操作方式。 1) OCW1 OCW1用来设置中断源的屏蔽状态,OCW1的内容直接写入中断屏蔽寄存器IMR的相应位中,用来对IRR送如的请求信号进行屏蔽。IMR的内容可以读出,供CPU了解当前中断的屏蔽情况。 OCW1必须写入奇地址端口,即A0=1。具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 M7 M6 M5 M4 M3 M2 M1 M0 1:屏蔽由IRI端
305、引入的中断请求 0:允许由IRI端引入的中断请求 7/22/2024354例 设OCW1=06H,表示IR1和IR2两引脚上的中断请求 被屏蔽,其它的中断请求(IR0、IR3IR7)得到允 许。8259A的编程指令为: MOV AL,00000110B ;OCW1屏蔽字 OUT 21H,AL ;屏蔽字写入奇地址口的OCW1寄存器 2) OCW2 OCW2是用来设置优先级循环方式和中断结束方式的操作命令字。要求写入偶地址端口,即A0=0。具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 R SL EOI 0 0 L2 L1 L0 7/22/2024355 SL=1 中断请求级别 L
306、2 L1 L0 0 0 0 0 0 0 1 1 0 1 0 2 0 1 1 3 1 0 0 4 1 0 1 5 1 1 0 6 1 1 1 7D7D7(R R,RotationRotation) 用来规定中断优先级是否设置为循环方式。D7=1,表示采用优先级循环方式; D7=0,为非循环方式。7/22/2024356D6D6(SLSL,SelectSelect) 用来规定OCW2中的L2、L1、L0是否有效。D6=1,表示D2D0(L2、L1、L0)有效;D6=0,表示无效。D5D5(EOIEOI,End Of InterruptEnd Of Interrupt) 中断结束命令位。D5=1,使
307、中断服务寄存器ISR中的对应位ISn复位。如前所述,如果ICW4中的D1(AEOI)位为1,则在第二个中断响应脉冲INTA结束后,8259A会自动清除当前中断服务寄存器ISR中的对应位ISn,即采用中断自动结束方式。如果AEOI为0,则ISn位就要用EOI命令来清除。EOI命令就是通过OCW2的D5位设置的。D4D3 D4D3 D4D3=00,OCW2的标志位。D2D2D0D0(L2L2、L1L1、L0L0) 当SL=1时,用于指示该操作字所涉及的是哪一级中断。例如:当R=0、SL=1、EOI=1,即OCW2给出的是特殊的中断结束命令时,L2、L1和L0指出具体应清除ISR中的哪一位;当R=1
308、、SL=1、EOI=1,即OCW2给出的是特殊的中断结束方式时的循环命令时,L2、L1和L0指出循环开始时哪个中断的优先级最低;当R=1、SL=1、EOI=0,即OCW2给出的是优先级设定命令时,L2、L1和L0指出哪个中断的优先级最低。7/22/2024357表7-11列出了D7D5位在不同的编码下OCW2完成不同的功能。 D7 D6 D5 功 能 R SL EOI 0 0 1 一般的中断结束命令 (Nonspecific EOI command) 0 1 1 特殊的中断结束命令 (Specific EOI command) 1 0 1 一般的中断结束方式时循环命令 (Rotate on n
309、onspecific EOI command) 1 0 0 中断自动结束方式时设置循环命令 (Rotate in automatic EOI mode (Set) 0 0 0 中断自动结束方式时撤消循环命令 (Rotate in automatic EOI mode (Clear) 1 1 1 特殊的中断结束方式时循环命令 (Rotate on specific EOI command) 1 1 0 优先级设定命令(Set priority command) 0 1 0 无操作(No operation)7/22/2024358例 如果8086系统中8259A的优先级顺序为IR3,IR4,IR
310、5,IR6,IR7,IR0,IR1,IR2,试编写一程序段实现该优先顺序,设8259A的偶地址为20H。 OCW2: R SL EOI 0 0 L2 L1 L0 1 1 0 0 0 0 1 0 MOV AL,0C2H ;OCW2 OUT 20H,AL ;把OCW2写入8259A的偶地址端口例 试编写一程序段,用以清除8086系统中8259A的IR6,设8259A的偶地址为20H。 OCW2: R SL EOI 0 0 L2 L1 L0 0 1 1 0 0 1 1 0 MOV AL,66H ;OCW2 OUT 20H,AL ;把OCW2写入8259A的偶地址端口7/22/2024359 3) O
311、CW3 操作命令字OCW3有三个功能:设置和撤消特殊屏蔽方式、设置中断查询方式、设置对8259A内部寄存器的读出命令。要求写入偶地址端口,即A0=0。具体格式如下: D7 D6 D5 D4 D3 D2 D1 D0 0 ESMM SMM 0 1 P RR RIS D6 D6(ESMMESMM) ESMM称为特殊屏蔽方式(Special Mask Mode)控制位,是允许SMM位起作用的控制位。ESMM=1时,SMM的设置有意义; ESMM=0时,SMM的设置无意义。 D5D5(SMMSMM) SMM称为设置特殊屏蔽方式位。SMM=1时,设定为特殊屏蔽方式;SMM=0时,设定为一般屏蔽方式。 特殊
312、屏蔽方式是8259A为了响应较低优先级的中断请求而提供的一种功能。CPU要先向8259A发出一个特殊屏蔽字,使8259A处于特殊屏蔽状态,才能中断当前的中断处理程序,转去响应较低优先级的中断请求;当较低优先级的中断处理完毕返回原程序的断点时,要发出撤消特殊屏蔽字,以恢复原来的嵌套顺序。设置和撤消特殊屏蔽方式就是由OCW3的D6、D5位实现的。当D6D5=11时,将8259A设置为特殊屏蔽方式;当D6D5=10时,撤消特殊屏蔽方式。7/22/2024360 例 如D2、D1、D0三位均为0,则设置的特殊屏蔽 方式字OCW3=68H,撤消特殊屏蔽方式字OCW3=48H。 D4D3 D4D3 D4D
313、3=01,OCW3的标志位。 D2D2(P P)中断查询方式位。当P=1时,表示向8259A发出查询命令。这时,8259A所接各中断源不再通过INT提出中断申请,而改由CPU向8259A读取中断请求的办法来判定是否需要服务。读取的方法与读状态时相似,即先写OCW3,使其中的P位为1,然后对同一端口地址进行一次读操作(用IN指令),CPU便可得到8259A提供的查询字。查询字反映了当前有无中断请求,以及中断请求中优先级最高的是哪一个。8259A的查询字格式如下: D7 D6 D5 D4 D3 D2 D1 D0 IR W2 W1 W0 IR=1表示有中断请求 000:IR0 001:IR1 当前中
314、断请求的最高优先级 111:IR7 7/22/2024361例 假设8259A的IR2输入引脚上有中断请求,但此时8086CPU内部的IF=0,8086CPU应如何知道8259A的IR2引脚上有中断请求? 答:可用中断查询方式来解决,CPU先发一个查询命令OCW3,然后接收8259A的查询字。 OCW3: 0 ESMM SMM 0 1 P RR RIS 0 0 0 0 1 1 0 0 程序如下: MOV AL,OCH ;P=1 OUT 20H,AL ;输出查询命令,即将OCW3写入 8259A的偶地址端口 IN AL,20H ;读8259A的查询字 7/22/2024362D1(RR, Rea
315、d Register)D1(RR, Read Register) 读寄存器命令。RR=1,表示CPU要求读取8259A中某寄存器内容。D0(RIS, Read ISR)D0(RIS, Read ISR) 用来为读寄存器命令确定读取对象。RIS=0,表示要求读IRR的内容;RIS=1,表示要求读ISR的内容; 若D1D0=10,安排一条IN指令,可将8259A中IRR的内容读到CPU的累加器中。若D1D0=11,安排一条IN指令,可将8259A中ISR的内容读到CPU的累加器中。 如果CPU要读取当前IMR的内容,则不必设置RR、RIS的状态,只要把端口地址设置为奇地址,即A0=1,然后直接安排
316、一条IN指令,便可将IMR的内容读到CPU的累加器中,这种情况实际上与OCW3控制字无关,可在程序的任何位置安排IN指令来实现。7/22/2024363例7-24 试编写一段程序,将8086系统中8259A的IRR、ISR、IMR三个寄存器的内容读出,并送入存储器0080H开始的单元中。设8259A的偶地址为20H,奇地址为21H。 MOV AL,OAH ;OCW3=0AH,要读IRR OUT 20H,AL ;将OCW3写入8259A的偶地址端口 IN AL,20H ;读回IRR的内容 MOV OO80H,AL;将IRR内容送入存储器0080H单元 MOV AL,OBH ;OCW3=0BH,要
317、读ISR OUT 20H,AL ;将OCW3写入8259A的偶地址端口 IN AL,20H ;读回ISR的内容 MOV OO81H,AL;将ISR内容送入存储器0081H单元 IN AL,21H ;读回IMR的内容 MOV OO82H,AL;将IMR内容送入存储器0082H单元7/22/20243645. 8259A在IBM PC/XT 机中的应用 在IBM PC/XT微型计算机中只用一片8259A,可连接8个外部中断源其连接方法如图7-26所示。 图图7-26 8259A7-26 8259A在在IBM PC/XT IBM PC/XT 中的应用中的应用7/22/2024365 下表列出了各中断
318、源的类型码及中断服务程序的入口地址等。 8259A的8个输入端在XT机中称为IRQ0IRQ7。其中IRQ0接至系统板上的计数器/定时器Intel 8253通道0的输出信号OUT0,用作微机系统的日时钟中断请求;IRQ1是键盘接口电路送来的请求信号;IRQ2是系统保留的;另外五个请求信号接至I/O通道,由I/O通道扩充板电路产生。在I/O通道上,通常IRQ3用于第二个串行异步通信接口,IRQ4用于第一个串行异步通信接口,IRQ5用于硬件适配器,IRQ6用于软件适配器,IRQ7用于并行打印机。7/22/2024366 系统分配给8259A的I/O端口地址为20H和21H,8259A采用边沿触发方式
319、、缓冲方式、一般的中断结束方式,中断优先级管理采用全嵌套方式。则8259A的初始化程序段为: MOV AL,13H ;写入ICW1,上升沿触发,单片 8259A,IC4=1 OUT 20H,AL MOV AL,08H ;写入ICW2,中断类型码高五位为 00001B OUT 21H,AL MOV AL,0DH ;写入ICW4,采用全嵌套方式、缓冲 方式和一般的中断结束方式 MOV 21H,AL 在完成初始化编程后,8259A就准备接受外部中断请求了。操作命令是在此基础上,为一些特定工作方式的需要而进行的写入操作,不需要按时间先后次序进行。7/22/2024367 如果要求只允许时钟和键盘中断起
320、作用,可以用OCW1命令对有关位进行屏蔽操作: MOV AL,0FCH OUT 21H,AL 又如:如果8259A被设置成一般的中断结束方式,则在每次中断结束前要对8259A进行中断结束操作,使片内有关位复位,就可以用OCW2中的D5位(EOI)进行置位来控制: MOV AL,20H ;写入OCW2,向8259A发一般的中 断结束命令 OUT 20H,AL7/22/202436868259A在IBM PC/AT 机中的应用 在IBM PC/AT微机系统中采用的是80286CPU。此系统中的外部可屏蔽中断源除了图7-26中的7个中断源外,还有实时时钟、INT 0AH、80287协处理器和第二个硬
321、磁盘等,因此外部中断源数大于8个,故系统中采用二片8259A组成中断系统。其中主片8259A的功能与图7-26例中相同,而从片8259A则管理其它中断源,从片的中断请求信号INT与主片的IR2输入端相连,两片8259A的CAS0CAS2依次连接,主片的CAS0CAS2输出信号,从片作为输入。 在IBM PC/AT机中两片8259A的连接图如图7-27所示。若采用全嵌套方式管理外部中断源时,优先级排列顺序从高到低依次为IRQ0、IRQ1、IRQ9、IRQ10、IRQ15、IRQ3、IRQ4、IRQ5、IRQ6、IRQ7。 7/22/2024369 图图7-27 8259A7-27 8259A在在
322、IBM PC/AT IBM PC/AT 机中的应用机中的应用7/22/2024370三三DMADMA和和DMADMA控制器控制器8237A8237A 前面介绍了常用的数据输入输出方式。这些方式适用于慢速及中速外设的数据交换。当高速外设要与微机内存进行快速数据交换时,无论采用查询方式还是中断方式,传输速率都还嫌不够高。中断方式虽然高些,但每进入一次中断处理程序,CPU都要保护断点和标志,在中断处理程序中,通常有一系列保护寄存器和恢复寄存器的指令,这些指令和数据传送没有直接关系,但在执行时,却要CPU花费不少时间;还有,对于CPU来说,本来取指令和执行指令分别由BIU和EU两个部件完成,它们并行地
323、工作,即EU在执行指令时,BIU把下面要执行的指令取到指令队列中,但一旦进入中断,指令队列就要清除,EU需等待BIU把中断处理子程序中的指令取到指令队列中才开始执行程序;同样,返回断点时,指令队列也要清除,EU要需等待BIU重新装入断点处的指令后才开始执行程序,这使并行工作机制失去功能。从上述几方面可以说明中断方 式下的传输效率仍不够高。在查询方式和中断方式中,7/22/2024371 还存在另外一个影响传输速度的愿因,即它们都是按字节或字来进行传输的。因此,为了提高传输速率,就得改变传输方式,实现按数据块传输,这就是直接存储器传输方式,即DMA方式。 在DMA方式下,外设利用专用的接口电路直
324、接和存储器进行高速数据传送,而并不经过CPU。这样,传输时就不必进行保护现场之类的额外操作,数据的传输速度基本上取决于外设和存储器的速度。实现这种传输的专门硬件电路称为DMA控制器(DMAC)。在利用DMA进行数据传输时,当然要用到系统的数据总线、地址总线和控制总线,但这些总线原来是由CPU管理的,现在则要求CPU让出总线,即把总线控制权交给DMA控制器。 Intel 8237A是一种高性能可编程DMA控制器,它可实现外设直接访问系统的存储器,还提供了从存储器到存储器的传送能力和许多其它功能,其传输数据的速率高达1.6M字节/秒,并允许在程序控制下实现动态控制,从而优化了系统。7/22/202
325、43721. DMA的工作过程 PC机中DMA的工作流程大致如图7-28所示。 图图7-28 DMA7-28 DMA操作流向图操作流向图7/22/2024373其过程如下:1)当外设准备就绪,希望进行DMA操作时,便向DMAC发出DMA传送请求DREQ。2)DMAC通过连接到CPU的HOLD信号向CPU提出DMA请求。3)CPU在完成当前总线周期后会立即对DMA请求作出响应。CPU的响应包括两个方面:一方面CPU将数据总线、地址总线和控制总线置于高阻,即CPU放弃对总线的控制权;另一方面,CPU将有效的HLDA信号加到DMAC上,以此来通知DMAC,CPU已放弃了对总线的控制权。4)CPU放弃
326、对总线的控制权后,DMAC即开始对总线实施控制并向外设送出DMA的应答信号DACK。5)DMAC送出地址信号和控制信号,实现外设与内存或内存与内存的数据传送。6)DMAC将规定的数据字节传送完之后,通过向CPU发HOLD信号,撤消向CPU的DMA请求。CPU收到此信号,一方面使HLDA无效,另一方面又重新开始控制总线,实现正常的运行。 7/22/2024374 图7-28中虚线表示DMA操作时的信号流向。在DMA传送时,DMAC送出地址和控制信号,而数据传送是直接在接口和内存间进行的,并不经过DMAC。对于内存和内存间的DMA传送,应先将数据由内存读出,放在DMAC的內部数据暂存器中,再利用一
327、个DMA存储器写周期将该数据写到内存的另一区域。7/22/2024375五可编程计数器五可编程计数器/ /定时器定时器82538253 8253可编程计数器/定时器是Intel公司生产的微机通用外围芯片之一。每片有三个独立的结构相同的16位计数器,每个计数器都可以按照二进制或BCD码计数,最高计数速率可达2MHZ;每个计数器有六种工作方式,可由程序设置和改变,所有的输入和输出均与TTL兼容。1基本工作原理 图7-31是8253每个计数器的逻辑原理框图。通过对控制字寄存器(8位)的设置来选择不同的工作方式。计数初值寄存器CR(16位)和计数输出锁存器OL(16位)占用同一个I/O端口地址,CPU
328、用输出指令向CR预置初值,用输入指令读回OL的数值,CR和OL都没有计数功能,只起锁存作用;计数执行单元CE(16位)执行计数操作,其操作方式受控制寄存器控制。通常CE接收来自CR的初值,对CLK信号减1计数,把结果送到OL中锁存,当减到0时,通过OUT引脚输出信号,表明CE已为0。当CLK是一个周期性时钟信号时,7/22/2024376 计数器就成了定时器;当CLK是一个非周期性事件计数信号时,此时呈计数器功能。OL通常跟随CE的内容而变化,当OL接收到CPU发来的锁存命令时,就锁定当前的计数值,而不再跟随CE变化,直到CPU从中读取锁存值后,才恢复到跟随CE变化的状态。 图7-31 逻辑原
329、理图7/22/20243772. 内部结构和引脚信号 8253的引脚和内部结构如图7-32和7-33所示。 7/22/2024378(1) 数据总线缓冲器 这是8253与CPU数据总线连接的八位双向三态缓冲器。CPU用输入输出指令对8253进行读写的所有信息都是通过数据总线缓冲器传送的,包括: 1) CPU在初始化编程时,写入8253的控制字。 2) CPU向计数初值寄存器CR写入计数初值。 3) CPU从计数输出锁存器OL读取计数值。(2) 读/写逻辑 这是8253内部操作的控制部分。其中包括片选信号CS的控制部分,当CS为高电平时,数据总线缓冲器处于三态,与系统的数据总线脱开,故不能进行编
330、程,也不能进行读写操作。其次,由这部分选择读/写操作的端口(三个计数器及控制字寄存器),控制数据传送的方向;读:数据由8253CPU; 写:数据由CPU8253。 A0、A1是地址输入线,通常接到地址总线的A0、A1。用于8253内部四个端口(三个计数器和一个控制字寄存器)的选择。端口选择如表7-15所示。 7/22/20243797/22/2024380(3) 控制字寄存器 在8253的初始化编程时,由CPU向控制字寄存器写入一个控制字,以决定通道的工作方式等,此寄存器只能写入而不能读出。(4) 计数器0、计数器1、计数器2 这是三个计数器/定时器通道,其工作原理如前页所述。每一通道有三个引
331、脚: 1) CLK 计数输入。此脚用于输入定时脉冲或计数脉冲,可以是系统的时钟脉冲,也可以由其它脉冲源提供。计数器就是对这个脉冲计数。 2) OUT 输出信号。当计数到0时,通过OUT引脚输出信号,六种工作方式有不同的输出波形。 3) GATE 门控输入。这是控制计数器工作的外部信号。当GATE引脚为低电平时,禁止计数器工作;高电平时才允许计数器工作。两个或两个以上计数器连用时,可用此信号来同步,也可用于外部某信号的同步。7/22/20243813控制字及其设置 控制字规定了8253的工作方式。其格式如下图所示。7/22/2024382(1)计数器选择(D7D6) 控制字的最高两位D7D6决定
332、这个控制字是哪一个通道的控制字。由于三个通道的工作是完全独立的,所以需要三个控制字寄存器分别设定相应通道的工作方式,但它们的地址是同一个,即A1A0=11所对应的地址(控制字寄存器的地址),由D7D6两位来决定哪一个通道。因此,对三个通道的编程需要向同一个地址写入三个控制字,由D7D6两位指定不同的通道。(2)读/写格式(D5D4) CPU向计数通道写入初值和读取它们的当前状态时。根据写入的是8位数据还是16位数据,有几种不同的格式,由D5D4位区分。若是8位数据,则令D5D4=01,这样就只写低8位,高8位自动清0。若是16位数据,有两种情况,若D5D4=11,就先写入低8位,后写入高8位;
333、若D5D4=10,就只写入高8位,低8位自动清0。若D5D4=00,则对当前计数值进行锁存操作,使当前计数值在输出锁存器中锁定,以便读出。7/22/2024383 (3)工作方式(D3D2D1) 8253的每个通道可以有六种不同的工作方式,由D3D2D1三位决定采用哪一种方式,各种方式的输出波形不同。(4)数制选择(D0) 8253的每个通道有两种计数制:二进制和BCD码,由D0位区分。若D0=0,采用二进制计数,写入初值的范围为0000HFFFFH,其中0000H是最大值,表示65536。若D0=1,采用BCD码,写入初值的范围为00009999,其中0000是最大值,表示10000。因为计
334、数器是先减1,再判断是否为0,所以写入0实际代表最大的计数值。7/22/20243844. 工作方式 下面将分别说明六种方式的操作功能。图7-34图7-39分别给出了各种方式的输入输出波形。图中有些共同问题先予以说明: (1) 图中的WR波形中的负脉冲表CPU执行输出指令时产生的写信号,在以下六种方式的讨论中都假设向计数器0写入信息,WR波形中的CW(Control Word)表示向计数器0写入的控制字节。例:CW=10,等号右边的数字是十六进制的,表示设置计数器0为工作方式0,只读/写低位字节,采用二进制。 (2) LSB表示低8位计数值,LSB=4表示写入CR的低位字节是常数4。 (3)
335、CLK脉冲指的是在CLK输入端从脉冲的上升边算起到下降边的过程。 (4) 触发信号指的仅仅是GATE输入端上信号的上升边沿,每出现一次上升边意味着有一个触发信号,与上升边之后的高电平持续时间长短无关。 (5) 计数器装入指的是从CR向CE的一次数值传送。 (6) OUT波形下的数字表示计数工作单元内的值,数之间的虚线表示数值变化的瞬间。7/22/2024385(1)方式0(计数结束中断方式,Interrupt on Terminal Count)方式0的工作时序如下图所示。 1) 计数过程 当写入方式0控制字CW后,OUT立即变为低电平,作为初始电平,在计数过程中始终维持低电平。要开始计数,G
336、ATE必须为高电平,并要写入计数初值。写入计数初值后,当CLK第一个下降沿到,计数初值装入计数工作单元CE,随后每一个CLK脉冲下降沿到,计数器就减1,当减到0时,OUT输出变为高电平,并一直保持到重新装入计数值或重新设置工作方式为止。方式0的特点是计数只计一遍。当计数到0时,不再重新计数,OUT保持高电平。7/22/2024386 2) GATE信号的影响 在计数过程中,可由门控信号GATE控制暂停。当GATE为低电平时,计数暂停;当GATE变高后又恢复计数。7/22/2024387 3) 新的初值对计数过程的影响 计数过程中若改变计数值,若新写入的计数值是8位的,计数器将按新的计数值重新开
337、始计数,如下图所示。如是16位的,在写入第一个字节后,计数器停止计数,写入第二个字节后,计数器按新的16位数值立即重新开始计数。新的计数初值是立即有效的。7/22/2024388 (2)方式1(可编程单稳态触发器,HardwareRetriggerable One-Shot)方式1由外部门控信号GATE的上升沿触发,产生一个单拍负脉冲信号。 1) 计数过程 如下图所示。写入方式1控制字CW后,OUT输出高电平(若原为低,则由低变高),作为初始电平。再写入计数初值(设为N,图中为3),这时计数器并不开始计数,而要等到GATE加入触发信号并经过一个CLK脉冲,OUT输出变低,计数才开始,直到计数到
338、0,OUT输出才变高。因此,输出为一单拍负脉冲,宽度为N个CLK周期。实际上这是一种单稳态工作方式,即单稳态触发器。7/22/2024389 2) GATE信号的影响 在计数结束后,若再次由GATE信号触发启动,可再输 出一个同样宽度的单拍脉冲,而不用再送一次计数值。 如果在计数过程中,又来了一个GATE信号,则经过一个 CLK脉冲,从初值开始重新计数,即中止原来的计数过 程,开始新的一次计数,实际上使输出加宽。 3) 新的初值对计数过程的影响 如果在计数过程中写入新的计数值初值,不会立即影 响计数过程。只有下一个GATE信号到来后,再隔一个 CLK周期,才终止原来的计数过程,按新的计数值开始
339、 计数。若计数结束前没有GATE信号,则原来计数过程正 常结束。即新的计数值下次有效。7/22/2024390 (3)方式2(频率发生器,分频器,Rate Generator) 方式2的工作时序如下图所示。这种方式的输出是按照计数值N分频后产生的连续脉冲。 1) 计数过程 写入方式2控制字CW后,OUT输出高电平,作为初始电平。再写入计数初值(设为N,图中为3),计数器将立即自动对CLK计数。在计数过程中OUT保持为高,直到计数器减到1时,OUT变低,减到0时,OUT输出又恢复为高,且计数器从初值开始重新计数。7/22/2024391 方式2的最大特点是能够连续工作,每输入N个CLK脉冲,就输
340、出一个CLK周期宽的负脉冲,如上图所示。实际上这是一种N分频的计数器,正脉冲为N-1个时钟脉冲宽度,负脉冲为1个时钟脉冲宽度。 在方式2中,计数器既可以由软件启动,也可以由硬件启动。软件启动就是上述由写入计数初值实现的,而硬件启动则是由外部输入到GATE端的上升沿脉冲实现的,此时GATE在低电平时停止计数过程。 2) GATE信号的影响 计数过程可由GATE信号控制,GATE信号为低电平时暂停计数,而由低电平恢复为高电平时,重新开始计数。 3) 新的初值对计数过程的影响 如果在计数过程中写入新的计数初值,且GATE信号一直维持高电平,则新的初值不会立即影响当前的计数过程。但从计数结束后的下一个
341、计数周期开始,将按新的计数值开始计数,即新的计数值下次有效。7/22/2024392(4)方式3(方波发生器,Square Wave Mode) 方式3与方式2工作类似,区别仅在于方式3输出的是方波或基本对称的矩形波。 1) 计数过程 写入方式3控制字CW后,OUT输出高电平,再写入计数初值(设为N),计数器将立即自动对CLK计数,OUT保持为高。当计数到N/2时,OUT变低,计数到0时,OUT输出恢复为高,且计数器从初值开始重新计数。方式3和方式2一样,能够连续工作。方式3的输出一半时间为高电平,一半时间为低电平。 若计数初值N为偶数,OUT端输出的波形是连续的方波。 若N为奇数,则OUT端
342、输出有(N+1)/2个CLK脉冲周期为高,(N-1)/2个CLK脉冲周期为低,OUT为高比为低多一个CLK周期时间。 7/22/2024393与方式2一样,方式3计数器既可以由软件启动,也可以由硬件启动。 2) GATE信号的影响 GATE为高,允许计数;GATE为低,禁止计数。如果在输出OUT为低电平期间,GATE变低,OUT将立即变高,停止计数。当GATE变高以后,计数器将重新装入初始值,重新开始计数。 3) 新的初值对计数过程的影响 如果在计数过程中写入新的计数初值,且GATE信号一直维持高电平,则新的初值不会立即影响当前的计数过程。从计数结束后的下一个计数周期开始,将按新的计数值开始计
343、数,即新的计数值下次有效。 若写入新的计数值后,遇到GATE的上升沿,计数器将在下一个CLK脉冲时装入新的计数值并以这个计数值开始计数。7/22/2024394(5)方式4(软件触发选通方式,Software Triggered Strobe) 1) 计数过程 写入方式4控制字CW后,OUT输出高电平(若原为低,则由低变高),作为初始电平。当写入计数初值后立即开始计数(相当于软件启动),当计数到0,OUT变低,经过一个CLK周期,OUT又变高。计数器停止计数。这种方式计数也是一次性的,只有在输入新的计数值后,才能开始新的计数。过程下图所示。7/22/2024395 2) GATE信号的影响 G
344、ATE为高,允许计数;GATE为低,禁止计数。所以要做到软件启动,GATE应保持高电平。 3) 新的初值对计数过程的影响 如果在计数过程中写入新的计数值初值,则按新的计数值重新开始计数,即新的计数值是立即有效的。7/22/2024396(6)方式5(硬件触发选通方式,Hardware Triggered Strobe) 1) 计数过程 写入方式5控制字CW后,OUT输出高电平(若原为低,则由低变高),作为初始电平。再写入计数初值,这时计数器并不开始计数。要由GATE信号的上升沿触发启动,开始计数,计数到0时,OUT输出变低,经过一个CLK周期,输出恢复为高,停止计数。要等下次GATE信号的触发
345、才能再计数。过程如下图所示。7/22/2024397 2) GATE信号的影响 若在计数过程中,又来了一个GATE信号的上升沿,则立即终止当前的计数过程,从初值开始重新计数。 3) 新的初值对计数过程的影响 如果在计数过程中写入新的计数初值,不会立即影响当前的计数过程。只有下一个GATE信号到来后,才按新的计数值开始减1计数,即新的计数值在下一个GATE信号上升沿触发后有效。但若在写入了新的计数初值后,在未计数到0之前,有新的GATE信号触发,则立即按新的计数值重新开始计数。7/22/2024398六种工作方式的比较六种工作方式的比较 方式2、4、5的输出波形是相同的,都是宽度为一个CLK周期
346、的负脉冲,但方式2是连续工作的,方式4由软件(设置计数值)触发启动,而方式5由门控脉冲GATE触发启动。 方式1和方式5基本相同,都由门控脉冲GATE触发启动,均输出负脉冲,但波形不同。方式1在计数过程中输出为低电平,输出的宽度为N个CLK周期。而方式5在计数过程中输出为高电平,输出负脉冲的宽度为1个CLK周期。 六种方式中,在写入控制字后,只有方式0的输出为低电平,其它五种均为高电平。写入控制字后,实际上只规定了工作方式,计数器并没有开始计数,这一点六种方式是一样的。随后必须写入计数值。方式0、2、3、4在写入计数值后开始计数;而方式1、5在写入计数值后,还要等待门控脉冲GATE启动,才开始
347、计数。 六种方式中,只有方式2和方式3是连续计数,其它四种方式都是一次计数,要继续计数,需要重新启动,方式0和方式4由写入计数值启动(软件启动),方式1和方式5由门控信号启动(硬件启动),方式2和方式3软、硬件都可启动。7/22/20243995应用实例 例7-27 图7-40 所示8253时钟信号的频率为8kHZ,要求每隔10ms给出一个中断请求信号。现采用定时器0来实现这一要求。将CLK0接到系统的8kHZ时钟上,设8253的端口地址为200H203H, 图7-40 8253用作定时器 7/22/2024400 图中由于要求OUT0每隔10ms发出连续信号,故应采用方式2。 确定计数初值如
348、下: CLK=8kHZ, 则T=1/CLK=0.125ms, 故计数初值 N=10ms/0.125ms=80=50H. 初始化程序段如下: MOV DX,203H ;控制字寄存器地址 MOV AL,00010100B ;定时器0,写入初值低8位, 高8位清0,方式2,二进制计数 OUT DX,AL ;写入方式控制字 MOV DX,200H ;计数器0地址 MOV AL,50H ;计数初值 OUT DX,AL ;写入计数初值7/22/2024401 例7-28 图7-41利用8253的计数器1记录外部事件的发生次数,在CLK1端每输入一个脉冲表示事件发生一次。计数满1250次后就由OUT1向CP
349、U发出中断请求,设8253的端口地址为80H83H。 图7-41 8253用作计数器7/22/2024402 根据题意,选择方式0可以满足要求,计数初值为N=1250。初始化程序段如下:MOV AL,01110001B ;计数器1,先写入初值低8位,再 写入高8位,方式0,BCD码计数。OUT DX,AL ;写入方式控制字MOV AL,50H ;写入计数初值低8位OUT 81H,ALMOV AL,12H ;再写入计数初值高8位OUT 81H,AL 值得注意的是,如采用BCD码计数,写入指令中的计数值仍需写成16进制数,如本题中的1250,需分别写为50H和12H。7/22/2024403 例7
350、-29 若加到8253的时钟频率为1MHZ,现要求每隔1分钟产生一次定时中断,应如何处理?设8253的端口地址为FF04HFF07H。 每隔1分钟即每60秒发出一次信号产生中断,可算出其计数初值为6107,而8253每个通道的最大计数值为65536,因此用一个通道不够。现将两个通道串起来使用,如图7-31所示,计数器1采用方式3,计数初值N1=7500;计数器2采用方式2,计数初值N2=8000;N1N2=6107,可满足要求。 图7-42 两个通道的串联使用7/22/2024404初始化程序段如下: MOV DX,FFO7H ;控制字寄存器地址 MOV AL,01110111B ;计数器1,
351、先写入初值低8位,再写入高8 位,方式3,BCD码计数 OUT DX,AL ;写入计数器1方式控制字 MOV DX,FF05H MOV AL,00H ;写入计数器1计数初值低8位 OUT DX,AL MOV AL,75H ;写入计数器1计数初值高8位 OUT DX,AL MOV DX,FFO7H ;控制字寄存器地址 MOV AL,01110111B ;计数器2,先写入初值低8位,再写入高8 位,方式2,BCD码计数 OUT DX,AL ;写入计数器2方式控制字 MOV DX,FF06H MOV AL,00H ;写入计数器2计数初值低8位 OUT DX,AL MOV AL,80H ;写入计数器2
352、计数初值高8位 OUT DX,AL7/22/2024405例7-30 8253在IBM-PC机中的应用 在IBM-PC机的系统板上使用一片8253,其三个计数器均用作系统所需的定时信号。三个计数器的CLK引脚的时钟频率均为1.19318MHZ,它是外设时钟PCLK经二分频产生的。系统分配给8253的端口地址为040H043H,整个系统如图7-43所示。7/22/2024406三个计数器的功能如下: 1)计数器0用作定时器产生实时日时钟信号,工作于方式3,计数初值为0,采用二进制计数方式,输出端OUT0作为中断请求信号IRQ0,连接到8259A的IR0端。计数器0预置的计数初值为0000H,即6
353、5536。这样OUT0端输出1.19318MHZ65536=18.2HZ的方波,方波的周期约为55ms,也就是说计数器0每隔55ms产生一次中断请求。CPU以此作为时间基准,在中断服务程序中对该中断次数进行计数,从初值0000H开始加1计数,当计满产生进位时,表示已产生了65536次中断,所经过的时间约为65536/18.23600秒=1小时,实际是3599.98155秒。对计数器0的初始化程序段: MOV AL,00110110B ;计数器0,先写低8位,再写 入高8位,方式3,二进制数。 OUT 43H,AL ;写入方式控制字 MOV AL,0 ;计数初值为65536 OUT 40H,AL
354、 ;先写入计数初值低8位 OUT 40H,AL ;再写入计数初值高8位7/22/2024407 2)计数器1用来产生动态RAM刷新操作的定时控制信号。它工作于方式2,计数初值为18,OUT1端输出一个负脉冲序列,其周期为181.19318MHZ=15.08s。该信号将作为DMA控制器8237A中通道0的DMA请求信号DREQ0,控制8237A完成每隔15.08s对系统的动态RAM进一行刷新操作。对计数器1的初始化程序段: MOV AL,010110110B ;计数器1,只写入初值低8位, 方式2,二进制计数。 OUT 43H,AL ;写入方式控制字 MOV AL,18 ;计数初值为18 OUT
355、 41H,AL ;写入计数初值低8位 7/22/2024408 3)计数器2输出约900HZ的方波信号,用来控制系统中的扬声器发声,作为报警信号或伴音信号。它也工于方式3,计数初值为0533H,GATE2接到系统板8255芯片的PB0,作为扬声器发声时间的控制信号。当GATE2为高电平时,OUT2端将输出频率为1.19318MHZ1331=896HZ的方波信号,该方波经功率放大器75477放大与滤波后驱动扬声器发声;当GATE2为低电平时,计数器2停止工作,OUT2端无方波信号输出。 7/22/2024409对计数器2的初始化程序段: MOV AL,10110110B ;计数器2,先写低8位,
356、再写高8 位,方式3,二进制计 数。 OUT 43H,AL ;写入方式控制字 MOV AX,0533H ;计数初值1331 OUT 42H,AL ;先写入计数初值低8位 MOV AL,AH OUT 42H,AL ;再写入计数初值高8位 IN AL,61H ;读8255端口B原输出值,61H是PB 口的端口地址 MOV AH,AL ;存于AH寄存器 OR AL,03H ;将PB0和PB1均置1 OUT 61H,AL ;输出使扬声器发声7/22/2024410七可编程串行通信接口芯片七可编程串行通信接口芯片8251A8251A Intel 8251A 是通用同步/异步收发器(Universal S
357、ynchronous/Asynchronous Receiver/Transmitter,简写作USART),广泛应用于微型计算机。通过编程,8251A可以工作在同步方式,也可以工作在异步方式。工作于同步方式时,每个字符可用5、6、7或8位来表示,波特率为064Kb/s,同步方式可选择内同步或外同步,内同步方式时,内部能自动检测同步字符,从而实现同步,8251A也允许在同步方式下增加奇/偶校验位进行校验。工作于异步方式时,每个字符也可用5、6、7或8位来表示,用1位作为奇/偶校验,波特率为019.2Kb/s,8251A能在异步方式下自动为每个数据增加起始位和停止位。8251A具有三种错误检测功
358、能:奇偶校验错误、溢出错误和帧格式错误。1. 系统的编程结构 图7-44是8251A的编程结构图,通过该图可对8251A的工作有一个大致的了解。7/22/20244117/22/2024412 图中数据输入缓冲寄存器和数据输出缓冲寄存器使用同一个端口地址,但实际上作为两个端口使用,一个为输入端口,一个为输出端口,不会混淆。 接收移位寄存器将到达RXD端的串行数据接收之后进行移位,变为八位并行数据,传送到数据输入缓冲寄存器,然后通过数据总线传送到CPU;输出时,CPU通过数据总线将数据传送到8251A的数据输出缓冲寄存器,再送入发送移位寄存器。该寄存器用移位的方法将并行数据变为串行数据,然后从T
359、XD端送往外部设备。 控制寄存器用来控制8251A的工作,其内容由程序设置的,状态寄存器则提供状态信息。 方式寄存器的内容决定了8251A工作在同步方式还是异步方式,还决定所接收和发送的字符格式,方式寄存器的内容也是由程序设置的。 图中两个同步字符寄存器用来放入同步方式中所用的同步字符。7/22/202441328251A的引脚和工作原理 8251A的引脚分布和原理框图如图7-45和7-46所示。其中包括8251A同CPU的接口部分数据总线缓冲器和读/写控制逻辑;发送器和接收器及其控制电路,以及产生RS-232C有关信号的调制/解调控制电路。 7/22/2024414 有关信号的作用概述如下:
360、(1)与CPU的连接信号: 1) RESET:复位信号输入线,高电平有效。当这个引脚上出现一个六倍时钟信号宽的高电平信号时,芯片被复位,复位后芯片处于空闲状态直至被初始化编程。 2) CLK:时钟信号输入端,用于产生8251A的内部时序。CLK的频率与数据速率并无直接关系,但是,为了电路能可靠工作,在同步方式下CLK的频率应大于接收/发送时钟的30倍,在异步方式下,则应大于4.5倍。 3) RD、WR:CPU对8251A中的寄存器读、写时的控制信号输入端,均为低电平有效。 4) CS:片选信号输入端,低电平有效。仅当CS为低电平时,CPU才能对8251A操作。 5) C/S:信息类型信号输入端
361、。高电平时,CPU对8251A写控制字或读状态字;低电平时读写的内容是数据。通常,将该端与地址线的最低位相连。于是,8251A就占有两个端口地址,偶地址为数据口地址,奇地址为控制口地址。 7/22/2024415 6) D7D0:八位双向数据线,同片内数据总线缓冲器相连,CPU通过该数据线向8251A写入数据和控制字,以及读数据和状态字。 CPU对8251A的读写操作控制如表7-16所示。7/22/2024416(2)发送器有关信号 1) TXD:发送数据输出线。CPU从这个引脚将并行输出给8251A的数据串行发送出去。 2) TXRDY:发送器准备好信号,高电平有效。如果该信号有效,就表示数
362、据输出缓冲器已空,这时如CTS为低电平,命令字中的TXEN为高电平,CPU可以向芯片送入新的数据。实际使用时,如果8251A和CPU之间采用中断方式联系,则TXRDY可以作为中断请求信号;如果8251A和CPU之间采用查询方式联系,则TXRDY可以作为联络信号,CPU通过读操作便能检测TXRDY,从而了解8251A的当前状态,以决定是否可以往8251A输送一个字符。不管用中断方式还是查询方式,当8251A从CPU得到一个字符后,TXRDY就变为低电平。 3) TXE:发送缓冲器空标志,高电平有效。如果TXE为高电平,表示输出缓冲器中没有要发送的内容;当CPU将数据写入8251A后,TXE变为低
363、电平。 7/22/2024417 4) TXC:发送器时钟,控制发送字符的速度。在同步方式下,TXC的频率等于字符传输的波特率;在异步方式下,TXC的频率等于字符传输波特率的1倍、16倍或64倍,具体倍数取决于8251A编程时指定的波特率因子。(3)接收器有关信号 1) RXD:串行数据输入线。串行数据从这个引脚进入8251A,然后被转变成并行方式。 2) RXRDY:接收器准备好信号,高电平有效。如果该信号有效,就表示当前8251A已经从外设或调制解调器接收到一个字符,正等待CPU取走。在中断方式时,RXRDY可以作为中断请求信号;在查询方式时,RXRDY可以作为联络信号,当CPU从8251
364、A读取一个字符后,RXRDY就变为低电平,等到下一次接收到一个新的字符后,又变为高电平。 7/22/2024418 3) RXC:接收器时钟,控制接收字符的速度。和TXC一样,在同步方式下,RXC的频率等于字符传输的波特率;在异步方式下,RXC的频率等于字符传输波特率的1倍、16倍或64倍。在实际使用时,RXC和TXC往往连在一起,由同一个外部时钟来提供,CLK则由另一个频率较高的外部时钟来提供. 4) SYNDET/BRKDET:同步和间断检测,高电平有效。对于同步方式,SYNDEY是同步检测端。若采用内同步,当RXD端上收到一个或两个同步字符时,SYNDEY输出高电平,表示已达到同步,后面
365、接收到的是便是有效数据;若采用外同步,外同步字符从SYNDEY端输入。对于异步方式,BRKDET用于检测线路是处于工作状态还是间断状态,当RXD端连续收到八个“0”信号,则BRKDET变为高电平,表示当前处于数据间断状态。7/22/2024419(4)MODEM(调制解调器)控制信号 8251A还提供了四个与MODEM相连的控制信号,信号的含义与RS-232C标准相同。 1) DTR(Data Terminal Ready):数据终端准备好。输出信号,低电平有效。 DTR 是由8251A送往外设或调制解调器的,CPU通过命令可以使DTR变为低电平,从而通知外设或调制解调器,CPU已准备就绪。
366、2) DSR (Data Set Ready):数据设备准备好。输入信号,低电平有效。 DSR 是由外设或调制解调器送往8251A的,用来表示外设或调制解调器已准备好,CPU可通过读入状态操作,在状态寄存器的D7位检测此信号。 3) RTS (Request To Send):请求发送,输出信号,低电平有效。 RTS 用于通知外设或调制解调器,CPU已准备好发送。CPU可通过编程,使命令字寄存器的D5位置“1”,将RTS变为低电平,表示CPU已准备好发送。7/22/2024420 4) CTS (Clear To Send):清除发送信号,输入信号,低电平有效。 CTS 是对RTS的响应信号,
367、它是由调制解调器或其它外设送入8251A的。若CTS有效,允许8251A发送数据。 这四个控制信号是给CPU和外设联络用的。因为CPU和外设是不能直接相连的,CPU给外设的控制信号和外设给CPU的状态信号都不能在CPU和外设之间直接传输,而只能通过接口来传递。8251A正是通过这四个信号起联络作用的。其中DTR和RTS是CPU通过8251A传送给外设的控制信号,DSR和CTS是外设通过8251A传送给CPU的状态信号。当外设和DSR端相连时,往此引脚上送一个低电平,就会影响8251A状态寄存器的DSR位,而CPU可通过软件对DSR位检测。CTS端的电平会影响TXRDY端的电平,而TXRDY正是
368、8251A送给CPU的一个状态信号,所以,CTS也起到将外设的状态通知CPU的联络作用。7/22/2024421 在形式上,这四个信号连接在8251A和外设之间,但实际上是在CPU和外设之间起联络作用,这种作用是通过8251A传递之后得到的。使用时,这四个信号中只有CTS必须为低电平,其它三个信号可以悬空不用,也就是说,即便CPU和外设之间不需要传递任何信号(如无条件传送),也要将CTS端接地,因为只有当CTS为低电平时,才能使TXRDY为高电平,而只有当TXRDY为高电平时,CPU才能往8251A发送数据。当然,如果8251A仅仅工作在接收状态,而不需要发送数据,则CTS端也可悬空。 如果C
369、PU通过8251A和一个串行打印机相连,则DTR为低电平时可表示CPU向打印机发送一个选通信号,而DSR为低电平则表示打印机有空,通知CPU可以发送要打印的数据。 当外设只要一对联络信号时,可选其中任意一组,如可用DTR和DSR,也可用RTS和CTS。只有当某个外设要求的联络信号较多时,才把四个信号全用上。在实际使用时,也可用其中的一个信号或三个信号。7/22/202442238251A的发送和接收 (1) 异步接收方式 当8251A工作在异步方式并准备接收一个字符时,就在RXD线上检测低电平,因为没有字符信息时,RXD上为高电平。8251A将RXD线上检测到的低电平作为起始位,并且启动接收控
370、制电路中的一个内部计数器进行计数,计数脉冲就是8251A的接收器时钟脉冲RXC,如RXC的频率等于字符传输波特率的16倍时,则当计到第8个脉冲,即相当于半位(bit)传输时间,又对RXD线进行检测,如此时仍为低电平,则确认收到一个有效的起始位。于是,8251A开始进行常规采样,即每隔一位(相当于RXC的16个脉冲间隔)对RXD进行一次采样。数据进入接收移位寄存器被移位,并进行奇偶校验、去掉停止位,变成了并行数据,再经过内部数据总线送到数据输入缓冲器,同时向CPU发出RXRDY信号,表示已经收到一个可用的数据。对于少于8位的数据,8251A则将其高位填上“0”。 7/22/2024423 在异步
371、接收时,当8251A在检测起始位时,过半位传输时间后,没有再次测到低电平,而是高电平,这时,8251A会把刚才检测到的信号看成干扰脉冲,于是重新开始检测RXD线上是否又出现低电平。 (2) 异步发送方式 在异步发送方式下,发送器为每个字符加上一个起始位,并且按照编程要求加上奇偶校验位以及1个、1.5个或2个停止位。数据及起始位、奇偶校验位、停止位是在发送器时钟脉冲TXC的下降沿时从8251A发出,数据传输的波特率为TXC的1、1/16或1/64,取决于编程时给出的波特率因子。 (3) 同步接收方式 在同步接收方式下,8251A首先搜索同步字符,即监测RXD线,每当RXD线上出现一个数据位,就把
372、它接收下来并送入移位寄存器移位,然后把移位寄存器的内容与同步字符寄存器的内容进行比较,如果两者不相等,则接收下一个数据,并重复上述比较过程。当两个寄存器内容相同时,8251A的SYNDEY引脚就变为高电平,以表示同步字符已找到,同步已经实现。 7/22/2024424 有的时候,采用双同步字符方式。在这种情况,在测得输入移位寄存器的内容与第一个同步字符寄存器的内容相同后,再继续检测此后的输入移位寄存器的内容与第二个同步字符寄存器的内容是否相同。如不同,则重新比较输入移位寄存器的内容与第一个同步字符寄存器的内容。如相同,则认为同步已经实现。 在外同步情况下,和上面的过程有所不同,因为这时是通过同
373、步输入端SYNDET加一高电位来实现同步的。SYNDET端一出现高电平,8251A就会立刻脱离对同步字符的搜索过程,只要此高电平能维持一个接收时钟周期,8251A便认为已经完成同步。 实现同步之后,接收器和发送器之间就开始进行数据的同步传输。这时,接收器利用时钟信号对RXD线进行采样,并把收到的数据位送到移位寄存器中。每当收到的数据位达到规定的一个字符的数位时,就将移位寄存器的内容送到输入缓冲寄存器,并且在RXRDY端上发出一个信号,表示收到了一个字符。7/22/2024425 (4)同步发送方式 在同步发送方式下,发送器先根据编程要求发送一个或两个同步字符,然后发送数据块。在发送数据块时,发
374、送器会根据编程要求对每个数据加上奇偶校验位。有时侯8251A正在提供数据,而CPU却来不及提供数据给8251A,这时,8251A的发送器会自动插入同步字符,这就满足了在同步发送时不允许数据之间存在间隙的要求。 4初始化编程 对8251A的编程就是指由CPU写入控制字(包括方式选择控制字和操作命令字)和读/写收发数据,实现对8251A的各种工作方式及工作进程的控制。8251A的编程包括初始化编程和收发数据的编程两部分。初始化编程就是通过程序设置8251A的方式选择控制字和操作命令字。对收发数据的编程是根据用户的具体需要而编制的。8251A将方式选择控制字和操作命令字均作为控制字,并且共用同一个地
375、址,因此采用写入次序的方法加以区分。方式选择控制字用来定义8251A的工7/22/2024426 作方式,操作命令字直接使8251A处于规定的工作状态,以准备接收或发送数据。在复位(包括系统复位和内部复位)后,首先写入的总是方式选择控制字,此后写入的才是操作命令字。 (1) 方式选择控制字 其格式如右图所 示。7/22/2024427各位意义如下: D1D0:决定工作方式是同步还是异步。 D1D0=00, 8251A工作于同步方式。 D1D000, 8251A工作于异步方式。三种组合分 别代表波特率因子为1、16、64。 如当D1D0=10, 则波特率因子为16。 例:TXC时钟频率为19.2
376、KhZ,可算 得波特率为1200b/s. D3D2:用来指定串行异步通信中每个字符数据的位 数,可以在5-8位中选择。如果传输的是ASCII 码,应选择7位;如果传输的是汉字,应选择8 位。 D4:用来选择是否需要奇偶校验位。D4=1,需要; D4=0,不需要。 D5;用来选择奇校验或偶校验。D5=1,偶校验; D5=0,奇校验。 7/22/2024428D7D6:D7D600,指定异步方式下停止位的位数,可以 选择1、1.5或2位。 D7D6=00,则D6指定是否外同步,若D6=1,外同步; D6=0,内同步。 D7指定是否单同步字符,若D7=1,单同步字符; D7=0,双同步字符。 例:
377、某异步通信中,数据格式为:1位起始位、1位停止位、7位数据位,奇校验,波特率因子为16,试确定方式选择控制字. 根据要求,可确定异步方式选择控制字为:01011010B=5AH。 将其写入控制端口的程序段如下: MOV DX,3F9H ;8251A的控制端口地址 MOV AL,5AH ;异步方式选择控制字 OUT DX,AL ;将控制字写入控制端口7/22/2024429例: 某同步通信中,设幀数据格式为:字符长度为8位,双同步字符且内同步,偶校验,试确定方式选择控制字。 根据要求,可确定同步方式选择控制字为:00111100B=3CH。 将其写入控制端口的程序段如下: MOV DX,3F9H
378、 ;8251A的控制端口地址 MOV AL,3CH ;同等步方式选择控制字 OUT DX,AL ;将控制字写入控制端口7/22/2024430(2)操作命令字 其格式如下图所示。7/22/2024431常用的控制位有:D0(TXEN):允许发送信号。当TXEN=1,表示当前8251A允许发送数据;TXEN=0,表示当前8251A禁止发送数据。CPU在对8251A编程时正是通过对TXEN位的控制来确定当前8251A是否可以工作在数据发送状态。D1(DTR):此位是送往MODEM去的控制信号。若DTR=1,8251A的DTR端变为低电平有效。D2(RXE):允许接收信号。当RXE=1,表示当前82
379、51A可以接收来自来自RXD的串行数据,并转换为并行数据以供CPU读取;RXE=0,则禁止8251A接收串行数据。CPU在通过对8251A这一位的设置,来确定8251A是否处于数据接收状态。D3(SBRK):此位用来选择异步方式时是否使用特定的间断字符。若SBRK=1,则使空闲时的输出数据线(TXD)成为低电平,以此低电平作为数据间断时的线路状态表示;若SBRK=0,则在出现数据间断时,线路仍处于高电平状态。另外,该位同时还控制接收端的工作,使接收端在接收数据时自动检测间断字符,由CPU作相应处理。7/22/2024432D4(ER):请除出错标志。当设置ER=1后,可以使状态字中的TE(幀格
380、式错误)、OE(溢出错误)、PE(奇偶校验错误)三个出错标志复位。用于8251A出错后的复位工作。D5(RTS):此位是送往MODEM去的控制信号。若RTS=1,8251A的RTS端变为低电平有效。D6(IR):内部复位。当IR=1,表示内部复位,8251A回到初始状态,CPU就可以对它进行重新初始化设置。D7(EH):搜索状态设置。EH=1时,使8251A进入同步搜索状态,将接收到的数据位逐位组合成字符,作同步比较,直到找到同步码后,引脚SYNDET输出1为止;然后,再将EH位清0,作正常接收。7/22/2024433 例: 某异步通信中,要求8251A内部复位,允许接收,允许发送,全部错误
381、标志复位,试确定操作命令字。 根据要求,可确定操作命令字为:01000000B=40H和00010101B=15H。 将其写入控制端口的程序段如下: MOV DX,3F9H ;8251A的控制端口地址 MOV AL,40H ;写内部复位操作命令字 OUT DX,AL MOV AL,15H ;允许接收,允许发送,错误标志 复位的操作命令字 OUT DX,AL 7/22/2024434(3)状态字 CPU向8251A发送各种操作命令,许多时候是依据8251A当前的运行状态决定的。下图是片内状态寄存器各位的定义。7/22/2024435 D1(RXRDY)、D2(TXEMPTY)、D6(SYNDET
382、)这三位的含义与对应引脚的含义完全相同。 D0(TXRDY)位与引脚TXRDY不完全相同。D0(TXRDY)状态位是当发送缓冲器一出现空闲时就置1;而引脚TXRDY除了上述条件外,还必须满足TXEN=1、CTS=0两条件,才能被置为1。 D7(DSR)位的含义与对应引脚DSR的含义相同,但电平相反。 D3(PE)位:奇偶校验出错标志。当允许使用奇偶校验时,芯片才对每个字符的校验位进行检查。如果出错,则置1。 D4(OE)位:溢出错误标志。当接收缓冲器中的字符尚未取走时,又接收到新的字符,造成前字符丢失。如果出错,则置1。 D5(TE)位:幀出错标志。当接收数据,若芯片在对停止位的检测中,发现错
383、误,则置1。 PE、OE、TE出错后的复位方法是对操作命令字中的ER位置1,就可以清除出错标志。7/22/2024436 例: 设某系统中8251A的状态口地址是3F9H,数据口地址是3F2H,若要检查8251A的发送器是否准备好,试写出相应的程序段。 MOV DX,3F9H ;8251A的状态端口地址WAIT:IN AL,DX ;读状态字 AND AL,01H ;查状态位 D0(TXRDY)=1? JZ WAIT ;D0(TXRDY)=0,发送未准备好,等待 MOV DX,3F2H ;8251A的数据端口地址 MOV AL,0AAH ;发送字符送AL OUT DX,AL ;发送字符写入825
384、1A 上面讨论了8251A的方式选择控制字、操作命令字和状态字,对于一个完整的通信过程,方式选择控制字只是约定了双方的通信方式(同步还是异步)、数据格式(数据位、停止位位数、奇偶校验位、同步字符个数等)、传输速率(波特率系数)等参数,但没有规定数据传送的方向(接收还是发送),因此需要用操作命令字来控制接收/发送。具体何时才能接收/发送取决于8251A的工作状态,通过检测状态字中的某些位来确定下一步操作,只有当8251A处于接收/发送准备好的状态,才能真正开始数据的传送。7/22/2024437(4)8251A的初始化编程 8251A工作之前,要进行初始化操作,其初始化编程的过程如右图所示。 图
385、图7-47 8251A7-47 8251A初始化编程流程初始化编程流程 7/22/2024438例7-31 如果8251A工作于异步方式,波特率因子为16,每个字符长度为8位,奇校验,1个停止位,允许接收,允许发送,并且发送准备就绪,全部错误标志复位。根据这些要求,可确定方式选择控制字为:01011110B=5EH,操作命令字为:00110111B=37H。 初始化程序段如下: MOV DX,3F9H ;8251A控制端口地址 MOV AL,5EH ;方式选择控制字 OUT DX,AL MOV AL,37H ;操作命令字 OUT DX,AL 7/22/2024439 (5) 采用8251A可以
386、实现微机与微机之间、主机与外设之间的串行通信,在硬件和软件设计中应注意以下问题: (1)确定串行通信的方式,如是同步通信还是步通信,全双工还是半双工。确定数据传输的波特率,选择合适的波特率因子。在波特率确定之后,就可以算出发送器时钟(TXC)和接收器时钟(RXC)的频率。 (2) 完成接口电路的设计,实现8251A与CPU以及外设之间的连接。 (3) 根据8251A与CPU的数据交换方式,确定是用查询还是中断,设计相应的硬件电路。 (4) 编程工作在硬件电路设计完成之后进行。首先是初始化编程,必须严格按照规定的顺序进行。先写入方式选择控制字,再写入操作命令字;若为同步方式,中间应插入12个同步
387、字符。完成初始化工作以后,便开始收发数据。7/22/2024440 下面以两台微机之间进行双机串行通信的硬、软件设计来说明8251A的应用。例5 如图7-48所示,采用8251A和RS232接口实现两台微机之间的串行通信,可采用异步或同步方式实现单工、双工或半双工通信。假定端口地址为:命令/状态端口为309H,数据端口为308H。 7/22/2024441 当采用查询方式、异步传送、半双工通信时,初始化程序由两部分组成。一部分是将一方定义为发送器,另一部分是将对方定义为接收器。发送端CPU每查询到TXRDY为1,则向8251A并行输出一个字节数据;接收端CPU每查询到RXRDY为1,则从825
388、1A并行输入一个字节数据;一直进行到全部数据传送完毕为止。 发送端程序如下:START:MOV DX,309H ;将8251A设置为异步方式,波 特率因子为16,8位数据,偶 校验,1个停止位,允许发 送,错误标志复位。 MOV AL,01111111B OUT DX,AL MOV AL,00010001B OUT DX,AL 7/22/2024442 MOV DI,发送数据块首地址;设置发送指针 MOV CX,发送数据块字节数;设置计数值NEXT1:MOV DX,309H ;查询TXRDY是否有效? IN AL,DX AND AL,01H JZ NEXT1 MOV DX,308H ;输出一个
389、字节数据 MOV AL,DI OUT DX,AL INC DI LOOP NEXT1 HLT7/22/2024443 接收端程序如下:BEGIN:MOV DX,309H ;将8251A设置为异步方式,波特 率因子为16,8位数据,偶校 验,1个停止位,允许接收,错 误标志不复位。 MOV AL,01111111B OUT DX,AL MOV AL,00000100B OUT DX,AL MOV DI,接收数据块首地址;设置接收指针 MOV CX,接收数据块字节数;设置计数值NEXT2:MOV DX,309H ;查询RXRDY是否有效? IN AL,DX ROR AL,1 ROR AL,1 7/22/2024444 JNC NEXT2 ROR AL,1 ;查询奇偶校验是否出错误? ROR AL,1 JC ERR MOV DX,308H ;输入一个字节到接收数据块 IN AL,DX MOV DI,AL INC DI LOOP NEXT2 HLT7/22/2024445