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

下载本文档

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

文档简介

1、第六章循环编程,问题:如何用第一季度结构构造循环?2循环命令有什么?3字符串处理操作是否循环?4.多周期的特征是什么?5.如何实现排序?在本章中,循环的概念循环命令字符串处理多循环、6.1循环的概念、装配语言中,进程的循环可以用分支传输命令实现,也可以使用8086命令系统中提供的特殊循环命令使进程清晰、容易。除了循环命令外,还有很多地方使用循环概念。例如,字符串处理要求在字符串中循环显示字符。有6.1.1循环结构,循环结构两种形式。一个是DOWHILE结构,另一个是DOUNTIL结构。循环程序由三部分组成。l表示循环的初始状态设置l循环l循环控制部分,6.1.1循环程序示例,示例6-1在第5行

2、16列中将颜色字符串显示为写图形内存。用循环指示实现。运行结果:设计思路:(1)将行号保存为DH,将列编号保存为DL;(2)BL存储文字特性,第一个文字的特性为4,红色。变更其他文字属性1;(3)文字位置计算公式:行号*160列号;(4)使用LOOP指令将丰富多彩的字符串循环写入图形内存。程序如下:6-1.asm在第5行16列中将丰富多彩的字符串显示为写图形内存。Datasegmenta1dbHelloworld!a2 db 0 dataendscodesegmentsumecs : code,ds : data start : movdh,5;行movdl,16;雷莫伏尔,4;属性movax

3、、datamovds、axmovsi、0、show _ str: movax、0b 800h视频内存第一个地址moves、axmovax、160muldh行号*160movdi、ax;起始行位置saldl、1movdh、0adddi、dx;列号movcx、a2-a1;字符串长度let1:moval,si;图形内存moves :di、almovbytepres :di 1、blindcsiincbladddi、2;创建完成后,显示looplet1。循环命令,movah,4chint 21 hcodeendsendstart,6.2循环命令,格式:LOOPo执行的操作:(CX)=(CX)-1,对于

4、CX0,转至标签OPR,执行循环时CX=说明:目标操作数OPR是具有位于LOOP指令前面的指令的标签。6.2.1LOOP循环命令,查找示例1 X=1 2 3 10的累积值。MOVAL、0MOVBL、1MOVCX、10SS1:ADDAL、BLINCBLLOOPSS1MOVX、AL、6 . 2 . 2 loop BZ/loose;格式:LOOPZ/LOOPZ当CX=0或ZF=0时,执行loop的以下命令:说明:结果为0或相等循环。如果上一个命令的结果等于0或等于0,则循环将在循环运行时提前结束,即使计数CX没有减少到0,也是如此。STRING db * * * * * p * * * movcx,

5、10MOVBX,-1MOVAL,0SS3:INCBXCMPSTRINGBX,* loops 3 movy,BX、movbx、-1 movcx、ms S4: incbxmovAL、ALPHABXTESTAL、20HLOOPZSS4MOVDL、AL,示例2将字符串alpha的第一个小写字母放入DL中。格式:LOOPNZ/LOOPNEOPR执行的操作:(CX)=(CX)-1,如果为CX0,则ZF=0将跳到标签OPR。当CX=0或ZF=1时,执行LOOP的以下命令:6.2.3 loopbnz/loone,说明:结果非零或不相等的循环。如果上一命令的结果不等于0或不等于,循环继续,则如果计数CX等于0,

6、即使计数CX没有减少到0,循环也会提前终止。MOVBX、0MOVAH、1ss 5: int21 hmovSYMBOLbx、ALINCBXCMPAL、0 dhloopsness 5 movax、0,1在symbol数组中循环显示字符,并在输入回车时退出、MOVBX、-1MOVCX、MSS6:INCBXCMPSYMBOLBX、ALOOPNESS6ORSYMBOLBX、20H、示例2在长度为m的字符串SYMBOL中查找大写a,找到后将其替换为小写。练习:创建1计算Y=5!的程序段。2创建程序段。在CATT表格中寻找文字后,将其储存在SIGN储存格中,并将位置值储存在ADDI储存格中。3创建程序段。从

7、长度为n的单词数组VALUE中删除第一个负数,并将其存储在AX中。6.3字符串处理,在汇编语言中,可以将连续n个存储设备称为字符串、表、数组等。对这些数据结构的操作称为字符串处理。操作字符串需要一些参数,例如字符串的长度、字符串的起始单位地址等。字符串操作大部分是循环的,循环控制方法、字符串访问方法等不同于其他数据操作。6.3.1字符串概念,6.3.2字符串处理示例,设计思路:(1)分别定义数据段和附加段。(2)源字符串STRG1的偏移地址为SI,目标字符串STRG2的偏移地址由DI保留,传输数由CLARiiON表示。(3)使用CLD命令清除DF 0的方向标记,以从较低的地址单位开始获取数字,

8、依次增加地址,然后删除一个。(4)使用REPMOVSB命令实现串行传输。示例6-2将数据段中的字符串STRG1传递给其他段的STRG2。程序如下:6-2.asm字符串传输dataegment seg 1 db 1234567890 dataendsextraegmentsegmentsegg 2 db 10 dup(?)extrendscodesegmentsumes : code,ds :数据,es : extra start : movax,datamovds,axmovax,extra moves显示方向qing0 movcx,10 rep movsbCX次,movah,4chint 2

9、1 hcodeendsendstart,运行结果:使用DEBUG运行6-2.exe以观察运行结果。在DEBUG中使用u命令查看,找到断点0018,运行G0018,然后使用DES:0命令查看传播结果。此时,数据段的段地址为0B45H,其他段的段地址为0B46H。查询结果位于其他线段上。思考:如果使用round robin命令实现字符串传输,程序将如何替换?6.3.3字符串处理指令、8086程序集语言指令系统中有5个字符串处理指令可用。范例:movs (movs)字串传输comparestring(CMPS)字串比较SCAS(scanstring)字串扫描load string(LODS)字串汇入

10、storestring范例比较两个字串BUNCH1和BUNCH2相同,但不是相同的列印y,相同的列印n。示例6-3比较两个字符串BUNCH1和BUNCH2为相同,相同打印y,不相同打印n .过程如下:6-3.asm两个字符串比较BUNCH1和bunch 2 datasegment bunch 1 dbstudentbunch 2 dbstudentdatdataendscodescendscomentsumecs 3360 code,ds : das同转1 movdl,n;不等于、Njmpprint、let1:movdl、Y;显示了Y print : movah、2 hint 21 HMO v

11、ah、4 chint 21 hcodeendsendstart、6.3.4字符串和循环以及摘要循环结构的几种形式。(1)使用条件传输命令进行循环(2)循环命令循环/循环/循环ne (3)迭代前缀REP/REPE/REPNE、在实际编程中实现循环的命令、循环执行条件和结束循环要求等综合考虑。以下是通过几个例子进行的具体分析。示例1将alpha数组发送到100个a。(1)环路MOVCX,100movs,0ss0: movalphasi,aincsidescxjns0,(2)环路MOVCX,100movs,0s s0:moval phass 0,6.4多环,1。内外循环的控制双环需要两个环控制变量I

12、,j。如果多个回路重叠,则不允许内部和外部回路相交。6.4.1多回路结构、2内部和外部回路的跳跃在编写多回路程序期间必须注意回路内条件切换命令的切换方向。通常,可以从内部循环跳至外部循环,也可以从外部循环跳至外部循环。不允许从外部循环直接跳到内部循环,或从循环外部直接跳到循环内部。6.4.2排序程序,双环程序的典型应用程序是排序。使用冒泡算法。冒泡算法的主要思想是从第一个元素开始,依次比较两个相邻的元素,如果第一个元素大于第二个元素,则两个数字交换位置,第一个通路N-1比较后最大的数字排在最后;比较第二个N-2次,比较第二个大数字。这样,最多进行N-1次比较,所有数字都从较小到较大按升序排序。

13、,设计理念:(1)在使用两个LOOP指令实现双回路的情况下,CX寄存器中存在冲突。使用PUSHCX命令将外部循环的CX值保存为堆栈,在内部循环的LOOP结束后恢复外部循环的CX。(2)通过相对寄存器寻址消除两个数字进行比较。示例6-5按升序对单词数组PART排序。程序如下:6-5.asm按升序排列单词数组part。Datasegmentpartdw15、32、6、-27或8sign dw?dataendscodesegmentsumecs : code、ds: data start : movax、datamovds、axmovcx、sign-part;阵列长度shrcx,1;元素数deccx

14、,loop1:pushcx外部环路数movbx、0 loop 23360 movax、partbxcmpax、partbx2 jlenext升序xchgax、part bx 2;交换movpartbx、ax next : addbx、2 loop 2popcx恢复外循环计数loop loop 1 movah,4 chint 21 hcodeendsendstart,练习:数组TABLE包含8个小写computer。编制程序,按降序排序。6.5循环程序示例:x=54881143325634h,Y=3499754783645231H,Z=8921868BB686A865H设计思路:(1)在数据段中

15、定义两个多字节变量,低字节单位存储(2)字节数n使用EQU分配伪命令计算。(3)进位加指令ADC与一起添加多字节;示例6-6编解码器将2个多字节的数量相加。Z=X Y,程序如下:Program6-6.asm将两个多字节数相加后,datasegmentxdb34h、56h、22h、33h、44h、11h、88h、54hyd31 h、52h、64h、8333n,字节数zdbndup(?)dataendscodesegmentsumecs : code,ds: data,start : movax,datamovds,axmovcx,NMO vbx,0clc舍入标志CF清晰0 let 1: mova

16、l,xx;从子开始adcal、ybxmovzbx、alicbxlooplet 1 movah、4 chint 21 hcodeendsendstart,运行结果:第7个前8字节单元的x,第8个f 8个单元的y,10H 17H、6.6实例6循环、循环命令和传输命令都更改程序路径,因此,如果程序中有错误的编写想法,则不容易找到错误的原因。最简单的方法是使用DEBUG工具和记事本直接打开源程序并调试边缘修改。执行6.6.1循环,(1)将程序重新部署到DEBUG,使用u命令反汇编,显示机器命令及其组件命令(2)首先使用g命令在断点上执行,使用DDS:0命令检查数据段情况(3)一次调试t命令并观察结果(

17、4)两个(2)内部和外部循环使用LOOP指令将外部循环数CX存储为堆栈,并在从外部循环进入内部循环时恢复内部循环的米值CX;(3)将存储在一维矩阵MAX中的数据与a矩阵中的数据进行比较,将较大的数字放在MAX中后继续与其他数字进行比较。示例6-10查找每个34矩阵a行的最大值,并将其放入MAX矩阵中。6-10。asmdataegmentdb2、-4、-5,10db3,6、-7、-12db14、-5,9、-3md 33;3行ndw44列max db 3d up(0)dataendscodesegmentsumecs 3360代码,ds: data start : movax,datamovds,axmovcx,m;共3次movbx、0movsi、0、过程如下:rept 2330pushcxmovcx,n rept 1: moval,abx每行最大CMP al,maxsijlelt2 movmaxsi,al,最大值为maxlet 23360 incbxlooprep

温馨提示

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

评论

0/150

提交评论