《《控制转移指令》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《控制转移指令》PPT课件.ppt(71页珍藏版)》请在三一办公上搜索。
1、1,3.2.5 控制转移指令(P130),专用于控制程序执行流程。通过对(CS)和(IP)的修改来改变程序执行的流程。,包括四种:,转移指令,过程调用指令,循环控制指令,中断指令,2,注意:,段内转移和段间转移,段内转移:目标地址在当前段内 属性为NEAR,段间转移:目标地址不在当前段内 属性为FAR,段间转移,转移指令修改(IP),转移指令修改(CS)和(IP),3,除中断指令,其它指令均不影响标志位。,直接转移和间接转移,直接转移:目标地址直接 出现在指令中,间接转移:目标地址间接存储 于寄存器或存储单元中,间接转移,4,1、转移指令,两种:,JMP 无条件转移指令,Jcc 条件转移指令,
2、5,1)、JMP无条件转移指令,五种格式:,段内直接短转移段内直接近转移段内间接转移段间直接远转移段间间接转移,6,(1)、段内直接短转移,格式:,JMP SHORT 目的地址标号,;(IP)当前(IP)+disp8,7,注意:,双字节指令,机器码:E8 KK KK为disp8,带符号数的补码,范围-128+127。,目的地址的偏移地址=当前(IP)+disp8=跳转指令地址+2+disp8,转移范围:从当前IP位置开始,向前128(减80H)个字节,向后127(加7FH)个字节。,例:,JMP SHORT NEXT,向前到(1000H)-80H=0F80H向后到(1000H)+7FH=107
3、FH,NEXT所指地址范围:,E8H50H,指令机器码:,10,8位位移量D8的范围在(-128 127)之间,否则出错。,11,实际使用时,在汇编指令中出现的直接是目的地址的标号,对于编程者,关心的是这个标号所指位置是否超出了本指令的跳转范围。,12,(2)、段内直接近转移,格式:,JMP NEAR PTR 目的地址标号,;(IP)当前(IP)+disp16,13,注意:,三字节指令,机器码:E8 KK JJ JJKK为disp16,带符号数补码,范围-32768+32767,目的地址的偏移地址=当前(IP)+disp16=跳转指令地址+3+disp16,14,转移范围:从当前IP位置开始,
4、向前32768(减8000H)个字节,向后32767(加7FFFH)个字节。但不超出本段。,15,(3)、段内间接转移,格式:,JMP WORD PTR OPR,;(IP)(EA)或(IP)(reg16),OPR 为16位寄存器、存储器,16,例:,JMP AXJMP WORD PTR BPDI,转移范围:当前段,17,(4)、段间直接转移,格式:,JMP FAR PTR 目的地址标号,;(IP)目的地址标号的偏移地址(CS)目的地址标号的段地址,18,JMP FAR PTR NEXT NEXT:MOV AL,SI,例:,19,转移范围:整个存储器1M空间,20,(5)、段间间接转移,格式:,
5、JMP DWORD PTR OPR,;(IP)OPR低16位(CS)OPR高16位,21,例:,JMP DWORD PTR BPDI,转移范围:整个存储器1M空间,22,2、条件转移指令,两种:,比较转移指令,判位转移指令,均采用相对短转移,即:(IP)当前(IP)+disp8,转移范围:从当前(IP)所指单元开始-128+127。,23,1)、比较转移指令,根据前一条比较指令结果(对标志位的影响)作测试条件。决定是否转移。,分为:无符号数比较转移指令 带符号数比较转移指令。,无符号数比较的结果作为转移条件(P134),两个带符号数比较的结果作为转移条件,25,例:数据段RESULT开始的30
6、个单元中存放着某班30个同学的某门课程的考试成绩。要求统计成绩在80分以上的学生人数,将其存放在BL中。,26,MOV AL,80 LEA DI,RESULT MOV CX,30 MOV BL,0 AGN:JMP AL,DI JA NEXT INC BL,NEXT:INC DI DEC CX JNZ AGN HLT;停机,27,2)、判位转移指令,根据当前某标志位的状态来决定是否进行转移,28,3)、判CX转移指令,既是一条转移指令,也可用来控制循环,但循环控制条件与LOOP相反。,29,2、循环控制指令,三种:,LOOP,LOOPE/LOOPZ,LOOPNE/LOOPNZ,30,格式:,LO
7、OPxx符号地址,执行操作:,(CX)(CX)-1 此操作不影响标志 检查转移条件xx,满足转向目标地址去执行;不满足执行LOOPxx后一条指令,31,只允许段内直接短转移方式,跳转范围-128127,都用CX作为循环计数器,循环指令说明:LOOP退出循环条件是(CX)=0 LOOPZ和LOOPNZ提供了提前结束循环的可能。,在串中查找字符,查到了,退出,用LOOPNZ,不相等时继续查找。比较两串时,当有字符不等,退出,两字符串不等。可用LOOPZ,当相等时继续比较。执行完 LOOPNZ或LOOPZ后,判断ZF的值 对查找字符,ZF=1,说明找到;否则没有找到。对串比较,ZF=1,说明两串相等
8、;否则不等。,LOOP,相当于:DEC CX JNZ 目的地址标号,例:在数据段DATA开始的30个单元中存放着某班30位同学的某门考试成绩,求总分和平均成绩,结果分别保存在DX,AL中。,35,MOV DX,0 LEA SI,DATA MOV CX,30 NEXT:ADD DL,BYTE PTR SI ADC DH,0 INC SI LOOP NEXT MOV CL,30 MOV AX,DX DIV CL,例:在string字符串中查找空格字符,串长度为N。,MOV CX,N MOV AX,SEG string MOV DS,AX LEA BX,string MOV AL,20H next:
9、CMP AL,BX JZ findINC BX DEC CX JNZ next 未找到处理JMP exit find:找到处理exit:结束出口,用条件转移:JZ,MOV CX,NMOV AX,SEG stringMOV DS,AXLEA BX,string MOV AL,20H next:CMP AL,BX PUSH FINC BXPOPFLOOPNZ nextJZ find未找到处理 JMP exit find:找到处理exit:结束出口,用循环指令:LOOPNZ,39,思考:去掉指令JMP exit,程序执行结果会怎样?PUSH F、POPF可否去掉?若要去掉,程序如何修改?执行完LOO
10、PNZ后,可否根据CX=0来判断查找结果?CX=0,即说明没找到,对吗?,40,3、过程(子程序)调用指令,子程序具有独立功能的独立程序模块。,子程序(过程)定义格式:子程序名 PROC 类型 子程序名 ENDP,子程序调用和返回调用:CALL 返回:RET,41,过程与调用语句间的位置,有两类:NEAR类:调用指令与过程在同一个段中FAR类:调用指令与过程不在同一个段中,子程序调用和返回调用:CALL 返回:RET,42,1)、CALL调用,CALL调用指令有4种:段内直接调用段间直接调用 段内间接调用段间间接调用,CALL指令出现在主程序中,43,(1)、段内直接调用,格式:,;(SP)(
11、SP)-2,(SP)+1,(SP)(IP);(IP)(IP)+D16,CALL 子程序名,第一步,断点入栈保护,第二步,装入子程序入口地址,D16 机器指令中的位移量,目的地址和当前(IP)地址之差,例:NEAR 类型过程 code SEGMENT;code段 CALL subp;D16=subp-XXX XXX:YYY subp PROC NEAR;过程定义 RET;返回 subp ENDP code ENDS,45,(2)、段内间接调用:,格式:,;(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)OPR的值,CALL WORD PTR OPR,第一步,断点入栈保护,第二步,装
12、入子程序入口地址(操作数的值),OPR 为16位寄存器,或存储器,例:,CALL WORD PTR SI CALL BX,47,(3)、段间直接调用,格式:,(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)入口偏移地址(指令第2,3字节)(CS)DST段地址(指令中第4,5字节),CALL FAR PTR 子程序名,例:CSEG1 SEGMENT CALL FAR PTR subp;处的CS:IP入栈;转subp:CSEG1 ENDSCSEG2 SEGMENT subp PROC RET subp ENDPCSEG2 ENDS,49,
13、(4)、段间间接调用:,格式:,(SP)(SP)-2((SP+1),(SP))(CS)(SP)(SP)-2((SP+1),(SP))(IP)(IP)(EA)(CS)(EA+2),CALL DWORD PTR OPR,例:,CALL DWORD PTR SI,51,2)、RET返回,RET返回指令有4种:段内返回 段间返回 段内带立即数返回 段间带立即数返回,放在子程序的末尾子程序执行完后返回调用程序继续执行。,52,(1)、段内返回:,格式:RET;机器码:C3H或者C2H 执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2,53,(2)、段间返回:,格式:RET;机器码:CBH或C
14、AH 执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2,54,段内带立即数返回格式:RET EXP;执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16 EXP是一个表达式计算出来的常数成为机器指令中位移量D16,修改堆栈 指针。,55,4、中断和中断返回指令,以后学习,56,2、过程(子程序)调用指令子程序程序中具有独立功能的部分编写成独立程序模块。子程序(过程)定义格式:符号名 PROC 类型 符号名 ENDP 子程序调用和返回指令:CALL RET(RETURN)过程有两种类型:按过程与调用语句
15、间的位置,过程有两种类型。NEAR类型:调用指令与过程在同一个段中FAR类型:调用指令与过程不在同一个段中CALL指令和RET指令都不影响条件码。,分界,57,段内直接调用格式:CALL DST;(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)(IP)+D16 DST给出转向地址(子程序的入口地址)。D16机器指令中的位移量(转向地址和返回地址之差)。位移量为D16范围-32768+32767H,占有两个字节。,58,(1)、CALL(Call a procedure)调用 CALL调用指令调用地址由指令给出CALL调用指令有4种:段内直接调用段间直接调用 段内间接调用段间间接调
16、用,59,段内直接调用格式:CALL DST;(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)(IP)+D16 DST给出转向地址(子程序的入口地址)。D16机器指令中的位移量(转向地址和返回地址之差)。位移量为D16范围-32768+32767H,占有两个字节。,60,工作过程如下:例:NEAR 类型过程 code SEGMENT;code段 CALL subp;调用 指令 YYY入栈,D16=subp-yyy XXX:YYY subp PROC NEAR;过程定义 RET;返回 subp ENDP code ENDS,61,例:两个数据变量X与Y相乘子程序和调用程序在同一个程
17、序模块中,子程序可以直接访问模块中的变量。DATASG SEGMENT X DW 100 Y DW 10DATASG ENDSCODESG SEGMENT MAIN PROC FAR ASSUME CS:CODESG,DS:DATA SG START:CALL subp RET MAIN ENDP,subp PROC NEAR MOV AX,XMOV BX,Y MUL BXRETsubp ENDCODESG ENDS END START,62,段内间接调用:格式:CALL DST;WORD PTR OPR OPR 为16位寄存器,或存储器(除立即数以外的任何一种寻址方式)执行操作:(SP)(S
18、P)-2(SP)+1,(SP)(IP)(IP)(EA)EA由DST寻址方式所确定的有效地址。,63,段间直接调用:格式:CALL FAR PTR DST;执行操作:(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)DST偏移地址(指令中第2,3字节)(CS)DST段地址(指令中第4,5字节),64,例:CSEG1 SEGMENT CALL FAR PTR subp;处的CS:IP入栈转subp:CSEG1 ENDSCSEG2 SEGMENT subp PROC RET subp ENDP CSEG2 ENDS,65,段间间接调用:格式:
19、CALL DWORD PTR DST执行操作:(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(EA)(CS)(EA)+2 转子程序入口 EA由DST的寻址方式确定的有效地址。,66,(2)、RET(Reture from procedure)返回 RET返回指令放在子程序的末尾使子程序在功能完成后返回调用程序继续执行。*为能准确返回,返回指令类型与调用指令类型相对应。RET返回指令有4种:段内返回段间返回 段内带立即数返回段间带立即数返回在子程序调用时,返回地址入栈 返回时:将返回地址出栈(IP)(段内或段间)。(CS)(段间)。,
20、67,段内返回:格式:RET;机器码:C3H或者C2H 执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2段间返回:格式:RET;机器码:CBH或CAH 执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2,68,段内带立即数返回格式:RET EXP;执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16 EXP是一个表达式计算出来的常数成为机器指令中位移量D16,修改堆栈 指针。,69,例如:RET EXP 堆栈使用情况:CODE SEG MENT ASSUME CS:CODE,DS:DATA
21、MAIN PROC FAR START:MOV AX,DATA MOV DS,AX PUSH BX PUSH CX CALL DELCHARCS:XXXX MOV AH,4CH INT 21H MAIN ENDP,DELCHAR PROC RET 4DELCHAR ENDPCODE ENDS END STARTRET EXP 堆栈使用情况:,70,段间带立即数返回:格式:RET EXP;执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16 CALL指令和RET指令都不影响条件码。,71,例:学习使用 段内、段间直接调用指令的使用及堆栈情况主程序 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 MAINCALL far ptr PRO-A(CS)=0500H(IP)=1000H,
链接地址:https://www.31ppt.com/p-5010434.html