lec10转移控制类指令(2)剖析

上传人:今*** 文档编号:107217544 上传时间:2019-10-18 格式:PPT 页数:41 大小:605KB
返回 下载 相关 举报
lec10转移控制类指令(2)剖析_第1页
第1页 / 共41页
lec10转移控制类指令(2)剖析_第2页
第2页 / 共41页
lec10转移控制类指令(2)剖析_第3页
第3页 / 共41页
lec10转移控制类指令(2)剖析_第4页
第4页 / 共41页
lec10转移控制类指令(2)剖析_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《lec10转移控制类指令(2)剖析》由会员分享,可在线阅读,更多相关《lec10转移控制类指令(2)剖析(41页珍藏版)》请在金锄头文库上搜索。

1、第 10 讲 转移控制类指令(2) 循环指令&子程序指令&中断指令,控制转移指令: 无条件转移指令 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、IRET,1. 循环指令: 注意: * CX 中存放循环次数 * 只能使用段内直接寻址的8 位位移量 LOOP LOOPZ / L

2、OOPE LOOPNZ / LOOPNE 执行步骤: (1) (CX) (CX) - 1 (2) 检查是否满足测试条件,如满足则 (IP) (IP) + 8位位移量,实行循环; 不满足则 退出循环,顺序执行。,循环指令:LOOP OPR 测试条件:(CX) 0 为零或相等时循环指令:LOOPZ(LOOPE) OPR 测试条件:ZF=1 且 (CX) 0 不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 测试条件:ZF=0 且 (CX) 0,如果将上面的程序写成如下的情形: L1: MOV CX, 10 . ; 重复执行的若干条指令 LOOP L1 这个程序将无限制地运行下去,称为

3、“死循环”。,MOV CX, 10 L1: . ; 需要重复执行的若干条指令 LOOP L1 上面的程序将L1到LOOP指令之间的一段程序重复执行10次。指令“MOV CX, 10”称为“装载循环计数器”, 在循环之前完成。,【例 2-31】编程计算1+2+3+100=? 结果保存到字变量SUM中。,XOR AX,AX ;累加器清零 MOV BX,0001H ;BX1 MOV CX,100 ;CX循环次数100 AGAIN: ADD AX,BX ;AX(AX)+(BX) INC BX ;BX(BX)+1 LOOP AGAIN ;未循环结束,则继续 MOV SUM,AX ;循环结束,保存结果,(

4、1)循环准备阶段:累加器、计数器、指针赋初值,在循环开始之前,每条指令只执行一次; (2)循环阶段:包括数据累加、修改指针、循环计数和控制三项操作。每条指令重复执行CX次。这部分的程序称为“循环体”。 (3)循环结束处理阶段:保存数据的累加和。这条指令在循环结束后执行,只执行一次。,程序的主体部分分为三段:,循环总结,【例 232】 数据段中分别以STRING1 和STRING2为首地址存放着100 个字符,比较两字符串,找出其中第一个不相同的字符分别送至AL和BL寄存器,若两串完全相同,则令AL=BL=0。 LEA SI,STRING1 ;SI字符串STRING1首地址 LEA DI,STR

5、ING2 ;DI字符串STRING2首地址 MOV CX,100 ;CX循环次数 CYCLE: MOV AL,SI ;AL串1 中的字符 MOV BL,DI ;BL串2 中的字符 INC SI ;SI(SI)+1 INC DI ;DI(DI)+1 CMP AL,BL ;(AL)(BL) LOOPE CYCLE ;若(CX)0,且ZF=1,则转向CYCLE JNZ DONE ;若相应两个单元的内容不等,则转向DONE MOV AL,0 ;若两串完全相同,则AL0 MOV BL,0 ;若两串完全相同,则BL0 DONE: ,程序使用LOOPE指令来控制循环,既有计数(CX)控制,又有条件(ZF)控

6、制。循环结束有两种可能性: 字符串比较找出了第一个不相同的字符:循环结束时ZF=0,AL和BL寄存器内是第一个不相同的字符; 比较字符串没有找到不相同的字符:循环结束时ZF=1。 对于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循环,一般应在循环结束后用条件转移指令分开这两种情况,分别处理。,子程序结构程序的优点: 1.每个子程序就是一个具有特定功能的独立的程序,提高程序的“可重用性”,提高了软件开发效率。 2.每个子程序可以独立地进行调试,由于子程序规模较小,降低了调试难度。 3.程序结构清晰,提高了程序的可阅读性和可维护性。,2. 子程序调用与返回指令,子程序是完成特定功能的一

7、段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 当运行完子程序功能后,采用RET返回指令回到主程序继续执行,演示,转移指令有去无回 子程序调用需要返回, 其中利用堆栈保存返回地址,主程序与子程序,CALL label MOV AX,0,主程序,RET,子程序,回到CALL指令后的指令处返回地址,子程序定义,子程序定义伪操作 子程序名 PROC 属 性 ; 子程序体 子程序名 ENDP 子程序名: 子程序入口的符号地址。子程序名应为合法的标识符,子程序名不能与同一个源程序中的标号、变量名、其它子程序名相同。 属 性:类型 属 性(NEAR、FAR)

8、 NEAR: 调用程序和子程序在同一个代码段中(段内调用),缺省为NEAR属性,可以省略。 FAR:调用程序和子程序不在同一个代码段中(段间调用),只能被同一个代码段里的程序调用的子程序。 由于主程序和子程序处于同一个代码段,调用和返回时只需要改变IP寄存器的值,CS寄存器的值保持不变。 近程子程序的入口地址用16位段内偏移地址表示。,近程子程序(属性为NEAR 型),远程子程序: (属性为FAR 型),能够被不同代码段的程序调用,也能被同一代码段的程序调用的子程序。 调用这样的子程序时,需要同时改变CS和IP寄存器的值,返回时,需要从堆栈里弹出32位的返回地址送入IP,CS寄存器。 远程子程

9、序的入口地址用16位段基址和16位段内偏移地址表示。,子程序调用和返回指令:,code1 segment main proc far call far ptr subp ret main endp code1 ends code2 segment subp proc far ret subp endp code2 ends,段间调用和返回,code segment main proc far call subp ret main endp subp proc near ret subp endp code ends,段内调用和返回,(1)段内调用与返回,段内直接调用 CALL 符号地址(子程序

10、名) ;NEAR属性 (SP) (SP)- 2 ;入栈保护返回地址 (SS:SP) (IP) (IP) 符号地址的偏址 ;转到子程序去执行 段内返回 RET ;按NEAR属性返回 (IP) (SS:SP) ;从堆栈中取出返回地址 (SP) (SP)+ 2,举例,段内调用与返回举例,code SEGMENT 、 、 CALL subp 2000:200H 、 、 、 、 subp PROC NEAR 2000:300H 、 、 、 RET subp ENDP code ENDS,A4 50,调用后 (IP)=300H,返回后 (IP)=200H,(2)段间调用与返回,段间调用 CALL 符号地址

11、(过程名) ;FAR属 性 (SP) (SP)- 2 ;先保存段地址 (SS:SP) (CS) (SP) (SP)- 2 ;后保存偏移地址 (SS:SP) (IP) (IP) 符号地址的偏址 (CS) 符号地址的段址,注意压栈的顺序,先段后偏移,(2)段间调用与返回(续),段间返回 RET ;按FAR属 性返回 (IP) (SS:SP) ;先取出偏移地址 (SP) (SP)+ 2 (CS) (SS:SP) ;后取出段地址 (SP) (SP)+ 2,举例,调用后 (IP)=200H (CS)=3000H,A4 50,返回后 (IP)=100H, (CS)=2000H,code1 SEGMENT

12、、 、 CALL far ptr subp 2000:100H 、 、 code1 ENDS code2 SEGMENT 、 subp PROC FAR 3000:200H 、 、 、 RET subp ENDP code2 ENDS,段间调用与返回举例,ZEROBYTES PROC ; 定义一个子程序 PUSH AX PUSH CX XOR AX, AX ; AX清零 MOV CX, 128 ; 循环次数送CX ZEROLOOP:MOV BX, AX ; 将一个字存储单元清零 ADD BX, 2 ; 修改地址 LOOP ZEROLOOP ; 循环控制 POP CX POP AX RET ;

13、返回主程序 ZEROBYTES ENDP ; 子程序结束,思考:该子程序完成了什么功能?调用该子程序时, 应该先做什么准备工作?,子程序定义举例,简写形式,ZEROBYTES:PUSH AX PUSH CX XOR AX, AX ; AX寄存器清零 MOV CX, 128 ; 计数器CX置初值 ZEROLOOP: MOV BX, AX ; 一个字单元清零 ADD BX, 2 ; 修改地址指针,指向下一个字 LOOP ZEROLOOP ; 循环控制 POP CX POP AX RET ; 结束程序运行,返回主程序,缺点:边界不容易清晰地区分;只能定义“近程子程序”; 只能被同一代码段内的程序调用

14、 。,子程序名 PROC NEAR/FAR PUSH ; 保护现场(寄存器/存储器) PUSH ; 个数根据具体情况决定 ;子程序主体 POP ;恢复现场,注意出栈次序 POP ; 先进栈的寄存器后出栈 RET ;返回 子程序名 ENDP,子程序的基本格式,3. 中断指令和系统功能调用,中断(Interrupt)是又一种改变程序执行顺序的方法 8086/8088 CPU支持256个中断,每个中断用一个编号(中断向量号)区别 中断指令有3条: INT IRET INTO 要求掌握中断调用指令INT ,进而掌握系统功能调用,类型0的(IP),类型0的(CS),类型1的(IP),类型1的(CS),类

15、型N的(IP),类型N的(CS),类型255的(IP),类型255的(CS),00000,00004,4*N,003FC,中断向量表,中断向量: 中断服务程序的入口地址,存放于中断向量表区。,中断指令: INT TYPE 执行操作: (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),注意: * TYPE (0255) 是中断类型号。根据TYPE ,在中断向量表中找到它所对应的中断

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号