汇编语言程序设计第七章循环结构程序理论:5学时第七章循环结构程序设计循环控制指令(0.5学时)循环结构程序的提出数据串操作指令(不讲)7.17.27.37.4循环程序的控制方法(0.5学时)7.5单重循环程序举例(2学时)7.6多重循环程序设计(2学时)7.7循环结构程序的组成第七章循环结构程序•7.1循环结构的提出–在解决实际问题过程中,经常会遇到某一种操作需反复多次进行的情况,如:内存两个存储器,分别存放50个数据,编制程序求对应数据之和,并存入另一个连续存储区。这样的问题,采用一段相同的程序重复执行50次即可。MOVCX,50AGAIN:MOVAX,[SI]MOVBX,[BX]ADDAX,BXMOV[DI],AXADDSI,2ADDBX,2ADDDI,2DECCXJNZAGAIN这样的程序段重复执行50次即可。优点:减少程序的书写、输入、汇编的时间、减少程序的存储空间。实验书上49页•要求从键盘输入若干字符,如果是a-z之间的小写字母,则将其转换为大写字母输出出来;如果是其他字符则不用再次显示;如果是ctrl+c,则程序停止运行,每次都是换行等待输入新的字符CSEGSEGMENTASSUMECS:CSEGSTART:MOVAH,1INT21HCMPAL,3JZEXITCMPAL,’a’JBNEXTCMPAL,’z’JANEXTSUBAL,20HMOVDL,ALMOVAH,2INT21HNEXT:MOVDL,0DHMOVAH,2INT21HMOVDL,0AHMOVAH,2INT21HJMPSTARTEXIT:MOVAX,4C00HINT21HCSEGENDSENDSTART第七章循环结构程序设计循环控制指令循环结构程序的提出数据串操作指令7.17.27.37.4循环程序的控制方法7.5单重循环程序举例7.6多重循环程序设计7.7循环结构程序的组成•7.2循环结构程序的组成–分析上面所示程序,循环结构程序由4部分组成——初始化部分、工作部分、修改部分和控制部分。如图所示:第七章循环结构程序图7.1循环结构程序的组成•循环程序由四部分组成:–初始化部分:为程序的循环做准备。如:初始化地址指示器、对寄存器赋初值、对存储单元赋初值等;–工作部分:一般为多次执行部分,完成程序要做的工作;–修改部分:为下一次工作做准备,以使下一次工作时获得必要的数据或状态。如:修改地址指示器、寄存器、内存单元的内容;–控制部分:根据条件,进行判断,是否继续转入工作部分继续工作,若未满足程序结束条件,则转入工作部分,否则,退出循环。任何循环程序都是由这四部分组成,在设计这样的程序时,从这四个方面去思考;设计完成后,再从这四个方面去检查。初始化部分只能执行一次,不得有转入初始化部分的语句,否则,循环程序会得到不正确结果。第七章循环结构程序•7.2循环结构程序的组成【例】设DS:SI中存放了一个字符串的首地址,字符串以“$”结束。编写程序段,把该字符串显示到屏幕上,结束符“$”不显示。……L1:CMPBYTEPTR[SI],'$'JEL2;遇‘$’则跳出循环MOVDL,[SI];把字符取到DL中MOVAH,2INT21H;把DL中的字符输出到屏幕ADDSI,1;使SI指向下一字符JMPL1;转回再做条件判断L2:…图7.2SI指出的是$?显示SI指出的字符SI增1YN第七章循环结构程序•7.2循环结构程序的组成上题也可这样设计:……L3:MOVDL,[SI];把字符取到DL中MOVAH,2INT21H;把DL中的字符输出到屏幕ADDSI,1;使SI指向下一字符CMPDL,'$'JNEL3;已显示'$'则跳出循环……上述两种循环结构的最大不同在于,图7.3的循环体部分SI指出的是$?显示SI指出的字符SI增1图7.3YN第七章循环结构程序•7.2循环结构程序的组成第七章循环结构程序设计循环控制指令循环结构程序的提出数据串操作指令7.17.27.37.4循环程序的控制方法7.5单重循环程序举例7.6多重循环程序设计7.7循环结构程序的组成•7.3循环控制指令–包括LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ。–3条指令的特点:•隐含指定CX作为循环计数器。使用前一定要对CX设置初值。•此指令与转移目标指令的距离在-126~129之间。•1.循环指令LOOP–格式:LOOPlabel–操作:CX←CX-1,若CX≠0,则转label。–影响标志:无。–说明:LOOP指令的功能相当于DECCXJNZLABEL第七章循环结构程序•7.3循环控制指令LOOP指令例子对一组数据求和:MOVCX,LENGTHARRAYMOVAX,0MOVSI,OFFSETARRAYNEXT:ADDAX,[SI]ADDSI,TYPEARRAYLOOPNEXTMOVRESULT,AX•2.条件重复控制指令LOOPE/LOOPZ–格式:LOOPE/LOOPZlabel–操作:CX←CX-1,若CX≠0且ZF=1,则转label。若CX=0或ZF=0,则顺序执行。–影响标志:无。•3.条件重复控制指令LOOPNE/LOOPNZ–格式:LOOPNE/LOOPNZlabel–操作:CX←CX-1,若CX≠0且ZF=0,则转label。若CX=0或ZF=1,则顺序执行。–影响标志:无。第七章循环结构程序•7.3循环控制指令LOOPZ指令的例子MOVSI,OFFSETSRCMOVDI,OFFSETDESMOVCX,5BIJIAO:INCSIINCDIMOVAL,[SI]CMPAL,[DI]LOOPZBIJIAOJZEQUAL…;这是不相等的处理EQUAL:…;这是相等的处理练习•求自然数1~10之和课间休息第七章循环结构程序设计循环控制指令循环结构程序的提出数据串操作指令7.17.27.37.4循环程序的控制方法7.5单重循环程序举例7.6多重循环程序设计7.7循环结构程序的组成7.5循环控制方法循环程序的控制方法,一般有3种:1.计数控制法当循环次数已知的情况下采用。已知的循环次数作为循环计数的初值,每执行一次循环,计数值减1,循环直至计数值为0。2.寄存器终值控制法在循环过程中,某寄存器的值总是按某种规律变化,当变化到某一值时,循环结束。3.条件控制法当循环次数未知、且不能求得循环次数,而是根据程序执行过程中的某个条件是否满足来决定是否继续循环。每执行1次循环,就对条件进行1次测试,满足循环条件,则循环,直至条件不满足时,停止循环。第七章循环结构程序•7.5循环程序的控制方法•【例7.2】已知DATA为首址的字节存贮区中,存放若干个带符号字节数据,试统计其中负元素的个数,并存放在RLT单元。数据个数在COUNT单元存放。•程序流程图如图7.4所示。1.计数控制法开始BX←数据首址,CX←数据个数,DX←0AL[BX]←AL≥0?DXDX+1BXBX+1CX-1=0?NNY保存结果结束Y图7.4←←CX-1=0?第七章循环结构程序•7.5循环程序的控制方法INCDXPLUS:INCBXDECCXJNZLOOP1MOVRLT,DXMOVAX,4C00HINT21HCSEGENDSENDSTART程序清单:DSEGSEGMENTDATADB2,-1,4,38,-5,93COUNTDW6RLTDW?DSEGENDSCSEGSEGMENTASSUMECS:CSEGASSUMEDS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEABX,BUFMOVCX,COUNTXORDX,DXLOOP1:MOVAL,[BX]ANDAL,ALJNSPLUS第七章循环结构程序•7.5循环程序的控制方法当循环计数器减为0时,循环程序结束!开始SI←数据首址,AL←第一个数据SISI+1←SI末址?AL[SI]NNY保存结果结束Y图7.5←AL[SI]?•【例7.3】内存DATA开始存放若干个无符号字节数据,数据末址为DTEND,编制程序将其中最大者送入MAX单元。•程序流程图如7.5所示。2.寄存器终值控制法第七章循环结构程序•7.5循环程序的控制方法DSEGSEGMENTDATADB15H,26H,03H…DTENDDW62HMAXDW?DSEGENDSSSEGSEGMENTSTACKDB50DUP(0)SSEGENDSLOAD:MOVMAX,ALMOVAX,4C00HINT21HCSEGENDSENDSTART程序清单:CSEGSEGMENTASSUMECS:CSEGASSUMEDS:DSEGSMAX:MOVAX,DSEGMOVDS,AXMOVAX,SSEGMOVSS,AXMOVSP,SIZESTACKLEASI,DATAMOVAL,[SI]AGAIN:INCSICMPSI,OFFSETDTENDJALOADCMPAL,[SI]JAAGAINMOVAL,[SI]JMPAGAIN第七章循环结构程序•7.5循环程序的控制方法当地址指针的值大于数据末址时,控制循环程序结束。•【例7.4】编制程序计算DX的平方根。已知DX中的数据为完全平方数,平方根存放在CX中。•算法:从1开始连续i个奇数之和是i的平方值。求N的平方根,可从N中依次连续减去从1开始的连续奇数,直到N为0时,减去奇数的个数i即为N的平方根3.条件控制法←NY开始DX中存放被开方数计数寄存器加1形成奇数被开方数减去奇数DX=0?DX为根结束图7.4第七章循环结构程序•7.5循环程序的控制方法程序清单:SQROOT:MOVAX,DSEGMOVDS,AXXORCX,CX;奇数个数XORAX,AX;形成奇数的基数MOVDX,DATA;被开方数送DXAGAIN:ANDDX,DXJZLROOTMOVBX,AXSHLBX,1INCBX;形成的奇数SUBDX,BXINCCXINCAXJMPAGAIN第七章循环结构程序•7.5循环程序的控制方法循环的条件LROOT:MOVROOT,CXMOVAH,4CHINT21H第七章循环结构程序设计循环控制指令循环结构程序的提出数据串操作指令7.17.27.37.4循环程序的控制方法7.5单重循环程序举例7.6多重循环程序设计7.7循环结构程序的组成7.6单重循环结构的程序–只有一个循环体的循环程序称为单重循环程序。【例7.6】编写程序:将BX寄存器中的二进制数用十六进制数的形式显示出来。【分析】根据要求,考虑如下:(1)将BX中的内容从左到右每4位一组显示出来,共显示4个十六进制数位。(2)如果显示的数位是0~9:+30H;A~F:+37H。(3)字符显示:DOS功能02号。第七章循环结构程序•7.6单重循环结构的程序【例7.6】程序………….CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVBX,0FE12HMOVCH,04H;循环计数值LOOP:MOVCL,04H;移动位数ROLBX,CL;MOVAL,BL;备份开始BX循环左移4位←加7显示一个字符NY结束第七章循环结构程序•7.6单重循环结构的程序初始化循计数值←把低4位转换ASCIIASCIIA~F?←循环计数值=0?YN【例7.6】程序(续)ANDAL,0FH;取低4位ADDAL,30H;先加30HCMPAL,3AH;AL9?JLPRINT;小于则直接打印ADDAL,07H;大于则再+9PRINT:MOVDL,AL;DOS调用做准备MOVAH,02HINT21H;DOS调用EDCCH;修改循环值JNZLOOP;判断循环结束否?MOVAX,4C00HINT21H……第七章循环结构程序•7.6单重循环结构的程序【例7.7】统计某字单元中二进制数位值为1的个数,并将统计结果存放在变量SUM单元中。【分析】考虑如下:(1)统计:采用移位操作,逐位测试。(2)方案:a.循环次数:CX=16;循环结束条件:CX=0;工作:统计个数+1。b.循环结束条件:被测数据=0?工作:累计CF的值。优点:循环次数随被测数据不同而不同,=16。第七章循环结构程序•7.6单重循环