590 likes | 781 Views
微机原理与接口技术. 第九讲. § 3-3 8086 的 指令系统. 指令系统. 一、数据传送指令 二、算术运算指令. 三、逻辑运算和移位指令 四、串操作指令 五、转移指令. 六、处理器控制指令. 2. § 3-3 8086 的 指令系统. 五、控制转移指令. 【 作用 】. 改变 CS 和 IP 的值,从而 改变指令的执行顺序 。. 【 类型 】. 无条件转移和过程调用指令 条件转移指令. 条件循环控制指令 中断指令. 3. § 3-3 控 制转移指令. 【 8086 的指令系统 】 4.
E N D
微机原理与接口技术 第九讲
§3-3 8086的指令系统 指令系统 一、数据传送指令 二、算术运算指令 三、逻辑运算和移位指令 四、串操作指令 五、转移指令 六、处理器控制指令 2
§3-3 8086的指令系统 五、控制转移指令 【作用】 改变CS和IP的值,从而改变指令的执行顺序。 【类型】 无条件转移和过程调用指令 条件转移指令 条件循环控制指令 中断指令 3
§3-3 控制转移指令 【8086的指令系统】 4 无条件转移和过程调用指令 JMP CALL RET 无条件转移 过程调用 过程返回 条件转移(见教材71页) JZ / JE (10条指令) JA / JNBE(8条指令) 直接标志转移 间接标志转移 条件循环控制 LOOP LOOPE / LOOPZ LOOPNE / LOOPNZ JCXZ CX≠0 则循环 CX≠0和ZF=1 则循环 CX≠0和ZF=0 则循环 CX=0 则转移 中 断 INT INTO IRET 中断 溢出中断 中断返回
§3-3 控制转移指令 【8086的指令系统】 1. 无条件转移和过程调用指令(Unconditional Transfer and Call) ⑴JMP无条件转移指令(Jump) 指令格式:JMP 目的 指令功能:程序无条件地转移到指定的目的地址去执行。 两种转移类型: 段内转移或近(NEAR)转移 转移指令的目的地址和JMP指令在同一代码段中,转移时,仅改变IP 寄存器的内容,段地址CS的值不变。 段间转移,又称为远(FAR)转移 转移指令的目的地址和JMP指令不在同一段中,转移时,CS和IP的 值都要改变,程序转到另一代码段去执行。 5
§3-3 控制转移指令 【8086的指令系统】 两种提供地址的方式: 直接转移 指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,它 又可分为段内直接转移和段间直接转移。 间接转移 目的地址包含在某个16位寄存器或存储单元中,CPU根据寄存器或存 储器寻址方式,间接地求出转移地址。这种转移类型又可分为段内间接 转移和段间间接转移。 转移类型和提供地址的方式的组合可形成不同指令,如下表所示: 6
§3-3 控制转移指令 【8086的指令系统】 无条件转移指令的类型和方式 类型 方式 寻址目标 指令举例 段内 转移 直接 直接 立即短转移(8位) 立即近转移(16位) JMP SHORTPROG_S JMP NEAR PTRROG_N 间接 间接 寄存器(16位) 存储器(16位) JMP BX JMP WORD PTR[BX] 段间 转移 直接 间接 立即转移(32位) 存储器(32位) JMP FAR PTRPROG_F JMP DWORD PTR[DI] 7
§3-3 控制转移指令 ①段内直接转移指令 指令格式:JMP SHORT 【8086的指令系统】 标号 标号 (或:JMP 标号) JMP NEAR PTR 特点: ▲目的操作数均用标号表示; ▲程序转向的有效地址EA=当前IP寄存器的内容+8/16位位移量(DISP)。 16位:近转移,范围在-32768~+32767个字节之间; 8位:短转移,范围在-128~+127个字节之间; ▲位移量带符号:正的向高地址转移;负的向低地址转移,且必须用补码 表示。 8
§3-3 控制转移指令 【8086的指令系统】 ▲段内近/短转移指令的机器码及其操作功能如下图所示。 其中第一个字节为操作码,后面的字节是位移量。 注意:8位的位移量与IP相加时,用符号扩展法扩展成16位后再相加。 段内近转移指令 E9 DISP_L 执行操作:IP DISP_H ← IP+16位位移量 段内短转移指令 EB DISP_L 执行操作:IP ← IP+8位位移量 9
§3-3 控制转移指令 【8086的指令系统】 近转移:标号前加说明符 NEAR PTR,也可以省略不写。 短转移:则在标号前需加说明符 SHORT PTR。 ;段内短转移 PROG_S JMP SHORT PTR ;段内近转移(或:JMP PROG_N) PTR PROG_N JMP NEAR 行号 1 偏离量 0000H 0000H 程 序 SEGMENT 机器码 CODE ASSUME CS:CODE 2 PROG_S: AL,05H 3 4 0000H 0002H 0405 90 ADD NOP 5 6 7 0003H 0005H 0006H EBFB 90 JMP SHORT NOP ENDS PROG _S CODE 8 END 10
§3-3 控制转移指令 【8086的指令系统】 位移量DISP的计算: DISP=目的地址偏移量-IP的当前值 =0000H-0005H =-5H 补码为FBH,经符号扩展后为FFFBH。 IP的修改: IP=IP+DISP =0005H+FFFBH =0000H 程序转到偏移量为0的位置,即标号为PROG_S处执行。 注意: 段内近转移指令,和段内短转移指令类似,不过段内近转移指令占有3 个字节,计算时注意。它可以转移到段内任何地址去执行指令。 11
§3-3 控制转移指令 【8086的指令系统】 ②段内间接转移指令 指令格式:JMP 16位寄存器 / 字存储器单元 特点: 16位有效地址存放在一个16位寄存器、字存储器单元; 寄存器内容; 寄存器间接寻址:有效地址存放在寄存器中,即IP 字存储单元内容; 存储单元间接寻址:有效地址存放在存储单元中,即IP 对于间接寻址,首先要计算出存储单元的物理地址,再从该地址处取一个字 送到IP。 12
§3-3 控制转移指令 【8086的指令系统】 【例】 JMP BX 解:若该指令执行前BX=4500H; 则指令执行时,将当前IP修改成4500H; 程序转向段内偏移地址为4500H处执行。 【例】 JMP WORD PTR [BX] 解:设指令执行前,DS=2000H,BX=100H,(20105H)=04F0H; 则指令执行后,IP=(20000H+100H+5H)=(20105H)=04F0H; 转到代码段内偏移地址为04F0H处执行。 注意: 指令的目的操作数前要加WORD PTR,表示进行的是字操作。 13
§3-3 控制转移指令 ③段间直接(远)转移指令 【8086的指令系统】 指令格式:JMP FAR 标号 特点: 用远标号直接给出了转向的段地址和偏移量,即 标号的段内偏移量 标号所在段的段地址 IP CS 例 JMP FAR PTR PROG_F 解:设标号PROG_F所在段的基地址=3500H,偏移地址=080AH; 则指令执行后,IP=080AH,CS=3500H; 程序转到3500:080AH处执行。 14
§3-3 控制转移指令 【8086的指令系统】 ④段间间接转移指令 指令格式:JMP DWORD PTR [存储单元] 特点: 目的地址的段地址和偏移量放在存储器中的4个连续地址单元中:前两 个字节为偏移量;后两个字节为段地址。指令中给出存放目标地址的存 储单元的首字节地址值; 注意: 指令的目的操作数前要加说明符DWORD PTR。 15
§3-3 控制转移指令 【8086的指令系统】 【例】JMP DWORD PTR [SI十0125H] 解:设指令执行前: CS=1200H,IP=05H,DS=2500H,SI=1300H; 内存单元(26425H)=4500H,(26427H)=32F0H。 指令中的位移量D1SP=0125H,即:DISP_H=01H,DISP_L=25H。 由附录B可知,该指令占4个字节。 第1个字节是操作码:FFH; 第2个字节的编码:MOD 101 R/M,查表3-2可得到MOD=10,R/M=100; 第3和第4字节:位移量低字节和高字节; 于是,机器码为FF AC 25 01H,该指令的编码格式为: OP MOD 101 R/M DISP_L DISP_H 1111 1111 10 101 100 0010 0101 0000 0001 16
§3-3 控制转移指令 【8086的指令系统】 指令要转向的地址存放在内存单元 DS:(SI+DISP) 中,即 目的操作数地址=DS×16+SI+DISP =25000H+1300H+0125H =26425H 从单元中取出转移地址,赋与IP和CS:IP=4500H,CS=32F0H; 程序转到32F0:4500H处执行。 指令的执行过程如下图所示。 17
§3-3 控制转移指令 【8086的指令系统】 X10H 现行代码段 CS 1200H + 12005H F A 2 0 F C 5 1 JMP指令操作码 DISP=0125H IP 0005H X10H DS 2500H 现行数据段 + SI 1300H 0 4 0 5 26425H 新IP=4500H F 3 0 2 DISP 0125H 新CS=32F0H 新的代码段 32F0H : 4500H JMP指令转向地址 18
§3-3 控制转移指令 【8086的指令系统】 ⑵过程调用和返回指令(Call and Return) 过程:程序中能完成特定功能而又独立的模块,也称子程序。 过程嵌套:在过程运行中又去调用另一个过程。 过程调用和返回指令的格式:CALL 过程名 RET 近过程调用:调用指令CALL和被调用的过程在同一代码段中。 远过程调用:两者在不同代码段中。 CALL指令执行时分两步: 第一步:是将返回地址(CALL指令下面那条指令的地址)推入堆栈。 近调用的操作:SP SP-2,IP入栈; 远调用的操作:SP SP-2,CS入栈;SP SP-2,IP入栈 第二步:转到程序的入口地址去执行。 寻址方法有四种:段内直接调用;段内间接调用;段间直接调用;段间间接 调用;(但没有段内短调用指令) 19
§3-3 控制转移指令 【8086的指令系统】 RET指令: 从栈中弹出返回地址,使程序返回主程序继续执行。 这里分为两种情况: SP+2 SP+2;再 如果从近过程返回:从栈中弹出一个字 如果从远过程返回:先从栈中弹出一个字 IP,并且使SP IP,并且使SP SP十2。 从个字栈中弹出一个字CS,并使SP ①段内直接调用和返回 例 CALL ;PROG_N是一个近标号 PROG_N 解:根据附录B可知,该指令含3字节,编码格式为: 调用之前:CS=2000H,IP=1050H,SS=5000H,SP=0100H,PROG_N与 CALL指令之间的距离等于1234H(即DISP=1234H) ,则 E8 DISP_L DISP_H 20
§3-3 控制转移指令 CALL指令的执行过程:如图所示 【8086的指令系统】 SP SP一2,即新的SP=0100H一2=00FEH 返回地址的IP入栈。 CALL指令的首地址:CS:IP=2000:1050H; 指令占3字节; 指令结束后的地址:2000:1053H,即IP=1053H,压入堆栈; 计算出新的IP值,作为子程序的入口地址,即 IP = IP+DISP = 1053H+1234H = 2287H RET指令的执行过程: IP (SP和SP+1)单元内容,即IP=1053H SP SP+2,即新的SP=00FEH+2=0100H 21
§3-3 控制转移指令 【8086的指令系统】 2000:1050 E 3 8 4 2000:1050 1 2 转 子 程 序 2000:1053 :1053 转返址执行 返 址 入 栈 :2287 弹出返址 :00FE 5000:0100 5 3 1 0 新SP=00FE 原SP=0100 5 3 1 0 (原SP=00FE) 新SP=0100 5000:0100 (b)RET指令 (a)CALL PROG_G指令 22
§3-3 控制转移指令 ②段内间接调用和返回 例1 CALL BX; 例2 CALL WORD PTR [BX十SI]; 【8086的指令系统】 操作步骤:SP SP一2,IP入栈,IP EA(从目的操作数取得或计算) 设:DS=1000H,BX=200H,SI=300H,(10500H)=3210H 例1中:EA=0200H; 例2中:EA=(16×DS+BX+SI) =(10000H+0200H+0300H)=(10500H)=3210H 返回: IP (SP和SP+1)单元内容(返回地址出栈) SPSP+2(修改栈顶指针) 23
§3-3 控制转移指令 【8086的指令系统】 ③段间直接调用 例3-75 CALL FAR PTR PROG_F;PROG_F是一个远标号 解:指令为5字节,编码格式为: 9A DISP_L DISP_H SEG_L SEG_H 调用之前: CS=1000H ,IP=205AH ,SS=2500H ,SP=0050H ,标号PROG_F 的地址 指针CS=3000H,IP=0500H; 存放CALL 指令的内存首地址为1000 :205AH ,由于该指令长度为5 个字 节,所以返回地址应为1000:205FH。 24
§3-3 控制转移指令 CALL指令的执行过程: 【8086的指令系统】 SP SP -2(SP=0050H -2=004EH), CS入栈(CS=1000H); SP SP-2(SP = 004CH),IP入栈(IP=205FH); 转子程序:FROG_F的段地址和偏移地址送CS:IP,CS 3000H, IP 0500H RET指令执行过程:(寻址方式也是段间直接调用) 栈中内容(IP 栈中内容(CS 205FH),SP 1000H),SP SP+2(SP SP+2(SP 004C+2=004EH) 004EH+2=0050H) IP CS 程序转返回地址CS:IP=1000:205FH处执行。 25
§3-3 控制转移指令 【8086的指令系统】 X10H 代码段 1000 CS + 1000:205A 操作码 过程入口IP 9 0 0 A 0 5 205A IP 0 3 0 0 过程入口CS 1000:205F (返址) 下条指令 堆栈段 2500:004C (新栈顶) 5 2 F 0 (返址IP) 0 1 0 0 X10H (返址CS) 2500 SS 2500:0050 (原栈顶) + 0050 SP 新的代码段 3000:0500 过程入口 图3-22 段间调用指令的执行过程 26
§3-3 控制转移指令 【8086的指令系统】 ④段间间接调用 操作数:必须是存储单元——存放的双字表示的入口地址,其中前2个字节 是偏移量,后两个字节为代码段基地址。 例3-76 CALL DWORD PTR [BX] 解:设DS=1000H,BX=200H,(10200H)=31F4H,(10202)=5200H。 CALL指令的执行过程: SP一2,CS入栈 SP一2,IP入栈 SP SP (10202)=5200H (10200H)=31F4H,CS IP 转子程序入口,CS:IP = 5200H:31F4H RET指令执行过程: SP+2 SP+2 栈中内容, SP 栈中内容, SP IP CS 程序转返回地址CS:IP处执行。 27
§3-3 控制转移指令 【8086的指令系统】 带参数的返回指令 RET n n称为弹出值,CPU在弹出返回地址后,再从堆栈中弹出n个字节的数据。其 值可以是0000-0FFFFH范围内的任何一个偶数。 用途: 调用过程的主程序通过堆栈向过程传递参数。 参数在调用过程前推入堆栈,过程运行中通过堆栈指针寻找; 过程返回时,用RET n把它们从栈中弹出。 28
§3-3 控制转移指令 【8086的指令系统】 2.条件转移指令(Conditional Transfer) 根据上一条指令执行后的状态标志作为判别测试条件来决定是否转移。 注意: 条件转移均为段内短转移。 目的地址=当前IP值+8位相对位移量。 它与转移指令之后的那条指令间的距离,允许为-128~+127字节; 8位偏移量用符号扩展法扩展到16位与IP相加。 指令格式:条件操作符 标号 条件转移指令共有18条,可以为两类: 直接标志转移指令 间接标志转移指令 29
§3-3 控制转移指令 【8086的指令系统】 ⑴直接标志转移指令(10条) 在指令助记符中直接给出标志状态的测试条件:以CF,ZF,SF,OF和PF等5 个标志的10种状态为判断的条件。 指令助记符 测试条件 指令功能 JC JNC JZ/JE JNZ/JNE JS JNS JO JNO JP/JPE JNP/JPO CF=1 CF=0 ZF=1 ZF=0 SF=1 SF=0 OF=1 OF=0 PF=1 PF=0 有进位 转移 无进位 转移 结果为零/相等 转移 不为零/相等 转移 符号为负 转移 符号为正 转移 溢出 转移 无溢出 转移 奇偶位为1/为偶 转移 奇偶位为0/为奇 转移 30
§3-3 控制转移指令 【8086的指令系统】 例: 求AL和BL寄存器中的两数之和,若有进位,则AH置1,否则AH清0。 【解】:可用如下程序段来实现该操作: AL,BL NEXT AH,0 EXIT ;两数相加 ;若有进位,转NEXT ;无进位,AH=0 ;往下执行 ADD JC MOV JMP NEXT: EXIT: ……… AH,1 ;有进位,AH置1 ;程序继续进行 MOV 31
§3-3 控制转移指令 【8086的指令系统】 ⑵间接标志转移 指令的助记符中不直接给出标志状态位的测试条件,而是标志的状态组合作 为测试的条件。 指令应用:通常放在比较指令CMP之后,以比较两个数的大小。 无符号数比较测试指令中,指令助记符中的“A”是英文Above的缩写,表示“高于” 之意,“B”是英文Below的缩写,表示“低于”之意; 带符号数比较测试指令中,指令助记符中的“G” (Great than)表示大于, “L”(Less than)表示小于。 32
§3-3 控制转移指令 【8086的指令系统】 间接标志条件转移指令 类别 指令助记符 测试条件 指令功能 无符号数比 较测试 JA/JNBE JAE/JNB JB/JNAE JBE/JNA CF∨ZF =0 CF=0 CF=1 CF∨ZF=1 高于/不低于等于 转移 高于等于/不低于 转移 低于/不高于等于 转移 低于等于/不高于 转移 带符号数比 较测试 JG/JNLE JGE/JNL JL/JNGE JLE/JNG (SF⊕OF)∨ZF=0 SF⊕OF =0 SF⊕OF =1 (SF⊕OF)∨ZF=1 大于/不小于等于 转移 大于等于/不小于 转移 小于/不大于等于 转移 小于等于/不大于 转移 33
§3-3 控制转移指令 【8086的指令系统】 【例】设某个学生的英语成绩已存放在AL寄存器中,若低于60分,则打印 F(FAIL);若高于或等于85分,则打印G(GOOD);当在60分和84分之 间时,打印P(PASS)。 程序: AL,60 FAIL AL,85 GOOD AL,’P’ PRINT AL,’F’ PRINT AL,’G’ ;与60分比较 ;<60,转FAIL ;≥60,然后与85分比较 ;≥85,转GOOD ;其它,将AL←’P’ ;转打印程序 ; AL←’F’ ;转打印程序 ; AL←’G’ ;打印存在AL中的字符 CMP JB CMP JAE MOV JMP FAIL: MOV JMP GOOD:MOV PRINT:… 34
§3-3 控制转移指令 【8086的指令系统】 【例】假设某温度控制系统中,从温度传感器输入一个8位二进制的摄氏温 度值。当系统中温度低于100度时,则打开加热器;当温度上升到100 度或100度以上时,关闭加热器,进行下一步处理。设温度传感器的端 口号为320H,同时假设控制加热器的输出信号连到端口321H的最低有 效位,当将这一位置1时,加热器便打开,清0时则关闭加热器。 解:实现上述温度控制的程序如下: 35
§3-3 控制转移指令 【8086的指令系统】 GET_TEMP: HEAT _ON: HEAT _OFF: DX, 320H AL, DX AL, 100 HEAT _ON HEAT _OFF AL, 01H DX, 321H DX, AL GET_TEMP AL, 01H DX, 321H DX, AL ; DX指向温度输入端口 ; 读取温度值 ; 与 100度比较 ;< 100度,加热 ;≥ 100度,停止加热 ; D0位置 1,加热 ; 加热器口地址 ; 打开加热器 ; 继续检测温度 ; D0位置 0,停止加热 ; 关闭加热器 ;进行其他处理 MOV IN CMP JB JMP MOV MOV OUT JMP MOV MOV OUT … 36
§3-3 控制转移指令 【8086的指令系统】 3.循环控制指令(Iteration Control) 特点: 是一组增强型的条件转移指令,控制程序段的重复执行,重复次数存 于CX寄存器中。 指令的字节数均为2,第一字节是操作码,第二字节是8位偏移量,转 移的目标都是短标号。 循环指令中的偏移量都是负值。 循环控制指令均不影响任何标志。 这类指令共有4条。 37
§3-3 控制转移指令 【8086的指令系统】 (1)LOOP循环指令(Loop) 指令格式:LOOP 短标号 指令功能:控制重复执行一系列指令,重复次数放在CX寄存器中,每执 行一次LOOP指令,CX自动减1。如果减1后CX≠0,则转移到指令 中所给定的标号处继续循环;若自动减1后CX=0,则结束循环。 一条LOOP指令相当于执行以下两条指令的功能: DEC CX JNZ 标号 38
§3-3 控制转移指令 【8086的指令系统】 【例】 设商店里有8种商品,价格分别为83元,76元,65元,84元,7l元,49元, 62元和58元,现要将每种商品提价7元,编程计算每种商品提价后的价格。 83H,76H,65H,84H 71H,49H,62H,58H 8 DUP( ?) OLD NEW DB DB DB … CX,08H BX,00H AL,OLD + [BX] AL,7 NEW+[BX] , AL BX NEXT ;共8种商品 ;BX作指针,初值为0 ;读入一个商品的原价 ;加上提价因子 ;调整为十进制 ;存放结果 ;地址指针加1 ;如未加满8次,继续循环 ;已加完8次 MOV MOV NEXT: MOV ADD DAA MOV INC LOOP 39
§3-3 控制转移指令 【8086的指令系统】 【例】这是一个用循环和跳转指令来控制PC机的扬声器发声的程序。在PC机中, 61H端口的D1和D0位接到扬声器接口电路上,在D0=0的情况下:当D1=1时, 扬声器被接通,D1=0则断开,通过控制这一位的值,就能产生一个由1和0构 成的二进制序列,使扬声器发声。 AL,61H AL,0FCH AL,02 61H,AL CX,260 ; AL←从61H端口读取数据 ;保护D7 ~D2位, D0位清零 ;触发D1位,使之在0和1间变化 ;控制扬声器开关通断 ;CX=循环次数 IN AND MORE:XOR OUT MOV DELAY:LOOP DELAY ;循环延时 ;再次触发 JMP MORE 延时程序的实现: CX,10 ;循环次数为10 MOV DELAY: ;本指令重复执行10次 LOOP DELAY 40
§3-3 控制转移指令 【8086的指令系统】 ⑵LOOPE/LOOPZ相等或结果为零时循环(Loop If Equal/Zero) 指令格式:LOOPE 标号 或LOOPZ 标号 指令功能: LOOPE是相等时循环; LOOPZ是结果为零时循环; 指令执行前,先将重复次数送到CX中,每执行一次指令,CX自动减1, 若减1后CX≠0和ZF=1(相等),则转到指令所指定的标号处重复执行; 若CX=0或ZF=0,便退出循环。 41
§3-3 控制转移指令 【8086的指令系统】 【例】设有一个由50个字节组成的数组存放在ARRAY开始的内存单元中, 现要对该数组中的元素进行测试,若元素为0,而且不是最后一个元素,便 继续进行下一个元素的测试,直到找到第一个非零元素或查完了为止。 ARRAY: × ×, × ×,… ;含50个元素的数据 DB … BX,OFFSET ARRAY ;BX指向数组开始单元 MOV ;指针减1 ;CX=元素个数 DEC MOV BX CX,50 NEXT: ;指向数组的下 个元素 ;数组元素与0比较 ;若元素为0 INC CMP LOOPE BX [BX],00H NEXT ;和CX≠0,循环 ;否则,继续查找 … 42
§3-3 控制转移指令 【8086的指令系统】 ⑶LOOPNE/LOOPNZ不相等或结果不为零循环 (Loop If Not Equal/Not Zero) 指令格式:LOOPNE 标号 或 LOOPNZ 标号 指令功能: LOOPNE是不相等时循环; LOOPNZ是结果不为零循环。 指令执行前,应将重复次数送入CX,每执行一次,CX自动减1,若减1 后CX≠0和ZF=0,则转移到标号所指定的地方重复执行;若CX=0或 ZF=1,则退出循环,顺序执行下一条指令。 43
§3-3 控制转移指令 【8086的指令系统】 【例】设一个由17个字符组成的字符串存放在STRING开始的内存中,查找该 字符串中是否包含空格符。若没有找到和尚未查完,测继续查找,直到找 到第一个空格符或查完了才退出循环。 下面是实现上述操作的程序: ARRAY ;字符串 DB ‘Personal Computer’ … BX,OFFSET ARRAY ;BX指向字符串的开始 MOV ;BX-1 ;CX=字符串长度 ;指向下一个字符串 ;字符串元素与空格比较 ;空格的ASCII码为20H DEC MOV NEXT:INC CMP BX CX,17 BX [BX],20H ;找到空格或CX已为0 LOOPNE NEXT 44
§3-3 控制转移指令 【8086的指令系统】 ⑷JCXZ若CX为0跳转(Jump If CX Zero) 指令格式:JCXZ 标号 指令功能: 若CX寄存器为零,则转移到指令中标号所指定的地址处,它不对 CX寄存器进行自动减1的操作。 主要用在循环程序开始处,为跳过循环,把CX寄存器清零。 45
§3-3 控制转移指令 【8086的指令系统】 4.中断指令(Iterrupt) ⑴中断概念 ▲定义:计算机暂时中止当前程序的运行,执行中断服务程序去为临时发生 的事件服务,执行完毕后,返回正常程序继续运行,这个过程称 为中断。 引脚NMI引入(马上响应) 引 起 中 断 的 原 因 (处理如系统掉电等重大故障) 外部中断 IF=1(允许响应) IF=0(不允许响应) 中 断 源 引脚INTR引入 意外情况 如除法运算出错、溢出错误等; 调试; 中断指令 INT n ; 内部中断: 46
§3-3 控制转移指令 【8086的指令系统】 ▲中断过程: 断点(CS,IP值)、标志寄存器的值入栈保护 取入口地址(中断类型×4得到中断向量的地址) 执行中断服务程序 执行中断返回指令IRET,从堆栈中恢复中断前CPU的状态和断点。 ▲中断向量表: 低2字节存放中断服务程序入口地址的偏移量 IP; 高2字节存放中断服务程序入口地址的段地址 CS; 中断服务程序入口地址=中断类型×4; 47
§3-3 控制转移指令 【8086的指令系统】 内部中断:专用中断,实现某种特定功能。除NMI外,其它几个都是软件中断。 ①除法错中断(类型0):除数为0;商超过范围 ②单步中断(类型1):单步标志TF置1; ③不可屏蔽中断(类型2):NMI引脚上接收到由低变高的电平变化; ④断点中断(类型3):调试程序时,程序执行到断点时便产生中断 ⑤溢出中断(类型4):溢出标志OF置l,溢出中断指令INTO产生 (注意:除单步中断外,都不能被屏蔽,不受中断允许标志IF的控制) 48
§3-3 控制转移指令 【8086的指令系统】 ⑵中断指令 ①软件中断指令(Interrupt): INT n 也称陷阱中断。n为中断类型号,范围0~255。 CPU执行INT n指令的过程: 标志寄存器的内容入栈 ; 当前断点的段基地址CS、偏移地址IP入栈 ; 清除中断标志IF、单步标志TF ; 将中断类型号n乘以4,找到中断服务程序的入口地址表的表头地址, 获得中断服务程序的入口地址,置入CS和IP寄存器转到相应中断服务程序。 ②溢出中断指令(Interrupt On overflow):INTO 带符号数进行算术运算时,若OF=1,则溢出中断指令INTO产生类型为4的中断。 可在带符号加减法运算之后安排一条INTO指令。 49
§3-3 控制转移指令 【8086的指令系统】 ③中断返回指令(Interrupt Return): IRET 实现中断返回。 安排在中断服务程序的出口处。 执行后: 首先从堆栈中依次弹出程序断点,送到IP和CS寄存器中; 接着弹出标志寄存器的内容,送回标志寄存器; CPU按CS:IP的值返回断点,继续执行原来被中断的程序。 50