




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本教案内容,第4章汇编语言程序设计汇编语言程序设计基础源程序的汇编、连接与调试分支程序设计技术循环程序设计技术子程序设计技术综合程序设计示例,循环结构程序设计针对的是处理一些重复进行的过程的操作。采用循环结构设计的程序,其长度缩短了,不仅节省了内存,也使得程序的可读性大大提高。使用循环结构形式设计程序时,通常将循环程序划分三个部分:,循环结构程序设计,4.4循环程序设计技术,循环的初始化部分:主要为循环所需的变量赋初值。循环体:程序所要完成的主要工作部分,这一部分的内容是由所要处理的问题来确定的,这一部分的执行结果可能影响到循环是否继续进行。循环控制部分:这一部分主要是以条件表达式的结果作为是否结束循环的条件。在事先知道了循环次数的情况下,可采用循环计数控制循环的结束;在事先不知道循环次数的情况下,多采用结果及给定特征作为条件来控制循环的结束。图4-3可以帮助我们很好地理解循环结构程序。,循环结构程序设计,4.4循环程序设计技术,图4-3循环程序结构(a)单循环结构;(b)双循环结构,单循环结构,下面举一个例子说明单循环结构程序设计的方法。假设从BUF单元开始为一个ASCII码字符串,找出其中的最大数送屏幕显示。程序流程图如图所示。,程序如下:DATASEGMENTBUFDBABCREF873COUNTEQU$-BUF;统计串长度MAXDBMAX,0DH,0AH,$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AX,MOVAL,0;无符号最小数0ALLEABX,BUF;串首址偏移量BXMOVCX,COUNT;串长度CXLAST:CMPBX,AL;比较JCNEXTMOVAL,BX;大数ALNEXT:INCBXLOOPLAST;循环计数,MOVMAX+4,AL;最大数MAX+4单元MOVAH,9MOVDX,OFFSETMAXINT21H;显示结果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG,在上述程序中,ASCII应看成无符号数,无符号数的最小值为0,因此,在进行第一次比较时,把0送AL寄存器,各个数都和AL比较,每次比较后的较大的数放入AL寄存器中,N个数需要比较N次,若把第一个数送AL作为初始比较对象,那么N个数需要比较N-1次。,4.4循环程序设计技术,对一组数据的操作可以采用循环结构来实现,其数据个数为循环次数。每次循环时要不断地修改指针,而且经常会出现同时使用多个指针地情况。指针的正确使用是关系到程序设计好坏的重要因素可直接采用的指针有4个:SI、DI、BX、BP默认段寄存器为:DSSS当程序中只需要一个指针时,可以使用SI、DI和BX中的任意一个;当程序需要两个指针时,一般会要求程序从源操作数中取出要处理的数据,处理结果存放在另一个目的存储区域中,这样可以将SI指向源操作数区域,DI指向目的操作数区域;当程序需要3个指针时,可以将BX用作为第三个指针;,4.4循环程序设计技术,当需要4个以上的指针时,应该仔细分析数据区域的操作特点,找出可以采用同一个指针处理的多个区域。指针的应用方式有两种:(1)指针表示绝对地址:将指针指向存储单元的段内偏移地址,例如:LEASI,BUFFERMOVAX,SI这样,指针SI的值表示缓冲区BUFFER的偏移地址,通过SI可以进行存储单元的访问。(2)指针表示相对地址:将指针清零,表示指向存储区域内的相对偏移地址,例如:XORSI,SIMOVAX,BUFFERSI,4.4循环程序设计技术,这样,指针SI就不是BUFFER所专用,而是可以同时供其它存储区域使用,例如可以通过:MOVBX,SOURCESI访问另一个存储区域SOURCE。例44在SOURCE存储区中保存有500个字节数据,现在要求将数据中的0FFH值去掉,并传送到DESTINATION缓冲区中,其有效数据个数保存在NUMBER中。解:将SI指向源操作数区域,DI指向目的操作数区域,每次传送一个字节,但在传送前对其内容进行检测,如果为0FFH,则不传送。在传送的同时要使有效数据个数的计数单元NUMBER进行加1。汇编语言程序如下:,4.4循环程序设计技术,N=500STACKSEGMENTSTACKSTACKDW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTSOURCELABELBYTE;假设有500个数据,并利用重复X=17;宏随机产生REPT500X=(X+97)mod256DBXENDMDESTINATIONDBNDUP(?)NUMBERDW?DATAENDS,4.4循环程序设计技术,CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPXORAX,AX;用户编写的程序MOVNUMBER,AXMOVCX,NLEASI,SOURCELEADI,DESTINATION,4.4循环程序设计技术,MOVE1:MOVAL,SIINCSICMPAL,0FFHJZMOVE2MOVDI,ALINCDIINCNUMBERMOVE2:LOOPMOVE1MOVE_END:MOVAH,4CH;返回DOS操作系统INT21HCODEENDSENDSTART,双循环结构-冒泡排序,根据循环程序的嵌套层数不同,可以将循环程序的结构分成单循环、双循环和多重循环。上面介绍的例子是单循环的结构,下面举例说明如何进行双重循环的程序设计假设需要对无序表中的元素排序,冒泡排序是最常用的一种方法。,设从地址ARRAY开始的内存缓冲区中有一个字数组,要使该数据表中的N个元素按照从大到小的次序排列,用冒泡算法显示的过程叙述如下:从第一个数开始依次进行相邻两个数的比较,即第一个数与第二个数比较,第二个数与第三个数比较,比较时若两个数的次序符合排序要求,则不做任何操作;若次序不对,就交换这两个数的位置。经过这样一遍全表扫描比较后,最大的数放到了表中第N个元素的位置上。在第一遍扫描中进行N-1次比较。用同样的方法再进行第二次扫描,这时只需考虑N-1个数之间的N-2次比较,扫描完毕,最大的数放到了表中第N-1个元素的位置上依此类推,在进行了N-1遍的扫描比较后将完成排序。,下面是对有7个元素的次序表进行冒泡排序的过程。表的初始状态:43366595811225第一遍扫描比较之后:36436581122595第二遍扫描比较之后:36436512258195第三遍扫描比较之后:36431225658195第四遍扫描比较之后:36122543658195第五遍扫描比较之后:12253643658195第六遍扫描比较之后:12253643658195,4.4循环程序设计技术,冒泡法最大可能的扫描遍数为N-1。但是,往往有的数据表在第1遍(1N-1)扫描后可能已经成序。为了避免后面不必要的扫描比较,可在程序中引入一个交换标志若在某一遍扫描比较中,一次交换也未发生,则表示数据已按序排列,在这遍扫描结束时,就停止程序循环,结束排序过程。,4.4循环程序设计技术,程序如下:DATASEGMENTARRAYDWd1,d2,d3,.,dnCOUNTEQU(-ARRAY)2;数据个数FLAGDB-1;交换标志,初值为-1DATAENDSSTACKSEGMENTPARASTACKSTACKDB1024DUP(?)STACKENDSCODESEGMENT,SORT:MOVAX,DATAMOVDS,AXMOVBX,COUNTLP1:CMPFLAG,0;数组已有序?JEEXIT;是,排序结束DECBX;否,置本遍扫描比较次数MOVCX,BXMOVSI,0;置数组的偏移地址MOVFLAG,0;预置交换标志为0,4.4循环程序设计技术,LP2:MOVAX,ARRAYSI;取一个数据AXCMPAX,ARRAYSI2;与下一个数比较JLENEXT;后一个数大,转NEXTXCHGAX,ARRAYSI+2;逆序,交换两个数MOVARRAYSI,AXMOVFLAG,-1;置交换标志为-1NEXT:ADDSI,2;修改地址指针,4.4循环程序设计技术,LOOPLP2;循环进行两两数据的比较JMPLP1;内循环结束,继续下一轮排序EXIT:MOVAH,4CH;排序完成,返回DOSINT21HCODEENDSENDSORT,4.4循环程序设计技术,4.4循环程序设计技术,例45在缓冲区DATABUF中保存有一组无符号数据(8位),其数据个数存放在DATABUF的第1、2个字节中,要求编写程序将数据按递增顺序排列。解:这里采用双重循环实现数据的排序,这可使程序变得简单。要对N个数据进行从小到大排序时,可以采用“冒泡法”:从后往前,每两个数据进行比较,当前者大于后者时,交换两者的次序;否则不变,这样,经过N-1次比较,可以将最小值交换到第一个单元(最轻的气泡最先冒出水面)。接着对后N-1个数据,重复上述过程,使次小值交换到第二个单元;依此类推,共进行N-1次比较过程,可以完成数据的排序操作。,4.4循环程序设计技术,由于每次比较操作都在相邻两个单元进行,因此只需要一个指针。汇编语言程序如下:N=100;设有100个数据STACKSEGMENTSTACKSTACKDW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDATABUFDWNDBNDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK,4.4循环程序设计技术,START:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOP;为了能够进行排序,DATABUF中必须已经保存数据,;因此我们产生一组随机数据MOVCX,DATABUFLEASI,DATABUF+2MOVBL,23MOVAL,11,4.4循环程序设计技术,LP:MOVSI,ALINCSIADDAL,BLLOOPLP;下面给出数据排序程序MOVCX,DATABUFDECCX;外循环次数LEASI,DATABUF2;SI指向数据区首地址ADDSI,CX;SI指向数据区末地址LP1:;外循环开始PUSHCXPUSHSI,4.4循环程序设计技术,LP2:;内循环开始,其循环次数恰好;与外循环的CX值一致MOVAL,SICMPAL,SI-1JAENOXCHGXCHGAL,SI-1;交换操作MOVSI,ALNOXCHG:DECSILOOPLP2POPSIPOPCXLOOPLP1;数据排序结束,4.4循环程序设计技术,MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART如果要求将数据从大到小排序,则只需要将交换条件指令“JAENOXCHG”改成“JBENOXCHG”;如果要排序的数据为有符号数,则只需要将交换条件指令“JAENOXCHG”改成“JGENOXCHG”。例46有一组数据(16位二进制数)存放在缓冲区BUF中,数据个数保存在BUF的前两个字节中。要求编写程序实现在缓冲区中查找某一数据(16位),如果缓冲区中没有该数据,则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的数据,则只保留第一个,将其余的删除。,4.4循环程序设计技术,解:在缓冲区BUF中搜索指定的数据,当没有找到该数据时,在最后插入该数据;当找到该数据时,则进入搜索多余的重复数据,每次找到该数据就删除它(即将缓冲区的剩余数据向前移动一个字)。当然还应该更新缓冲区的长度单元。要删除数据时,可以采用例4.4的方法,开辟另一个存储区域,并且删除后还需要将数据传送回原来的存储区域。,4.4循环程序设计技术,我们还可以巧妙的利用指针,在同一个区域中实现删除功能。在例4.4的方法中,让目的操作数指针DI也指向源操作数区域,如图4.3所示,这样,每次的写操作可以写回到原来的存储区域,一开始SI与DI指针指向同一个地址,当找到需要删除的单元时,由于只有读操作,没有写操作,使DI指针落后于SI,从而完成将后续单元的内容向前移动的操作。汇编语言程序如下:STACKSEGMENTSTACKSTACKDW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTBUFDW20;设缓冲区原有20个字,4.4循环程序设计技术,DW1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H,10A7H,0B612HDW56AAH,15ACH,5789H,56AAH,6666H,7777H,56AAH,8888H,9999H,1111HDW10DUP(?);为可能的插入操作留出空间NEWDW56AAH;指定的数据为(NEW)56AAHDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AX,4.4循环程序设计技术,MOVAX,STACKMOVSS,AXLEASP,TOP;搜索指定的数据MOVCX,BUFLEASI,BUF+2MOVAX,NEWL1:CMPAX,SIJZL2INCSIINCSILOOPL1;没有找到,则插入数据,4.4循环程序设计技术,MOVSI,AXINCBUFJMPOK;结束L2:;找到第一个数据,在剩余部分搜索并进行删除操作DECCXINCSIINCSIMOVDI,SI;DI与SI指向剩余区域的首地址L3:MOVBX,SI;读数据INCSIINCSICMPAX,BX;比较JZL4,4.4循环程序设计技术,MOVDI,BX;写数据INCDIINCDIJMPL5L4:DECBUF;更新长度计数器L5:LOOPL3OK:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART,4.4循环程序设计技术,例47在缓冲区DAT1和DAT2中,存放着两组递增有序的8位二进制无符号数,其中前两个字节保存数组的长度,要求编程实现将它们合并成一组递增有序的数组DAT,DAT的前两个字节用于保存新数组的长度。解:这里要用到3个指针,对于将数据写入数组DAT的指针首选使用DI,从DAT1和DAT2读数据的两个指针可分别采用SI和BX,并结合使用字符串指令,可以简化程序的设计。在程序设计中,将由BX指示的缓冲区DAT2中的内容读入AL,这样,当需要将DAT1的内容传送到DAT时,可直接采用MOVSB指令;当需要将DAT2的内容传送到DAT时,可直接采用STOSB指令。汇编语言程序如下:,4.4循环程序设计技术,STACKSEGMENTSTACKSTACKDW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTDAT1DW10;设DAT1中有10个数据DB10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6HDAT2DW13;设DAT2中有13个数据DB05,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEHDATDW?DB200DUP(?),4.4循环程序设计技术,DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVCX,DAT1;CX表示DAT1的数据个数MOVDX,DAT2;DX表示DAT2的数据个数MOVDAT,CX;先计算出DAT的数据个数,4.4循环程序设计技术,ADDDAT,DXLEASI,DAT1+2;SI指向DAT1的数据区LEABX,DAT2+2;BX指向DAT2的数据区LEADI,DAT+2;DI指向DAT的数据区CLDL1:MOVAL,BXINCBXL2:CMPAL,SIJBL3MOVSB;DAT1区中的一个数据传送到DAT区DECCXJZL4JMPL2,4.4循环程序设计技术,L3:STOSB;DAT2区中的一个数据传送到DAT区DECDXJZL5JMPL1L4:MOVSI,BXDECSIMOVCX,DXL5:REPMOVSB;将DAT1或DAT2中剩余部分全部传送到DAT区MOVAH,4CH;返回DOSINT21H,4.4循环程序设计技术,CODEENDSENDSTART例48已知缓冲区BUFA内有20个互不相等的整数(其序号从0到19),缓冲区BUFB内有30个互不相等的整数(其序号从0到29)。编写程序完成:将既在BUFA中出现又在BUFB中出现的整数(设为x)存放在缓冲区BUFC中,并将x在BUFA和BUFB中的序号分别存放于缓冲区BUFCA和BUFCB中。解:这里涉及到5个存储区域,最好有5个指针,但BUFC、BUFCA和BUFCB为同步操作,即当找到x时,需要同时对BUFC、BUFCA和BUFCB进行操作,而且每个区域都写入一个字节,因此它们可以采用同一个指针,寻址方式为寄存器相对寻址,即设AL为找到的值,DL、BL为序号,则其操作为:,4.4循环程序设计技术,MOVBUFCDI,ALMOVBUFCADI,DLMOVBUFCBDI,BL对序号的处理也应仔细设计,采用寄存器相对寻址时,例如MOVAL,BUFASI,其中SI即为序号。汇编语言程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年行政诉讼法行业应用考核试卷
- 区域贸易协定中的服务贸易负面清单实务考核试卷
- 制造业供应链数字化转型项目总结考核试卷
- 2025年人工智能深度学习框架(PyTorch方向)行业准入(产教融合模式)考核试卷
- 2025年农村物流体系能力考核试卷-农村农产品品牌与物流品牌协同需求
- 2025年多元化幼儿教师游戏设计与形式创新能力考核试卷
- 2025年能源安全保障标准规范岗前考核试卷
- 解析卷-人教版八年级物理上册第4章光现象专题测评试卷(含答案详解)
- 重难点解析人教版八年级物理上册第5章透镜及其应用-透镜专题训练试卷(含答案详解版)
- 难点解析人教版八年级物理上册第5章透镜及其应用-5.5显微镜和望远镜定向攻克试题(含详解)
- 行政自学考试试题及答案
- 2025年湖南邵阳武冈市城乡供水有限公司招聘5人笔试历年参考题库附带答案详解(3卷合一)
- GB/T 31971.3-2025船舶与海上技术海上环境保护:撇油器性能试验第3部分:高黏度油
- 《土木工程智能施工》课件 第3章 土方作业辅助工程-土壁支护2
- 艺人独家经纪合同(标准版)
- 福建省银行业专业人员初级职业资格考试(银行业法律法规与综合能力)试题及答案(2025年)
- 商业银行统一报表平台:设计理念、技术实现与实践成效
- 《守望成长法治护航》法制教育主题班会
- (正式版)DB1501∕T 0021-2021 《园林绿地分级养护技术规程》
- 乌鲁木齐市既有建筑改造消防设计与审查指南
- 2025小红书S+级项目《宝藏目的地》招商方案
评论
0/150
提交评论