PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章

上传人:E**** 文档编号:89350112 上传时间:2019-05-23 格式:PPT 页数:86 大小:1.13MB
返回 下载 相关 举报
PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章_第1页
第1页 / 共86页
PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章_第2页
第2页 / 共86页
PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章_第3页
第3页 / 共86页
PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章_第4页
第4页 / 共86页
PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章》由会员分享,可在线阅读,更多相关《PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第7章(86页珍藏版)》请在金锄头文库上搜索。

1、第七章 循环程序设计,7.1 循环程序结构与循环控制指令 7.2 计数循环程序 7.3 条件循环程序 7.4 门控循环程序和用逻辑尺控制的循环程序 7.5 多重循环 习题七,7.1 循环程序结构与循环控制指令,7.1.1 循环程序结构 汇编语言的循环程序结构与高级语言的循环程序结构基本相同,只不过用汇编语言实现时更细,与硬件关系更具体罢了。 循环程序结构主要由循环的初始化部分、工作部分、循环的修改部分、循环的控制部分和循环结束的处理部分组成。它们之间的关系如图7.1所示。,图 71 循环程序结构框图,组成循环程序的五大部分各自完成的工作: (1)循环的初始化部分。它主要根据具体问题,分析出循环

2、的次数或条件以及数据在内存中的起始地址,以便设置好相应的地址指针值、 计数器及各个寄存器的初值等,其目的是为了确保循环在正确的初始值的情况下开始工作。 (2)循环程序的工作部分,是循环程序的核心部分, 称循环体。它是程序需要重复操作的部分(例如, 数的累加、连乘等运算或连续查找某一个数据等),它可由顺序程序、分支程序或循环程序组成。,(3) 循环修改部分。它主要完成循环参数(或条件)、地址值的修改,使循环的次数或条件发生改变,或使参与运算的数据产生有规律的变化, 为下一次循环作准备。 (4) 循环的控制部分。它根据预先设定的循环次数或条件, 判断下一次循环是否要继续进行,从而保证循环程序的正常

3、执行。 (5) 循环结束的处理部分。这部分主要是对循环结束后的某些结果进行处理(例如将运算的结果存放到内存单元或输出等)。,图 72 当型循环结构框图,7.1.2 循环控制指令 为了简化循环程序的设计,功能较强的汇编语言往往提供多种循环控制指令以便编程者选用,需要注意的是:不用这些指令也可以使用其它的指令实现循环的控制(如第四章的例4.19),但是用了这些指令可能使编写的程序更加简练, 执行效率更高。 8088/8086的循环控制指令共有三组, 均属直到型循环控制指令。 它们分别是: LOOP(Loop) 循环指令。 LOOPZLOOPE(Loop While Zero, or Equal)

4、当为零或相等时循环指令。 LOOPNZLOOPNE(Loop While Not Zero, or Not Equal) 当不为零或不相等时循环指令。,下面分别予以说明: (1) LOOP 循环指令。 汇编格式: LOOP DST 循环(转移)条件: (CX)0 结束循环(顺序)条件: (CX)=0 (2) LOOPZLOOPE 当为零(或相等)时循环指令。 汇编格式: LOOPZ(或LOOPE) DST 循环(转移)条件: ZF1且(CX)0 结束循环(顺序)条件: ZF=0或(CX)=0,(3) LOOPNZLOOPNE 当不为零(或不相等)时循环指令。 汇编格式: LOOPNZ(或LOO

5、PNE) DST 循环(转移)条件: ZF0且(CX) 0 结束循环(顺序)条件: ZF=1或(CX)=0 这三条指令的执行步骤是: (1) (CX) (CX)- 1。,(2) 检查是否满足上述各条指令的转移条件, 如满足,则IP(IP)+8位位移量。循环指令均为段内直接短转移,在汇编格式中, DST必须为同一代码段中的转向符号地址,汇编后机器指令用8位位移量表示转向地址与当前IP值的差。由于位移量是采用补码表示的, 且只有8位,所以转向地址必须在距该循环指令的下一条指令地址的-128 +127字节的范围之内。 当满足测试条件时,就修改IP的值,转向由DST指定的地址去执行(实行循环),如不满

6、足, 则IP值不变,顺序执行(退出循环)。 若使用循环指令, 则例419 的程序段可表示为:,该程序段用一条循环指令代替了修改循环计数值、 条件转移及无条件转移三条指令。 使用上述三条循环控制指令时应注意: (1) 这三条循环控制指令执行后都不影响标志位。 (2) 对于LOOPZ/LOOPE指令和LOOPNZ/LOOPNE指令的操作,除了(CX)(CX)-1外,特别需要注意的是:判断的ZF标志位不是本指令执行的状态,而是本指令前的指令执行后对影响。,7.2 计数循环程序,例 7.1 已知Fibnacci数列 1, 1, 2, 3, 5, 8 , 由下列的递推关系定义: F11, F2 1, F

7、n+2Fn+1+Fn (n1) 试编制一个程序,计算出此数列的第12项的值,并将此值存放到地址为FIB20的字节单元中。 根据题意,数列中的前两个数为已知,而且从第三个数开始它的值总是前两个数之和,要求第12项的值,只需执行10次相同的递推关系,即可求得该值。假设这里的递推关系采用BL、 BH和AL寄存器实现,最后的结果在AL中,然后存放到FIB20单元中。 该例程序如下:,DATA SEGMENT FIB20 DB ? DATA ENDS CODE SEGMENT ASSUME DS: DATA, CS: CODE START: MOV AX, DATA MOV DS, AX MOV SI,

8、 OFFSET FIB20 ; 设置数据指针 MOV BL, 1 ; Fibnacci数列第一项为 MOV BH, BL ; Fibnacci数列第二项为 MOV CX, 10 ; 计算第12项需循环10次 NEXT: ADD BL, BH; 计算下一项 MOV AL, BL MOV BL, BH; 前项移入BL,MOV BH, AL ; 后项移入BH LOOP NEXT MOV SI, AL ; 第12项移入FIB20 MOV AH, 4CH ; 返回DOS INT 21H CODE ENDS END START,例 7.2 由任意10个字符组成的字符串存放在以STRING为首的符号地址中,

9、试编程在该字符串中查找有无大写英文字母“A”,若有, 则在RESULT单元中存放一个字符“Y”, 否则在该单元中存放一个字符“N”。 这个问题是在一个已知的表中查找一个确定的字符,可采用顺序查找方法,即从第一个字符开始比较,若查到,则将“Y”存到RESULT单元,若查遍该表仍没找到,则将“N”存到RESULT单元中。 程序流程见图7.3, 程序如下:,DATA SEGMENT RESULT DB ? STRING DB MNOQABCDEF DATAENDS COSEG SEGMENT ASSUME DS: DATA, CS: COSEG START: MOV AX, DATA MOV DS,

10、 AX MOV CX, 10 ; 循环次数等于表长 MOV SI, OFFSET RESULT ; 设置数据区指针 CONTIN: INC SI; SI指向第一个字符,CMP SI, A ; 查找 LOOPNE CONTIN ; 不等, 继续 JNE NOA ; ZF0, 说明在字符串中没有字符“A” MOV RESULT, Y; ZF1, 说明在字符串中有字符“A” JMP RETN NOA: MOV RESULT, N RETN:MOV AH, 4CH; 返回DOS INT 21H COSEG ENDS END START,图 7.3 例7.流程图,例7.2程序中使用了LOOPNE循环指令

11、,当查找的次数不够10次,且没有查到字符“A”,则转移到CONTIN处继续查找, 当查到了字符“A”, 循环次数不够10次也不再循环,或者查了10次都没有查到也不再查找。在LOOPNE指令下面要通过判断ZF位来确定是否查到,因为LOOP类指令不影响ZF位,此时ZF位的状态是CMP SI,A指令执行的结果。 从图7.3的流程图可以看到本例是一个典型的直到型循环, 直到满足循环终止条件才结束循环。本例程序中也可以使用串搜索指令完成寻找,为使地址指针逐次增加,在循环初始化部分应使DF置“0”。,例 7.3 已知在 NUM开始的字单元中存放有10个无符号整数,试编制一个程序挑选出其中的最大数存放到MA

12、XV单元中, 最小数存放到MINV单元中。 解题思路:可先将第一个数既作为最大数也作为最小数, 依次与其余数作比较。每次将下一个数与最大数作比较,若大于,则将该数作为最大数。反之将该数与最小数作比较,若小于,则将该数作为最小数,再取下一个数作上述比较。 为了避免在比较过程中频繁地进行存储器的存取操作,可将最大数暂放在AX中, 最小数暂放在BX中,当循环结束后,再将最大数存入MAXV单元, 最小数存入MINV单元。程序的流程见图7.4。,图 7.4 例7.3流程图,程序如下: DATA SEGMENT NUM DW 235, 3278, 581, 2561, 357, 128, 5, 5476,

13、 12345, 7891 MAXV DW ? MINV DW ? DATA ENDS COSEG SEGMENT ASSUME DS: DATA, CS: COSEG START: MOV AX, DATA MOV DS, AX MOV SI, OFFSET NUM ; 设置数据区指针,MOV CX, 9 ; 设置循环次数 MOV AX, SI ; 取第一个数先作为最大数 MOV BX, AX ; 和最小数 ADDR2: ADD SI, 2 ; 指向下一个数 CMP SI, AX ; (AX)与下一个数比 JC COMPMIN ; 若小于(CF=1), 转 JZ NEXT ; 若等于, 继续

14、MOV AX, SI ; 若大于, 成为新的最大数 JMP NEXT,COMPMIN: CMP SI, BX ; (BX)与下一个数比 JNC NEXT ; 若大于(CF=), 继续 MOV BX, SI ; 若小于, 成为新的最小数 NEXT: LOOP ADDR2 MOV MAXV, AX ; 送最大数 MOV MINV, BX ; 送最小数 MOV AH, 4CH ; 返回DOS INT 21H COSEG ENDS END START,7.3 条件循环程序,例 7.4 已知有一个以“”为结束标志的字符串存在以地址为STRING1开始的内存单元中, 试编制一个程序将上述字符串(除“”以外

15、)存入以STRING2开始的内存单元中。 将字符串从一处传送至另一处,字符串的长度未知, 所以不能使用计数的方法控制循环,可根据是否是“”字符来控制循环。每次传送时应先进行判断,若是非“”字符,则传送, 若是“”字符,则停止传送, 结束循环。 按上述分析程序的流程如图7.5所示,程序如下:,DATA SEGMENT STRING1 DB MNOPQXYZ$ STRING2 DB 50 DUP(?) DATA ENDS COSEG SEGMENT ASSUME DS: DATA, CS: COSEG START: MOV AX, DATA MOV DS, AX MOV SI, OFFSET STRING1 ; 设置字符串指针 MOV DI, OFFSET STRING2 ; 设置目的指针 NEXT: CMP SI, ; 是“”?,JZ JSP; 是“”结束循环 MOV AL, SI ; 不是, 传送 MOV DI, AL INC SI; 修改地址指针 INC DI JMP NEXT JSP: MOV AH, 4CH ; 返回DOS INT 21H COSEG ENDS END START,图7.5 例7.4的

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

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

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