3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述

Slides:



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

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
§1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1、操作码字段 操作码字段表明指令执行何种性质的操作。
第四章 汇编语言 程序设计 任课教师:王晓甜
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
汇编语言与接口技术 教师:范新民.
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
微机原理与接口技术 第3章 8086/8088指令系统 黄强 深圳大学 信息工程学院.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日.
第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
微机原理与接口技术 微机原理与接口技术 朱华贵 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 章 中断系统.
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第二章 8086微处理器. 第二章 8086微处理器 微处理器的基本结构 8086微处理器的主要特性和内部结构 8086CPU的工作模式和引脚信号 8086的存储器管理 8086的总线操作和时序.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第九章 微处理器外部结构和总线操作时序.
第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.
第二章 8086系统结构 /8086的存储器组织 的系统配置及引脚功能 CPU时序
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。 1、转移指令 转移指令包括两种: (1)、JMP(Jump) 无条件转移指令 (2)、Jcc 条件转移指令

(1)、JMP(Jump)无条件转移指令 转移分成两类:段内或段间转移。 无条件转移指令有五种格式: 段内直接短转移 段内直接近转移 段内间接转移 段间直接远转移 段间间接转移 JMP指令的操作:无条件地转移到指令中规定的目的地开始往 下执行指令。 目标地址可以是:直接方式/间接方式给出。 JMP指令不影响标志位。

(2)、Jcc 条件转移指令 汇编程序设计中常利用条件转移指令来实现分支。 “cc”-表示条件。 操作数必须是短标号。转移范围为:-128~+127 具体条件转移指令分四种情况讨论: 根据单个条件标志的设置情况转移 JZ(JE)/JNZ(JNE),JS/JNS,JO/JNO,JP(JPE)/JNP(JPO), JB(JNAE、JC)/JNB(JAE、JNC), 根据两个无符号数比较结果转移 JB(JNAE、JC)/JNB(JAE、JNC),JBE(JNA)/JNBE(JA) 比较两个带符号数,并根据比较结果转移 JL(JNGE)/JNL(JGE),JLE(JNG)/JNLE(JG) 测试CX的值为零转移 JCXZ

2、 过程(子程序)调用指令 如果有一些程序段在不同地方反复出现,可以将这些程序段设计成为过程(子程序)供调用。过程结束,返回调用处。 子程序:在一个实际程序中,有些操作要执行多次,把要 重复执行(subroutine)操作编为子程序。 常把一些常用的操作编为标准化、通用化的子程序。 主程序(Main program):往往要调用子程序 或处理 中断, 即执行子程序或中断服务程序。

过程调用指令包括:过程调用指令和返回指令 (1)、 CALL( Call a procedure)调用  CALL调用指令 段内直接调用 段间直接调用 段内间接调用 段间间接调用 (2)、 RET( Return from procedure)返回  RET返回指令 段内返回 段间返回 段内带立即数返回 段间带立即数返回

循环控制指令用于使一些程序段反复执行形成循环程序。 循环控制指令有三种: 3、循环控制指令 循环控制指令用于使一些程序段反复执行形成循环程序。 循环控制指令有三种: (1)、LOOP (Loop) 循环指令 (2)、LOOPE/LOOPZ (Loop if equal / Loop if zero) 当相等/为“0”循环 (3)、LOOPNE/LOOPNZ (Loop if not equal/ Loop if not zero) 当不相等/不为“0”循环

4、中断指令 8086/8088CPU 可以在程序中安排一条中断指令引起中断过程,这种中断称为软中断。 8086/8088CPU共有三条中断指令: (1)、INT (Interrupt) (2)、INTO(Interrupt if overflow) (3)、IRET(Interrupt Return)

归纳控制转移指令分类 指令类型 助记符 无条件转移 JMP 条件转移 JE/JZ, JNE/JNZ, JS, JNS, JP/JPE, JNP /JPO,JO, JNO, JC, JNC, JB/JNAE, JAE/JNB, JA/JNBE, JBE/JNA,JG/JNLE, JGE/JNL, JL/JNGE, JLE/JNG ,JCXZ 循环控制 LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ 过程调用 CALL, RET 中断指令 INT, INTO, IRET

(二)、控制转移指令(Control transfer instructions) 1、转移指令 转移指令是将程序控制从一处转换到另一处的最直接方法。 在CPU内部,转移是通过将目标地址传送给CS(段地址 )、IP(偏移量)来实现的。 注意: 转移、调用地址寻址方式

指令在内存中是顺序存放的,分控制和非控制转移指令。 8086/8088 中CS和IP的变化规则: reset复位后,( CS ) = FFFFH,( IP ) = 0 故8088从内存FFFF:0000H处取第一条指令执行, 第一条指令在内存的ROM区。 非控制转移指令 CPU取指后,自动增加IP的值,使IP顺序指向下一条指令, 取紧接着的指令执行。 (此时IP的变化由CPU内部的硬件自动完成) 控制转移指令 以CS和IP为主要操作对象控制转移指令改变CS和IP的值,使程序产生分支、调用结构。 *分支、调用结构: 顺序存放,非顺序执行,特别是条件转移指令体现计算机的智能作用。

例:比较(AX)、(BX)的大小,将大数存于( max )单元。 CMP AX, BX JGE great ;有符号数比较, (AX)大于或等于转 XCHG AX, BX great: MOV [max], AX

(1)、JMP(Jump)无条件转移指令 JMP指令必须指定转移的目标地址(或转向地址)。 转移分成两类:段内或段间转移。 段内转移:只要改变IP寄存器的内容,指在同一段的范围之内进行转移。即(CS)不变,只改变(IP) 段间转移:要修改IP、 CS寄存器的内容 转到另一段去执行程序。

 段内直接短转移: EB(操作码) 8位位移量D8 格式:JMP SHORT OPR OPR—在汇编语言中使用符号地址  段内直接短转移: 格式:JMP SHORT OPR OPR—在汇编语言中使用符号地址 在机器语言中存放8位位移量D8 位移量D8 = 符号地址的偏移地址 – 当前IP的值 执行操作:(IP)←(IP)当前+D8 SHORT 短属性标号 8位位移量D8的范围在(-128 ~ 127)之间,占有一个字节。 该指令共占有两个字节。 EB(操作码) 8位位移量D8

例:代码段内有一条无条件转移指令(在汇编语言中使用符号地址。)JMP SHORT NEXT指令执行过程: (IP)←(IP)当前+D8

8位位移量D8的范围在(-128 ~ 127)之间,否则出错。 如:TAGER: …… JMP TAGER JMP SHORT TAGER …… TAGER: 标号与控制转移指令在同一段中,后引用的标号可以不用SHORT,前引用的标号必须使用SHORT。

 段内直接近转移: E9(操作码) 低8位位移量 高8位位移量 格式:JMP NEAR PTR OPR OPR—在汇编语言中使用符号地址  段内直接近转移: 格式:JMP NEAR PTR OPR OPR—在汇编语言中使用符号地址 在机器语言中存放16位位移量D16 位移量D16 = 符号地址的偏移地址 - 当前IP的值 执行操作: (IP)←(IP)当前+D16 NEAR:近属性标号 位移量D16范围:-32768~+32767H,占有两个字节。 该指令为三字节指令。可以转移到段内的任一位置,转移过程如同SHORT转移。 E9(操作码) 低8位位移量 高8位位移量

设有一段程序如下表所示,(CS)=1005H 程序转移地址? 汇编语句 机器指令 偏移地址 NEXT: MOV BX,AX JMP NEAR PTR NEXT XOR BX,BX 8B D8 E9 FB FF 33 DB 0000 0002 0005 转移地址偏移地址=当前(IP)+位移量 =0005H+FFFBH =0000H 转移地址段地址=当前(CS)=1005H 所以转移目的地址=1005:0000H即10050H(NEXT)处

 段内间接转移: 格式:JMP WORD PTR OPR OPR —为16位寄存器、 或存储器(除立即数以外的任何一种寻址方式)  段内间接转移: 格式:JMP WORD PTR OPR OPR —为16位寄存器、 或存储器(除立即数以外的任何一种寻址方式) 执行操作: (IP) (EA) 或(IP)  (reg16) 指令格式举例: JMP AX JMP SI JMP TABLE [BX] ; 操作数已定义为16位存储器 JMP ALPHA_WORD ;操作数已定义为16位存储器 JMP WORD PTR [BP][DI]

例: (DS)=1000H, (BX)=1000H, (CX)=5000H, (CS)=3000H (11000H)=1234H, ( 11002H)=5678H JMP CX ;(CS)=3000H ,(IP)=5000H JMP WORD PTR [BX] ;(CS)=3000H , (IP)=1234H (IP)的获得: (PA)=(16d(DS)+(BX))=(11000H)=1234H 例: (DS)=1000H, (BX)=1000H, (CX)=5000H, (CS)=3000H (11000H)=1234H, ( 11002H)=5678H JMP CX ; (IP)=5000H JMP WORD PTR [BX] ;(CS)=3000H (IP)=1234H (PA)=(16d´(DS)+(BX))=(11000H)=1234H

 段间直接(远)转移: (CS) 、 (IP)都改变 格式:JMP FAR PTR OPR; OPR—在汇编语言中使用符号地址。 符号地址与指令不在同一个段里。 在机器语言中则要指定转向地址的偏移地址和段地址 FAR:远属性标号 执行操作: (IP)←OPR所在的段内偏移地址。 (CS)←OPR所在的段的段址。 指令占有5个字节: 用1个字节存放操作码; 用2个字分别存放符号地址的偏移地址、段地址。

FAR 远属性标号, 标号与控制转移指令不在同一段中。 在汇编语言中,在机器语言中存放如下: 例: C1 SEGMENT … JMP FAR PTR next_prog C1 ENDS C2 SEGMINT next_prog: … C2 ENDS C1段 … … E A OP码 5 0 新(IP)=0250H JMP指令 0 2 0 0 新(CS)=2000H 2 0 … … C2段 20000H … … next_prog: 20250H 2000:0250H … …

 段间间接转移:(CS) 、 (IP)都改变 格式:JMP DWORD PTR OPR OPR —可以使用存储器 (除立即数和寄存器以外的任何一种寻址方式) 执行操作: (IP)←(EA) (CS)←(EA+2) 例:已知 (BX)=1000H,(SI)=2000H , (DS)=2000H (23000H)=2211H, (23002H)=4433H JMP DWORD PTR [BX][SI] 则: (BX)+(SI)=3000H (IP)=(PA)=(16d(DS)+(BX)+(SI))=(23000H)=2211H (CS)=(PA+2)=4433H

根据单个条件标志的设置情况转移(10种) ( 2)、Jcc 条件转移指令 JZ(JE)/JNZ(JNE),JP(JPE)/JNP(JPO), JS/JNS, JO/JNO, JB(JNAE、JC)/JNB(JAE、JNC), 根据两个无符号数比较结果转移(4种) JB(JNAE、JC)/JNB(JAE、JNC),JBE(JNA)/JNBE(JA) 比较两个带符号数,并根据比较结果转移(4种) JL(JNGE)/JNL(JGE),JLE(JNG)/JNLE(JG)

指令格式:J cc OPR 操作:根据上一条指令所设置的标志位来判别测试条件转移。 每一种条件转移指令都有它的测试条件。 满足条件时 : (IP)←(IP)当前+ 符号扩展到16位后的位移量D8, 所有条件转移指令使用段内直接短转移——相对寻址方式 范围: -128~+127个字节 不满足条件时: (IP)不变,顺序执行下一条指令。

注意几点: 所有条件转移指令都是相对转移形式, 范围(-128~+127)。超过转移范围怎么办? ② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移, ③ 条件转移指令不影响标志位 * 当条件转移超过转移范围时, 先选用条件转移转到附近一个单元, 然后,再用无条件转移转到较远的目的地。

按转移条件不同,条件转移指令可以分为四大类: ① 以单个状态标志作为转移条件助记符 转移条件 ① 以单个状态标志作为转移条件助记符 转移条件 助记符 转移条件 JZ/JE ZF=1 JNZ/JNE ZF=0 JS SF=1 JNS SF=0 JO OF=1 JNO OF=0 JP/JPE PF=1 JNP/JPO PF=0 JC CF=1 JNC CF=0 ② 以CX的值为0作为转移条件 助记符 转移条件 JCXZ CX=0

③以两个无符号数比较的结果作为转移条件 ④以两个带符号数比较的结果作为转移条件 助记符 转移条件 JA/JNBE CF∨ZF=0 高于/不低于等于 JAE/JNB/JNC CF=0 高于或等于/不低于/无进位 JB/JNAE/JC CF=1 低于/不高于等于/有进位 JBE/JNA CF∨ZF=1 低于或等于/不高于 ④以两个带符号数比较的结果作为转移条件 助记符 转移条件 JG/JNLE (SF⊕OF)∨ZF=0 大于/不小于等于 JGE/JNL SF⊕OF=0 大于或等于/不小于 JL/JNGE SF⊕OF=1 小于/不大于等于 JLE/JNG (SF⊕OF)∨ZF=1 小于或等于/不大于

例:比较二个数是否相等 如相等做动作1 否则做动作2 …… 条件转移指令应用 例:比较二个数是否相等 如相等做动作1 否则做动作2 …… CMP AX,BX JE action_1;或JZ Action_2: …… action_1 : …… 或 …… CMP AX,BX JNZ action_2 action_1: …… action_2: ……

例: X,Y放在X,Y单元里,(带符号数判断) 先判X>50,YES→too_high, NO→ 做X-Y , 溢出→overflow ,否则求|X-Y|→result MOV AX,X CMP AX,50 JG too_high ;大于转too_high SUB AX,Y JO overflow ;溢出转overflow JNS nonneg ; S=0转nonneg NEG AX nonneg: MOV result ,AX too_high: …… overflow: ……

2、 过程( 子程序 )调用指令 子程序—程序中具有独立功能的部分,编写成独立程序模块。 子程序(过程)定义格式: 符号名 PROC 类型 …… 符号名 ENDP ;符号名即过程名 子程序调用和返回指令: CALL / RET(return) 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型。 NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响标志位。

(1)、CALL( Call a procedure)调用 段内直接调用 段间直接调用 段内间接调用 段间间接调用

 段内直接调用 入栈 格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP)  段内直接调用 入栈 格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP) ; (IP) ← (IP)+D16 DST—通常是过程名,给出转向地址(子程序的入口地址 )。 D16—机器指令中的位移量(转向地址和返回地址之差)。 位移量为D16范围-32768~+32767H,占有两个字节。

NEAR 类型工作过程如下: code SEGMENT ;code段 … CALL subp ;调用指令, XXX入栈, D16 =subp-XXX XXX: … subp PROC NEAR ;过程定义 RET ;返回 subp ENDP code ENDS

 段内间接调用 格式: CALL DST; ↑ WORD PTR OPR OPR —为16位寄存器,  段内间接调用 格式: CALL DST; ↑ WORD PTR OPR OPR —为16位寄存器, 或存储器(除立即数以外的任何一种寻址方式) 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(IP) (IP)← 16位寄存器内容 或(EA) EA—由DST寻址方式所确定的有效地址。

 段间直接调用: 格式:CALL FAR PTR DST; 执行操作 : (SP)←(SP)-2 ((SP)+1,(SP))←(CS)  段间直接调用: 格式:CALL FAR PTR DST; 执行操作 : (SP)←(SP)-2 ((SP)+1,(SP))←(CS) ((SP)+1,(SP))←(IP) (IP)←DST偏移地址(指令中第2,3字节 ) (CS)←DST段地址(指令中第4,5字节 )

例 : … CSEG1 SEGMENT CALL FAR PTR subp;AA处的CS:IP入栈,转subp AA: … … 例 : … CSEG1 SEGMENT CALL FAR PTR subp;AA处的CS:IP入栈,转subp AA: … … CSEG1 ENDS CSEG2 SEGMENT subp PROC RET subp ENDP CSEG2 ENDS

 段间间接调用: 格式: CALL DWORD PTR DST 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(CS)  段间间接调用: 格式: CALL DWORD PTR DST 执行操作: (SP)←(SP)-2 ((SP)+1,(SP))←(CS) ((SP)+1,(SP))←(IP) (IP)←(EA) (CS)←(EA)+2 转子程序入口 EA—由DST的寻址方式确定的有效地址。

(2)、RET( Return from procedure)返回 放在子程序的末尾 使子程序在功能完成后返回调用程序继续执行。 *为能准确返回 ,返回指令类型与调用指令类型相对应。 RET返回指令有4种: 段内返回 段间返回 段内带立即数返回 段间带立即数返回 在子程序调用时,返回地址入栈 返回时:将返回地址出栈 (IP)(段内或段间) (CS)(段间)

 段内返回:  段间返回: 格式: RET; 执行操作:(IP)←((SP)+1,(SP)) (SP)←(SP)+2  段内返回: 格式: RET; 执行操作:(IP)←((SP)+1,(SP)) (SP)←(SP)+2  段间返回: 执行操作: (IP)←((SP)+1,(SP)) (CS)←((SP)+1,(SP))

 段内带立即数返回 格式: RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2  段内带立即数返回 格式: RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (SP)←(SP)+D16 EXP—是一个表达式 计算出来的常数成为机器指令中位移量D16,修改堆栈 指针。

例:RET EXP 堆栈使用情况

 段间带立即数返回: 格式:RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2  段间带立即数返回: 格式:RET EXP; 执行操作: (IP)←((SP)+1,(SP)) (SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+D16 CALL指令和RET指令都不影响标志位。

例:段内、段间直接调用指令的使用及堆栈情况 主程序 MAIN在一个代码段中 子程序 PRO-A PRO-B PRO-C 在另一个代码段 程序调用关系: 另一个代码段  PRO-A  PRO-B …… …… CALL near ptr PRO-B CALL near ptr PRO-C (IP)=2500H  (IP)=4000H ……  …… CALL near ptr PRO-C RET  (IP)=3700H ……  PRO-C  …… RET RET (SP)=0100H MAIN …… CALL far ptr PRO-A (CS)=0500H (IP)=1000H 

堆栈情况:

(3) 、小结 : 指令格式: JMP 操作数 操作数 执行操作 ◢ 位移量 = 符号地址的偏移量 - 当前IP的值。 符号地址 (SHORT) (IP) ← (IP)当前+ 8位位移量 符号地址 ( NEAR属性) (IP) ← (IP)当前+ 16位位移量 reg (16位)或 mem ( DW类型 ) (IP) ← ( reg ) 或(IP) ← (mem) 符号地址 ( FAR属性) (IP) ← 符号地址的偏值 (CS) ← 符号地址的段值 mem ( DD类型 ) (IP) ← ( mem ), (CS) ← (mem+2 ) ◢ 当前IP的值为控制转移指令下一条指令的偏移地址。 ◢ 位移量 = 符号地址的偏移量 - 当前IP的值。 ◢ 符号地址(目标地址)= 当前IP的值 + 位移量

转移方式:由CS是否变化、以及操作数类型决定情况如下表 跳转范围 段内直接短 方 式 不变 符号地址(SHORT) -128 ~ 127即0~FFH 段内直接近 方 式 符号地址(NEAR属性) 一个段内0~FFFFH 段 内间接方式 Reg mem (DW类型) 段 间直接方式 变 符号地址(FAR属性) 整个内存0~FFFFFH 段 间间接方式 mem(DD类型)

各控制转移指令允许使用的转移方式 转移方式 无条件转移JMP 条件转移 Jcc 循环转移 LOOPxx 子程调用CALL 段内直接短 方 式 √ × 段内直接近 方 式 段 内间接方式 段 间 直接方式 段 间间接

例 : JMP again (√) JMP BX (√) JMP WORD PTR [BX] (√) JMP DWORD PTR [BX] (√) Jz AX (×) LOOP BX (×) Jnz next (×) (若 next的位移量超出-128~127) 指令JMP、CALL 、Jcc、LOOPxx本身对标志无影响。

3、循环控制指令(Iteration control) 格式 : LOOPxx  符号地址 执行 操作 : ①(CX) ← (CX)- 1 此操作不影响标志 ② 检查转移条件xx,满足转向目标地址去执行;    不满足执行LOOPxx后一条指令 转移方式 只允许段内直接短方式,跳转范围-128~127 助记符 转移条件 不转移条件 LOOP CX≠0 CX=0 LOOPZ CX≠0且ZF=1 CX=0或ZF=0 LOOPNZ CX≠0且ZF=0 CX=0或ZF=1

与条件转移指令不同的是:循环指令隐含 ( CX ) 减1操作。 例 用循环指令设计软件延时程序 DS5MS PROC PUSH CX MOV CX, 500 NEXT:NOP NOP LOOP NEXT; DEC CX JNZ NEXT POP CX RET DS5MS ENDP

循环指令说明: LOOP退出循环条件是(CX)=0 LOOPZ和LOOPNZ提供了提前结束循环的可能, 不一定要等到(CX)=0才退出循环。 ▲ 在串中查找字符,查到了,就可退出,      可用LOOPNZ,不相等时继续查找。 ▲ 比较两串时,当有字符不等,就可退出,说明两字符串不等。      可用LOOPZ,当相等时继续比较。 ▲ 执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果 对查找字符,ZF=1,说明找到;否则没有找到。 对串比较,ZF=1, 说明两串相等;否则不等。

4、中断(Interrupt)和中断返回(Interrupt return)指令 有时当系统运行或程序运行期间遇到某些特殊情况,需要计算机自动执行一组专门的例行程序称中断服务子程序来进行处理。 种类: 中断分为内部(软)中断和外部(硬)中断两种。 内部中断—如除法运算中除数为0、中断指令引起的中断。 外部中断—处理I/O设备与CPU之间的通信。

IBM-PC中,存储器的最底地址00000H——003FFH为中断向量区,存放256种类型中断服务程序入口地址, 每个中断向量占4个单元。 CPU响应一次中断自动完成三件事情: (PSW)入栈 — 保护现场, (CS),(IP)保存入栈 — 保留断点, 转中断例行程序去执行。 中断返回时: 恢复(IP)、(CS)及(PSW) 中断向量:中断服务程序入口地址。 IBM-PC中,存储器的最底地址00000H——003FFH为中断向量区,存放256种类型中断服务程序入口地址, 每个中断向量占4个单元。 中断指定类型号N × 4——取得指定类型的中断向量地址。

(1)、 中断指令:INT n 格式:INT n ; n—常数或表达式,n=0—255 执行操作: (SP)←(SP)-2,((SP)+1,(SP)) ←(PSW) (SP)←(SP)-2,((SP)+1,(SP)) ← (CS) (SP)←(SP)-2,((SP)+1,(SP)) ← (IP) (IP) ←(N×4) (CS) ←(N×4+2) 清除IF、TF,避免进入中断后被外面其它中断所打断 及进入中断以后按单步执行。

(2)、溢出中断 INTO 指令 格式: INT O ; 该指令检测OF标志, OF=1执行 INT O,否则执行INTO下一条指令。 执行操作: (SP)←(SP)-2 , ((SP)+1,(SP)) ←(PSW) (SP)←(SP)-2 ,((SP)+1,(SP)) ←(CS) (SP)←(SP)-2 ,((SP)+1,(SP)) ←(IP) (IP) ←(0010H) (CS) ←(0012H) IF=TF=0

执行: OF为1时,执行 INT O ; OF为0时,执行INTO下一条执行。 例 : 、、、 INTO 、、、 类型4中断子程 → 、、、

(3) 、 IRET——中断返回指令(Interrupt return) 所有中断过程(服务程序)不管是硬中断还是软中断,最后一条指令一定是: IRET—— 退出中断过程,返回中断时的断点。 格式:IRET 执行操作: (IP)←((SP)+1,(SP)) , (SP) ←(SP)+2 (CS)←((SP)+1,(SP)) , (SP) ←(SP)+2 ( PSW)←((SP)+1,(SP)), (SP) ←(SP)+2

3.4.6 处理器控制指令(自学) (一)标志设置指令 (二)其他处理机控制指令 1、CLC (Clear carry flag ) 清CF标志 2、STC(Set carry flag ) 置CF标志 3、CMC(Complement carry flag ) 对CF求反 4、CLD(Clear direction flag ) 清DF标志 5、STD(Set direction flag ) 置DF标志 6、CLI(Clear interrupt flag ) 清IF标志 7、 STI (Set interrupt enable flag ) 置IF标志   (二)其他处理机控制指令 1、 NOP(No operation ) 空操作 2、 HLT(Halt ) CPU暂停状态 3、 WAIT (Wait while pin not asserted ) CPU等待状态 4、 ESC(Escape ) 交权 5、 LOCK(Lock bus ) 总线锁定

1. 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志。 指令格式 执行操作 CLC CF=0 STC CF=1 CLM CF ← CLD DF=0 STD DF=1 CLI IF=0 STI IF=1

2.其他处理机控制指令 ① 暂停指令HLT 格式 : HLT 执行 : 使CPU处于暂停状态 用于等待外部中断,中断处理结束后, 例 、、、 、、、 STI ;允许外部中断 HLT ;等待中断 MOV AX, 0

● 在中断允许情形下(IF=1),在INTR线上有请求 只有以下几种情况才能脱离暂停状态: ● RESET线上有复位信号 ● 在NMI线上有请求 ● 在中断允许情形下(IF=1),在INTR线上有请求 ② 空操作指令NOP 格式 : NOP 指令不执行任何操作, 但占有3个时钟周期,继续执行下条指令。 其机器码占一个字节单元, 在调试程序时,修改程序用。 做短暂延时 只有以下几种情况才能脱离暂停状态: ●RESET线上有复位信号 ●在NMI线上有请求 ●在中断允许情形下(IF=1),在INTR线上有请求 ② 空操作指令NOP 格式 NOP 指令不执行任何操作,但占有3个时钟周期,继续执行下条指令。 ①其机器码占一个字节单元, 在调试程序时,修改程序用。 ②做短暂延时

③处理器脱离(processor Escape) 格式:ESC mem mem——指出一个存储单元, 不能是寄存器和立即数寻找方式 执行: 8088从存储器中读出操作数并放到总线上, 协处理器由此知道要执行什么操作,得到操作数,从而 代替8088操作。 调动协处理器工作的联络手段,ESC二字节指令。 能区分要调用哪个协处理器进行什么操作; 能指出放在存储器中的操作数。

④ 处理器等待(Process OR wait) 执行: 处理器等待,CPU处于空操作, 等待外中断发生, 中断结束后,可继续执行下面程序 ⑤ LOCK总线锁定 LOCK实际上是一个指令前缀,可以放在任何一条指令前面。 用来维持总线的锁存信号直到与其联合的指令执行完; CPU与其他协处理器协同工作时,可以避免破坏有用信息。

8086/8088指令助记符表

8086/8088指令助记符表(续)

作业三(续2): 教材:P123 习题 16 , 17

判断下列指令是否正确 3 .MOV DX, [SP] ;错 无[SP]寻址方式,存储器地址只能 通过BX,BP,SI,DI寻址 1 .MOV DS,2010H ;错 不能将立即直接给段寄存器 2 .PUSH AL ;错 不能对字节进行堆栈操作 3 .MOV DX, [SP] ;错 无[SP]寻址方式,存储器地址只能 通过BX,BP,SI,DI寻址 4 .IN AL,0A00H ;错 端口地址大于FFH应用DX寻址端口 5 .XCHG CL,CH ;对 6 .SHR AX,3 ;错 移位次数大于1时,应将其放于CL中

7.MOV AX,ES:[BX];对 8.ADD [BP+DI],[1000H] ;错 两个操作数不能均为存储器 9.OUT DX,CL ;错 端口只能通过AL或AX传送数据 10.CBW BH ;错 CBW为无操作数指令,默认操作数AL 11.ADD 03ECH,AX ;错 目的操作数不能为立即数 12.MOV BX,[SI+DI];错 无[SP+DI]寻址,必须是基址 (BX或BP)+变址(SI或DI) 13.MOV DI,[AX] ;错 无[AX]寻址,存储器地址只能 通过BX,BP,SI,DI寻址

14.LEA BX,1000H ;错 LEA源操作数应为一个存储器操作数, 不能是立即数 15.LEA DX,DI ;错 LEA源操作数应为一个存储器操作数, 不能是寄存器 16.MOV AX,[BX+BP];错 无[BP+BX]寻址, 必须是基址(BX或BP)+变址(SI或DI) 17.CMP [BX],[SI] ;错 双操作数不能均为存储器 18.MUL 24H ;错 MUL为单操作数指令, 且源操作数不能为立即数 19.OUT DX,BX ;错 端口只能通过AL或AX传送数据

20.AND 0FH,AL ;错 目的操作数不能为立即数 21.SAL [BX],CX ;错 移位次数大于1时, 应将其放于CL中 22.MOVS ;错 应该给出属性,是B还是W 23.JMP DWORD PTR[BX+SI];对 24.JNZ AAA ;错 AAA是一条指令.不能作为符号地址 25.JMP NEXT ;对 26.SBB AX,[DX] ;错 DX不能间接寻址