1、第十章 分支程序设计第1页第一节分支程序结构1.1.分支程序结构有两路分支与多路分支两种结构形式。分支程序结构有两路分支与多路分支两种结构形式。(1)(1)两路分支完成两种情况选择处理,相当于高级语言中两路分支完成两种情况选择处理,相当于高级语言中IF-THEN-IF-THEN-ELSEELSE语句,如图语句,如图5 5一一l l所表示。所表示。第2页(2)(2)多路分支完成各种情况选择处理,相当于高级语言中两路分支嵌套结多路分支完成各种情况选择处理,相当于高级语言中两路分支嵌套结构、构、CASECASE语句语句或或SWITCHSWITCH语句,如图语句,如图5252所表示所表示。(3)(3)
2、分支结构程序要求先进行条件判断,然后依据判断结果将程序执行流程转移分支结构程序要求先进行条件判断,然后依据判断结果将程序执行流程转移到对应分到对应分支上去,判断一次只可能有一路分支被选择。支上去,判断一次只可能有一路分支被选择。第3页第二节第二节 无条件转移指令无条件转移指令1.1.转移指令分为无条件转移指令和条件转移指令两种。它们经过改变转移指令分为无条件转移指令和条件转移指令两种。它们经过改变CSCS和和IPIP,或,或经过仅改经过仅改变变IPIP来实现转移。前者适合用于段间转移,后者适合用于段内转移。来实现转移。前者适合用于段间转移,后者适合用于段内转移。无条件转移指令功效是将控制无条件
3、地转移到操作数所指位置。无条件转移指令功效是将控制无条件地转移到操作数所指位置。无条件转移指令包含无条件转移指令包含JMPJMP、CALLCALL和和RET3RET3条指令,本节只讨论条指令,本节只讨论JMPJMP指令,指令,CALLCALL和和RETRET指令将在第指令将在第7 7章子程序中讨论。章子程序中讨论。瓜瓜IPIP指令格式为:指令格式为:JMPDOPDJMPDOPD其中,其中,DOPDDOPD是转移地址,能够是标号,也能够是存放器或存放器,前者称为是转移地址,能够是标号,也能够是存放器或存放器,前者称为直接转移,直接转移,后者称为间接转移。后者称为间接转移。(1)(1)段内直接短转
4、移:段内直接短转移:JMPSHORTPTRJMPSHORTPTR标号标号转移地址转移地址IPIP由当前由当前IPIP,加,加8 8位位移量形成,只能在段内位位移量形成,只能在段内-128-128127127字节范围内字节范围内转移。向转移。向前转移可缺省前转移可缺省SHORTSHORT。第4页(2)(2)段内直接转移:段内直接转移:JMPNEARPTRJMPNEARPTR标号标号转移地址转移地址IPIP由当前由当前IPIP加加1616位位移量形成,转移位置能够在代码段内任位位移量形成,转移位置能够在代码段内任何位置。何位置。(3)(3)段内间接转移:段内间接转移:JMPWORDPTRJMPWO
5、RDPTR存放器或内存单元存放器或内存单元转移地址口位于一通用存放器中或任一个存放器寻址方式确定。转移地址口位于一通用存放器中或任一个存放器寻址方式确定。(4)(4)段间直接转移:段间直接转移:JMPFARPTRJMPFARPTR标号标号转移时同时修改转移时同时修改IPIP与与CSCS。标号必须定义为。标号必须定义为FARFAR属性。属性。(5)(5)段间间接转移:段间间接转移:JMPFARPTRJMPFARPTR存放器存放器转移地址是内存中一双字,高位字是转移地址转移地址是内存中一双字,高位字是转移地址CSCS值,低位字是转移地值,低位字是转移地址址IPIP值值第5页例例5-15-1】JMP
6、JMP指令举例。指令举例。C1)JMPSHORTPTRL1C1)JMPSHORTPTRL1;段内短转移;段内短转移(2)JMPNEARPTRL2(2)JMPNEARPTRL2;段内直接转移;段内直接转移(3)JMPFARPTRL3(3)JMPFARPTRL3;段间直接转移;段间直接转移(4)JMPDWORDPTR(4)JMPDWORDPTR【BxBx;段间间接转移;段间间接转移(5)JMPWORDPTRBX(5)JMPWORDPTRBX;段内间接转移;段内间接转移(6)JMPDWORDPTRBP+12(6)JMPDWORDPTRBP+12;转移到地址在堆栈段程序;转移到地址在堆栈段程序(7)J
7、MPDWORDPTRBP(7)JMPDWORDPTRBP【DIDI;段间间接转移;段间间接转移JMPJMP指令对标志位无影响。指令对标志位无影响。JMPJMP指令不能组成份支程序,但在分支程序设计中往往需要用它将各指令不能组成份支程序,但在分支程序设计中往往需要用它将各分支出口聚集到一起。另分支出口聚集到一起。另外当条件转移指令转移范围超出外当条件转移指令转移范围超出-128-128+127+127字节时,也往往要借助字节时,也往往要借助JMPJMP指令来实现预定转移。指令来实现预定转移。JMPJMP指令即使改变不少,但大多数时候只用到指令即使改变不少,但大多数时候只用到“JMP“JMP标号标
8、号”简单形式。简单形式。第6页第第3 3节节 条件转移指令条件转移指令1.1.概述概述(1 1)与无条件转移指令不一样,条件转移指令是依据前面形成条件与无条件转移指令不一样,条件转移指令是依据前面形成条件来确定转移去向。来确定转移去向。(2 2)条件转移指令条件主要由标志存放器给定,依据)条件转移指令条件主要由标志存放器给定,依据ZFZF、CFCF、SFSF、OFOF及及PFPF等标志位值来转移。能改变这些标志位运算和指令均可形成转等标志位值来转移。能改变这些标志位运算和指令均可形成转移条件,移条件,CMPCMP、TESTTEST指令惯用于形成转移条件。指令惯用于形成转移条件。CXCX值是否为
9、值是否为0 0也常表也常表示转移条件。示转移条件。(3 3)条件转移指令共有条件转移指令共有1919条,分为简单条件转移指令、无符号数条条,分为简单条件转移指令、无符号数条件转移指令、符号数条件转移指令及件转移指令、符号数条件转移指令及CXCX条件转移指令条件转移指令4 4类。类。(4 4)全部条件转移只能是段内直接短转移,而且与)全部条件转移只能是段内直接短转移,而且与JMPJMP指令一样不影指令一样不影响任何标志位。响任何标志位。(5 5)条件转移指令普通格式为:条件转移指令助记符短标号)条件转移指令普通格式为:条件转移指令助记符短标号第7页2.2.简单条件转移指令简单条件转移指令简单条件
10、转移指令是仅取决于简单条件转移指令是仅取决于ZFZF、CFCF、SFSF、OFOF及及PFPF中某一标志位条件转中某一标志位条件转移指令。标移指令。标志志ZFZF、CFCF、SFSF、OFOF及及PFPF值能够表示值能够表示1010种状态,因而设置了种状态,因而设置了1010条简单条件条简单条件转移指令,见转移指令,见表表5-15-1。【例【例5252】简单条件转移指令举例。】简单条件转移指令举例。CMPAXCMPAX,0 0JELlJELl;AXAX为为0 0时转时转L1L1ADDAXADDAX,1234H1234HJOL2JOL2;溢出时转;溢出时转L2L2第8页3.3.无符号数条件转移指
11、令无符号数条件转移指令无符号数条件转移指令视比较对象为无符号数,往往跟在比较指令后。无符号数条件转移指令视比较对象为无符号数,往往跟在比较指令后。对无符号数条件转移指令对无符号数条件转移指令“比较比较”用高于用高于(Above)(Above)、低于、低于(BelOW)(BelOW)和等于和等于(Equal)(Equal)表示,见表表示,见表5252,表中,表中A A、B B为无符号数。为无符号数。【例【例5353】X X、Y Y为无符号数,计算为无符号数,计算lX-YllX-Yl。程序段以下:程序段以下:MOVAXMOVAX,X XCMPAXCMPAX,Y Y比较比较JAELLLJAELLLX
12、CHGAXXCHGAX,Y Y:假如:假如AXYAXY,交换,交换AXAX、Y YLLLLLL:SUBAXSUBAX,Y Y第9页4.4.符号数条件转移指令符号数条件转移指令当要依据两个符号数大小关系决定是否转移时,必须选取符号数条件转当要依据两个符号数大小关系决定是否转移时,必须选取符号数条件转移指令。移指令。对符号数条件转移指令对符号数条件转移指令“比较比较”用大于用大于(Greater)(Greater)、小于、小于(Less)(Less)和等于和等于(Equal)(Equal)表示,表示,以示与无符号数条件转移指令区分,见表以示与无符号数条件转移指令区分,见表5353,表中,表中A A
13、、B B为两个符号数。为两个符号数。表表5353符号数条件转移指令符号数条件转移指令第10页【例【例5454】JGJG与与JAJA指令。指令。MOVALMOVAL,一,一40H40HCMPALCMPAL,50H50HJGLLLJGLLL;AL50HALO1XO0X0X:O O本例是一个经典三路分支处理程序,程序以下:本例是一个经典三路分支处理程序,程序以下:DATASE(DATASE(JMENJMEN。I IXDB?XDB?YDB?YDB?DATAENDSDATAENDSSTACKSEGMENTSTACKSTACKSEGMENTSTACKDB100DUP(?)DB100DUP(?)STACKE
14、NDSSTACKENDSCODESEGMENTCODESEGMENTASSUMECSASSUMECS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKMAINPROCFARMAINPROCFARPUSHDSPUSHDS第15页MOVAXMOVAX,0 0PUSHAXPUSHAX;保留;保留PSPPSP地址,另一个方式返回地址,另一个方式返回DOSDOSMOVAXMOVAX,DATADATAMOVDSMOVDS,AXAXMOVALMOVAL,X XCMPALCMPAL,O O:准备转移条件:准备转移条件JZZEROJZZERO;为;为0 0时转时转ZEROZERO处处
15、JSNEGLJSNEGL;为负时转;为负时转NEGLNEGL处处MOVALMOVAL,1 1:为正时等于:为正时等于1 1JMPDONEJMPDONENEGLNEGL:MOVALMOVAL,0FFH0FFH;为负时等于一;为负时等于一1 1JMPDONEJMPDONEZEROZERO:MOVALMOVAL,O O:为:为0 0时等于时等于0 0DONEDONE:MOVYMOVY,ALAL;计算结果送;计算结果送Y YRET=RET=返回返回MAINENDPMAINENDPCODEENDSCODEENDSENDMAINENDMAIN第16页2 2跳转表法跳转表法跳转表法实现多路分支程序设计关键思
16、想是:在内存中开辟一片连续存跳转表法实现多路分支程序设计关键思想是:在内存中开辟一片连续存放单元作为跳转放单元作为跳转表,表中次序存放着进入各个分支处理程序转移地址或转移指令。需要表,表中次序存放着进入各个分支处理程序转移地址或转移指令。需要进入某分支处理程进入某分支处理程序,只需查找跳转表中对应分支地址或指令对应位置即可。序,只需查找跳转表中对应分支地址或指令对应位置即可。跳转表法又分为地址跳转表法和指令跳转表法。跳转表法又分为地址跳转表法和指令跳转表法。(1)(1)地址跳转表法地址跳转表法在地址跳转表法中,跳转表存放各个分支转移地址,跳转表能够经过在地址跳转表法中,跳转表存放各个分支转移地
17、址,跳转表能够经过DwDw伪指令来定义。伪指令来定义。(2 2)指令跳转表法)指令跳转表法在指令跳转表法中,跳转表直接存放各个分支处理转移指令,跳转表在在指令跳转表法中,跳转表直接存放各个分支处理转移指令,跳转表在代码段中定义。代码段中定义。第17页三三.对于分支程序设计,归纳一下,有这么几点务必注意:对于分支程序设计,归纳一下,有这么几点务必注意:(1)(1)选择适当转移指令,不然可能不能转移到预定程序分支。选择适当转移指令,不然可能不能转移到预定程序分支。(2)(2)必须为每个分支安排出口,不然将造成程序运行混乱。必须为每个分支安排出口,不然将造成程序运行混乱。(3)(3)应把各分支中公共
18、部分尽可能集中到分支前或后程序段中。应把各分支中公共部分尽可能集中到分支前或后程序段中。(4)(4)程序中分支出现次序必须与流程图中一致,也尽可能与问题中一致。程序中分支出现次序必须与流程图中一致,也尽可能与问题中一致。(5)(5)在调试程序时,应尽可能对每个分支进行测试。在调试程序时,应尽可能对每个分支进行测试。(6)(6)无条件转移指令转移范围不受限制,条件转移指令只能在无条件转移指令转移范围不受限制,条件转移指令只能在_128_128127127字节范围内转移。字节范围内转移。第18页第5节.分支程序设计举例1.1.【例【例5 5一一ll ll】编写程序,将三个符号数最大者送入】编写程序
19、,将三个符号数最大者送入MAXMAX字单元。字单元。三个符号数用三个符号数用x x、Y Y、Z Z描述,最大值用描述,最大值用MAXMAX表示。表示。程序流程图如图程序流程图如图5555所表示。所表示。第19页程序以下:程序以下:DAIDAIASEGMENTASEGMENTXDW1234HXDW1234HYDW4321HYDW4321HZDW3421HZDW3421HM_AXDW?M_AXDW?DATAENDSDATAENDSSTACKSEGMENTSTACKSTACKSEGMENTSTACKDB100DUP(?)DB100DUP(?)STACKENDSSTACKENDSCODESEGMENT
20、CODESEGMENTASSUMECSASSUMECS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACKBEGINBEGIN:MOVAXMOVAX,DATADATAMOVDSMOVDS,AXAXMOVAXMOVAX,X XCMPAXCMPAX,Y Y:XY?XY?JGXGZJGXGZMOVAXMOVAX,Y YCMPAXCMPAX,Z Z:YZ?YZ?JGNEXTJGNEXTZTOAXZTOAX:MOVAXMOVAX,Z ZJMPNEXTJMPNEXTXGZXGZ:CMPAXCMPAX,Z Z:XZ?XZ?JNGZTOAXJNGZTOAXNEXTNEXT:MOVMA
21、XMOVMAX,AXAXMOVAHMOVAH,4CH4CHINT21HINT21HCODEENDSCODEENDSENDBEGINENDBEGIN第20页2.2.【例【例512512】编写程序,将输入大写字母转换为小写字母。英文大、小】编写程序,将输入大写字母转换为小写字母。英文大、小写字母写字母ASCIIASCII码相差为码相差为20H20H,将大写字母转换为对应小写字母,只需将大,将大写字母转换为对应小写字母,只需将大写字母写字母ASCIIASCII码加上码加上20H20H即可。即可。用用0101号功效调用实现从键盘输入一个字符,用号功效调用实现从键盘输入一个字符,用0202号功效调用输出
22、一个小号功效调用输出一个小写字母,用写字母,用0909号功效显示犯错信息,用号功效显示犯错信息,用CMPCMP和和JMBJMB指令实现分支程序设指令实现分支程序设计。假定输入以计。假定输入以“#”“#”结束。结束。程序流程图如图程序流程图如图5656所表示。所表示。第21页程序以下:程序以下:DATASEGMENTDATASEGMENTERRMESSDBERROR!ERRMESSDBERROR!,$DATAENDSDATAENDSSTACKSEGMENTSTACKSTACKSEGMENTSTACK图图5656例例5 5一一1212程序流程图程序流程图DB100DUP(?)DB100DUP(?)
23、STACKENDSSTACKENDSCODESEGMENTCODESEGMENTASSIASSI,MECSMECS:CODECODE,DSDS:DATADATA,SSSS:S1S1ACKACKSTARTSTART:MOVAXMOVAX,DATADATAMOVDSMOVDS,AXAXLLLLLL:MOVAHMOVAH,1 1:从键盘输入一个字符送:从键盘输入一个字符送ALALINT21HINT21HcMPALcMPAL,#;输入字符为;输入字符为#结束结束JZDONEJZDONECMPALCMPAL,AA;若不是大写字母,转显示犯错信息;若不是大写字母,转显示犯错信息JBERRJBERRCMAL
24、CMALZZJAERRJAERRADDALADDAL,20H20H;转换成小写字母;转换成小写字母MOVDLMOVDL,ALAL:输出:输出MOVAHMOVAH,2 2INT2lHINT2lHJMPLLLJMPLLL:继续输入:继续输入ERRERR:MoVDxMoVDx,OFFSETERRMESSOFFSETERRMESS:输出犯错信息:输出犯错信息MOVAHMOVAH,9 9INT21HINT21HJMPLLLJMPLLLDONEDONE:MOVAHMOVAH,4CH4CHINT21HINT21HCoDEENDSCoDEENDSENDSTARTENDSTART第22页3.3.【例【例5135
25、13】对例】对例4 42828计算计算0 09 9中数立方程序进行改中数立方程序进行改进,增加容错处理。进,增加容错处理。程序流程图如图程序流程图如图5757所表示。所表示。第23页程序以下:程序以下:STACKSEGMENTS1tACKSTACKSEGMENTS1tACKDWDW】OOHDIm(O)OOHDIm(O)STACKENDSSTACKENDSDATASEGMENTDATASEGMENTMESSDBINPUTX(0MESSDBINPUTX(09)9):$TABDW0TABDW0,1 1,8 8,2727,6464,125125XDB?XDB?DAIADAIACODECODEMAINM
26、AIN:图图5757例例513513程序流程图程序流程图216216,343343,512512,729729:定义数据表:定义数据表XXXDW?XXXDW?ERRDBINPUTERROR!$ERRDBINPUTERROR!$ENDSENDSSEGMENTSEGMENTASSUMECSASSUMECS:CoDECoDE,DSDS:DAIADAIA,SSSS:STACKSTACKMOVAXMOVAX,DATADATAMOVDSMOVDS,AXAXMOVDxMOVDx,OFFSETMESSOFFSETMESS:显示提醒信息:显示提醒信息MOVAHMOVAH,9 9第24页INT2lHINT2lHM
27、OVAHMOVAH,1 1:输入:输入X XINT21HINT21HCMPALCMPAL,OO:改进部分:改进部分JBLERRJBLERRCMPALCMPAL,99JALERRJALERRANDALANDAL,OFHOFH:AScIIAScII码转换成真值码转换成真值MOVXMOVX,ALALADDALADDAL,ALAL:计算表中:计算表中1616位位移位位移MOVBLMOVBL,ALALMOVBHMOVBH,O O:MOVAXMOVAX,TABBxTABBx;TAB+BxTAB+Bx】为所求立方值偏移地址】为所求立方值偏移地址MOVXXXMOVXXX,AXAXEXITEXIT:MOVAHMOVAH,4CH4CHINT21HINT21HLERRLERR:MOvDXMOvDX,0FFSETERR0FFSETERR;输出犯错信息;输出犯错信息MoVAHMoVAH,9 9INT21HINT21HJMPEJMPET TCODEENDSCODEENDSENDMAINENDMAIN第25页