您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第四章汇编语言程序设计(2)循环程序设计1
14.2循环程序结构所谓循环程序,就是程序中有某一部分代码被重复执行多次。三个部分组成:循环初始——为开始循环准备必要的条件,如循环次数、循环体需要的初始值等;循环体——重复执行的程序代码,其中包括对循环条件的修改等;循环控制——判断循环条件是否成立,决定是否继续循环2循环程序有两种结构:“先判断、后循环”的循环程序结构–对应高级语言的WHILE语句“先循环、后判断”的循环程序结构–对应高级语言的DO语句344.2.1循环控制指令1.LOOP指令(1)格式LOOPLABEL(2)功能:将CX的内容减1,CX(ECX)如不为0,则继续转到标号为LABEL的指令处循环执行,为0,则退出循环,程序顺序往下执行。如一段软件延时程序:DLY:PUSHCXMOVCX,0100H;设置循环次数KKK:NOPLOOPKKK;CX减1,如不为0则循环POPCXRETDECECXJNZlabel5〔例4-10〕数组求和程序数组求和:首先确定数组中数据的个数,指向数组的首地址,和的初始值设为0,然后从数组中取出一个数,加到和中,修改数组的地址,数据个数-1,判断如果还没有加完(数据个数-1不等于0),返回去循环执行,否则完成求和过程。;数据段arrayDWORD136,-138,133,130,-161;数组sumDWORD?;代码段movecx,lengthofarray;ECX=数组元素个数xoreax,eax;求和初值为0movebx,eax;数组指针为0again:addeax,array[ebx*(typearray)];求和incebx;指向下一个数组元素loopagain;ECX-1,≠0,转againmovsum,eax;保存结果calldispsid;显示结果循环体循环控制循环初始DWORD数据类型typearray=472LECXZ循环指令(1)格式LECXZlabel(2)功能ECX=0,转移到标号处,否则顺序执行。对于以上数组求和,如果是一个空数组,则ECX的初值为0,前面的程序求和将出现错误——第一次ECX-1再判断,将使ECX变为)0FFFFFFFFH,本来是一个空数组,……我们就用先判断,在执行循环体的循环程序结构相当于:CMPECX,0JZlabel8movecx,lengthofarray;ECX=数组元素个数xoreax,eax;求和初值为0movebx,eax;数组指针为0again:lecxznext;ECX=0,转next,退出循环addeax,array[ebx*(typearray)];求和incebx;指向下一个数组元素dececx;ECX-1jmpagain;转anain继续判断与循环next:movsum,eax;保存结果calldispsid;显示结果94.2.2计数控制循环利用循环次数控制循环程序中循环体的执行。利用LOOP指令属于计数控制常见结构是“先循环、后判断”循环结构计数可以减量进行,即减到0结束计数可以增量进行,即达到规定值结束教材上还有一个计数控制循环的例子——简单的加解密程序加密端:利用一个数(密钥)与待加密的字节进行异或实现加密解密端:利用同样的密钥,与被加密的字节信息再进行一次异或运算,就可恢复出原始信息,实现解密。104.2.3条件控制循环除了用次数控制循环外,还可以根据条件决定是否进行循环。根据条件决定是否进行循环–需要使用有条件转移指令实现–多见“先判断、后循环”结构先行判断的条件控制循环程序–很像双分支结构–主要分支需要重复执行多次(JMP的目标位置是循环开始)–另一个分支用于跳出这个循环先行循环的条件控制循环程序–类似单分支结构,循环体就是分支体–顺序执行就跳出循环条件控制循环可使用条件循环控制指令,也可用条件转移指令实现。111LOOPZ/LOOPE(1)格式loopzlabel(2)功能:将CX减1,如CX为0或者ZF为0则退出循环,在ZF=1且CX≠0时继续循环。注意:①CX-1中的值为0时,并不会影响标志位ZF。②IA-32使用ECX,8086使用CX请注意与LOOP指令的相同与区别。122LOOPNZ/LOOPNE(1)格式LOOPNZlabel;LOOPNEabcd(2)功能CX减1,如CX≠0且ZF=0,则转到标号处继续循环;如CX=0,或ZF=1,则退出循环,顺序往下执行程序。该类指令可以用于比较指令之后,例如在DAT1开始的200个数据,我们查找是否有等于55H的值,如果有,将其地址保存在BX,,否则(BX)=0FFH。13ABC开始取地址SIDAT1循环次数CX200AL[SI](SI)+1(BX)(SI)-1LOOPNZABC结束CPMAL,55HZF=0?(BX)=0FFHENDA02A01NY有相等的或CX=0退出14LEASI,DAT1;(SI)←源地址指针MOVCX,200;(CX)←循环次数ABC:MOVAL,[SI];取一个带符号数到ALINCSI;CMPAL,55H;AL内容与55H比较LOOPNZABC;没找到(Z=0)且CX≠0,循环JNZA02;没有找到A01:DECSI;(SI)=(SI)-1,恢复所在地址MOVBX,SI;找到,BX=所在的地址JMPNEXT;A02:MOVBX,55H;没找到,BX=55HNEXT:……;15教材上有两个例子〔例4-12〕字符个数统计程序;数据段stringbyte‘DoyouhavefunwithAssembly?’,0;以0结尾的字符串;代码段xorebx,ebx;EBX用于记录字符个数,也用于指向字符的指针again:moval,string[ebx]cmpal,0;用指令“testal,al”更好jzdoneincebx;个数加1jmpagain;继续循环done:moveax,ebx;显示个数calldispuid〔例4-13〕字符剔除程序-1moveax,offsetstring;显示处理前字符串calldispmsgmovesi,offsetstringoutlp:cmpbyteptr[esi],0;外循环,先判断后循环jzdone;为0结束again:cmpbyteptr[esi],'';是否是空格jnznext;不是空格继续循环movedi,esi;是空格,剔除空格分支inlp:incedi;该分支是循环程序moval,[edi];前移一个位置mov[edi-1],al〔例4-13〕字符剔除程序-2cmpbyteptr[edi],0;内循环,先循环后判断jnzinlp;内循环结束处jmpagain;再次判断是否为空格(处理连续空格)next:incesi;继续对后续字符进行判断处理jmpoutlp;外循环结束处done:moveax,offsetstring;显示处理后字符串calldispmsg
本文标题:第四章汇编语言程序设计(2)循环程序设计1
链接地址:https://www.777doc.com/doc-3356617 .html