文档详情

《控制转移指令》ppt课件

tia****nde
实名认证
店铺
PPT
613.81KB
约71页
文档ID:69388891
《控制转移指令》ppt课件_第1页
1/71

1,§ 3.2.5 控制转移指令(P130),专用于控制程序执行流程通过对(CS)和(IP)的修改来改变程序执行的流程包括四种:,转移指令,过程调用指令,循环控制指令,中断指令,2,注意:,段内转移和段间转移,段内转移:目标地址在当前段内 属性为NEAR,段间转移:目标地址不在当前段内 属性为FAR,段间转移,转移指令修改(IP),转移指令修改 (CS)和(IP),3,除中断指令,其它指令均不影响标志位 直接转移和间接转移,直接转移:目标地址直接 出现在指令中,间接转移:目标地址间接存储 于寄存器或存储单元中,间接转移,4,1、转移指令,两种:,JMP 无条件转移指令,Jcc 条件转移指令,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=107FH,NEXT所指地址范围:,E8H 50H,指令机器码:,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位置开始,向前32768 (减8000H)个字节,向后32767 (加7FFFH)个字节 但不超出本段15,(3)、段内间接转移,格式:,JMP WORD PTR OPR,;(IP) (EA) 或(IP)  (reg16),OPR —为16位寄存器、存储器,16,例:,JMP AX JMP WORD PTR [BP][DI],转移范围:当前段,17,(4)、段间直接转移,格式:,JMP FAR PTR 目的地址标号,;(IP)←目的地址标号的偏移地址 (CS)←目的地址标号的段地址,18,¦ JMP FAR PTR NEXT ¦ NEXT : MOV AL,[SI] ¦,例:,19,转移范围:整个存储器1M空间,20,(5)、段间间接转移,格式:,JMP DWORD PTR OPR,;(IP)←OPR低16位 (CS)←OPR高16位,21,例:,JMP DWORD PTR [BP][DI],转移范围:整个存储器1M空间,22,2、条件转移指令,两种:,比较转移指令,判位转移指令,均采用相对短转移,即: (IP)←当前(IP)+disp8,转移范围: 从当前(IP)所指单元开始-128~+127。

23,1)、比较转移指令,根据前一条比较指令结果(对标志位的影响)作测试条件决定是否转移分为: 无符号数比较转移指令 带符号数比较转移指令无符号数比较的结果作为转移条件(P134),两个带符号数比较的结果作为转移条件,25,例: 数据段RESULT开始的30个单元中存放着某班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,格式:,LOOPxx 符号地址,执行操作 :,①(CX) ← (CX)- 1 此操作不影响标志 ② 检查转移条件xx,满足转向目标地址去执行; 不满足执行LOOPxx后一条指令,31,,只允许段内直接短转移方式,跳转范围-128~127,都用CX作为循环计数器,循环指令说明: LOOP退出循环条件是(CX)=0 LOOPZ和LOOPNZ提供了提前结束循环的可能。

▲ 在串中查找字符,查到了,退出, 用LOOPNZ,不相等时继续查找 ▲比较两串时,当有字符不等,退出,两字符串不等 可用LOOPZ,当相等时继续比较 ▲执行完 LOOPNZ或LOOPZ后,判断值 对查找字符,ZF=1,说明找到;否则没有找到 对串比较,ZF=1, 说明两串相等;否则不等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字符串中查找空格字符,串长度为NMOV CX, N MOV AX, SEG string MOV DS, AX LEA BX, string MOV AL,20H next: CMP AL,[BX] JZ find INC BX DEC CX JNZ next 未找到处理 JMP exit find: 找到处理 exit: 结束出口,用条件转移: JZ,MOV CX, N MOV AX, SEG string MOV DS, AX LEA BX, string MOV AL,20H next: CMP AL, [BX] PUSH F INC BX POPF LOOPNZ next JZ find 未找到处理 JMP exit find: 找到处理 exit: 结束出口,用循环指令: LOOPNZ,39,思考: ① 去掉指令JMP exit ,程序执行结果会怎样? ② PUSH F、POPF可否去掉?若要去掉,程序如何修改? ③ 执行完LOOPNZ后,可否根据CX=0来判断查找结果? CX=0,即说明没找到,对吗?,40,3、过程( 子程序 )调用指令,子程序—具有独立功能的独立程序模块。

子程序(过程)定义格式: 子程序名 PROC 类型 …… 子程序名 ENDP,子程序调用和返回 调用: CALL 返回: RET,41,过程与调用语句间的位置,有两类: NEAR类:调用指令与过程在同一个段中 FAR类:调用指令与过程不在同一个段中,子程序调用和返回 调用: CALL 返回: RET,42,1)、 CALL调用,CALL调用指令有4种: 段内直接调用 段间直接调用 段内间接调用 段间间接调用,CALL指令出现在主程序中,43,(1)、 段内直接调用,格式:,; (SP)←(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,第一步,断点入栈保护,第二步,装入子程序入口地址(操作数的值),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 ENDS CSEG2 SEGMENT … subp PROC … RET subp ENDP CSEG2 ENDS,49,(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或CAH 执行操作: (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) 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型 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 procedu。

下载提示
相似文档
正为您匹配相似的精品文档