《循环程序设计讲稿.ppt》由会员分享,可在线阅读,更多相关《循环程序设计讲稿.ppt(89页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、循环程序设计第一页,讲稿共八十九页哦1 1、如何计算转移指令的目标地址、如何计算转移指令的目标地址?2 2、分支程序的结构特点和如何编分支程序的结构特点和如何编写分支程序?写分支程序?第二页,讲稿共八十九页哦第第5 5章章 循环程序设计循环程序设计第三页,讲稿共八十九页哦本章学习目标本章学习目标n 循环程序的一般结构循环程序的一般结构n 循环指令循环指令n 计数型循环与条件型循环计数型循环与条件型循环n 单重循环程序设计方法单重循环程序设计方法n 多重循环程序设计方法多重循环程序设计方法通过本章学习,应掌握以下内容通过本章学习,应掌握以下内容:第四页,讲稿共八十九页哦5.1 5.1 循环程序的
2、一般结构循环程序的一般结构5.2 5.2 循环指令循环指令5.3 5.3 循环程序设计方法循环程序设计方法第五页,讲稿共八十九页哦5.1 5.1 循环程序循环程序 的一般结构的一般结构第六页,讲稿共八十九页哦 顺序程序是按指令的先后顺序依次顺序程序是按指令的先后顺序依次执行,每条指令只执行一次;分支程执行,每条指令只执行一次;分支程序是根据判断条件的真假,选择其中序是根据判断条件的真假,选择其中的一个分支段程序执行;循环程序是的一个分支段程序执行;循环程序是根据需要重复执行一段程序多次。根据需要重复执行一段程序多次。第七页,讲稿共八十九页哦 循环程序结构分循环程序结构分计数型循环和条件型循计数
3、型循环和条件型循环环。循环程序由循环程序由3 3部分组成部分组成:(1 1)循环初始化循环初始化:为循环做准备工作为循环做准备工作 (2 2)循环体循环体:重复执行部分重复执行部分 (3 3)循环控制循环控制:按循环结束条件判断是否按循环结束条件判断是否继续循环继续循环 第八页,讲稿共八十九页哦两种循环结构流程图两种循环结构流程图:CXCX循环次数循环次数循环体循环体CXCX循环次数循环次数-1-1(CX)=0(CX)=0N NY Y退出循环退出循环图图5-1 计数型循环结构计数型循环结构图图5-2 条件型循环结构条件型循环结构循环初始化部分循环初始化部分循环体循环体(工作部分和修改循环条件)
4、(工作部分和修改循环条件)循环结束循环结束条件条件N NY Y退出循环退出循环第九页,讲稿共八十九页哦 实际应用,实际应用,可将循环控制部分放在循可将循环控制部分放在循环体之前,形成环体之前,形成“先判断、后循环先判断、后循环”的的结构,也可以将循环控制部分放在循环结构,也可以将循环控制部分放在循环体之后,形成体之后,形成“先循环、后判断先循环、后判断”的结的结构形式。构形式。下面分别举例说明计数型循下面分别举例说明计数型循环和条件型循环的控制方法。环和条件型循环的控制方法。第十页,讲稿共八十九页哦例例5-15-1 n n个个8 8位有符号数,存在位有符号数,存在BUFBUF为首址为首址的存储
5、区中,试统计正数的个数。的存储区中,试统计正数的个数。分析分析:每个数均是每个数均是8 8位有符号二进位有符号二进制数,应先分析数的正负,再使用制数,应先分析数的正负,再使用符号数条件转移指令进行转移或正符号数条件转移指令进行转移或正数的统计。共有数的统计。共有n n个元素,整个程序个元素,整个程序的结构要重复判断的结构要重复判断n n次,故可次,故可选用计选用计数型循环程序。数型循环程序。第十一页,讲稿共八十九页哦 存储单元及寄存器分配如下存储单元及寄存器分配如下:BX:BUF BX:BUF存储区的地址指针,初值为存储区的地址指针,初值为BUFBUF的的偏移地址,每循环一次之后,其值加偏移地
6、址,每循环一次之后,其值加1 1。CX:CX:循环计数器,初值为循环计数器,初值为BUFBUF存储区中元素存储区中元素的个数的个数n n,每循环一次之后,其值减,每循环一次之后,其值减1 1。AX:AX:存放正数的个数,初值为零。存放正数的个数,初值为零。COUNT:COUNT:最终存放正数的个数。最终存放正数的个数。程序流程图如图程序流程图如图5-35-3所示。所示。第十二页,讲稿共八十九页哦开始开始BXBUFBXBUF的偏移地址的偏移地址CXBUFCXBUF区中元素个数区中元素个数AX0AX0(BX)0(BX)0AXAX(AXAX)+1+1BXBX(BXBX)+1+1CXCX(CXCX)-
7、1-1(CX)=0(CX)=0COUNTCOUNT(AXAX)结束结束Y YY YN NN N循环初始部分循环初始部分循环体部分循环体部分循环控制部分循环控制部分图图5-3 统计正数个数程序流程图统计正数个数程序流程图第十三页,讲稿共八十九页哦源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK 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 =$BUF N
8、=$BUF ;BUFBUF区中元素个数区中元素个数COUNT DW?COUNT DW?DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX第十四页,讲稿共八十九页哦 LEA BXLEA BX,BUFBUF MOV CXMOV CX,N N ;循环初始部分;循环初始部分 MOV AXMOV AX,0 0AGAINAGAIN:CMP BYTE PTR
9、 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 ;正数个数送入;正数个数送入COUNTCOUNT MOV AHMOV AH,4CH4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEGIN END BEGIN 第十五页,讲稿共八十九页哦 该程序的循环体重复执行了该程序的循环体重复执行了n n次
10、,即次,即当(当(CXCX)=n=n,n-1n-1,1 1 时循环执行,时循环执行,当(当(CXCX)=0=0时循环结束,将正数个数时循环结束,将正数个数5 5送入字变量送入字变量COUNTCOUNT中。中。对于计数型循环,在进入循环体前要对于计数型循环,在进入循环体前要先要确定循环次数,每循环一次就修改先要确定循环次数,每循环一次就修改一次计数值,计数值为零时就结束循环。一次计数值,计数值为零时就结束循环。第十六页,讲稿共八十九页哦 思考题思考题:(1 1)在循环初始部分,如果将负值送入循)在循环初始部分,如果将负值送入循环计数器环计数器CXCX,即,即:“MOV CXMOV CX,-n n
11、”,应该,应该如何修改程序?如何修改程序?(2 2)若将)若将0 0送入循环计数器送入循环计数器CXCX中,即中,即:“MOV MOV CXCX,0 0”,应该如何修改程序?,应该如何修改程序?(3 3)如果要分别统计出正数、零、负数的)如果要分别统计出正数、零、负数的 个数,应如何设计程序?个数,应如何设计程序?第十七页,讲稿共八十九页哦例例5-25-2 统计寄存器统计寄存器BXBX中中1 1码元的个数,将码元的个数,将结果存放在结果存放在COUNTCOUNT单元中。单元中。分析分析:统计统计BXBX中中1 1码元的个数码元的个数,须进行逐须进行逐位测试。先判断最高位是否为位测试。先判断最高
12、位是否为1 1,然后用移,然后用移位方法位方法,把各位逐次移到最高位进行判断。把各位逐次移到最高位进行判断。循环的结束条件可用计数值循环的结束条件可用计数值1616来控制,即来控制,即可以用计数型循环来设计。可以用计数型循环来设计。但是但是,这种方法的缺点是无论这种方法的缺点是无论BXBX中有没有中有没有 1 1都必须循环都必须循环1616次。次。第十八页,讲稿共八十九页哦 若用条件控制法,即测试若用条件控制法,即测试BXBX的值是否为的值是否为0 0作为结束条件,可大大缩短循环次数。作为结束条件,可大大缩短循环次数。存储单元及寄存器分配如下存储单元及寄存器分配如下:BX:BX:要测试的寄存器
13、要测试的寄存器 CX:CX:存放存放1 1的个数,初始值为的个数,初始值为0 0 COUNT:COUNT:最终存放最终存放1 1的个数的个数 程序流程图如图程序流程图如图5-45-4所示所示第十九页,讲稿共八十九页哦开始开始(BX)=0(CX)0SF=0CX(CX)+1(BX)左移一位)左移一位COUNT(CX)结束结束N NY YN NY Y图图5-4 统计统计BX中中1的个数程序流程的个数程序流程第二十页,讲稿共八十九页哦源程序如下源程序如下:STACKSTACK SEGMENT STACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACKSTAC
14、K 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 MOV DS MOV DS,AXAX第二十一页,讲稿共八十九页哦 MOV CX MOV CX,0 0 ;CX0CX0NEXTNEXT:AND BX AND BX,BXBX ;BXBX相与运算相与运算 JZ EXITJZ EXI
15、T ;(;(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 ;无条件转;无条件转NEXTNEXT继续循环继续循环EXITEXIT:MOV COUNT MOV COUNT,CXCX ;COUNT1COUNT1的个数的个数 MOV AH MOV AH,4CH4CH INT 21H INT 21
16、HCODECODE ENDS ENDS END BEGIN END BEGIN第二十二页,讲稿共八十九页哦 程序运行中,若程序运行中,若BXBX的值全为的值全为0 0,则不必则不必循环,直接转循环,直接转EXITEXIT结束。若只有最高位为结束。若只有最高位为1 1,则执行,则执行“INC CXINC CX”后,左移一位,再转后,左移一位,再转NEXTNEXT处判断,此时(处判断,此时(BXBX)=0=0转转EXITEXIT,仅需,仅需执行一次循环。只有最低位为执行一次循环。只有最低位为1 1时才需时才需1616次次循环,统计出循环,统计出BXBX中的个数。显然,用条件中的个数。显然,用条件控
17、制循环效率最高。控制循环效率最高。返回本章目录返回本章目录第二十三页,讲稿共八十九页哦5.2 5.2 循环指令循环指令第二十四页,讲稿共八十九页哦 为了简化循环程序的设计,为了简化循环程序的设计,8086/80888086/8088指令系统专门设置了一组循环程序指令指令系统专门设置了一组循环程序指令:LOOPLOOP、LOOPZ/LOOPELOOPZ/LOOPE和和LOOPNZ/LOOPNELOOPNZ/LOOPNE。这些循环指令在执行前,这些循环指令在执行前,必须预先将循必须预先将循环次数存放在环次数存放在CXCX寄存器中。寄存器中。另外这些循另外这些循环控制指令只能实现短转移。环控制指令只
18、能实现短转移。第二十五页,讲稿共八十九页哦1.LOOP 1.LOOP 循环指令循环指令 格式格式:LOOP LOOP 标号标号 功能功能:CX CX(CXCX)-1-1 判断判断CXCX的值,若(的值,若(CXCX)0 0转移到标号处继续循环,否则转移到标号处继续循环,否则退出循环。退出循环。第二十六页,讲稿共八十九页哦例例5-35-3 计算计算1+2+3+1+2+3+100+100,将结果存入字变量将结果存入字变量SUMSUM中。中。分析分析:这是一个典型的这是一个典型的计数型循环,计数型循环,用于求累用于求累加和。循环体执行次数为加和。循环体执行次数为100100。存储单元及寄存器分配如下
19、存储单元及寄存器分配如下:AX:AX:存累加求和,初值为存累加求和,初值为0 0。CX:CX:存循环次数,初值存循环次数,初值100100,每次减,每次减1 1。SUM:SUM:存最终结果的字变量。存最终结果的字变量。第二十七页,讲稿共八十九页哦开始开始AX0CX100AX(AX)+(CX)CX(CX)1(CX)=0SUM(AX)结束结束N NY Y图图5-5 求累加和程序流程图求累加和程序流程图第二十八页,讲稿共八十九页哦源程序如下源程序如下:STACKSTACK SEGMENT STACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACKSTACK
20、 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第二十九页,讲稿共八十九页哦 MOV AXMOV AX,0 0 ;AXAX清零清零 MOV CXMOV CX,100100 ;CXCX循环次数循环次数100100NEXTNEXT:ADD AXADD AX,
21、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。第三十页,讲稿共八十九页哦思考思考:(1 1)程序中)程序中“LOOP NEXTLOOP NEXT”语句可以用语句可以用哪两条语句来代替?哪两条语句来代替?(2 2)若要求从)若要求从1 1开始连续开始连续
22、5050个奇数的个奇数的和,应如何编程?和,应如何编程?第三十一页,讲稿共八十九页哦2.LOOPZ/LOOPE2.LOOPZ/LOOPE为零或相等时循为零或相等时循 环指令环指令 格式格式:LOOPZ/LOOPE LOOPZ/LOOPE 标号标号 功能功能:CX CX(CXCX)-1-1 判断判断CXCX和和ZFZF的值,若的值,若(CXCX)0 0且且ZF=1ZF=1转移到标号处转移到标号处继续循环,若(继续循环,若(CXCX)=0=0或或ZF=0ZF=0则则退出循环。退出循环。第三十二页,讲稿共八十九页哦3.LOOPNZ/LOOPNE3.LOOPNZ/LOOPNE不为零或不相不为零或不相
23、等时循环指令等时循环指令 格式格式: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和和LOOPNZ/LOOPNELOOPNZ/LOOPNE指令提供指令提供了提前结束循环的可能性。了提前结束循环的可能性。第三十三页,讲稿共八十九页哦 例例5-45-4 以以BUFBUF为首址的存储区中存放有为首址的存储
24、区中存放有N N个个字符。在字符串中查找第字符。在字符串中查找第1 1次出现次出现 “E E”的的字符。若找到将其偏移位置存入字符。若找到将其偏移位置存入FOUNDFOUND;否则显示;否则显示“NO FINDNO FIND!”。分析分析:在字符串中查找某字符,查找的在字符串中查找某字符,查找的方法有多种,这里采用顺序查找法。若方法有多种,这里采用顺序查找法。若找到将其偏移位置保存起来,找到将其偏移位置保存起来,并结束程并结束程序;否则显示序;否则显示“NO FINDNO FIND!”。第三十四页,讲稿共八十九页哦 存储单元与寄存器分配如下存储单元与寄存器分配如下:BUF:BUF:存放字符串的
25、存储区存放字符串的存储区SI:BUFSI:BUF存储区中字符的偏移位置,初存储区中字符的偏移位置,初 值为值为11,每次递增,每次递增1 1。AL:AL:保存要查找的字符保存要查找的字符CX:CX:存放循环次数,初值为字符串长存放循环次数,初值为字符串长 度,每次减度,每次减1 1。FOUND:FOUND:存查找成功时字符的偏移值存查找成功时字符的偏移值第三十五页,讲稿共八十九页哦源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACK ENDSSTACK ENDSDATA SEGMENT
26、DATA 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 ASSUME CS ASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATABEGINBEGIN:MOV AX MOV AX,DATADATA MOV DS MOV DS,AXAX 第
27、三十六页,讲稿共八十九页哦 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 ;判断要查找的字符;判断要查找的字符 LOOPNE NEXTLOOPNE NEXT ;ZF=0ZF=0且(且(CXCX)0 0转转NEXTNEXT循环循环 JNZ NO_FINDJNZ NO_FIND ;ZF=0ZF=0
28、转转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 21HINT 21HEXITEXIT:MOV AHMOV AH,4CH 4CH ;程序结束;程序结束 INT 21HINT 21HCODE CODE ENDS ENDS END BEGIN END BEGIN第三十七页,讲
29、稿共八十九页哦 程序执行过程中,有两种可能性程序执行过程中,有两种可能性:(1 1)成功找到字符)成功找到字符“E E”,ZF=1ZF=1,提前退出,提前退出循环。执行循环。执行JNZJNZ指令时,因不满足测试条件指令时,因不满足测试条件而执行下一条指令而执行下一条指令“MOV FOUNDMOV FOUND,SISI”。(2 2)一直查找到字符串结束而未发现字符)一直查找到字符串结束而未发现字符“E E”,则因(,则因(CXCX)=0=0而结束循环。在执行而结束循环。在执行JNZJNZ指令时,因指令时,因ZF=0ZF=0而转而转NO_FINDNO_FIND。返回本章目录返回本章目录第三十八页,
30、讲稿共八十九页哦5.3 5.3 循环程序设计方法循环程序设计方法第三十九页,讲稿共八十九页哦 循环程序循环程序,按结构可分单重循环按结构可分单重循环程序和多重循环程序程序和多重循环程序。5.3.1 5.3.1 单重循环程序设计单重循环程序设计 单重循环是其循环体内不再包含单重循环是其循环体内不再包含循环结构的程序。循环结构的程序。第四十页,讲稿共八十九页哦 例例5-55-5 BUFBUF为首址的存储区中存放一串字为首址的存储区中存放一串字符,把最大的字符存入符,把最大的字符存入MAXMAX中。中。分析分析:在一串字符中寻找最大值,可将在一串字符中寻找最大值,可将第第1 1个字符存入个字符存入A
31、LAL单元中。然后单元中。然后,从第从第2 2个字符开始依次与个字符开始依次与ALAL比较,若某个字符比较,若某个字符比比ALAL还大,则将其赋给还大,则将其赋给ALAL,如此比较,如此比较,最后最后ALAL中保存的定是最大字符。中保存的定是最大字符。第四十一页,讲稿共八十九页哦 存储单元与寄存器分配如下存储单元与寄存器分配如下:CX:CX:循环次数控制变量,初值为字符串的长循环次数控制变量,初值为字符串的长度减度减1 1,每次减,每次减1 1。BX:BUFBX:BUF存储区地址指针,初值指向存储区地址指针,初值指向BUFBUF,每,每次加次加1 1。AL:AL:保持某个时刻的最大字符值。保持
32、某个时刻的最大字符值。MAX:MAX:保存最终结果的字节单元。保存最终结果的字节单元。程序流程图如图程序流程图如图5-65-6所示。所示。第四十二页,讲稿共八十九页哦Y Y开始开始BXBUFBXBUF存储区首地址存储区首地址ALAL字符串中第一个字符字符串中第一个字符CXCX字符串长度减字符串长度减1 1BXBX(BXBX)+1+1(ALAL)BXBXCXCX(CXCX)-1-1ALAL(BXBX)(CXCX)=0=0MAXMAX(ALAL)结束结束N NY YN N图图5-6 求最大字符的流程图求最大字符的流程图第四十三页,讲稿共八十九页哦STACKSTACK SEGMENT STACK S
33、EGMENT 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 MOV AX,DATADATA MOV DS MOV
34、DS,AXAX源程序如下源程序如下:第四十四页,讲稿共八十九页哦 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(替代)(替代)MOV ALMOV AL,BXBX ;较大数送
35、;较大数送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”。第四十五页,讲稿共八十九页哦 例例5-65-6 编程把字变量编程把字变量NUMNUM中的二进制数,中的二进制数,用十六进制数显示。用十六进制数显示。分析分析:把把NUMNU
36、M中的二进制数从左到右每中的二进制数从左到右每4 4位分为位分为1 1组,用循环移位把要处理的组,用循环移位把要处理的4 4位位二进制数移到最右边,再将数值转换到二进制数移到最右边,再将数值转换到字符。字符。若是数值若是数值0 09 9,加,加30H30H转换成字符转换成字符“0 0”“9 9”;若是值;若是值A AF F,除将其值加,除将其值加30H30H外,还应加上外,还应加上7H7H才能转换成才能转换成“A A”“F F”。第四十六页,讲稿共八十九页哦DI:DI:指向存转换结果的单元,每次加指向存转换结果的单元,每次加1 1BX:BX:待转换的二进制数的工作单元待转换的二进制数的工作单元
37、CH:CH:循环计数器,初值为循环计数器,初值为4 4,每次减,每次减1 1CL:CL:循环移位次数,每次移循环移位次数,每次移4 4位位AL:AL:转换中用到的工作单元转换中用到的工作单元 程序流程图如图程序流程图如图5-75-7所示所示存储单元及寄存器分配如下存储单元及寄存器分配如下:第四十七页,讲稿共八十九页哦图图5-7 5-7 二进制转换成十六进制的程序流程图二进制转换成十六进制的程序流程图开始开始初始化工作初始化工作将将BXBX循环左移四位循环左移四位是否大于是否大于“9 9”Y Y将转换结果送存储区保存将转换结果送存储区保存加加0707调整调整循环计数器为循环计数器为0 0显示转换
38、结果显示转换结果结束结束N NY YN N取取BXBX低四位转换成低四位转换成ASCIIASCII码码第四十八页,讲稿共八十九页哦 源程序如下源程序如下: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
39、0)STACK ENDSSTACK ENDSCODECODE SEGMENT SEGMENT ASSUME CSASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATABEGINBEGIN:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX第四十九页,讲稿共八十九页哦 MOV BXMOV BX,NUMNUM ;待转换的二进制数送;待转换的二进制数送BXBX LEA DILEA DI,BUF0BUF0 ;存储单元首址送;存储单元首址送DIDI MOV CHMOV CH,4 4 ;CHCH循环次数循环次数NEXTNEXT:MOV
40、 CLMOV CL,4 4 ;CLCL循环移位次数循环移位次数 ROL BXROL BX,CLCL ;4 4位二进制数移到最低位位二进制数移到最低位 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 ;转换
41、的十六进制数送;转换的十六进制数送BUF0BUF0 INC DIINC DI ;指向下一存储单元;指向下一存储单元 DEC CHDEC CH ;CH CH(CHCH)11 JNZ NEXTJNZ NEXT ;(;(CHCH)0 0转转NEXTNEXT继续转换继续转换第五十页,讲稿共八十九页哦 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 A
42、H,9 9 INT 21H INT 21H MOV AH MOV AH,4CH4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEGIN END BEGIN 程序运行后,屏幕显示:(程序运行后,屏幕显示:(NUMNUM)=2D39H=2D39H第五十一页,讲稿共八十九页哦5.3.2 5.3.2 多重循环程序设计多重循环程序设计 多重循环指循环体内又嵌套有循环的多重循环指循环体内又嵌套有循环的程序。程序。多重循环程序设计的基本思想和单重多重循环程序设计的基本思想和单重循环程序设计是一致的,但应分别考虑循环程序设计是一致的,但应分别考虑各重循环的控制条件及其程序
43、实现,各重循环的控制条件及其程序实现,内外层循环必须是嵌套的,不能出现交内外层循环必须是嵌套的,不能出现交叉。叉。第五十二页,讲稿共八十九页哦 例例5-95-9 BUF BUF为首址的字节存储区存放有为首址的字节存储区存放有n n 个无符号数个无符号数x1x1,x2x2,xnxn,试编程,试编程 将它们由大到小排列在将它们由大到小排列在BUFBUF中。中。分析分析:本例是对本例是对n n个数据排序,排序个数据排序,排序 的方法有很多种,如选择、冒泡、插入、的方法有很多种,如选择、冒泡、插入、shellshell排序等。这里仅介绍较简单的排序等。这里仅介绍较简单的选选择排序。择排序。第五十三页,
44、讲稿共八十九页哦 选择排序算法选择排序算法:一组数放入一组数放入n n个存储单元,先将第个存储单元,先将第1 1个存储单元中的数与个存储单元中的数与其后其后n-1n-1个存储单元中的数依次比较,将两数中的大数放在个存储单元中的数依次比较,将两数中的大数放在第第1 1个存储单元,经过个存储单元,经过n-1n-1次比较后,次比较后,n n个数中的最大者定存个数中的最大者定存入第入第1 1个存储单元中,个存储单元中,n-1n-1次比较可以用一个计数型循环来次比较可以用一个计数型循环来控制;接着进行第控制;接着进行第2 2轮比较,将第轮比较,将第2 2个存储单元中的数与其个存储单元中的数与其后的后的
45、n-2n-2个存储单元中的数依次比较,个存储单元中的数依次比较,n n个数中的第个数中的第2 2大者大者就存入第就存入第2 2个存储单元,如此重复,个存储单元,如此重复,直到第直到第n-1n-1轮比较后,轮比较后,将将n n个数中的第个数中的第n-1n-1大者存入第大者存入第n-1n-1个存储单元,第个存储单元,第n n个存储个存储单元中的数据定是单元中的数据定是n n个数中的最小者。个数中的最小者。从第从第1 1轮到第轮到第n-1n-1轮的轮的控制又可以用控制又可以用1 1个计数型循环。个计数型循环。第五十四页,讲稿共八十九页哦例如例如,4 4个数据个数据:60 27 96 43:60 27
46、 96 43 将它们从大到小的重新排列。将它们从大到小的重新排列。4 4个数的排序需要经过个数的排序需要经过3 3轮比较才能完成。轮比较才能完成。第第1 1轮轮:将第将第1 1个存储单元的数据个存储单元的数据6060,依次与后面的数据比较,经,依次与后面的数据比较,经3 3次比较得第次比较得第1 1个单个单元的最大值元的最大值9696。第第1 1次次:60 27:60 27969643 602743 6027不需交换不需交换 第第2 2次次:96 27:96 27606043 609643 604343 9643不需交换不需交换第第2 2轮轮:求第求第2 2个位置上的最大值,需经两次比较。个位
47、置上的最大值,需经两次比较。第第1 1次次:96 60:96 60272743 276043 274343 6043不需交换不需交换第第3 3轮轮:求第求第3 3个位置上的最大值,只需经个位置上的最大值,只需经1 1次比较。次比较。第第1 1次次:96 60:96 60434327 274327 2743进行交换进行交换 第五十五页,讲稿共八十九页哦 存储单元和寄存器分配如下存储单元和寄存器分配如下:BUF:BUF:存放要排序数据的存储单元存放要排序数据的存储单元N:N:存放要排序数据的个数存放要排序数据的个数SI:SI:控制外循环的循环计数器,初值为控制外循环的循环计数器,初值为 1 1,终
48、值为,终值为N1N1,每次递增,每次递增1 1。DI:DI:控制内循环的循环计数器,初值为(控制内循环的循环计数器,初值为(SISI)+1+1,终值为,终值为N N,每次递增,每次递增1 1。AL:AL:存放比较数据的寄存器存放比较数据的寄存器第五十六页,讲稿共八十九页哦开始开始SI1SI1DIDI(SISI)+1+1ALAL(BUF+BUF+(SISI)-1-1)(AL)(BUF+(DI)-1)(AL)(BUF+(DI)-1)ALAL与与(BUF+(DI)-1)(BUF+(DI)-1)互换互换(BUF+(SI)-1BUF+(SI)-1)(AL)(AL)DIDI(DIDI)+1+1(DI)(D
49、I)N NSISI(SISI)+1+1(SI)N-1(SI)N-1结束结束Y YY YY YN NN NN N图图5-115-11选择排序算法流程选择排序算法流程第五十七页,讲稿共八十九页哦源程序如下源程序如下:STACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP DB 200 DUP(0 0)STACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUF DB 0AHBUF DB 0AH,8 8,15H15H,36H36H,6 6,20H20H,12H12HN =$-BUF N =$-BUF ;N N为要排序数据的
50、个数为要排序数据的个数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,1 1 ;外循环计数赋初值;外循环计数赋初值1 1NEXT1NEXT1:MOV DIMOV DI,SISI ;内循环计数初值(;内循环计数初值(DI)=(SI)+1DI)=(SI)+1 INC DI INC DI MOV AL MOV AL,B