《第3章6 控制转移指.ppt》由会员分享,可在线阅读,更多相关《第3章6 控制转移指.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 无条件转移无条件转移指令指令 JMP 条件转移条件转移指令指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ 循环循环指令指令 LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE 子程序调用和返回子程序调用和返回指令指令 CALL、RET 中断与中断返回中断与中断返回指令指令 INT、INTO、IRET3.2.5 控制转移指令:控制转移指令:JMP(jmp)跳转指令无条件地转移到指令指定的地址去执行从该地址开始的指令。可以看出JMP指令必须指定转移的目标地址(或称转向地址)。总的说来,转
2、移可以分成两类:段内转移和段间转移。段内转移是指在同一代码段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。段间转移则是要转到另一个代码段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此,此时的转移目标地址应由新的段地址和偏移地址两部分组成。1 无条件转移指令无条件转移指令无条件转移指令的格式及执行的操作:无条件转移指令的格式及执行的操作:段内直接短转移:段内直接短转移:JMP SHORT OPR(例)例)执行操作:执行操作:(IP)(IP)+8位位移量位位移量段内直接近转移:段内直接近转移:J
3、MP NEAR PTR OPR 执行操作:执行操作:(IP)(IP)+16位位移量位位移量段内间接转移:段内间接转移:JMP WORD PTR OPR 执行操作:执行操作:(IP)(EA)无条件转移指令无条件转移指令段间直接远转移:段间直接远转移:JMP FAR PTR OPR(例)例)执行操作:执行操作:(IP)OPR 的段内偏移地址的段内偏移地址 (CS)OPR 所在段的段地址所在段的段地址段间间接转移:段间间接转移:JMP DWORD PTR OPR 执行操作:执行操作:(IP)(EA)(CS)(EA+2)说明:说明:JMP指令不影响条件标志位。指令不影响条件标志位。无条件转移指令无条件
4、转移指令条件转移指令根据上一条指令所设置的条件码来判别测试条件,每一种条件转移指令有它的测试条件,满足测试条件则转移到由指令指出的转向地址去执行那里的程序;如不满足条件则顺序执行下一条指令。因此,当满足条件时:(IP)(IP)+符号扩展到16位后的位移量D8,如不满足测试条件:则(IP)不变。可见条件转移指令使用了相对寻址方式,在汇编格式中OPR应指定一个目标地址,这个目标地址应在本条转移指令下一条指令地址的-128+127个字节的范围之内。即条件转移即条件转移指令只能使用段内直接寻址的指令只能使用段内直接寻址的8 位位移量(段内直接位位移量(段内直接短转移)。短转移)。另外,所有的条件转移指
5、令都不影响条件码。2 条件转移指令条件转移指令 格式格式 测试条件测试条件JZ(JE)OPR ZF=1JNZ(JNE)OPR ZF=0JS OPR SF=1JNS OPR SF=0JO OPR OF=1JNO OPR OF=0JP OPR PF=1JNP OPR PF=0JC OPR CF=1JNC OPR CF=0(1)根据单个条件标志的设置情况转移根据单个条件标志的设置情况转移 格式格式 测试条件测试条件 JB(JNAE,JC)OPR CF=1 JNB(JAE,JNC)OPR CF=0 JBE(JNA)OPR CFZF=1 JNBE(JA)OPR CFZF=0*适用于地址或双精度数低位字的
6、比较适用于地址或双精度数低位字的比较(2)比较两个无符号数,并根据比较结果转移比较两个无符号数,并根据比较结果转移*格式格式 测试条件测试条件 JL(JNGE)OPR SF OF=1 JNL(JGE)OPR SF OF=0 JLE(JNG)OPR (SF OF)ZF=1 JNLE(JG)OPR (SF OF)ZF=0*适用于带符号数的比较适用于带符号数的比较(3)比较两个带符号数,并根据比较结果转比较两个带符号数,并根据比较结果转移移 格式格式 测试条件测试条件 JCXZ OPR (CX)=0(4)测试测试 CX 的值为的值为 0 则转移则转移例例:如如果果 X50,转转到到TOO_HIGH;
7、否否则则|X-Y|RESULT,如如果果溢溢出出转转到到 OVERFLOW,JGJGJOJOJNSJNS MOV AX,XMOV AX,XCMP AX,50CMP AX,50 TOO_HIGH TOO_HIGHSUB AX,YSUB AX,Y OVERFLOW OVERFLOW NONNEG NONNEGNEG AXNEG AX NONNEG:NONNEG:MOV RESULT,AX MOV RESULT,AX JMP EXITJMP EXITTOO_HIGH:TOO_HIGH:JMP EXIT JMP EXITOVERFLOW:OVERFLOW:EXIT:EXIT:MOV AX,4C00HM
8、OV AX,4C00HINTINT21H21H例:例:、是双精度数,分别存于是双精度数,分别存于 DX,AX 及及 BX,CX 中,中,时转时转 X,否则转否则转Y CMP DX,BX CMP DX,BX JG X JG X JL Y JL Y CMP AX,CX CMP AX,CX JA X JA XY:Y:JMP EXITJMP EXITX:X:EXIT:EXIT:MOV AX,4C00HMOV AX,4C00HINTINT21H21H循环结构用转移指令实现循环结构:MOV CX,N AGAIN:DEC CX JNZ AGAINLOOP OPRLOOPZ/LOOPE OPRLOOPNZ/L
9、OOPNE OPR执行步骤:执行步骤:(1)(CX)(CX)-1(2)检查是否满足测试条件,检查是否满足测试条件,如如满满足足则则(IP)(IP)+8位位位位移移量量,实实行行循循环环;不满足则不满足则 IP 不变,退出循环。不变,退出循环。3 循环指令:循环指令:循环指令循环指令注意:注意:*CX 中存放循环次数中存放循环次数*只能使用段内直接寻址的只能使用段内直接寻址的8 位位移量位位移量*不影响条件标志位不影响条件标志位循环指令:循环指令:LOOP OPR测试条件:测试条件:(CX)0为零或相等时循环指令:为零或相等时循环指令:LOOPZ(LOOPE)OPR测试条件:测试条件:ZF=1
10、且且(CX)0不为零或不相等时循环指令:不为零或不相等时循环指令:LOOPNZ(LOOPNE)OPR测试条件:测试条件:ZF=0 且且(CX)0LOOP AGAIN DEC CX JNZ AGAIN循环指令:循环指令:例:求首地址为例:求首地址为 ARRAY 的的 M 个字之和,个字之和,结果存入结果存入 TOTALMOV CX,MMOV CX,MMOV AX,0MOV AX,0MOV SI,AXMOV SI,AXAGAIN:AGAIN:ADD AX,ARRAYSIADD AX,ARRAYSIADD SI,2ADD SI,2LOOP AGAINLOOP AGAINMOV TOTAL,AXMOV
11、 TOTAL,AX例:例:子程序结构相当于高级语言中的过程子程序结构相当于高级语言中的过程(procedure)。为便为便于模块化程序设计,往往把程序中某些具有独立功能的部分编于模块化程序设计,往往把程序中某些具有独立功能的部分编写成独立的程序模块,称之为子程序。写成独立的程序模块,称之为子程序。程序中可由调用程序(或称主程序)调用这些子程序,程序中可由调用程序(或称主程序)调用这些子程序,而在子程序执行完后又返回调用程序继续执行。而在子程序执行完后又返回调用程序继续执行。主程序调用子程序时使用主程序调用子程序时使用CALL指令,由子程序返回主程指令,由子程序返回主程序时使用序时使用RET指令
12、。由于调用程序和子程序可以在同一个代码指令。由于调用程序和子程序可以在同一个代码段中,也可以在不同的代码段中,因此,段中,也可以在不同的代码段中,因此,CALL指令和指令和RET指令指令也有近调用、近返回及远调用、远返回两类格式。也有近调用、近返回及远调用、远返回两类格式。4 过程调用和返回指令过程调用和返回指令code1 segmentcode1 segmentmain proc main proc farfar callcall far far ptrptr subpsubp ret retmain main endpendpcode1 endscode1 endscode2 segmen
13、tcode2 segmentsubpsubp proc proc farfar retretsubpsubp endpendpcode2 endscode2 ends 段间调用和返回段间调用和返回code segmentcode segmentmain proc main proc farfar call call subpsubp ret retmain main endpendpsubpsubp proc proc nearnear retretsubpsubp endpendpcode endscode ends 段内调用和返回段内调用和返回子程序调用和返回指令:子程序调用和返回指令:(
14、1)段内直接近调用:)段内直接近调用:CALL DST执行操作:执行操作:(SP)(SP)-2 (SP)+1,(SP)(IP)(IP)(IP)+16位位移量位位移量(2)段内间接近调用:)段内间接近调用:CALL DST执行操作:执行操作:(SP)(SP)-2 (SP)+1,(SP)(IP)(IP)(EA)其中其中EA是由是由DST的寻址方式所确定的有效地址。的寻址方式所确定的有效地址。1、CALL 调用指令调用指令(3)段间直接远调用:)段间直接远调用:CALL DST执行操作:执行操作:(SP)(SP)-2 (SP)+1,(SP)(CS)(SP)(SP)-2 (SP)+1,(SP)(IP)
15、(IP)偏移地址偏移地址 (CS)段地址段地址(4)段间间接远调用:)段间间接远调用:CALL DST执行操作:执行操作:(SP)(SP)-2 (SP)+1,(SP)(CS)(SP)(SP)-2 (SP)+1,(SP)(IP)(IP)(EA)(CS)(EA+2)1、CALL 调用指令调用指令(1)段内近返回:)段内近返回:RET执行操作:执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(2)段内带立即数近返回:段内带立即数近返回:RET EXP执行的操作:执行的操作:(IP)(SP)+1,(SP)(SP)(SP)+2 (SP)(SP)+D162、RET 返回指令返回指令(3)段间远
16、返回:段间远返回:RET执行操作:执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2 (CS)(SP)+1,(SP)(SP)(SP)+2(4)段间带立即数远返回:段间带立即数远返回:RET EXP执行操作:执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2 (CS)(SP)+1,(SP)(SP)(SP)+2 (SP)(SP)+D16CALL指令和指令和RET指令都不影响条件码。指令都不影响条件码。2、RET 返回指令返回指令有时当系统运行或者程序运行期间在遇到某些特殊情况时,需要计有时当系统运行或者程序运行期间在遇到某些特殊情况时,需要计算机自动执行一组专门的例行程序来进行
17、处理。这种情况称为算机自动执行一组专门的例行程序来进行处理。这种情况称为中断中断(Interrupt),所执行的这组程序称为所执行的这组程序称为中断例行程序(中断例行程序(Interrupt routine)或中断子程序或中断子程序。中断分为内部中断和外部中断两类。中断分为内部中断和外部中断两类。内部内部中断中断(软件中断)软件中断)包括象除法运算中遇到需要除以包括象除法运算中遇到需要除以0时所产生的中断,时所产生的中断,或者程序中为了作某些处理而设置的中断指令等。或者程序中为了作某些处理而设置的中断指令等。外部中断(硬件外部中断(硬件中断)中断)则主要处理则主要处理I/O设备与设备与CPU之
18、间的通信。之间的通信。当当CPU响应一次中断时,也要和调用子程序时类似地把(响应一次中断时,也要和调用子程序时类似地把(IP)和和(CS)保存入栈。除此之外,为了能全面地保存现场信息,以便保存入栈。除此之外,为了能全面地保存现场信息,以便在中断处理结束时返回现场,还需要把反映现场状态的(在中断处理结束时返回现场,还需要把反映现场状态的(PSW)保存入栈,然后才能转到中断例行程序去执行。当然从中断返回时,保存入栈,然后才能转到中断例行程序去执行。当然从中断返回时,除要恢复(除要恢复(IP)和(和(CS)外,还需要恢复(外,还需要恢复(PSW)。)。5 中断指令中断指令主程序主程序IRET中断服务
19、程序中断服务程序断点断点中断请求中断请求中断请求可以来自处理器外部的中断源,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起:也可以由处理器执行指令引起:例如执行例如执行INT i8指令。指令。中断的过程INT TYPE 或或 INT执行操作:执行操作:(SP)(SP)-2 (SP)+1,(SP)(FLAGS)(SP)(SP)-2 (SP)+1,(SP)(CS)(SP)(SP)-2 (SP)+1,(SP)(IP)(IP)(TYPE*4)(CS)(TYPE*4+2)INT指令设置指令设置IF和和TF标志为标志为0,不影响其它标志位不影响其它标志位*TYPE(0255)是中断类型号是
20、中断类型号,隐含的类型号为隐含的类型号为3(1)中断指令:中断指令:执行操作:执行操作:若若OF=1,(SP)(SP)-2 (SP)+1,(SP)(FLAGS)(SP)(SP)-2 (SP)+1,(SP)(CS)(SP)(SP)-2 (SP)+1,(SP)(IP)(IP)(10H)(CS)(12H)INTO指令设置指令设置IF和和TF标志为标志为0,不影响其它标志位不影响其它标志位(2)溢出中断指令:溢出中断指令:INTO执行操作:执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2 (CS)(SP)+1,(SP)(SP)(SP)+2 (FLAGS)(SP)+1,(SP)(SP)(SP)+2 注意:注意:*IRET 指令执行完,标志位由堆栈中取出指令执行完,标志位由堆栈中取出的值确定的值确定(3)从中断返回指令:从中断返回指令:IRET