第6章循环程序设计_第1页
第6章循环程序设计_第2页
第6章循环程序设计_第3页
第6章循环程序设计_第4页
第6章循环程序设计_第5页
已阅读5页,还剩40页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、设问:设问:1怎样用分支结构构成循环?怎样用分支结构构成循环?2循环指令有哪些?循环指令有哪些?3串处理操作是循环执行的吗?串处理操作是循环执行的吗?4. 4. 多重循环有什么特点?多重循环有什么特点?5. 5. 如何实现排序如何实现排序? ?本章重点本章重点循环的概念循环的概念 循环指令循环指令 串处理串处理 多重循环多重循环 6.1 循环的概念循环的概念 在汇编语言中,程序的循环可以用在汇编语言中,程序的循环可以用分支转移指令实现,也可以用分支转移指令实现,也可以用8086指指令系统中提供的专门的循环指令,这令系统中提供的专门的循环指令,这样使程序更清晰、简便。样使程序更清晰、简便。 除了

2、循环指令之外,还有很多地方用除了循环指令之外,还有很多地方用到了循环的概念。例如串处理,需要到了循环的概念。例如串处理,需要对串中的字符循环地进行操作。对串中的字符循环地进行操作。 6.1.1 循环结构循环结构循环结构有两种形式。一种是循环结构有两种形式。一种是DO WHILE结构,结构,另一种是另一种是DO UNTIL结构。结构。 循环程序循环程序有有三部分:三部分:l l 设置循环的初始状态设置循环的初始状态l l 循环体循环体l l 循环控制部分循环控制部分6.1.1 循环程序例子循环程序例子运行结果:运行结果:示例示例6-1 在在5行行16列上用写显存方法显列上用写显存方法显示多彩字符

3、串。用循环指令实现。示多彩字符串。用循环指令实现。设计思路:设计思路:(1)用)用DH存放行号,存放行号,DL存放列号;存放列号;(2)BL存放字符属性,第存放字符属性,第1个字符的属性为个字符的属性为4,红色;其他字符属性红色;其他字符属性+1改变;改变;(3)字符的位置计算公式:行号)字符的位置计算公式:行号*160+列号;列号;(4)用循环指令)用循环指令LOOP实现将多彩字符串循环实现将多彩字符串循环写入显存。写入显存。 程序如下:程序如下:;6-1.asm 在在5行行16列上用写显存方法显示多彩字符列上用写显存方法显示多彩字符串。串。data segmenta1 db Hello w

4、orld!a2 db 0data endscode segmentassume cs:code,ds:datastart:mov dh,5;行行 mov dl,16;列列mov bl,4;属性属性mov ax,datamov ds,axmov si,0show_str:mov ax,0b800h;显存首址显存首址mov es,axmov ax,160mul dh;行号行号*160mov di,ax;起始行位置起始行位置sal dl,1mov dh,0add di,dx;+列号列号mov cx,a2-a1;字符串长度字符串长度let1: mov al,si;循环写字符和属性到显存循环写字符和属性

5、到显存mov es:di,almov byte ptr es:di+1,blinc siinc bladd di,2;写完即显示完写完即显示完loop let1;循环指令循环指令mov ah,4chint 21hcode endsend start6.2 循环指令循环指令格式:格式: LOOP OPR执行的操作:执行的操作:(CX)=(CX)-1,若,若CX0,跳转,跳转到标号到标号OPR处循环执行,处循环执行,CX=0则执行则执行LOOP的下一条指令。的下一条指令。说明:目的操作数说明:目的操作数OPR是标号,该标号处的是标号,该标号处的指令应该在指令应该在LOOP指令之前,以构成循环指令之

6、前,以构成循环 。6.2.1 LOOP循环指令循环指令 例例1 求求X=1+2+3+10的累加值。的累加值。MOV AL,0MOV BL,1MOV CX,10SS1:ADD AL,BL INC BL LOOP SS1 MOV X,AL6.2.2 LOOPZ/LOOPE 格式:格式: LOOPZ/LOOPE OPR执行的操作:执行的操作:(CX)=(CX)-1,若,若CX0,并且,并且ZF=1则跳转到标号则跳转到标号OPR处循环执行,若处循环执行,若CX=0,或者或者ZF=0则执行则执行LOOP的下一条指令。的下一条指令。说明:结果为说明:结果为0或相等循环。当执行到或相等循环。当执行到LOOP

7、Z/LOOPE时,如果之前的指令结果为时,如果之前的指令结果为0或者相等时继续循环,如果结果不为或者相等时继续循环,如果结果不为0或者或者不相等,提前退出循环,即使计数值不相等,提前退出循环,即使计数值CX还还没减为没减为0。STRING DB *P* MOV CX,10MOV BX,-1MOV AL,0 SS3: INC BXCMP STRINGBX,*LOOPE SS3MOV Y,BX 例例1 10个星号字符的个星号字符的STRING串中有一个串中有一个字符不是星号,找出该字符的位置,保存字符不是星号,找出该字符的位置,保存在在Y单元。单元。MOV BX,-1MOV CX,MSS4:INC

8、 BXMOV AL,ALPHABXTEST AL,20HLOOPZ SS4MOV DL,AL例例2 取出字母串取出字母串ALPHA中的第一个小中的第一个小写字母放入写字母放入DL。格式:格式: LOOPNZ/LOOPNE OPR执行的操作:执行的操作:(CX)=(CX)-1,若,若CX0,并且,并且ZF=0则跳转到标号则跳转到标号OPR处循环执行,若处循环执行,若CX=0,或者或者ZF=1则执行则执行LOOP的下一条指令。的下一条指令。6.2.3 LOOPNZ/LOOPNE说明:结果不为说明:结果不为0或不相等循环。或不相等循环。当执行到当执行到LOOPNZ/LOOPNE时,如果之前的时,如果

9、之前的指令结果不为指令结果不为0或者不相等时继续循环,如果或者不相等时继续循环,如果结果为结果为0或者相等,提前退出循环,即使计数或者相等,提前退出循环,即使计数值值CX还没减为还没减为0。MOV BX,0MOV AH,1SS5:INT 21HMOV SYMBOLBX,ALINC BXCMP AL,0DHLOOPNE SS5MOV AX,0例例1 循环输入字符,并将字符保存在循环输入字符,并将字符保存在SYMBOL数组中,当输入回车时结束。数组中,当输入回车时结束。MOV BX,-1MOV CX,MSS6:INC BXCMP SYMBOLBX,ALOOPNE SS6OR SYMBOLBX,20

10、H例例2 在长度为在长度为M的字符串的字符串SYMBOL中查中查找大写字母找大写字母A,找到后将其变为小写。,找到后将其变为小写。练习:练习: 1写出计算写出计算Y=5!的程序段。!的程序段。 2写程序段。查找写程序段。查找CATT表中的字表中的字符符”,找到后将其保存到,找到后将其保存到SIGN单元,单元,其位置值保存到其位置值保存到ADDI单元。单元。 3写程序段。在长度为写程序段。在长度为N的字数组的字数组VALUE中取出第一个负数保存到中取出第一个负数保存到AX中。中。6.3 串处理串处理 在汇编语言中,可将连续的在汇编语言中,可将连续的n个存储单个存储单元称为串、表、数组等。元称为串

11、、表、数组等。 对于这种数据结构的操作称为串处理。对于这种数据结构的操作称为串处理。 对串进行操作,需要几个参数,如串对串进行操作,需要几个参数,如串的长度、串的起始单元地址等;而且的长度、串的起始单元地址等;而且串操作大都是循环执行的,循环如何串操作大都是循环执行的,循环如何控制、串的存取方式等都不同于其它控制、串的存取方式等都不同于其它数据操作。数据操作。 6.3.1 串的概念串的概念 6.3.2 串处理例子串处理例子 设计思路:设计思路:(1)分别定义数据段和附加段;)分别定义数据段和附加段;(2)用)用SI保存源串保存源串STRG1的偏移地址,的偏移地址,DI保存目的串保存目的串STR

12、G2的偏移地址,传送个数的偏移地址,传送个数由由CX指出;指出;(3)用)用CLD指令将方向标志指令将方向标志DF清清0,以便,以便从低地址单元开始取数,依次地址增加,从低地址单元开始取数,依次地址增加,取下一数;取下一数;(4)用)用REP MOVSB指令实现串传送。指令实现串传送。 示例示例6-2 将数据段中的字符串将数据段中的字符串STRG1传送到传送到附加段的附加段的STRG2中。中。程序如下:程序如下:;6-2.asm 串传送串传送data segmentstrg1 db 1234567890data endsextra segmentstrg2 db 10 dup(?)extra

13、endscode segmentassume cs:code,ds:data,es:extrastart:mov ax,datamov ds,axmov ax,extramov es,axlea si,strg1lea di,strg2cld;方向标志清方向标志清0mov cx,10rep movsb ;以字节形式重复传送以字节形式重复传送CX次次mov ah,4chint 21hcode endsend start运行结果:运行结果:要观察运行结果,采用要观察运行结果,采用DEBUG执行执行6-2.exe。在。在DEBUG下,用下,用U命令查看,找到断点命令查看,找到断点0018,用,用G

14、0018执行,再用执行,再用D ES:0命令查看传送结果。命令查看传送结果。 此时,数据段的段地址为此时,数据段的段地址为0B45H,而附加,而附加段的段地址为段的段地址为0B46H。查看的结果在附加。查看的结果在附加段中。段中。 思考:如果采用循环指令实现串传送,思考:如果采用循环指令实现串传送,程序如何改写?程序如何改写? 6.3.3 串处理指令串处理指令 8086汇编语言指令系统中提供了汇编语言指令系统中提供了5种串处理指令。种串处理指令。分别是:分别是:MOVS (move string)串传送串传送CMPS (compare string)串比较串比较SCAS (scan strin

15、g)串扫描串扫描LODS (load string)串获取串获取STOS (store string)串存入串存入上述串指令应该和重复前缀上述串指令应该和重复前缀REP、REPZ/REPE、REPNZ/REPNE结合结合.例例 比较两个字串比较两个字串BUNCH1和和BUNCH2是否相同,是否相同,相同打印相同打印Y,不相同打印,不相同打印N。 示例示例6-3 比较两个字串比较两个字串BUNCH1和和BUNCH2是否相同,相同打印是否相同,相同打印Y,不相同打印不相同打印N。程序如下:程序如下:;6-3.asm 比较两个字串比较两个字串BUNCH1和和BUNCH2data segment bu

16、nch1 db student bunch2 db studEntdata endscode segment assume cs:code,ds:data,es:datastart:mov ax,datamov ds,axmov es,axlea si,bunch1lea di,bunch2cldmov cx,7repe cmpsb jz let1;相等转相等转LET1mov dl,N;不相等,显示不相等,显示Njmp printlet1:mov dl,Y;相等,显示相等,显示Yprint:mov ah,2hint 21hmov ah,4chint 21hcode endsend start6

17、.3.4 串与循环串与循环 归纳循环结构的几种形式:归纳循环结构的几种形式:(1)用条件转移指令实现循环)用条件转移指令实现循环(2)循环指令)循环指令LOOP/LOOPE/LOOPNE(3)重复前缀)重复前缀REP/REPE/REPNE在实际编程中,采用哪种指令实现循环,在实际编程中,采用哪种指令实现循环,要从循环执行的条件和退出循环的要求等要从循环执行的条件和退出循环的要求等方面综合考虑。下面通过几个例子作具体方面综合考虑。下面通过几个例子作具体分析。分析。例例1 将将ALPHA数组送入数组送入100个个a。(1)用条件转移指令实现循环)用条件转移指令实现循环 MOV CX,100 MOV

18、 SI,0SS0: MOV ALPHASI,a INC SI DEC CX JNZ SS0 (2)用)用LOOP指令实现循环指令实现循环 MOV CX,100 MOV SI,0 SS0: MOV ALPHASI,a INC SI LOOP SS0(3)用串处理)用串处理REP前缀实现循环前缀实现循环 MOV CX,100 MOV DI,OFFSET ALPHA MOV AL,a REP STOSB 分析:由于问题简单,只是做赋值操作,且循环分析:由于问题简单,只是做赋值操作,且循环次数已知,所以可以用这三种方法实现。次数已知,所以可以用这三种方法实现。6.4 多重循环多重循环 1. 内循环和外

19、循环的控制内循环和外循环的控制双重循环需要两个循环控制变量双重循环需要两个循环控制变量I,J。多重循环嵌套时,不允许内外循环交叉。多重循环嵌套时,不允许内外循环交叉。6.4.1多重循环结构多重循环结构2内循环和外循环的跳转内循环和外循环的跳转在多重循环程序编写过程中,要注意循环体内条件转在多重循环程序编写过程中,要注意循环体内条件转移指令的转移方向。一般来说,可以从内循环跳入外移指令的转移方向。一般来说,可以从内循环跳入外循环,或者跳出外循环;不允许从外循环跳入内循环循环,或者跳出外循环;不允许从外循环跳入内循环或者直接从循环外跳入循环内。或者直接从循环外跳入循环内。 6.4.2排序程序排序程

20、序 双重循环程序的典型应用是排序。排序双重循环程序的典型应用是排序。排序采用冒泡算法。采用冒泡算法。冒泡算法的主要思想是从第一个元素开冒泡算法的主要思想是从第一个元素开始,依次对两个相邻的元素进行比较,如始,依次对两个相邻的元素进行比较,如果第一个元素比第二个大,则两数交换位果第一个元素比第二个大,则两数交换位置,第一遍置,第一遍N-1次比较之后,最大的数排在次比较之后,最大的数排在最后;再做第二遍最后;再做第二遍N-2次比较,比较出第二次比较,比较出第二大的数大的数;以此类推,最多进行;以此类推,最多进行N-1遍比遍比较,所有的数按从小到大升序排序。较,所有的数按从小到大升序排序。 设计思路

21、:设计思路:(1)用两条)用两条LOOP指令实现双重循环时,对指令实现双重循环时,对CX寄存器有冲突。采用寄存器有冲突。采用PUSH CX指令将外指令将外循环的循环的CX值入栈保存,内循环的值入栈保存,内循环的LOOP结结束后,再将外循环的束后,再将外循环的CX恢复;恢复;(2)用相对寄存器寻址取出两数进行比较。)用相对寄存器寻址取出两数进行比较。示例示例6-5 将字数组将字数组PART按升序排序。按升序排序。程序如下:程序如下:;6-5.asm 将字数组将字数组part按升序排序。按升序排序。data segmentpart dw 15,32,6,-27,8sign dw ?data end

22、scode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,sign-part;数组长度数组长度shr cx,1 ;元素个数元素个数dec cxloop1:push cx;保存外循环次数保存外循环次数mov bx,0loop2:mov ax,partbxcmp ax,partbx+2jle next;升序升序xchg ax,partbx+2;交换交换mov partbx,axnext: add bx,2loop loop2pop cx;恢复外循环次数恢复外循环次数loop loop1mov ah,4chint 21hc

23、ode endsend start 练习:练习: 数组数组TABLE中存放中存放8个小个小写字母写字母computer。编程序,将它。编程序,将它们按降序排序。们按降序排序。 6.5 循环程序举例循环程序举例 如如X=5488114433225634H,Y=3499754783645231H,Z=8921868BB686A865H设计思路:设计思路:(1)在数据段中定义两个多字节变量,低字在数据段中定义两个多字节变量,低字节单元存放低位,高字节单元存放高位;节单元存放低位,高字节单元存放高位;(2)字节的个数字节的个数N采用采用EQU赋值伪指令计算赋值伪指令计算获得;获得; (3)多字节相加用带进位加指令多字节相加用带进位加指令ADC;示例示例6-6 编程序实现两个多字节数相加运算。编程序实现两个多字节数相加运算。Z=X+Y程序如下:程序如下:;program 6-6.asm 两个多字节数相加运算两个多字节数相加运算data segment x db 34h,56h,22h,33h,44h,11h,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论