资源描述:
《循环程序设计》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、循环程序设计 强制CPU重复执行同一指令集合的一种程序结构,它可以使许多重复性工作的程序大为简化。 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体,循环指令和转移指令可以实现循环控制;还可以采用MASM6.x提供的循环控制伪指令实现 循环结构 .modelsmall .stack .data sumdw? .code .startup xorax,ax;被加数AX清0 movcx,100 again:addax,cx ;从100,99,...,2,1倒序累加 loopagain movsum,ax;将累加和送入指定单元 .exit0 end
2、例1:在内存40000H开始的顺序30个单元中存放着8位无符号数,若将它们的和放在DX中,其程序如下: MOVAX,4000H MOVDS,AX MOVSI,0000H MOVCX,30 XORAX,AX GOON:ADDAL,[SI] ADC:AH,00H INCSI DECCX JNZGOON MOVDX,AX HLT 例2:在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号的16位数,现欲编程序将100个字按大小顺序排列: LEADI,BUFFER MOVBL,99 N
3、EXT0: MOVSI,DI MOVCL,BL NEXT3: MOVAX,[DI] ;第一个数-->AX ADDSI,2 CMPAX,[SI] ;第一个数同第二个数比较 JNCNEXT5 ;第一个数第二个数,转NEXT5 MOVDX,[SI] ;若第一个数DX MOV[DI],DX ;DX-->第一个位置 MOV[SI],AX NEXT5: DECCL JNZNEXT3 ;CL0 INCDI INCDI DECBL JNZNEXT0 HLT 例3.求1-
4、100的和 计数控制循环 ,循环次数固定 movah,1;从键盘输入一个字符 int21h movbl,al;BL←AL=字符的ASCII码 ;DOS功能会改变AL内容,故字符ASCII码存入BL movah,2 movdl,’:’;显示一个分号,用于分隔 int21h movcx,8;CX←8(循环次数) again:shlbl,1;左移进CF,从高位开始显示 movdl,0;MOV指令不改变CF adcdl,30h;DL←0+30H+CF ;CF若是0,则DL←‘0’;若是1,则DL←‘1’ movah,2 int21h;显示 loopagain;CX减1
5、,如果CX未减至0,则循环 例4:用二进制显示从键盘输入的一个字符的ASCII码 movbx,offsetstring again:moval,[bx];取一个字符 oral,al;是否为结尾符0 jzdone;是,退出循环 cmpal,’A’;是否为大写A~Z jbnext cmpal,’Z’ janext oral,20h ;是,转换为小写字母(使D5=1) mov[bx],al;仍保存在原位置 next:incbx jmpagain;继续循环 done:.exit0 例5.大小写 条件控制循环,利用标志退出 冒泡法 “冒泡法”是一种排序算法,不是最优
6、的算法,但它易于理解和实现 冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序 这需要一个双重循环程序结构 冒泡法的排序过程 比较遍数 序号数1234 1323216158 2851615815 3161581616 458323232 51885858585 movcx,count;CX←数组元素个数 deccx;元素个数减1为外循环次数 outlp:movdx,cx;D
7、X←内循环次数 movbx,offsetarray inlp:moval,[bx];取前一个元素 cmpal,[bx+1];与后一个元素比较 jnanext ;前一个不大于后一个元素,则不进行交换 xchgal,[bx+1];否则,进行交换 mov[bx],al next:incbx;下一对元素 decdx jnzinlp;内循环尾 loopoutlp;外循环尾 计数控制双