《循环和分支程序设计书.ppt》由会员分享,可在线阅读,更多相关《循环和分支程序设计书.ppt(104页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、循环和分支程序设计书现在学习的是第1页,共104页5.1概述l5.1.1汇编语言程序设计的一般步骤l5.1.2流程图返回本章首页返回本章首页现在学习的是第2页,共104页5.1.1 汇编语言程序设计的一般步骤返回本节返回本节现在学习的是第3页,共104页汇编语言程序设计一般有以下几个步骤:(1)分析题意,确定算法;分析和理解题意,找出合理的算法及适当的数据结构;(2)根据算法画出程序流程图;(3)根据流程图编制程序;(4)上机调试程序;任何程序必须经过调试才能检查出你的设计思想是否正确,以及你的程序是否符合你的设计思想。调试时可用工具DEBUG进行调试。程序结构有:顺序、循环、分支、和子程序四
2、种数据结构。(5)运行程序;现在学习的是第4页,共104页5.1.2 流程图l1流程图的概念l流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2流程图符号表示流程图符号表示(1)起止框:表示程序的)起止框:表示程序的开始和结束。开始和结束。起止框起止框现在学习的是第5页,共104页(2)判断框(3)处理框)处理框(4)调用框)调用框 现在学习的是第6页,共104页l(5)指向线(6)连接框)连接框 返回本节返回本节现在学习的是第7页,共104页l5.2顺序程序设计顺序程序设计l下面举例说明顺序程序的设计
3、。l例5.1数组中存放若干个字节元素。将两个数组对应元素相加,运算结果存放在第三个数组相应结果单元中。本例每个数组有1个元素,每个元素占1字节长。l(1)E:MASMEDITC100.ASMlDATASEGMENTlDATA1DB1;被加数lDATA2DB5;加数lDATA3DB0;和初值lDATAENDSlCODESEGMENTlASSUMECS:CODE,DS:DATA现在学习的是第8页,共104页lSTART:MOVAX,DATAlMOVDS,AXlMOVSI,0lCLC;清进位标志;清进位标志lMOVAL,DATA1SIlADCAL,DATA2SI;字节相加;字节相加lMOVDATA3
4、SI,ALl;-输出显示部分输出显示部分-lMOVBX,OFFSETDATA3lMOVDL,BXlADDDL,30HlMOVAH,2lINT21Hl;-返回返回DOS-lMOVAX,4C00HlINT21HCODEENDSlENDSTART现在学习的是第9页,共104页l(2)E:MASMMASMC100.ASMl(3)E:MASMLINKC100l(4)E:MASMC100l6l(5)lE:MASMDEBUGC100.EXE现在学习的是第10页,共104页5.2顺序程序设计l【例5.2】试编写一程序计算以下表达式的值。l=(v-(*+-540)/xl式中x、v均为有符号字数据。l设、的值存放
5、在字变量、V中,结果存放在双字变量之中,程序的流程图如图5.1所示。返回本章首页返回本章首页现在学习的是第11页,共104页图图5 5.1 1 顺顺序序运运算算程程序序流流程程图图现在学习的是第12页,共104页l源程序如下:lDATASEGMENTlXDW200lYDW100lZDW3000lVDW10000lWDW2DUP(?)lDATAENDSlSTACKSEGMENTSTACKlDB200DUP(0)lSTACKENDSlCODESEGMENTlASSUMEDS:DATA,CS:CODE,SS:STACK现在学习的是第13页,共104页lSTART:MOVAX,DATAlMOVDS,A
6、X;DATAAXlMOVAX,XlIMULY;(;(X)*(Y)DX:AXlMOV CX,AXlMOVBX,DX;(;(DX:AX)(BX:CX)lMOVAX,ZlCWD;(;(Z)符号扩展)符号扩展lADDCX,AXlADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)lSUBCX,540lSBBBX,0;(;(BX:CX)-540(BX:CX)lMOVAX,V现在学习的是第14页,共104页lCWD;(V)符号扩展lSUB AX,CXlSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)lIDIVX;(DX:AX)/XlMOVW,AX;商WlMOVW+2,DX;余数DX
7、W+2lMOVAH,4CHlINT 21HlCODEENDS;退出DOS状态lENDSTART现在学习的是第15页,共104页5.3分支程序设计l5.3.1用条件转移指令实现程序分支l5.3.2用跳转表实现多路分支返回本章首页返回本章首页现在学习的是第16页,共104页1、分支程序的结构形式:分支程序结构可以有两种形式:一个是二路分支:IFTHENELSE形式;一个是多路分支:CASE形式;常用的语句:5.3.1 用条件转移指令实现程序分支JZ结果为零JNZ结果不为零JS/结果为负JNS结果为正JL小于JLE小于等于JG大于JGE大于等于现在学习的是第17页,共104页在某一种确定条件下,只能
8、执行多个分之中一个分支。在某一种确定条件下,只能执行多个分之中一个分支。例例5.3 5.3 已知已知X=80,X值在数据段中定义,编写程序:值在数据段中定义,编写程序:若若X50则则Z=X+Y,否则否则Z=X-Y,结果存入,结果存入Z。X,Y,Z均为字数据。均为字数据。DATASEGMENTlXDW80;数据段中;数据段中DATAENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAlMOVDS,AXMOVAX,XCMPAX,50JGHIGHSUBAX,YJMPEXITHIGH:ADDAX,YEXIT:MOVZ,AXlMOVA
9、H,4CHlINT21HCODEENDSlENDSTART现在学习的是第18页,共104页l【例5.4】编写计算下面函数值的程序:l1X0lY=0 X=0l-1 Xhigh,则查找失败,置则查找失败,置CF=1,退出程序。,退出程序。否则,计算中点:否则,计算中点:mid(low+high)/2;K与中点元素与中点元素rmid比较,若比较,若k=rmid,则查找成功,退出程序;则查找成功,退出程序;若若krmid,则转步骤(则转步骤(5);lowmid+1,转转低半部查找低半部查找(lower),highmid-1,返回步骤(返回步骤(2),继续查找),继续查找高半部查找高半部查找(highe
10、r),lowmid+1,返回步骤(返回步骤(3),继续查找),继续查找现在学习的是第31页,共104页流程图如下:现在学习的是第32页,共104页DsegsegmentLow_idxdw?;低地址元素的下标.High_idxdw?;高地址元素的下标.Dsegends.现在学习的是第33页,共104页B_searchprocnearMovax,55;查找元素“55”(ax)Cmpax,es:di+2;(ax)第一个元素,比较.Jachk_last;(ax)第一个元素,则到chk_lastLeasi,es:di+2;(ax)第一个元素,则第一个元素SJeexit;(ax)=第一个元素,则退出.St
11、c;(ax)第一个元素,则CF=1,未找Jmpexit;退出.Chk_last:Movsi,es:di;元素个数S.Shlsi,1;长度*2=到最后元素(下标)的字节数Addsi,di;形成最后元素的地址Cmpax,es:si;比较,high_idxcmpcx,dx;若lowhigh,则转no_match,置cjano_match:int(low+high)/2cx(中间)addcx,dx;shrcx,1;中间元素下标(si)movsi,cx;shlsi,1;将下标值*2形成元素偏移地址compare:;数组基地址BX+元素偏移量元素地cmpax,es:bx+si;址bx+si.(ax)与中间
12、元素bx+si比较jeexit;若相等则退出jahigher;若(ax)(mid)则转high现在学习的是第35页,共104页ax中间元素:;若(ax)(mid)inccx;1、中间元素下标值:(cx)(cx)+movlow_idx,cx;2、low_idx(cx)将中间元素变为低地址元素jmpmid.;3、转mid,计算中间元素No_match:Stc;未找到,置cf=1Exit:Popds;弹出dsRetB_searchendp 程序首先把查找值与数组的第一个元素和最后一个元素相比较,如果找到或该数小于第一个元素或大于最后一个元素,则结束查找,否则从SEARCH开始折半查找。现在学习的是第
13、36页,共104页SEARCH从SEARCH开始,首先把数组长度作为数组中间元素下标,把它从数组的第一个单元中取出来,并使它成为偶数,然后再把下标加到DI中以形成数组的中间元素的地址并开始比较查找;如果比较相等则转至ALL_DONE结束查找;否则要确定下一步的查找是在数组的低半部还是高半部中进行。它们要做的工作是:首先检查下标是否等于2,如果等于2则说明整个查找失败,应把CF置1并转至ALL_DONE结束查找;其次,把下标除以2,以便做进一步的折半查找,然后使下标形成偶数值;如果要在低半部查找,则从当前的地址(DI)中减去下标值(si)以形成新的查找地址;如果要在高半部查找,则把下标值加到当前
14、地址值中。以上过程重复进行直到下标值减到2或者查找值找到为止。现在学习的是第37页,共104页Dsegsegment定义数据段Starteddw?存放数组的首地址DsegendsCsegsegment代码段BsearchprocfarAssumecs:cseg,ds:dsegPushdsPushaxMovax,dsegMovds,axPopax;将已存入ax中的数弹出Cmpax,es:di+2;(ax)第一个元素吗?Jachklast;到CHKLAST开始比较大于现在学习的是第38页,共104页 取偏移地址leasi,es:di+2;到时,则取地址存入sijeexit;=退出,CF=0不置位s
15、tc;置CF=1,未找到转EXITjmpexitchklast:movsi,es:di;取第一单元中数组长度shlsi,1;长度*2=最后元素下标addsi,d;形成最后元素地址cmpax,es:si;比较jbsearch;最后元素,置CF=1,退出jmpexitsearch:movstarad,di;将起始地址存入startadmovsi,es:di;取长度(si)evenr:testsi,1;是偶数则第0位为1jzaddI;当ZF=1时则为全0,为偶数现在学习的是第39页,共104页incsi;为奇数+1形成偶数addiadddi,si;形成查找元素的地址compare:cmpax,es:
16、di;比较(ax)=?es:dijealldone:=则转alldonejahigher;ax则到高半部cmpsi,2;si=2jneidxok;不为2则继续查找nomatch:stc;CF=1,未找到jealldoneidxok:shrsi,1;(si)/2=si逻辑右移0testsi,1;为偶数吗?jesubidx;是incsi;否则加1subidx:subdi,si;再低半部,di-si形成jmpshartcompare;元素地址higher:cmpsi,2;在高半部现在学习的是第40页,共104页jenomatch;未找到,置CF=1shrsi,2;(si)/2(si)jmpshort
17、evenisi;转eveni,将di+s高半部alldone:movsi,dmovdi,startaddr元素的位置Sexit:popds偏移位置retbsearchendpcsegendsend如果数组如下:ListDw12、11、22、33、44、55、66、77、88、99、111、222、333.要求查找的数为(ax)=55。数组长度为12,第一次比较的是数组的第6个元素66;因5533.所以第三次用高半部折半查找,比较的是第五个元素55.这样经过三次比较后,因查找成功而退出程序。如果要查找的数是(ax)=57.现在学习的是第41页,共104页则第二次比较的仍是第六个元素66;因573
18、3,所以第三次用低半部折半查找,比较的是第五个元素55;因5557,第四次用高半部折半查找,比较的又是第六个元素66;因57 9?.jlprint;小于小于34hadddl,07hPrint:Movah,2;Asciidl,调中断显示调中断显示dl.Int21h;Decch;显示显示4位吗?位吗?Jnznext;再执行显示二位再执行显示二位.RetmovAx,4c00hInt21HMainendpPrognamendsEndstart现在学习的是第86页,共104页例例5.15、设设有有数数组组X和和Y。X数数组组中中有有X1到到X10;Y数数组组中中有有Y1到到Y10;试编程计算:;试编程计
19、算:Z1=X1+Y1;Z2=X2+Y2;Z3=X3-Y3;Z4=X4-Y4;Z5=X5-Y5;Z6=X6+Y6;Z7=X7-Y7;Z8=X8-Y8;Z9=X9+Y9;Z10=X10+Y10。结果存入结果存入Z数组数组,对于这种问题,我们也可用循环来完成;对于这种问题,我们也可用循环来完成;已知循环计数值为已知循环计数值为10,每次循环的操作数是可以顺序取出,每次循环的操作数是可以顺序取出的,但所做的操作却有不同,这里有两种操作:的,但所做的操作却有不同,这里有两种操作:加、减,为加、减,为了区别每次应该做那一种操作,可以设置标志位了区别每次应该做那一种操作,可以设置标志位,如标志为如标志为0作
20、作加法;为加法;为1则做减法则做减法,这样进入循环后只要判别标志位,就可,这样进入循环后只要判别标志位,就可确定应该做的操作了。确定应该做的操作了。把把10次操作设立次操作设立10个标志位,我们把它放在一个存储单元个标志位,我们把它放在一个存储单元LOG中,这种存储单元一般称为逻辑尺,本例设定逻辑尺为:中,这种存储单元一般称为逻辑尺,本例设定逻辑尺为:00000000110111000DCH。现在学习的是第87页,共104页从低位开始所设的标志位反映了每次要做的操作顺序,最高的从低位开始所设的标志位反映了每次要做的操作顺序,最高的6位没有意义,位没有意义,设为设为0。Zi=Xi+YiZi=Xi
21、+YiI=10I=10、9 9、8 8、7 7、6 6、5 5、4 4、3 3、2 2、1 1 +,-+-+-,-+-+1010次操作设立次操作设立1010个标志位个标志位 0 0 0 0 ,1 1 0 1 1 1 0 1 ,1 1 0 01 1 0 0 位位=16 15 14 13=16 15 14 13、12 11 10 912 11 10 9、8 87 76 65 5、4 43 32 21 1字:字:00000 0 0 0 0 00 0,1 1 0 11 1 0 1,1 1 0 0=0DCH1 1 0 0=0DCHZ1=X1+Y1;Z2=X2+Y2;Z3=X3-Y3;Z4=X4-Y4;Z
22、5=X5-Y5;Z6=X6+Y6;Z7=X7-Y7;Z8=X8-Y8;Z9=X9+Y9;Z10=X10+Y10现在学习的是第88页,共104页现在学习的是第89页,共104页movbx,0movcx,10movdx,lognext:movax,xbxshrdx,1jcsubtaddax,ybxjmpshortresultsubt:subax,ybxresult:movzbx,axaddbx,2loopnext现在学习的是第90页,共104页data segment ;data segment ;数据段数据段 x dw 2,3,4,5,6,7,8,9,10,11;x dw 2,3,4,5,6,7
23、,8,9,10,11;y dw 1,2,3,4,5,6,7,8,9,10;y dw 1,2,3,4,5,6,7,8,9,10;Z dw 10 dup(?);Z dw 10 dup(?);log dw 00dch log dw 00dchdata endsdata endsprognam segment ;prognam segment ;代码段代码段main proc farmain proc far assume cs:prognam,ds:data assume cs:prognam,ds:datastart:push dsstart:push ds sub ax,ax sub ax,ax
24、 push ax push ax mov ax,data ;mov ax,data ;初始化初始化 mov ds,axmov ds,ax现在学习的是第91页,共104页movbx,0movcx,10movdx,lognext:movax,xbx;循环循环shrdx,1jcsubtaddax,ybxjmpshortresultsubt:subax,ybxresult:movzbx,axaddbx,2loopnextretret main endp main endp prognam endp prognam endp end start end start 相对寻址:相对寻址:=16x(ds)+
25、(bx)+16位位移量位位移量movax,y+bx现在学习的是第92页,共104页例例5.13、在在附附加加段段中中,有有一一个个首首地地址址为为list和和未未经经排排序序的的字字数数组组,在在数数组组的的第第一一个个字字中中存存放放着着数数组组的的长长度度,数数组组的的首首地地址址已已存存放放在在DI寄存器中。寄存器中。AX寄存器中存放着一个数。寄存器中存放着一个数。要要求求编编制制一一程程序序;在在数数组组中中查查找找该该数数,如如果果找找到到该该数数则则把把它它从从数数组组中中删除。删除。分分析析:1、首首先先查查找找数数组组中中是是否否有有(AX),如如果果没没有有则则不不对对数数组
26、组做做任任何何处理就结束程序;处理就结束程序;2、如如果果找找到到这这一一元元素素则则应应把把数数组组中中地地址址比比该该元元素素高高(其其前前)的的元元素向低地址方向移动(后移一个字),并修改数组长度值;素向低地址方向移动(后移一个字),并修改数组长度值;3、如如果果找找到到的的元元素素恰恰好好位位于于数数组组的的末末尾尾,则则不不必必移移动动任任何何元元素素,只只要要修修改数组长度就可以了;改数组长度就可以了;所以程序所以程序第一部分第一部分查找元素可以使用串处理命令;查找元素可以使用串处理命令;第二部分第二部分删除元素则可以使用循环结构,因为查找结束删除元素则可以使用循环结构,因为查找结
27、束时就可以知道该元素的位置,所以可以作为循环次数已知的情况来设时就可以知道该元素的位置,所以可以作为循环次数已知的情况来设计。计。现在学习的是第93页,共104页现在学习的是第94页,共104页DatareasegmentMessdbpersonalcomputer$DatareaendsExtrasegmentListdw5,1,2,3,4,6ExtraendsCodesegmentMainprocfar;del_ulprocnearAssumccs:code,ds:datarea,es:extraStart:PushdsSubax,axPushaxMovax,datareaMovds,ax
28、Movax,extraMoves,ax现在学习的是第95页,共104页Movdi,offsetlistCldMovax,2;要删除的数为要删除的数为2PushdiMovcx,es:di;元素个数;元素个数5cxLop:Adddi,2;每个元素占两个字节每个元素占两个字节cmpax,es:di;RepnescaswJedelete;找到转;找到转deletedeccxjnzlopPopdi;未找到转;未找到转exitJmpshortexit现在学习的是第96页,共104页Delete:jcxedeccntNextel:movbx,es:diMoves:di-2,bxAdddi,2LoopNext
29、elDeccnt:popdidecwordptres:diExit:retMainendpdel_ulendpCodeendsEndstart现在学习的是第97页,共104页 用子程序方法编制程序如下:del_ulprocfarCld;DF=0时,向前查找。Pushdi;右起始地址;Movcx,es:di;取元素数;Adddi,2;改变指针。RepnescaswJzdelete;结果为0,ZF=1.转,此时CX值减少1PopdiJmpshortexitDelete:jcxzdeccnt;为最后元素?cx剩下未比较个数Nextel:movbx,es:di;元素向低地址移动一个字.Moves:di
30、-2,bxadddi,2;指向另一个元素loopNextel;重复,直到所有全移动deccnt:popdidecwordptres:di;总元素数-1exit:retdel_ulendp主程序如下:DatasegmentNdw3DataendsExtrasegmentArray1dw5,1,2,3,4,6ExtraendsCodesegmentMainprocfarAssumecs:code,ds:data,es:extra现在学习的是第98页,共104页主程序:Start:PushdsSubas,axPushaxMovax,dataMovas,axMovax,extraMoves,axMov
31、ax,N;要删除的元素Movdi,offsetarray1Calldel_ulMovdi,offsetarray1Movcx,es:diInccx;元素个数+1,因为要显示元素数和各个元素现在学习的是第99页,共104页Disp:movdx,es:di;显示元素数及各个元素Movah,2Int21hAdddi,2LoopdispRetMainendpCodeendsEndstart现在学习的是第100页,共104页说明:1、repne把AX的内容与由(DI)指定的在附加段中的一个字进行比较,不等时继续重复操作(串操作)(DF=0则di+2),如某次两数比较相等或(cx)=0,则可结束操作,(找
32、到时ZF=1);2、Jcxz:测试条件(cx)=0时,即cx寄存器内容为0则转移3、DF=1时,向前查找,DI+2DI,cx-1cx,AX与ES:di比jmpshortexit执行:(IP)+8位位移量(IP)机器执行时则是当前的IP值(即JMP指令的下一条指令的地址)与指令中指示的8位位移量之和。位移量需要满足向前或向后转移的需要,因此它是一个带符号的数,也就是说这种转移格式只允许在-128+127字节范围内转移。现在学习的是第101页,共104页例5.14、将正数N插入一个已整序的字数组的正确位置。该数组的首地址和末地址分别为ARHEAD和AREND,其中所有数均为正数且已按递增的次序排序
33、。分析:数组长度可由首、末地址确定;1、这里只需求插入一个数,并不一定要扫描整个数组,所以可以用找到应插入数的位置作为循环结束的条件。此外,为空出插入数的位置,2、其前的全部元素,都应向前(前移向高地址)移动一个字;所以,从尾部向头部查找,可逐字取出数组中的一个数。3、可能出现的边界情况是N大于或小于数组中所有数的两种可能性,若N大于数组中所有数,则第一次比较就结束循环;若N小于数组中所有数,则不许查找的范围超过数值的首地址,这就可以把数组的首地址也同时作为结束条件,或同时用循环次数作为条件之一来考虑。本例则利用所数均为正数的条件,在ARHEAD-2单元中存放“-1”这个数,这样可以保证如果数
34、N小于数组中的所有数,那它必然大于“-1”,这样就可以正确地把N放在数组之首了。循环结束仍然可以使用KN这个条件。(N为待插入的数,K为数组中的元素)现在学习的是第102页,共104页Data segmentX dw?Arhead dw 3、5、15、23、37、49、52、65、78、99.Arend dw 105N dw 32 64hData endsPrognam segmentMain prot ds Assume cs:prognam,ds:data.现在学习的是第103页,共104页Start:pushds;段地址进栈Subax,ax;将0压入堆栈PushaxMovax,data;将data段地址ds段寄存器Movds,axMovax,nMovarhead-2,offffh;-1arhead-2单元中.Movsi,0Comp:cmparendsi,ax;取数组最末一个数与ax比.Jleinsert;kn,Movbx,arendsiMovarendsi+2.Bx;将原地址为arend+si向地址方向移动字操作。JmpshortcompInsert:movarendsi+2,axRet;返回dosMainendp;main程序块结束Prognamends;代码段结束Endstart;汇编结束现在学习的是第104页,共104页