IBM-PC汇编语言程序设计5._第1页
IBM-PC汇编语言程序设计5._第2页
IBM-PC汇编语言程序设计5._第3页
IBM-PC汇编语言程序设计5._第4页
IBM-PC汇编语言程序设计5._第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第五章循环与分支程序设计,5.1循环程序设计5.2分支程序设计5.3如何在实模式下发挥80386及其后继机型的优势,1.编写汇编语言程序步骤l分析实际问题,确定解决问题的算法l按算法画出程序流程图l按流程图编写程序l上机调试,运行程序,注:本教材所讨论的编程环境只限于在DOS操作系统下的实模式,2.判断程序质量的标准程序的正确性程序的可读性程序的执行时间程序所占内存大小,3几种程序结构顺序结构循环结构分支结构子程序结构,顺序结构形式,循环结构形式,当型循环(当条件成立进入循环),直到型循环(直到条件成立退出循环),分支结构形式,Y,Y,N,N,分支结构形式,1多处调用完成同一功能的子程:codeSEGMENTstart:、CALLsubp、CALLsubp、CALLsubp、MOVAH,4CHINT21HsubpPROC、RETsubpENDPcodeENDSENDstart,2模块化程序设计:codeSEGMENTbegin:CALLsub1CALLsub2CALLsub3MOVAH,4CHINT21Hsub1PROC、RETsub1ENDPsub2PROC、RETsub2ENDPsub3PROC、RETsub3ENDPcodeENDSENDbegin,子程结构形式,注意返回DOS语句位置,5.1.1循环程序的结构形式,5.1循环程序设计,(1)DO-WHILE结构(2)DO-UNTIL结构,有关字符、数码转换的处理1.计算机处理字符时,常用的字符编码是ASCII码。2.数字和字母的ASCII码是一个有序序列数字09:30H39H大写字母AZ:41H5AH小写字母az:61H7AH,5.1.2循环程序设计方法,例5.1将寄存器BX中的内容以十六进制形式显示出来。,BX是一个16位寄存器二进制1010100100111110,用十六进显示时,每4位用一个字符显示,共4个其中:0000030H,1010A41H0001131H,1011B42H、1001939H,1111F46H,十六进制A93E,屏幕上的显示A93E,对应的ASCII41H39H33H45H,算法:取出要显示的某4位,转换为对应的ASCII码,再调用DOS系统功能进行显示。,(1)对于00001001(09),先扩展成一个字节,高4位清0,加上30H后,即可得字符09对应的ASCII码。00000001B+30H=31H00001001B+30H=39H0001B11001B9,(2)对于10101111(AF),先扩展成一个字节,高4位清0,加上30H后,还要再加上07H,才能得到AF对应的ASCII码00001010B+30H+07H=41H00001111B+30H+07H=46H1010BA1111BF,codeSEGMENTASSUMECS:codestart:MOVCH,4;字符个数rotate:MOVCL,4;循环移位次数ROLBX,CL;取显示位的值MOVAL,BL;保存在AL中ANDAL,0FH;清除高4位ADDAL,30H;转变为数字的ASCIICMPAL,3aH;大于3aH,则应转变JLprint;为数字09的ASCIIADDAL,07H;为字母AF的ASCIIprint:MOVDL,AL;送ASCII字符到DLMOVAH,2;显示DL中的字符INT21HDECCH;显示结束?JNZnextMOVAH,4CH;返回DOSINT21HcodeENDSENDstart,例5.2在ADDR单元中存放着数,度编制一程序把中1的个数存入COUNT单元中。,datareasegmentaddredw1234hcountdw?datareaends,movcx,0movbx,addremovax,bxagain:testax,0ffffhjzexitjnsshiftinccxshift:shlax,1jmpagainexit:movcount,cxret,例5.4将正数n插入一个已整序的字数组的正确位置。xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32movax,nmovarray_head-2,0ffffhmovsi,0compare:cmparray_endsi,axjleinsertmovbx,array_endsimovarray_endsi+2,bxsubsi,2jmpshortcompareinsert:movarray_endsi+2,ax,例5.5i=Xi+Yi,LOGIC_RULEDW00DCHMOVBX,0MOVCX,10MOVDX,LOGIC_RULENEXT:MOVAX,XBXSHRDX,1JCSUBTRACTADDAX,YBXJMPSHORTRESULTSUBTRACT:SUBAX,YBXRESULT:MOVZBX,AXADDBX,2LOOPNEXTRET,例5.6键入一行以空格开头以空格结束的字符串,datareasegmentbufferdb80dup(?)flagdb?datareaends,leabx,buffermovflag,0next:movah,01;读键盘int21h;所读内容放入altestflag,01h;flag=1?jnzfollow;flag=0,zf=1不转cmpal,20h;al是空格?,jnzexit;不是,zf=0退出movflag,1;置标志flag=1jmpnextfollow:cmpal,20h;al是空格?jzexit;是,zf=1,退出movbx,al;不是,保存incbx;数组索引加1jmpnextexit:,20,a,b,c,d,e,f,20,flag=01jzexit成立,5.1.3多重循环程序设计,基本方法与单重循环相同,但要注意:1、分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆2、每次从外层循环再次进入内层循环时,初始条件要重新设置,例5.7将首地址为a的字数组从大到小排序(气泡算法,多重循环)adw100,30,78,99,15,-1,66,54,189,256movcx,10;待排序数的个数deccx;外循环的次数loop1:movdi,cx;暂存外循环次数movbx,0;数组下标loop2:movax,abx;取第bx个数cmpax,abx+2;与后一个数比较jgecontinue;bx=bx+2xchgax,abx+2;=,转移,不换xchges:di+2,axmoves:di,axsubbx,bx;排序标志cont:loopnextcmpbx,0;bx=1,已排好jeinitsorted:movdi,start_addr,练习5.11:从键盘输入一系列以$结束的字符串,统计数字字符的个数,datasegmentcountdw0buffdb50dup(?)dataendsprognamsegmentmainprocfarassumecs:prognamstart:pushdssubax,axpushaxmovax,datamovds,axleabx,buff;取缓冲地址input:movah,01;从键盘读串int21H;存入al中movbx,al;保存字符,incbx;buff数组下标cmpal,$;是不是$jnzinput;是,结束读leabx,buff;取串地址movax,0next:movcl,bx;取串中字符incbx;指向下一字符cmpcl,$;是不是$jzdisp;是,zf=1,转移cmpcl,30h;与0比较jbcont;9,不计数incax;计数cont:jmpnextdisp:retmainendpprognamendsendstart,练习5.11:测试一字符串是否存在数字,若存在,置CL第5位置1,否则置0,datasegmentstringdbabcqdefghijklmnopqrsdataendsprognamsegmentmainprocfarassumecs:prognam,ds:data,es:datastart:pushdssubax,axpushaxmovax,datamovds,axmoves,ax,begin:movcx,20;字符个数movsi,0;数组下标again:moval,stringsicmpal,30h;与0比较jbgoon;,转移orcl,20h;有数字,置5位jmpexitgoon:incsi;数组下标加1loopagainandcl,0dfh;无数字,清5位exit:retmainendpprognamendsendstart,循环程序设计小结1、循环控制条件的选择:a.循环次数已知,采用LOOPb.循环次数已知,但有可能使用其他特征或条件结束循环,可采用LOOPZ和LOOPNZc.循环次数未知,具体问题具体分析2、设立条件标志位的方法,5.2分支程序设计,5.2.1分支程序的结构形式,双分支与多分支的共同特点:运行方向是向前的在某一种特定条件下,只能执行其中的一个分支,5.2.1分支程序设计方法,1、使用CMP、TEST等运算型指令+条件转移指令2、使用逻辑尺的方法3、使用跳跃表法实现CASE结构,例5.9折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,dsegsegmentlow_idxdw?high_idxdw?listdw12,11,22,33,44,55,66,77,88,99,111,222,333targetdw77dsegendscsegsegmentmainprocfarassumecs:cseg,ds:dseg,es:dsegstart:pushdssubax,axpushaxmovax,dsegmovds,axmoves,ax,例5.9折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,movax,target;leadi,list;取数组首地址cmpax,es:di+2;取第1个数jachk_last;第1个,检查最后1个leasi,es:di+2;,调节搜索头deccx;=movhigh_idx,cx;调节搜索末jmpmidhighter:inccxmovlow_idx,cx;调节搜索头jmpmidno_match:stcexit:ret,例5.9折半查找:附加段有一个有序字数组,首字表示数组长度,AX是待查字,若找到CF=0,否则CF=1,例5.10根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去。,branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine8,注意:DW标号的使用,寄存器间接寻址,cmpal,0jecontinueleabx,branch_tableL:shral,1;逻辑右移,最低位进入CF位jnbnot_yet;jnb=jnc,CF=0,转移jmpwordptrbx;段内间接转移not_yet:addbx,typebranch_tablejmpLcontinue:routine1:routine2:,调试源程序,变址寻址方式实现,cmpal,0jecontinuemovsi,0L:shral,1;逻辑右移,最低位进入CF位jnbnot_yet;jnb=jnc,CF=0,转移jmpbranch_tablesi;段内间接转移not_yet:addsi,typebranch_tablejmpLcontinue:routine1:routine2:,调试源程序,基址变址寻址,cmpal,0jecontinueleabx,branch_tablemovsi,7*typebranch_tablemovcx,8L:shlal,1;逻辑左移,最高位进入CF位jnbnot_yet;jnb=jnc,CF=0,转移jmpwordptrbxsi;段内间接转移not_yet:subsi,typebranch_tableloopLcontinue:routine1:routine2:,调试源程序,习题5.21试写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:(1)如果三个数都不相等,则显示0(2)如果有两个相等则显示1(3)如果都相等,则显示2,dsegsegmentarraydw3dup(?)dsegendscsegsegmentmovcx,3leasi,arraybegin:pushcxmovcl,4movdi,4movdl,movah,02int21h,input:movah,01hint21handal,0fhshldx,clordl,aldecdijneinputmovsi,dxaddsi,2popcxloopbegin,compa:leasi,arraymovdx,0movax,simovbx,si+2cmpax,bxjnenext1incdxnext1:cmpsi+4,axjnenext2incdxnext2:cmpsi+4,bxjnenumincdx,num:cmpdx,3jldispdecdxdisp:movah,2adddl,30hint21hmainendpcsegendsendstart,习题5.23已定义整型变量、(1)若只有一个奇数,奇数存入,偶数存入(2)若两个奇数,A=A+1B=B+1(3)若两个偶数,A、值不变,begin:movax,amovbx,bxorax,bxtestax,1hjzclass;同奇同偶,转移textbx,1hjzexit,xchgbx,amovb,bxjmpe

温馨提示

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

评论

0/150

提交评论