3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.

Slides:



Advertisements
Similar presentations
第2章 微处理器 2.1 概述 /8086微处理器 微处理器 X86/Pentium微处理器
Advertisements

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
x86/Pentium指令系统 x86寻址方式 1.比例变址寻址方式 (Scaled Indexed Addressing)
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
§1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1、操作码字段 操作码字段表明指令执行何种性质的操作。
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
第一章 计算机基础知识 第一节 计算机概述 一、计算机的基本组成和工作原理 二、有关术语 三、计算机发展简史 四、微型计算机概述
汇编语言与接口技术 教师:范新民.
输入/输出及接口 输入/输出的传送方式 中断技术 80x86/Pentium中断系统 8259A可编程中断控制器 中断程序设计
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
第3章 80x86汇编语言程序设计(下).
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
微机原理与接口技术 第3章 8086/8088指令系统 黄强 深圳大学 信息工程学院.
第7章 中断与异常.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
第6章 DMA传输 6.1 DMA传输原理 6.2 DMA控制器8237A A的编程使用 欢迎辞.
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
微机原理与接口技术 第2章 8086系统结构 朱华贵 2015年09月17日.
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第3章 IA-32指令系统 3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
第8章 寻址方式与指令系统.
微机原理及应用 主讲:谢维成 西华大学 电气信息学院 1.
微机原理及应用 主讲:郑海春.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
第8章 PCH中的常规接口.
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
第二章 8086/8088系统结构 主要内容 8086/8088微处理器的内部结构 8086/8088 CPU 的引脚与功能
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
1.3 微型计算机的结构和工作原理.
第 13 章 中断系统.
條件處理.
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第二章 8086微处理器. 第二章 8086微处理器 微处理器的基本结构 8086微处理器的主要特性和内部结构 8086CPU的工作模式和引脚信号 8086的存储器管理 8086的总线操作和时序.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第12章 中断 罗文坚 中国科大 计算机学院
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第8章 并行接口芯片 并行接口一般具有两个或两个以上的8位I/O接口。各个口的工作方式可由程序分别确定或改变,使用灵活,便于和各种外部设备连接。因此,又称可编程的外部接口(PPI) 目前各主要微处理器厂商都有自己的PPI产品,但它们的功能基本类似.
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令

表4-6 控制转移类指令 类别 指令名称 指令格式 无条件转移 JMP目标标号 调用/返回 过程调用 CALL 过程名 条件转移 (无符号数) (CF/ZF) 过程返回 RET 弹出值 高于/不低于也不等于转移 JA/JNBE 目标标号 高于或等于/不低于转移 JAE/JNB 目标标号 低于/不高于也不等于转移 JB/JNAE 目标标号 低于或等于/不高于转移 JBE/JNA 目标标号

续表(2) 类别 指令名称 指令格式 条件转移 (CF/ZF) (有符号数) (OF/SF/ZF) 进位位为1转移 JC 目标标号 进位位为0转移 JNC 目标标号 等于/结果为0转移 JE/JZ 目标标号 不等于/结果不为0转移 JNE/JNZ 目标标号 大于/不小于也不等于转移 JG/JNLE 目标标号 大于或等于/不小于转移 JGE/JNL 目标标号 小于/不大于也不等于转移 JL/JNGE 目标标号

续表(3) 类别 指令名称 指令格式 条件转移 (有符号数 OF/SF/ZF) (OF/PF/SF) 小于或等于/不大于转移 JLE/JNG 目标标号 溢出转移 JO 目标标号 不溢出转移 JNO 目标标号 奇偶位为0/奇偶性为奇转移 JNP/JPO 目标标号 奇偶位为1/奇偶性为偶转移 JP/JPE 目标标号 符号标志位为0转移 JNS 目标标号 符号标志位为1转移 JS 目标标号

续表(4) 类别 指令名称 指令格式 循环控制 (CX/ZF) 循环 LOOP 目标标号 等于/结果为0循环 LOOPE/LOOPZ目标标号 不等于/结果不为0循环 LOOPNE/LOOPNZ目标标号 CX内容为0转移 JCXZ目标标号 中断 INT 中断类型 溢出时中断 INTO 中断返回 IRET

1.转移指令 转移指令的实质: 改变IP(或者CS和IP)的内容。 对标志位flags的影响: 所有转移指令不会影响标志位flags。 分类: 分为无条件转移和条件转移两种。

指令中给出的8/16位的位移量加到IP, CS保持不变。 ② 段内间接转移: JMP reg / mem 本指令无条件转移到指定的目标地址, 以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令可实现短\近\远距离跳转, 指令分成4种情况。 ① 段内直接转移: JMP disp 指令中给出的8/16位的位移量加到IP, CS保持不变。 ② 段内间接转移: JMP reg / mem reg/mem中的16位偏移地址送IP, CS保持不变。 ③ 段间直接转移 JMP segment : offset 指令中给出的16位的段和16位的偏移地址送到CS和IP。 ④ 段间间接转移 JMP mem32 mem32中的16位的段和16位的偏移地址送到CS和IP。

① 段内直接转移 转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个相对于IP的位移量: JMP disp ; 位移量 转移范围 汇编语言中格式 8位 -128~+127 JMP SHORT OPRD; 短距离 16位 -32768~+32767 JMP NEAR PTR OPRD 或 OPRD ; 近距离 注意: disp的助记符写为新IP’, 而disp的机器码为位移量d(新IP’=原IP+位移量d) 例:JMP 0120H ;直接转向0120H(缺省为NEAR) JMP SHORT LP ;转向LP JMP NEAR PTR BBB;转向BBB 由于是段内转移,故转移后CS内容保持不变

无条件段内转移 转移目标地址: 直接转移: JMP Lable ┇ JMP Lable 偏移地址IP=当前IP+位移量(16位) ┇ 段基地址CS不变; 偏移地址IP=当前IP+位移量(16位) 近地址标号 ┇ JMP Lable 代码段 位移量 ┇ Label CS : IP= ┇

转移的目标地址由寄存器或存储单元的内容给出。 例1:JMP SI ; 近距离 ②段内间接转移 转移的目标地址由寄存器或存储单元的内容给出。 例1:JMP SI ; 近距离 若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。 注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。

无条件段内转移 间接转移: JMP BX JMP WORD PTR[BX] ┇ ┇ CS : IP ┇ ┇ JMP BX 代码段 指令码 XXH 数据段 XXH ┇

例2:JMP [BX+DI] 设指令执行前: (DS)=3000H,(BX)=1300H, (DI)=1200H,(32500H)=2350H; 则指令执行后:(IP)=2350H 在汇编语言中,段内间接寻址通常写成: JMP WORD PTR[BX+DI] 表示所取得的目标地址是一个字。

③段间直接转移 在指令中直接给出要转移到的目的段地址和偏移地址。 例:JMP 2000H:1000H ;远距离 执行时,(IP)←1000H,(CS)←2000H 注意:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FAR PTR。 例:JMP FAR PTR far_label ;远距离 其中的far_label为远类型的标号。

无条件段间转移 直接转移: JMP FAR PTR Lable ┇ ┇ CS : IP= Label ┇ JMP XXH IP XXH 代码段1 XXH IP XXH 远地址标号 XXH CS XXH ┇ 代码段2 CS : IP= Label ┇

④段间间接转移 转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如: JMP DWORD PTR[SI] ; 远距离 设指令执行前:(DS)=4000H,(SI)=1212H, (41212H)=1000H,(41214H)=4A00H 则指令执行后:(IP)=1000H,(CS)=4A00H 于是转到4B000H处开始执行指令。 例中的DWORD PTR表示转移地址是一个双字。

无条件段间转移 间接转移: JMP DWORD PTR[BX] ┇ ┇ CS : IP ┇ [BX] ┇ 代码段1 JMP 代码段2 指令码 XXH IP XXH 数据段 XXH CS XXH ┇

JMP DWORD PTR [SI]的机器码 段间间接转移操作示意图 4000 +) 1212 41212 41213 41214 11111111 11101100 DS:[SI] 4000 DS +) 1212 SI 41212 41212 41213 41214 41215 00 1000 IP 10 00 4A00 CS 4A 段间间接转移操作示意图

(2)条件转移指令 - JXX 条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是 否进行分支转移。 格式:JXX label;xx为条件名称缩写 指令的转移范围为-128~+127字节(短跳转)。 主要的条件转移指令参见p142表3-7。

① 根据单个标志位设置的条件转移指令 JB/JC ;低于,或CF=1, 则转移 JNB/JNC/JAE ;不低于,或CF=0,高于或等于, 则转移 JP/JPE ;奇偶标志PF=1(偶), 则转移 JNP/JPO ;奇偶标志PF=0(奇), 则转移 JZ/JE ;结果为零(ZF=1), 则转移 JNZ/JNE ;结果不为零(ZF=0), 则转移 JS ;SF=1, 则转移 JNS ;SF=0, 则转移 JO ;OF=1, 则转移 JNO ;OF=0, 则转移

② 根据组合条件设置的条件转移指令 这类指令主要用来判断两个数的大小。一般指令序列为: Jxx label ;根据比较结果转移 CMP dist,src ;比较 Jxx label ;根据比较结果转移 判断无符号数的大小 JA 高于则转移(dist>src) 转移条件为: CF=0∧ZF=0 JNA/JBE 低于或等于则转移(dist≤src) 转移条件为: CF=1∨ZF=1

判断有符号数的大小 转移条件为: (SF⊕OF=0)∧ZF=0 转移条件为: (SF⊕OF=0)∨ZF=1 JG ;大于则转移(dist>src) 转移条件为: (SF⊕OF=0)∧ZF=0 JGE ;大于或等于则转移(dist≥src) 转移条件为: (SF⊕OF=0)∨ZF=1 JL ;小于则转移(dist<src) 转移条件为: (SF⊕OF=1)∧ZF=0 JLE ;小于或等于则转移(dist≤src) 转移条件为: (SF⊕OF=1)∨ZF=1

③根据CX内容来决定是否转移的转移指令 JCXZ label 若(CX)=0,则转移到label处开始执行。

条件转移指令举例:以十六进制数形式显示BX中的内容。 MOV BX, 1234H MOV CH, 4 ; CH做循环计数器 ROT: MOV CL, 4 ; CL做移位计数器 ROL BX, CL ; 将最高4位移到低4位 MOV AL, BL AND AL, 0FH ; 取出低4位 ADD AL, 30H ; 转换为ASCII码 CMP AL, 39H ; 与 ’9’ 比较 JBE DISP ; 若(AL)≤‘9’, 则转显示 ADD AL, 7 ; 若(AL)>’9’, 再加7转为‘A’-‘F’ DISP: MOV DL, AL ; (DL)←字符 MOV AH, 2 INT 21H ; 显示输出 DEC CH ; 4个十六进制数显示完否? JNZ ROT ; 没有, 循环 MOV DL, 48H ; ‘H’ INT 21H ; 最后显示’H’

2.循环控制指令 用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。 转移的目标应在距离本指令-128~+127的范围之内(短跳转)。 循环控制指令不影响标志位。

(1) LOOP 格式:LOOP label 类比 串前缀REP 操作:(CX)-1→CX; 若(CX)≠0,则转至label处执行; DEC CX JNZ label

(2)LOOPZ (LOOPE) 类比 串前缀REPZ/E 格式:LOOPZ label 操作:(CX)-1→CX; 若(CX)≠0∧ZF=1,则转至label处执行; 否则退出循环,执行LOOP后面的指令。 (3)LOOPNZ (LOOPNE) 类比 串前缀REPNZ/NE 格式:LOOPNZ label 若(CX)≠0∧ZF=0,则转至label处执行;

例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0H) MOV AX, 1A00H MOV DS, AX ; 1A00H段 MOV DI, -1 MOV CX, 256 GOON: INC DI DEC BYTE PTR[DI] LOOPNZ GOON HLT

例2:在8000H开始的长度为1000字节的字符串中查找’S’,若找到,把其偏移地址记录在ADDR中,否则ADDR单元置为0FFFFH。 MOV DI, 8000H MOV CX, 1000 MOV AL, ’S’ MOV ADDR, 0FFFFH GOON: SCASB LOOPNZ GOON ; 两条可并为REPNZ SCASB JNZ DONE DEC DI MOV ADDR,DI DONE: HLT

3. 过程调用和返回指令 过程(子程序) 一段具有特定功能的,供其它程序调用的公用程序。 特点 调用子程序时,IP(或CS:IP)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(或CS:IP)。 子程序执行结束后一般均要返回调用程序。 一次定义,多次调用; 可带参数调用,以完成不同的功能。 优点 程序代码短,结构清晰,便于编程、调试、修改和阅读。 两条相关指令: 子程序调用指令 CALL 子程序返回指令 RET

调用指令CALL与转移指令JMP的比较 CALL 子程序入口地址 = JMP 子程序入口地址 + PUSH CALL的下一条指令地址 用于调用一个子过程; 调用前须保护断点地址(断点=CALL的下一条指令地址CS:IP);再跳转到子程序入口地址(子程序入口地址=子程序的第一条指令地址CS:IP’或CS’:IP’); 子过程执行结束后要返回原调用处继续执行原程序 —— 断点恢复(RET指令)。 入口地址 CALL 断点 RET

主程序调用子程序的执行过程: 将调用指令的下一条指令的地址(断点)压入堆栈(CALL指令); ----相当于乎 PUSH 下一条指令的地址(IP或 CS:IP) 获取子过程的入口地址(子过程第1条指令的偏移地址) (CALL指令) ; ----相当于乎 JMP入口地址(CS:IP’或CS’:IP’) 执行子过程,含相应参数的保存及恢复(其它指令); 将断点偏移地址由堆栈弹出,返回原程序(RET指令)。 ----相当于乎 POP IP或 CS:IP

(1)调用指令 CALL ① 段内直接调用 例:CALL 0120H ;子程序偏移地址由指令给出 一般格式:CALL sub ;sub为子程序的入口 根据子程序入口的寻址方式,子程序调用有4类。 ① 段内直接调用 子程序的偏移地址直接由CALL指令给出。 格式:CALL near_proc ;近调用 CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上得到新IP’跳转到子程序入口地址。 注意:汇编以后的调用地址是相对于CALL的下一条指令的位移量。 例:CALL 0120H ;子程序偏移地址由指令给出

位移量由汇编程序在汇编时进行计算,如下例: CS:0102 CALL 0120H ;3字节 CS:0105 …… 则位移量为: 0120-0105H=001BH 于是CALL 0120H的机器码为E8 1B 00 CS:0102 E8 CS:0103 1B CALL 0120H CS:0104 00 CS:0105 ……

CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP得到新IP’跳转。 ②段内间接调用 子程序的偏移地址在寄存器或存储器中。 格式:CALL mem16/reg16 ;近调用 CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP得到新IP’跳转。 例: CALL BX ;子程序地址由BX给出 CALL WORD PTR[SI] ;子程序地址在存储器中

CALL WORD PTR [SI]指令的操作图示: 假定:(DS) = 8000H,(SI) = 1200H 代码段 IPH IPL 81200H 81201H 数据段

③段间直接调用 例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程 格式:CALL far_proc ;far_proc为远过程的地址 ;远调用 指令的操作为:  CS内容压栈  IP内容压栈  CS’←段地址  IP’←偏移地址 例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程 保护断点 跳转

④段间间接调用 子程序的段和偏移地址为存储器的连续4个单元中的内容。 格式:CALL mem32 ;远调用 指令的操作为:(含保护断点和跳转两步) SP←(SP)-2 ((SP)+1,(SP))←(CS) ;CS压栈 CS’←(mem32+2) ((SP)+1,(SP))←(IP) ;IP压栈 IP’←(mem32) 例:CALL DWORD PTR[DI] 调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。

CALL DWORD PTR[DI] CALL IPH IPL CSH CSL 段间间接调用示意图 代码段 [DI] [DI]+1 数据段 [DI]+3 CSH CSL 段间间接调用示意图

例:下面的程序执行后,(AX)=? (DX)=? CS:2000H MOV AX, 2012H 2003H MOV CX, 200CH(无此指令) 2006H PUSH CX 2007H CALL 4000H 200AH ADD AX, BX 200CH ADD AX, DX 200EH HLT … … CS:4000H MOV BX, 200AH POP DX RET

(2)返回指令 RET 段内返回指令RET的操作为: 恢复子程序执行前IP的内容。---相当于POP IP 段间返回指令RET的操作为: 恢复子程序执行前IP和CS的内容。---相当于POP CS:IP 另有一种带立即数的返回指令 “ RET n ”,其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。 例:RET 4 ;返回后再丢弃栈顶的4个字节

4.中断指令 中断的定义: CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(称为中断服务程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。 中断源分类:外部中断、内部中断 内部中断(软件中断):CPU内部执行程序(INT n或INTO)时自身产生的中断。 外部中断(硬件中断):CPU以外的设备、部件产生的中断。用于处理外设与CPU间的通信。

中断指令用于产生软件中断,以执行一段特殊的中断处理过程(即中断服务子程序)。 中断指令的主要作用: (1)调用操作系统(OS)提供的特殊子程序(系统功能调用) (2)实现一些特殊功能,如调试程序时单步运行、断点等。 (3)调用基本I/O系统(BIOS)提供的硬件低层服务。 8086/8088 CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。被中断的指令地址处称为“断点”。有关中断的详细情况将在第六章讨论。 中断指令共有三条: (1)INT n 执行类型n的中断服务程序,n=0~255 (2)INTO 执行溢出(OF)中断的中断服务程序,=INT 4 (3)IRET 从中断服务程序返回调用程序

中断INT n与过程CALL 段间间接调用: 中断是随机事件或异常事件引起,调用则是事先已在程序中安排好 ; 响应中断请求不仅要保护断点地址,还要保护FLAGS内容; 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码n,入口地址则在向量码n指向的内存单元中。 CALL RET INT IRET

(1) INT n 中断类型码 n = 0〜255 格式: INT n 说明: n×4 = 中断向量地址。该向量地址中的内容即为中断服务程序入口地址(段:偏移),入口地址也称为“中断向量”。 内存 0000 : n×4 中断向量地址= XXH XXH 中断服务程序入口的偏移地址(IP) YYH 中断向量 YYH 中断服务程序入口的段地址(CS)

INT指令的操作: 将FLAGS压入堆栈;--相当于 PUSH FLAGS 将INT指令下一条指令的地址压栈(即把CS和IP的内容压栈); --相当于 PUSH CS:IP 取中断服务程序入口地址送入CS’和IP’。 --相当于 JMP CS’:IP’ INT指令只影响IF和TF, 对其余标志位无影响 INT指令可用于调用系统服务程序,如INT 21H

INT指令的操作例: INT 21H(软中断) (1)先做: 保护标志FLAGS和 保护断点地址CS:IP 保护断点 堆栈 SP=11FA IPL IPH 执行INT 21H指令后 CSL CSH FLAGSL FLAGSH SP=1200 执行INT 21H指令前

(2)再做:跳转到子程序(入口地址CS’:IP’) 执行INT 21H指令后, CS=? IP=? 因为n=21H,所以n×4=84H。 下图中,(0:0084H)=2000H:1123H 所以: CS=2000H IP=1123H 0000:0084H 23H 0000 : 21H×4 11H IP 00H CS 20H

(2)溢出中断 INTO INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。 格式: INTO INTO检查溢出标志OF,如果OF=1,则启动一个类型4的中断过程;如果OF=0,不做任何操作。 通常INTO指令安排在有符号数算术运算指令后面。如 IMUL DX INTO ;若溢出,则启动INT 4, 否则往下执行 MOV RESULT,AX MOV RESULT+2,DX …… 相当于 INT 4

(3)中断返回指令 IRET 用于从中断服务程序返回被中断的程序。IRET负责恢复断点(CS和IP)和恢复标志寄存器FLAGS内容。

3.3.6 处理器控制指令 表 4- 7 处理器控制类指令 类别 名称 操作码 标志位操作 (CF/DF/IF) (无TF) 进位标志置1 表 4- 7 处理器控制类指令 类别 名称 操作码 标志位操作 (CF/DF/IF) (无TF) 进位标志置1 STC 进位标志复位 CLC 进位标志取反 CMC 方向标志置1 STD 方向标志复位 CLD 中断标志置1 中断标志复位 STI CLI

续表(2) 类别 名称 操作码 外同步 停机 HLT 等待 WAIT 交权 ESC 封锁总线 LOCK 空操作 NOP

3.3.6 处理器控制指令 1.标志操作指令 用来设置标志位的状态。 (1)CF设置指令 (2)DF设置指令 (3)IF设置指令 CLC 0→CF STC 1→CF CMC CF变反 (2)DF设置指令 CLD 0→DF (串操作的指针移动方向从低到高) STD 1→DF (串操作的指针移动方向从高到低) (3)IF设置指令 CLI 0→IF (禁止INTR中断) STI 1→IF (开放INTR中断)

2. 外部同步指令 (1) 暂停指令 HLT 执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。 这类指令都不影响Flags标志位 (1) 暂停指令 HLT 执行HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。 外部中断(包括IF=1时的可屏蔽中断请求INTR及非屏蔽中断请求NMI)或复位信号可让CPU退出暂停状态。 该指令常用来等待中断的产生。

(2)空操作指令 NOP NOP指令不做任何实质性的操作,但占用3个时钟周期,然后执行下一条指令。 它多用于:(1)程序的延时; (2)预留存储空间(占位子)。

(3) 等待指令 WAIT CPU每隔5个时钟周期就要检查一次 ,WAIT指令可以使CPU进入等待状态,等待状态期间( 变为无效)CPU可被中断。当它为有效时, CPU会停止执行WAIT,退出等待状态。 WAIT主要用于: (1)CPU (8086)与协处理器(8087/8089)和外部设备 的同步; (2)也可用来等待被允许的外部中断的到来,但中断 任务执行完后仍返回WAIT指令,继续等待。

(4) 换码或协处理器指令 ESC ESC指令主处理器可向协处理器提供一条可执行的指令及相应的操作数。 当执行ESC指令时,协处理器监视系统总线, 并可取得操作码。由于8087协处理器无寻址能力,当取得操作需要存储器访问时,8086主处理器将指定存储单元的内容送到数据总线上,否则不需要8086做任何事情。 指令一般格式: ESC OPRD OPRD为存储器操作数。指令执行时,把一个指定的存储单元的内容送到DB上,由协处理器获取后,完成相应的操作。

(5) 封锁指令 LOCK LOCK是一个可用在有关指令前面的前缀,使用了这个指令前缀的指令,可在指令执行期间封锁局部总线,以保证在多处理器及多任务下的数据安全。  LOCK指令前缀可使CPU的LOCK 引脚产生一个有效电平,以实现总线封锁,此过程一直持续到该指令执行结束。

作业: P152 3.2~3.7, 3.10~3.12, 3.15~3.16