循环程序的设计_第1页
循环程序的设计_第2页
循环程序的设计_第3页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、循环程序的设计循环程序可以有两种结构形式,如图所示。一种是DO_WHILE结构形式;另一种是DO_UNTIL结构形式。例 51设内存BUFF开始的单元中依次存放着30个 8 位无符号数,求它们的和并放在SUM单元中,试编写程序。分析:这是一个求累加的程序。程序如下:MOVSI, BUFF;设地址指针MOVCX,30;设计数初值XORAX ,AX;设累加器初值AGAIN : ADDAL , SIADCAH ,0INCSIDECCXJNZAGAIN;循环累加MOVSUM , AX例 5 2 在给定个数的 16 位数串中,找出大于零、等于零和小于零的个数,并紧跟着原串存放。分析:这是一个统计问题,须

2、设定三个计数器分别统计三种情况下的结果。程序如下:DATASEGMENTBUFFDWX1 , X2 , X3 , XnCOUNTEQU$-BUFF;此时, COUNT的值为 BUFF 所占的字节数PLUSEDB?ZERODB?MINUSDB?DATAENDSCODESEGMENTASSUMECS:CODE , DS: DATAASSUMEES:DATA, SS: STACKBEGIN:MOVAX, DATAMOVDS, AXMOVCX , COUNTSHRCX,1;相当于除 2,正好为 BUFF 中的数据个数MOVDX ,0;设定计数器初值MOVAX ,0;设定计数器初值LEABX , BUF

3、FAGAIN:CMPWORDPTRBX, 0JAEPLU;大于等于0,则转PIUINCAH;0,则统计JMPNEXTZER :INCDH; 0,则统计NEXT :INCBXINCBXLOOPAGAINMOVPLUS , DLMOVZERO, DHMOVMINUS , AHMOVAX , 4C00HINT21HCODEENDSENDBEGIN例 53在 ADDR 单元中存放着16 位数 Y 的地址, 试编写一程序,把Y 中 1 的个数存入 COUNT 单元中。分析:这是一个循环统计的工作。采用DO WHILE结构,做 16 次循环,每次将最高位移入CF 中进行测试,先判断结果是否为0,若为0,则

4、结束;否则统计计数后循环重复。程序如下:DATASEGMENTADDRDWNUMBERNUMBERDWYCOUNTDW?DATAENDSPROGRAMSEGMENTMAINPROCFARASSUMECS:PROGRAM , DS: DATASTART :PUSHDSMOVAX ,0PUSHAXMOVAX , DATAMOVDS, AXMOVCX,0;计数器初值 0MOVBX , ADDRMOVAX , BX;取Y送AXREPEAT:TESTAX , 0FFFFH;检测是否为全0JZEXITJNSSHIFTINCCXSHIFT :SHLJMPREPEATEXIT :MOVRET;是,则转EXIT

5、;最高位是 0,则转 SHIFT;最高位是1,则统计计数AX , 1;处理下一位COUNT , CXMAINENDPPROGRAMENDSENDSTART在实际应用中,有些问题较复杂,一重循环不够,必须使用多重循环实现,这些循环是一层套一层的,通常称为循环嵌套。例 54在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100 个无符号16 位数,现要编写程序将这100个字数据从大到小排序。分析:排序的方法有很多,在这里,我们采用冒泡法。程序如下:LEADI ,BUFFER;DI 作为指针,指向要排序的数据MOVBL ,99;循环控制初值NEXT0 : MOVSI, DIMOVCL,BLN

6、EXT3 : MOVAX , SI;取一个数ADDSI,2CMPAX , SI;与下一个数进行比较JNCNEXT5;大于等于时转移MOVDX , SI;否则,两数交换MOVSI-2 , DXMOVSI, AXNEXT5:DECCL;控制进行交换的次数JNZNEXT3DECJNZBLNEXT0;修改交换的次数HLT例 55 试编制一个程序,把 BX 寄存器中的二进制数以十六进制的形式显示在屏幕上。解析:根据题目要求应将BX 中的内容从左到右每4 位一组显示出来,共显示4 个十六进制数位。如果显示的数位是 09,则把 4 位二进制数加上30H,转换成相应的ASCII码 30H39H ;如果是 AF

7、 ,则应加上 37H ( 30H+7 ),转换成 ASCII 码 41H46H 。显示字符可以使用DOS 功能调用来实现。下图是程序框图。以 binihex asm 为文件名,建立源程序如下:; binihex Asmprognamsegment;定义代码段mainprocfarassumecs:prognamstart:;程序从此处开始执行; 为正常返回 DOS 而设置堆栈pushdssubax,axpushax; 下面是程序的主要部分movch,4;4 组二进制数rotate:movcl,4;每组 4 个二进制位rolbx,cl;把 bx 循环左移4 位moval,bl;暂存 bl 到 a

8、l 中andal,0fh;仅保留 al 的低 4位addal,30h;转换成 ASCII 码cmpal,3ah;要显示的数大于9?jlprintit;如果数在0 9之间则显示addal,7h;数在 A F 之间则调整printit:movdl,al;把要显示字符的 ASCII 码送 dlmovah,2; 功能号 2 送 ahint21h;DOS 功能调用decch; (ch)-1jnzrotate;4 组都处理完?否,循环处理下一组ret;返回 DOSmainendp;主程序 main 结束prognamends;代码段结束endstart;结束汇编例 5 6 从键盘接收十进制数并存入 BX

9、prognam segmentmain proc farassume cs:prognamstart:pushdssubax,axpushaxmovbx,0newchar:movah,1;键盘输入int21hsubal,30hjlexit;9 退出cbw例 5 7从键盘接收十六进制数并存入BXcodeassumesegmentcs:code,ds:datastart:movax,4c00hint21h;返回DOScodeendendsstart例 5 8将正数N 插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END ,其中所有数均为正数且已按递

10、增的次序排列。; 定义数据段datareasegmentxdw?array_headdw23,37,49,52,65,78,99array_enddw105ndw32datareaends; 定义代码段prognamsegmentmainprocfar;主 程 序 部 分assumecs:prognam,ds:datareastart:;程序从此处开始执行pushdssubax,axpushaxmovax,datareamovds,ax; 程序的主要部分movax,nmovarray_head-2,0ffffh;-1送array_head-2单元movsi,0compare:cmparray_

11、endsi,axjleinsertmovbx,array_endsimovarray_endsi+2,bxsubsi,2jmpshort compareinsert:movarray_endsi+2,axretmainendp; 主程序 main 结束prognam endsendstart例 5.9设有数组 X (, ,) 和Y ( , ,),编程计算数组Z ( , ,),其中:; 定义数据段datareasegmentxdwx1,x2,x3,x4,x5,x6 x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,

12、z7,z8,z9,z10logic_ruledw00dchdatareaends; 定义代码段prognamsegmentmainprocfarassumecs:prognam,ds:datareastart:pushdssubax,axpushaxmovax,datareamovds,axmovbx,0movcx,10movdx,logic_rulenext:movax,xbxshrdx, 1jcsubtractaddax,ybxjmpshortresultsubtract:subax,ybxresult:movzbx, axaddbx,2loopnextretmainendpprognam

13、endsendstart这种设置逻辑尺的方法是很常用的。例如,在矩阵运算中,为了跳过操作数为0 的计算, 经常采用这种方法。又如,把一组数据存入存储器时,如果其中数值为 0 的元素很多,也可用这种方法设立一个每位表示一个下标的逻辑尺(这样的逻辑尺可能占有几个字,由数组的长度确定。 ), 0 元素就可不占有存储单元了。每个标志只占一位,如果要表示的特征数更多,则每个标志可占有几位,而在处理方法上是完全相同的。设立标志位的方法除了如逻辑尺那样可静态地预置外,还可以在程序中动态地修改标志位的值,以达到控制的目的,下例将说明这种方法。例 5 10 试编制一程序:从键盘输入一行字符,要求第一个键入的字符

14、必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入) ,直到接收到第二个空格符时退出程序。这一程序要求接收的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。为此,设立作为标志的存储单元FLAG 。一开始将其置为0,接收第一个字符后可将其置1。整个程序的框图如图所示。;定义数据段datareasegmentbufferdb80dup(?)flagdb?datareaends;定义代码段prognamsegmentmainprocfarassumecs:prognam,ds:datareastart:

15、pushdssubax,axpushaxmovax,datareamovds,axleabx,buffermovflag,0next:movah,01int21htestflag,01hjnz/jnefollowcmpal,20hjnz/jneexitmovflag,1jmpnextfollow:cmpal,20hjz/jeexitmovbx,alincbxjmpnextexit:retmainendpprognamendsendstart例 511 有一个首地址为 A 的 N 字数组,请编制程序使该数组中的数按照从小到大的次序整序。解析:这里采用起泡排序算法实现数组整序。从第一个数开始依次对相邻两个数 Ki 和 Ki+1 进行比较,若 Ki Ki+1,Ki的位置不动,Ki+1继续和Ki+2比较;若Ki Ki+1,则两者交换位置,Ki+1(交换前的Ki )继续和Ki+2比较。(气泡算法,多重循环)32,85,16,15,8; 定义数据段dsegsegmentnequ5;数组中数的个数adwndup(?)dsegends; 定义代码段csegsegmentmainprocfarassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovcx,ndeccx;设置 co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论