《循环程序设计.ppt》由会员分享,可在线阅读,更多相关《循环程序设计.ppt(89页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、循环程序设计现在学习的是第1页,共89页1 1、如何计算转移指令的目标地址、如何计算转移指令的目标地址?2 2、分支程序的结构特点和如何编分支程序的结构特点和如何编写分支程序?写分支程序?现在学习的是第2页,共89页第第5 5章章 循环程序设计循环程序设计现在学习的是第3页,共89页本章学习目标本章学习目标n 循环程序的一般结构循环程序的一般结构n 循环指令循环指令n 计数型循环与条件型循环计数型循环与条件型循环n 单重循环程序设计方法单重循环程序设计方法n 多重循环程序设计方法多重循环程序设计方法通过本章学习,应掌握以下内容:现在学习的是第4页,共89页5.1 5.1 循环程序的一般结构循环
2、程序的一般结构5.2 5.2 循环指令循环指令5.3 5.3 循环程序设计方法循环程序设计方法现在学习的是第5页,共89页5.1 5.1 循环程序循环程序 的一般结构的一般结构现在学习的是第6页,共89页 顺序程序是按指令的先后顺序依次执顺序程序是按指令的先后顺序依次执行,每条指令只执行一次;分支程序是行,每条指令只执行一次;分支程序是根据判断条件的真假,选择其中的一个根据判断条件的真假,选择其中的一个分支段程序执行;循环程序是根据需要分支段程序执行;循环程序是根据需要重复执行一段程序多次。重复执行一段程序多次。现在学习的是第7页,共89页 循环程序结构分循环程序结构分计数型循环和条件型循计数
3、型循环和条件型循环。环。循环程序由循环程序由3 3部分组成部分组成:(1 1)循环初始化循环初始化:为循环做准备工作为循环做准备工作 (2 2)循环体循环体:重复执行部分重复执行部分 (3 3)循环控制循环控制:按循环结束条件判断是按循环结束条件判断是否继续循环否继续循环 现在学习的是第8页,共89页两种循环结构流程图两种循环结构流程图:CX循环次数循环体CX循环次数-1(CX)=0NY退出循环图5-1 计数型循环结构图5-2 条件型循环结构循环初始化部分循环体(工作部分和修改循环条件)循环结束条件NY退出循环现在学习的是第9页,共89页 实际应用,实际应用,可将循环控制部分放在循可将循环控制
4、部分放在循环体之前,形成环体之前,形成“先判断、后循环先判断、后循环”的的结构,也可以将循环控制部分放在循环结构,也可以将循环控制部分放在循环体之后,形成体之后,形成“先循环、后判断先循环、后判断”的结的结构形式。构形式。下面分别举例说明计数型循环和下面分别举例说明计数型循环和条件型循环的控制方法。条件型循环的控制方法。现在学习的是第10页,共89页例例5-15-1 n n个个8 8位有符号数,存在位有符号数,存在BUFBUF为首址为首址的存储区中,试统计正数的个数。的存储区中,试统计正数的个数。分析分析:每个数均是每个数均是8 8位有符号二进制位有符号二进制数,应先分析数的正负,再使用符数,
5、应先分析数的正负,再使用符号数条件转移指令进行转移或正数号数条件转移指令进行转移或正数的统计。共有的统计。共有n n个元素,整个程序的个元素,整个程序的结构要重复判断结构要重复判断n n次,故可次,故可选用计数选用计数型循环程序。型循环程序。现在学习的是第11页,共89页 存储单元及寄存器分配如下存储单元及寄存器分配如下:BX:BUF BX:BUF存储区的地址指针,初值为存储区的地址指针,初值为BUFBUF的的偏移地址,每循环一次之后,其值加偏移地址,每循环一次之后,其值加1 1。CX:CX:循环计数器,初值为循环计数器,初值为BUFBUF存储区中元素存储区中元素的个数的个数n n,每循环一次
6、之后,其值减,每循环一次之后,其值减1 1。AX:AX:存放正数的个数,初值为零。存放正数的个数,初值为零。COUNT:COUNT:最终存放正数的个数。最终存放正数的个数。程序流程图如图程序流程图如图5-35-3所示。所示。现在学习的是第12页,共89页开始BXBUF的偏移地址CXBUF区中元素个数AX0(BX)0AX(AX)+1BX(BX)+1CX(CX)-1(CX)=0COUNT(AX)结束YYNN循环初始部分循环体部分循环控制部分图5-3 统计正数个数程序流程图现在学习的是第13页,共89页源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK
7、 DB 200 DUP DB 200 DUP(0 0)STACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUF DB 8BUF DB 8,1010,-5-5,100100,-7-7,2525,4040N =$N =$BUF BUF ;BUFBUF区中元素个数区中元素个数COUNT DW?COUNT DW?DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AXMOV AX,DAT
8、ADATA MOV DS MOV DS,AXAX现在学习的是第14页,共89页 LEA BXLEA BX,BUFBUF MOV CXMOV CX,N N ;循环初始部分;循环初始部分 MOV AXMOV AX,0 0AGAINAGAIN:CMP BYTE PTR BXCMP BYTE PTR BX,0 0 JLE NEXTJLE NEXT INC AXINC AX ;循环体部分;循环体部分NEXTNEXT:INC BXINC BX DEC CXDEC CX JNZ AGAIN JNZ AGAIN ;循环控制部分;循环控制部分 MOV COUNTMOV COUNT,AXAX ;正数个数送入;正数
9、个数送入COUNTCOUNT MOV AHMOV AH,4CH4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEGIN END BEGIN 现在学习的是第15页,共89页 该程序的循环体重复执行了该程序的循环体重复执行了n n次,即次,即当(当(CXCX)=n=n,n-1n-1,1 1 时循环执行时循环执行,当(,当(CXCX)=0=0时循环结束,将正数个数时循环结束,将正数个数5 5送入字变量送入字变量COUNTCOUNT中。中。对于计数型循环,在进入循环体前要对于计数型循环,在进入循环体前要先要确定循环次数,每循环一次就修改先要确定循环次数,每循环一次
10、就修改一次计数值,计数值为零时就结束循环一次计数值,计数值为零时就结束循环。现在学习的是第16页,共89页 思考题思考题:(1 1)在循环初始部分,如果将负值送入循)在循环初始部分,如果将负值送入循环计数器环计数器CXCX,即,即:“MOV CXMOV CX,-n n”,应该如何,应该如何修改程序?修改程序?(2 2)若将)若将0 0送入循环计数器送入循环计数器CXCX中,即中,即:“MOV MOV CXCX,0 0”,应该如何修改程序?,应该如何修改程序?(3 3)如果要分别统计出正数、零、负数的)如果要分别统计出正数、零、负数的 个数,应如何设计程序?个数,应如何设计程序?现在学习的是第1
11、7页,共89页例例5-25-2 统计寄存器统计寄存器BXBX中中1 1码元的个数,将码元的个数,将结果存放在结果存放在COUNTCOUNT单元中。单元中。分析分析:统计统计BXBX中中1 1码元的个数码元的个数,须进行逐须进行逐位测试。先判断最高位是否为位测试。先判断最高位是否为1 1,然后用移,然后用移位方法位方法,把各位逐次移到最高位进行判断。把各位逐次移到最高位进行判断。循环的结束条件可用计数值循环的结束条件可用计数值1616来控制,即来控制,即可以用计数型循环来设计。可以用计数型循环来设计。但是但是,这种方法的缺点是无论这种方法的缺点是无论BXBX中有没有中有没有 1 1都必须循环都必
12、须循环1616次。次。现在学习的是第18页,共89页 若用条件控制法,即测试若用条件控制法,即测试BXBX的值是否为的值是否为0 0作为结束条件,可大大缩短循环次数。作为结束条件,可大大缩短循环次数。存储单元及寄存器分配如下存储单元及寄存器分配如下:BX:BX:要测试的寄存器要测试的寄存器 CX:CX:存放存放1 1的个数,初始值为的个数,初始值为0 0 COUNT:COUNT:最终存放最终存放1 1的个数的个数 程序流程图如图程序流程图如图5-45-4所示所示现在学习的是第19页,共89页开始(BX)=0(CX)0SF=0CX(CX)+1(BX)左移一位COUNT(CX)结束NYNY图5-4
13、 统计BX中1的个数程序流程现在学习的是第20页,共89页源程序如下源程序如下:STACKSTACK SEGMENT STACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACKSTACK ENDS ENDSDATADATA SEGMENT SEGMENTCOUNT DW COUNT DW?DATADATA ENDS ENDSCODECODE SEGMENT SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AXMOV AX,DATADATA
14、 MOV DS MOV DS,AXAX现在学习的是第21页,共89页 MOV CX MOV CX,0 0 ;CX0CX0NEXTNEXT:AND BX AND BX,BXBX ;BXBX相与运算相与运算 JZ EXITJZ EXIT ;(;(BXBX)=0=0,结束循环,结束循环 JNS NEXT1JNS NEXT1 ;SF=0SF=0(结果的最高位)(结果的最高位)转转NEXT1NEXT1 INC CX INC CX ;否则,;否则,CX CX(CXCX)+1+1NEXT1NEXT1:SHL BXSHL BX,1 1 ;(;(BXBX)左移)左移1 1位位 JMP NEXTJMP NEXT
15、;无条件转;无条件转NEXTNEXT继续循环继续循环EXITEXIT:MOV COUNT MOV COUNT,CXCX ;COUNT1COUNT1的个数的个数 MOV AH MOV AH,4CH4CH INT 21H INT 21HCODECODE ENDS ENDS END BEGIN END BEGIN现在学习的是第22页,共89页 程序运行中,若程序运行中,若BXBX的值全为的值全为0 0,则不必则不必循环,直接转循环,直接转EXITEXIT结束。若只有最高位为结束。若只有最高位为1 1,则执行,则执行“INC CXINC CX”后,左移一位,再转后,左移一位,再转NEXTNEXT处判断
16、,此时(处判断,此时(BXBX)=0=0转转EXITEXIT,仅需,仅需执行一次循环。只有最低位为执行一次循环。只有最低位为1 1时才需时才需1616次次循环,统计出循环,统计出BXBX中的个数。显然,用条件中的个数。显然,用条件控制循环效率最高。控制循环效率最高。返回本章目录现在学习的是第23页,共89页5.2 5.2 循环指令循环指令现在学习的是第24页,共89页 为了简化循环程序的设计,为了简化循环程序的设计,8086/80888086/8088指令系统专门设置了一组循环程序指令指令系统专门设置了一组循环程序指令:LOOPLOOP、LOOPZ/LOOPELOOPZ/LOOPE和和LOOP
17、NZ/LOOPNELOOPNZ/LOOPNE。这些循环指令在执行前,这些循环指令在执行前,必须预先将循必须预先将循环次数存放在环次数存放在CXCX寄存器中。寄存器中。另外这些循另外这些循环控制指令只能实现短转移。环控制指令只能实现短转移。现在学习的是第25页,共89页1.LOOP 1.LOOP 循环指令循环指令 格式格式:LOOP LOOP 标号标号 功能功能:CX CX(CXCX)-1-1 判断判断CXCX的值,若(的值,若(CXCX)0 0转移到标号处继续循环,否则转移到标号处继续循环,否则退出循环。退出循环。现在学习的是第26页,共89页例例5-35-3 计算计算1+2+3+1+2+3+
18、100+100,将结果存入字变量将结果存入字变量SUMSUM中。中。分析分析:这是一个典型的这是一个典型的计数型循环,计数型循环,用于求累用于求累加和。循环体执行次数为加和。循环体执行次数为100100。存储单元及寄存器分配如下存储单元及寄存器分配如下:AX:AX:存累加求和,初值为存累加求和,初值为0 0。CX:CX:存循环次数,初值存循环次数,初值100100,每次减,每次减1 1。SUM:SUM:存最终结果的字变量。存最终结果的字变量。现在学习的是第27页,共89页开始AX0CX100AX(AX)+(CX)CX(CX)1(CX)=0SUM(AX)结束NY图5-5 求累加和程序流程图现在学
19、习的是第28页,共89页源程序如下源程序如下:STACKSTACK SEGMENT STACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACKSTACK ENDS ENDSDATADATA SEGMENT SEGMENTSUMSUM DW DW?DATADATA ENDS ENDSCODECODE SEGMENT SEGMENTASSUME CSASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX现在学习的
20、是第29页,共89页 MOV AXMOV AX,0 0 ;AXAX清零清零 MOV CXMOV CX,100100 ;CXCX循环次数循环次数100100NEXTNEXT:ADD AXADD AX,CXCX ;求累加和;求累加和 LOOP NEXTLOOP NEXT MOV SUM MOV SUM,AX AX ;将累加和送入;将累加和送入SUMSUM中中 MOV AHMOV AH,4CH4CH INT 21H INT 21HCODECODE ENDS ENDS END BEGIN END BEGIN 程序运行后,变量程序运行后,变量SUMSUM中保存的值中保存的值是是50505050。现在学习
21、的是第30页,共89页思考思考:(1 1)程序中)程序中“LOOP NEXTLOOP NEXT”语句可以用哪语句可以用哪两条语句来代替?两条语句来代替?(2 2)若要求从)若要求从1 1开始连续开始连续5050个奇数的和个奇数的和,应如何编程?,应如何编程?现在学习的是第31页,共89页2.LOOPZ/LOOPE2.LOOPZ/LOOPE为零或相等时循为零或相等时循 环指令环指令 格式格式:LOOPZ/LOOPE LOOPZ/LOOPE 标号标号 功能功能:CX CX(CXCX)-1-1 判断判断CXCX和和ZFZF的值,若(的值,若(CXCX)0 0且且ZF=1ZF=1转移到标号处继续循转移
22、到标号处继续循环,若(环,若(CXCX)=0=0或或ZF=0ZF=0则退出循则退出循环。环。现在学习的是第32页,共89页3.LOOPNZ/LOOPNE3.LOOPNZ/LOOPNE不为零或不相不为零或不相 等时循环指令等时循环指令 格式格式:LOOPNZ/LOOPNE LOOPNZ/LOOPNE 标号标号 功能功能:CX CX(CXCX)-1-1 判判CXCX和和ZFZF的值,若(的值,若(CXCX)0 0且且ZF ZF=0=0转移到标号处继续循环转移到标号处继续循环,若(若(CXCX)=0=0或或ZF=1ZF=1则退出循环。则退出循环。LOOPZ/LOOPELOOPZ/LOOPE和和LOO
23、PNZ/LOOPNELOOPNZ/LOOPNE指令提供指令提供了提前结束循环的可能性。了提前结束循环的可能性。现在学习的是第33页,共89页 例例5-45-4 以以BUFBUF为首址的存储区中存放有为首址的存储区中存放有N N个个字符。在字符串中查找第字符。在字符串中查找第1 1次出现次出现 “E E”的的字符。若找到将其偏移位置存入字符。若找到将其偏移位置存入FOUNDFOUND;否;否则显示则显示“NO FINDNO FIND!”。分析分析:在字符串中查找某字符,查找的方在字符串中查找某字符,查找的方法有多种,这里采用顺序查找法。若找到法有多种,这里采用顺序查找法。若找到将其偏移位置保存起
24、来,将其偏移位置保存起来,并结束程序;并结束程序;否则显示否则显示“NO FINDNO FIND!”。现在学习的是第34页,共89页 存储单元与寄存器分配如下存储单元与寄存器分配如下:BUF:BUF:存放字符串的存储区存放字符串的存储区SI:BUFSI:BUF存储区中字符的偏移位置,初存储区中字符的偏移位置,初 值为值为1 1,每次递增,每次递增1 1。AL:AL:保存要查找的字符保存要查找的字符CX:CX:存放循环次数,初值为字符串长存放循环次数,初值为字符串长 度,每次减度,每次减1 1。FOUND:FOUND:存查找成功时字符的偏移值存查找成功时字符的偏移值现在学习的是第35页,共89页
25、源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUF DB BUF DB“H HE ELLOLLO,MY FRIENDMY FRIEND!”N =$-BUFN =$-BUFFOUND DW FOUND DW?NOFIND DB 0DHNOFIND DB 0DH,0AH0AH,“NO FINDNO FIND!$”DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSU
26、ME CS ASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATABEGINBEGIN:MOV AX MOV AX,DATADATA MOV DS MOV DS,AXAX 现在学习的是第36页,共89页 MOV CXMOV CX,N N ;CX CX 字符串长度字符串长度N N MOV SI MOV SI,-1 -1 ;给;给BUFBUF偏移量的初值偏移量的初值 MOV ALMOV AL,45H 45H ;AL AL “E E”的的ASCIIASCII码码NEXTNEXT:INC SIINC SI CMP AL CMP AL,BUFSI BUFSI ;
27、判断要查找的字符;判断要查找的字符 LOOPNE NEXTLOOPNE NEXT ;ZF=0ZF=0且(且(CXCX)0 0转转NEXTNEXT循环循环 JNZ NO_FINDJNZ NO_FIND ;ZF=0ZF=0转转NO_FINDNO_FIND MOV FOUND MOV FOUND,SI SI ;ZF=1ZF=1,偏移量送,偏移量送FOUNDFOUND JMP EXITJMP EXITNO_FINDNO_FIND:MOV DXMOV DX,OFFSET NOFINDOFFSET NOFIND MOV AH MOV AH,9 9 ;显示;显示“NO FINDNO FIND!”INT 21
28、HINT 21HEXITEXIT:MOV AHMOV AH,4CH 4CH ;程序结束;程序结束 INT 21HINT 21HCODE CODE ENDS ENDS END BEGIN END BEGIN现在学习的是第37页,共89页 程序执行过程中,有两种可能性程序执行过程中,有两种可能性:(1 1)成功找到字符)成功找到字符“E E”,ZF=1ZF=1,提前退出,提前退出循环。执行循环。执行JNZJNZ指令时,因不满足测试条件指令时,因不满足测试条件而执行下一条指令而执行下一条指令“MOV FOUNDMOV FOUND,SISI”。(2 2)一直查找到字符串结束而未发现字符)一直查找到字符
29、串结束而未发现字符“E E”,则因(,则因(CXCX)=0=0而结束循环。在执行而结束循环。在执行JNZJNZ指令时,因指令时,因ZF=0ZF=0而转而转NO_FINDNO_FIND。返回本章目录现在学习的是第38页,共89页5.3 5.3 循环程序设计方法循环程序设计方法现在学习的是第39页,共89页 循环程序循环程序,按结构可分单重循环按结构可分单重循环程序和多重循环程序程序和多重循环程序。5.3.1 5.3.1 单重循环程序设计单重循环程序设计 单重循环是其循环体内不再包含单重循环是其循环体内不再包含循环结构的程序。循环结构的程序。现在学习的是第40页,共89页 例例5-55-5 BUF
30、BUF为首址的存储区中存放一串为首址的存储区中存放一串字符,把最大的字符存入字符,把最大的字符存入MAXMAX中。中。分析分析:在一串字符中寻找最大值,可将在一串字符中寻找最大值,可将第第1 1个字符存入个字符存入ALAL单元中。然后单元中。然后,从第从第2 2个字符开始依次与个字符开始依次与ALAL比较,若某个字符比较,若某个字符比比ALAL还大,则将其赋给还大,则将其赋给ALAL,如此比较,如此比较,最后最后ALAL中保存的定是最大字符。中保存的定是最大字符。现在学习的是第41页,共89页 存储单元与寄存器分配如下存储单元与寄存器分配如下:CX:CX:循环次数控制变量,初值为字符串的长循环
31、次数控制变量,初值为字符串的长度减度减1 1,每次减,每次减1 1。BX:BUFBX:BUF存储区地址指针,初值指向存储区地址指针,初值指向BUFBUF,每,每次加次加1 1。AL:AL:保持某个时刻的最大字符值。保持某个时刻的最大字符值。MAX:MAX:保存最终结果的字节单元。保存最终结果的字节单元。程序流程图如图程序流程图如图5-65-6所示。所示。现在学习的是第42页,共89页Y开始BXBUF存储区首地址AL字符串中第一个字符CX字符串长度减1BX(BX)+1(AL)BXCX(CX)-1AL(BX)(CX)=0MAX(AL)结束NYN图5-6 求最大字符的流程图现在学习的是第43页,共8
32、9页STACKSTACK SEGMENT STACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACKSTACK ENDS ENDSDATADATA SEGMENT SEGMENTBUF DB BUF DB ABCD5678bdcaMNABCD5678bdcaMNN N =$-BUF =$-BUFMAX DB MAX DB?DATA ENDDATA ENDCODECODE SEGMENT SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AX
33、 MOV AX,DATADATA MOV DS MOV DS,AXAX源程序如下:现在学习的是第44页,共89页 MOV BXMOV BX,OFFSET BUF OFFSET BUF ;BXBX指向字符串首指向字符串首 MOV ALMOV AL,BX BX ;取第;取第1 1个字符个字符 MOV CXMOV CX,N-1N-1 ;循环次数送;循环次数送CXCXNEXT1NEXT1:INC BXINC BX ;BXBX指向下指向下1 1字符字符 CMP ALCMP AL,BX BX ;比较大小;比较大小 JNC NEXT2 JNC NEXT2 ;JAE NEXT2JAE NEXT2(替代)(替代
34、)MOV ALMOV AL,BXBX ;较大数送;较大数送ALALNEXT2NEXT2:LOOP NEXT1LOOP NEXT1 ;(;(CXCX)0 0继续循环继续循环 MOV MAXMOV MAX,AL AL ;MAXMAX最大数最大数 MOV AHMOV AH,4CH4CH INT 21H INT 21H CODE ENDSCODE ENDS END BEGIN END BEGIN 程序运行后,程序运行后,MAXMAX单元中保存的字符是单元中保存的字符是“d d”。现在学习的是第45页,共89页 例例5-65-6 编程把字变量编程把字变量NUMNUM中的二进制数中的二进制数,用十六进制数
35、显示。,用十六进制数显示。分析分析:把把NUMNUM中的二进制数从左到右每中的二进制数从左到右每4 4位分为位分为1 1组,用循环移位把要处理的组,用循环移位把要处理的4 4位二位二进制数移到最右边,再将数值转换到字符进制数移到最右边,再将数值转换到字符。若是数值若是数值0 09 9,加,加30H30H转换成字符转换成字符“0 0”“9 9”;若是值;若是值A AF F,除将其值加,除将其值加30H30H外,外,还应加上还应加上7H7H才能转换成才能转换成“A A”“F F”。现在学习的是第46页,共89页DI:DI:指向存转换结果的单元,每次加指向存转换结果的单元,每次加1 1BX:BX:待
36、转换的二进制数的工作单元待转换的二进制数的工作单元CH:CH:循环计数器,初值为循环计数器,初值为4 4,每次减,每次减1 1CL:CL:循环移位次数,每次移循环移位次数,每次移4 4位位AL:AL:转换中用到的工作单元转换中用到的工作单元 程序流程图如图程序流程图如图5-75-7所示所示存储单元及寄存器分配如下存储单元及寄存器分配如下:现在学习的是第47页,共89页图5-7 二进制转换成十六进制的程序流程图开始初始化工作将BX循环左移四位是否大于“9”Y将转换结果送存储区保存加07调整循环计数器为0显示转换结果结束NYN取BX低四位转换成ASCII码现在学习的是第48页,共89页 源程序如下
37、源程序如下:DATADATA SEGMENT SEGMENTNUM DW 0010NUM DW 0010110111010011001110011001B BBUFBUF DB 0AH DB 0AH,0DH0DH,(NUMNUM)=BUF0BUF0 DB 6 DUP DB 6 DUP(?)(?)DATA ENDSDATA ENDSSTACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACK ENDSSTACK ENDSCODECODE SEGMENT SEGMENT ASSUME CSASSUME CS:CODEC
38、ODE,SSSS:STACKSTACK,DSDS:DATADATABEGINBEGIN:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX现在学习的是第49页,共89页 MOV BXMOV BX,NUMNUM ;待转换的二进制数送;待转换的二进制数送BXBX LEA DILEA DI,BUF0BUF0 ;存储单元首址送;存储单元首址送DIDI MOV CHMOV CH,4 4 ;CHCH循环次数循环次数NEXTNEXT:MOV CLMOV CL,4 4 ;CLCL循环移位次数循环移位次数 ROL BXROL BX,CLCL ;4 4位二进制数移到最低位位二进制数移
39、到最低位 MOV ALMOV AL,BLBL ;取;取BXBX的低字节送的低字节送ALAL AND ALAND AL,0FH0FH ;取出最低;取出最低4 4位位 OR ALOR AL,30H30H ;转换成十六进制;转换成十六进制 CMP ALCMP AL,3AH3AH JL DONEJL DONE ;9 9 时转移时转移 ADD ALADD AL,07H07H ;若;若大于9 9加07H07HDONEDONE:MOV DIMOV DI,ALAL ;转换的十六进制数送;转换的十六进制数送BUF0BUF0 INC DIINC DI ;指向下一存储单元;指向下一存储单元 DEC CHDEC CH
40、 ;CH CH(CHCH)1 1 JNZ NEXTJNZ NEXT ;(;(CHCH)0 0转转NEXTNEXT继续转换继续转换现在学习的是第50页,共89页 MOV BYTE PTRDIMOV BYTE PTRDI,“H H”;十六进制数后加;十六进制数后加H H INC DI INC DI MOV BYTE PTRDI MOV BYTE PTRDI,“$”LEA DX LEA DX,BUF0 BUF0 ;显示十六进制数;显示十六进制数 MOV AHMOV AH,9 9 INT 21H INT 21H MOV AH MOV AH,4CH4CH INT 21H INT 21HCODE ENDS
41、CODE ENDS END BEGIN END BEGIN 程序运行后,屏幕显示:(程序运行后,屏幕显示:(NUMNUM)=2D39H=2D39H现在学习的是第51页,共89页5.3.2 5.3.2 多重循环程序设计多重循环程序设计 多重循环指循环体内又嵌套有循环的多重循环指循环体内又嵌套有循环的程序。程序。多重循环程序设计的基本思想和单重多重循环程序设计的基本思想和单重循环程序设计是一致的,但应分别考虑循环程序设计是一致的,但应分别考虑各重循环的控制条件及其程序实现,各重循环的控制条件及其程序实现,内外层循环必须是嵌套的,不能出现交内外层循环必须是嵌套的,不能出现交叉。叉。现在学习的是第52
42、页,共89页 例例5-95-9 BUF BUF为首址的字节存储区存放有为首址的字节存储区存放有n n 个无符号数个无符号数x1x1,x2x2,xnxn,试编程,试编程 将它们由大到小排列在将它们由大到小排列在BUFBUF中。中。分析分析:本例是对本例是对n n个数据排序,排序个数据排序,排序 的方法有很多种,如选择、冒泡、插入的方法有很多种,如选择、冒泡、插入、shellshell排序等。这里仅介绍较简单的排序等。这里仅介绍较简单的选择排序。选择排序。现在学习的是第53页,共89页 选择排序算法选择排序算法:一组数放入一组数放入n n个存储单元,先将第个存储单元,先将第1 1个存储单元中的数与
43、其个存储单元中的数与其后后n-1n-1个存储单元中的数依次比较,将两数中的大数放在第个存储单元中的数依次比较,将两数中的大数放在第1 1个存储单元,经过个存储单元,经过n-1n-1次比较后,次比较后,n n个数中的最大者定存入第个数中的最大者定存入第1 1个个存储单元中,存储单元中,n-1n-1次比较可以用一个计数型循环来控制;接次比较可以用一个计数型循环来控制;接着进行第着进行第2 2轮比较,将第轮比较,将第2 2个存储单元中的数与其后的个存储单元中的数与其后的 n-2n-2个存个存储单元中的数依次比较,储单元中的数依次比较,n n个数中的第个数中的第2 2大者就存入第大者就存入第2 2个存
44、储个存储单元,如此重复,单元,如此重复,直到第直到第n-1n-1轮比较后,将轮比较后,将n n个数中的第个数中的第n-1n-1大者存入第大者存入第n-1n-1个存储单元,第个存储单元,第n n个存储单元中的数据定个存储单元中的数据定是是n n个数中的最小者。个数中的最小者。从第从第1 1轮到第轮到第n-1n-1轮的控制又可以用轮的控制又可以用1 1个计数型循环。个计数型循环。现在学习的是第54页,共89页例如例如,4 4个数据个数据:60 27 96 43:60 27 96 43 将它们从大到小的重新排列。将它们从大到小的重新排列。4 4个数的排序需要经过个数的排序需要经过3 3轮比较才能完成
45、。轮比较才能完成。第第1 1轮轮:将第将第1 1个存储单元的数据个存储单元的数据6060,依次与后面的数据比较,经,依次与后面的数据比较,经3 3次比较得第次比较得第1 1个单元个单元的最大值的最大值9696。第第1 1次次:60 27:60 27969643 602743 6027不需交换不需交换 第第2 2次次:96 27:96 27 606043 609643 604343 9643不需交换不需交换第第2 2轮轮:求第求第2 2个位置上的最大值,需经两次比较。个位置上的最大值,需经两次比较。第第1 1次次:96 60:96 60272743 276043 274343 6043不需交换不
46、需交换第第3 3轮轮:求第求第3 3个位置上的最大值,只需经个位置上的最大值,只需经1 1次比较。次比较。第第1 1次次:96 60:96 60434327 274327 2743进行交换进行交换 现在学习的是第55页,共89页 存储单元和寄存器分配如下存储单元和寄存器分配如下:BUF:BUF:存放要排序数据的存储单元存放要排序数据的存储单元N:N:存放要排序数据的个数存放要排序数据的个数SI:SI:控制外循环的循环计数器,初值为控制外循环的循环计数器,初值为 1 1,终值为,终值为N N1 1,每次递增,每次递增1 1。DI:DI:控制内循环的循环计数器,初值为(控制内循环的循环计数器,初值
47、为(SISI)+1+1,终值为,终值为N N,每次递增,每次递增1 1。AL:AL:存放比较数据的寄存器存放比较数据的寄存器现在学习的是第56页,共89页开始SI1DI(SI)+1AL(BUF+(SI)-1)(AL)(BUF+(DI)-1)AL与(BUF+(DI)-1)互换(BUF+(SI)-1)(AL)DI(DI)+1(DI)NSI(SI)+1(SI)N-1结束YYYNNN图5-11选择排序算法流程现在学习的是第57页,共89页源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACK E
48、NDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUF DB 0AHBUF DB 0AH,8 8,15H15H,36H36H,6 6,20H20H,12H12HN =$-BUF N =$-BUF ;N N为要排序数据的个数为要排序数据的个数DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX MOV SI MOV SI,
49、1 1 ;外循环计数赋初值;外循环计数赋初值1 1NEXT1NEXT1:MOV DIMOV DI,SISI ;内循环计数初值(;内循环计数初值(DI)=(SI)+1DI)=(SI)+1 INC DI INC DI MOV AL MOV AL,BUF+SI-1 BUF+SI-1;ALAL(BUF+BUF+(SISI)1 1)现在学习的是第58页,共89页NEXT2NEXT2:CMP ALCMP AL,BUF+DI-1BUF+DI-1 ;满足降序转;满足降序转NEXT3NEXT3 JAE NEXT3JAE NEXT3 XCHG AL XCHG AL,BUF+DI-1 BUF+DI-1 ;两数交换;
50、两数交换 MOV BUF+SI-1 MOV BUF+SI-1,ALALNEXT3NEXT3:INC DI INC DI ;(DI)(DI)+1(DI)(DI)+1 CMP DI CMP DI,N N ;(DI)(DI)N N转转NEXT2NEXT2 JBE NEXT2JBE NEXT2 ;进入下一轮循环;进入下一轮循环 INC SI INC SI ;(SI)(SI)+1(SI)(SI)+1 CMP SI CMP SI,N-1 N-1 ;比较(;比较(SISI)与)与N N1 1 JBE NEXT1JBE NEXT1 ;若(;若(SISI)N-1N-1转转NEXT1NEXT1 MOV AH MO