资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1第五章循环与分支程序设计w5.1循环与转移指令w5.2循环程序设计w5.3分支程序设计25.1循环与转移指令一、循环控制指令二、转移指令控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变3一、循环控制指令w8086指令系统的循环控制指令均为二字节指令n一字节为转移的相对位移量(8位带符号的二进制数)IPIP+相对位移量EIPEIP+相对位移量n隐含使用CX作为循环计数器程序中的某段需反复执行若干次时,用循环来实现短转移4LOOPlabel;CXCX1,CX0,循环到标号label一、循环控制指令LOOPE/LOOPZlabel;CXCX1,CX0且ZF1,循环到标号labelLOOPNE/NZlabel;CXCX1,CX0且ZF0,循环到标号label等于时循环不等于时循环5一、循环控制指令(例)MOVCX,COUNT;设置循环次数MOVSI,OFFSETDATA_BYTEXORAX,AX;BX清0,用于存放累加和AGAIN: ADDAL,SIADCAH,0INCSILOOPAGAIN;计数器减1,不为0继续循环6一、循环控制指令(例)MOVCX,COUNT;设置循环次数MOVSI,OFFSETSTRINGXORBX,BX;BX清0,用于记录空格数MOVAL,20HAGAIN:CMPAL,SIJNZNEXT;ZF=0,非空格,转移INCBX;ZF=1,是空格,个数加1NEXT:INCSILOOPAGAIN;计数器减1,不为0继续循环7二、转移指令w无条件转移指令w条件转移指令8无条件转移指令JMPlabel;程序转向label标号指定的地址NEARFARw只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令wJMP指令分成4种类型:段内转移、直接寻址段内转移、间接寻址段间转移、直接寻址段间转移、间接寻址目的地址与JMP属同一逻辑段,只修改IP值从一个代码段转移到另一个代码段,CS和IP都会被修改91.无条件转移指令目标地址的寻址方式w直接寻址方式n转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式w间接寻址方式n转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式用标号表达用寄存器或存储器操作数表达101.无条件转移指令目标地址的范围:段内w段内转移近转移(near)n在当前代码段64KB范围内转移(32KB范围)n不需要更改CS段基值,只要改变IP偏移地址w段内转移短转移(short)n转移范围可以用一个字节表达,在段内128127范围的转移代码段代码段111.无条件转移指令目标地址的范围:段间w段间转移远转移(far)n从当前代码段跳转到另一个代码段,可以在1MB范围n需要更改CS段基值和IP偏移地址n目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代码段代码段实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr或farptr强制12段内直接寻址转移JMPlabel;IPIP+位移量w位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移w当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负实际为相对寻址JMPAGAIN;转移到AGAIN处继续执行AGAIN:DECCX;标号AGAIN的指令JMPOUTPUT;转向OUTPUTOUTPUT: MOVRESULT,AL;标号OUTPUT的指令13段内间接寻址转移JMPr16/m16;IPr16/m16w将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容JMPAX;IPAXJMPWORDPTRBX;IPBX14段间直接寻址转移JMPfarptrlabel;IPlabel的偏移地址;CSlabel的段基值w将标号所在段的段基值作为新的CS值,标号在该段内的偏移地址作为新的IP值;程序跳转到新的代码段执行JMPFARPTROTHERSEG;远转移到代码段2的otherseg15段间间接寻址转移JMPfarptrmem;IPmem,CSmem+2w用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器MOVWORDPTRBX,0MOVWORDPTRBX+2,1500HJMPFARPTRBX;转移到1500H:0162.条件转移指令Jcclabel;条件满足,发生转移:IPIP8位位移量;条件不满足,顺序执行指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令操作数label是采用短转移,称为相对寻址方式172.条件转移指令wJcc指令的操作数label是一个标号n一个8位位移量是相对于当前IP的,且距当前IP地址128127个单元的范围之内,属于段内短距离转移wJcc指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针IP加2182.条件转移指令指令的分类wJcc指令不影响标志,但要利用标志。w根据利用的标志位不同,19条指令分成4种情况:判断单个标志位状态比较无符号数高低比较有符号数大小判断计数器CX为019助记符标志位助记符标志位JCCF=1JA/JNBECF=0且ZF=0JNCCF=0JAE/JNBCF=0或ZF=1JZ/JEZF=1JB/JNAECF=1且ZF=0JNZ/JNEZF=0JBE/JNACF=1或ZF=1JSSF=1JG/JNLESF=OF且ZF=0JNSSF=0JGE/JNLSF=OF或ZF=1JP/JPEPF=1JL/JNGESFOF且ZF=0JNP/JPOPF=0JLE/JNGSFOF或ZF=1JOOF=1JCXZCX=0JNOOF=0实际虽然指令只有19条,但却有31个助记符采用多个助记符,只是为了方便记忆和使用20判断单个标志位状态这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)JS和JNS:利用符号标志SF,判断结果是正是负JO和JNO:利用溢出标志OF,判断结果是否产生溢出JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇JC和JNC:利用进位标志CF,判断结果是否进位或借位例题例题例题例题例题212.条件转移指令JZ/JNZ指令REPZCMPSB;重复比较两个字符JNZUNMAT;ZF0(不等),转移MOVAL,0;顺序执行(相等)JMPOUTPUTUNMAT:MOVAL,0FFHOUTPUT: MOVRESULT,ALREPZCMPSB;重复比较两个字符JZMAT;ZF1(相等),转移MOVAL,0FFH;顺序执行(不等)JMPOUTPUTMAT: MOVAL,0OUTPUT: MOVRESULT,AL222.条件转移指令JS/JNS指令w计算|XY|(绝对值)。X和Y为存放于X单元和Y单元的16位操作数,结果存入RESULT。MOVAX,XSUBAX,YJNSNONNEGNEGAXNONNEG:MOVRESULT,AX232.条件转移指令JO/JNO指令w计算XY。X和Y为存放于X单元和Y单元的16位操作数,若溢出,则转移到OVERFLOW处理MOVAX,XSUBAX,YJOOVERFLOW.;无溢出,结果正确OVERFLOW:.;有溢出处理242.条件转移指令JP/JNP指令w设字符的ASCII码在AL寄存器中。将字符加上奇校验位:在字符ASCII码中为“1”的个数为奇数时令其最高位为“0”,否则令最高位为“1”ANDAL,7FH;最高位置“0”,同时判断“1”的个数JNPNEXT;个数已为奇数,则转向NEXTORAL,80H;否则,最高位置“1”NEXT:.252.条件转移指令JC/JNC指令w记录BX中1的个数XORAL,AL;AL0,CF0AGAIN:TESTBX,0FFFFH;等价于CMPBX,0JZNEXTSHLBX,1JNCAGAININCALJMPAGAINNEXT:.;AL保存1的个数262.条件转移指令无符号数的比较无符号数的大小用高(Above)低(Below)表示利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系:高于(不低于等于):JA(JNBE)高于等于(不低于):JAE(JNB)低于(不高于等于):JB(JNAE)低于等于(不高于):JBE(JNA)272.条件转移指令无符号数的比较(例)CMPAX,BX;比较AX和BXJAENEXT;若AXBX,转移XCHGAX,BX;若AXBX,交换NEXT:.结果:AX保存较大的无符号数282.条件转移指令有符号数的比较w有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)w两数的大小分成4种关系:n小于(不大于等于):JL(JNGE)n小于等于(不大于):JLE(JNG)n大于(不小于等于):JG(JNLE)n大于等于(不小于):JGE(JNL)292.条件转移指令有符号数的比较(例)CMPAX,BX;比较AX和BXJGENEXT;若AXBX,转移XCHGAX,BX;若AXBX,交换NEXT:.结果:AX保存较大的有符号数302.条件转移指令计数器CX为0转移JCXZlabel;CX0,发生转移:IPIP8位位移量;CX0,顺序执行CX寄存器通常在程序中用做计数器JCXZ指令用来判断计数是否为0315.2循环程序设计一、循环程序的结构形式二、循环程序设计三、多重循环程序设计32一、循环程序的结构形式结束初始化循环的初始状态循环体循环的工作部分及修改部分计数控制循环条件控制循环修改部分控制条件YN先循环,后判断33一、循环程序的结构形式结束初始化循环的初始状态循环体循环的工作部分及修改部分计数控制循环条件控制循环修改部分控制条件YN先判断,后循环34xorax,ax;被加数ax清0movcx,100again:addax,cx;从100,99,.,2,1倒序累加loopagain.modelsmall.stack256.datasumdw?.code.startupmovsum,ax;将累加和送入指定单元.exit0end二、循环程序设计(例)35例5.2在ADDR单元存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中开始1的个数计数器0循环次数计数器CX16Y左移一次CF=11的个数计数器+1CXCX-1=0COUNT1的个数计数器结束NYNY循环次数固定,完全由循环计数器控制36DATASEGMENTYDW1234HADDRDWYCOUNTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,0MOVBX,ADDRMOVAX,BXMOVCX,16REPEAT:SHLAX,1JNCNEXTINCDLNEXT:LOOPREPEATEXIT0:MOVCOUNT,DLMOVAH,4CHINT21HCODEENDSENDSTART例5.237开始1的个数计数器0循环次数计数器CX16Y左移一次CF=11的个数计数器+1CXCX-1=0COUNT1的个数计数器结束NYNYY=0NY例5.238DATA SEGMENTYDW1234HADDR DWYCOUNTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,0MOVBX,ADDRMOVAX,BXMOVCX,16REPEAT:SHLAX,1JNCNEXTINCDLNEXT: LOOPREPEATEXIT0: MOVCOUNT,DLADDDL,30HMOVAH,2INT21HMOVAH,4CHINT21HCODE ENDSENDSTARTCMPAX,0JZEXIT0例例5.2JMPREPEAT39w例5.4将正数N插入一个已升序排列的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有的数均为正数。解法一:w从数组的尾部开始比较N较大,则在比较对象后插入,结束循环N较小,则把比较对象及其后元素后移一个字w循环结束的控制:执行插入操作后结束循环w若N比所有元素都小,扫描整个数组后仍无法结束循环,将-1加在数组前可解决该问题23,37,49,5232ENDHEAD-1,23,37,49,5232,-1,40开始(ARRAY_HEAD-2)-1初始化变址寄存器SI将N放在K的后面K=N修改地址K后移一个字单元结束YN例例5.441DATAREASEGMENTXDW?ARRAY_HEAD DW3,5,15,23,37,49ARRAY_END DW105NDW32DATAREAENDSPROGRAMSEGMENTMAINPROCFARASSUMECS:PROGRAM,DS:DATAREASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAREAMOVDS,AXMOVAX,NMOVARRAY_HEAD-2,-1MOVSI,0COMP:CMPARRAY_ENDSI,AXJLEINSERTMOVBX,ARRAY_ENDSIMOVARRAY_ENDSI+2,BXSUBSI,2JMPCOMPINSERT:MOVARRAY_ENDSI+2,AXRETMAINENDPPROGRAMENDSENDSTART例例5.4MOVBX,ARRAY_ENDSICMPBX,AXJLEINSERT42w例5.4将正数N插入一个已升序排列的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有的数均为正数。解法二:w从数组的头部开始比较N较小,则在比较对象前插入,结束循环N较大,则把比较对象及其前元素前移一个字w循环结束的控制:可扫描整个数组,循环次数为数组元素个数执行插入操作后结束循环w若N比所有元素都小,形成新的头;若N比所有元素都大,则被置于尾部43DSEGSEGMENTPARADATADW?ARRAY_HEADDW3,5,13H,23H,37HDW49H,52H,65H,78H,99H,105HCOUNT EQU($-ARRAY_HEAD)/2NDW32HDSEG ENDSCSEG SEGMENTPARACODEASSUMECS:CSEGASSUMEDS:DSEG,SS:SSEGMAIN PROCFAR;makeneccessaryinitalizalitionMOVAX,DSEGMOVDS,AXMOVES,AXMOVAX,NMOVSI,0MOVCX,COUNTREPEAT: MOVBX,ARRAY_HEADSICMPBX,AXJAEINSERT;N较小,则转插入操作MOVARRAY_HEADSI-2,BX;数组元素前移1字单元INCSIINCSILOOPREPEATINSERT: MOVARRAY_HEADSI-2,AX;将N加入到数组中MOVAX,4C00HINT21HMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT44例5.5设有数组X和Y,每个数组都有10个元素,完成以下计算:Z1=X1+Y1Z2=X2+Y2Z3=X3-Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10结果存入数组Z。比例尺:0000000011011100B45DATASEGMENTXDW11,33,10,60,4,7,19,80,45,23YDW44,5,2,90,78,32,12,10,100,98ZDW10HDUP(?)FLAGDW0000000011011100BDATAENDSSTKSEGMENTSTACKDW20HDUP(0)STKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STKSTART:MOVAX,DATAMOVDS,AXMOVBX,0MOVCX,10MOVDX,FLAGNEXT:MOVAX,XBXSHRDX,1JCSUBTRACTADDAX,YBXJMPRESULTSUBTRACT:SUBAX,YBXRESULT:MOVZBX,AXADDBX,2LOOPNEXTMOVAH,4CHINT21HCODEENDSENDSTART46三、多重循环程序设计w例5.7有一个首地址为A的N字数组,请编制程序使该数组中的数按照从大到小的次序整序冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不小于后一个元素;将所有元素比较完之后,最小的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次小的元素排在后面;如此重复,直至完成就实现元素从大到小的排序这需要一个双重循环程序结构47冒泡法的排序序号 数比比 较较 遍遍 数数1234 1 32 2 15 3 16 4 8 5 8532161585832168515832851615885321615848CSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFAR;MAKENECCESSARYINITALIZALITIONPUSHDSXORAX,AXPUSHAXMOVAX,DSEGMOVDS,AXMOVES,AXMOVCX,NDECCXLOOP1:MOVDI,CX;保存计数器MOVBX,0;数组地址指针清零LOOP2:MOVAX,ABXCMPAX,ABX+2JGECOTINUEXCHGABX+2,AX;交换MOVABX,AXCOTINUE:ADDBX,2;修改数组指针LOOPLOOP2MOVCX,DI;恢复循环计数器LOOPLOOP1RETMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT49CSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFAR;MAKENECCESSARYINITALIZALITIONPUSHDSXORAX,AXPUSHAXMOVAX,DSEGMOVDS,AXMOVES,AXMOVCX,NDECCXLOOP1:MOVDI,CX;保存计数器MOVBX,0;数组地址指针清零MOVDL,0LOOP2:MOVAX,ABXCMPAX,ABX+2JGECOTINUEXCHGABX+2,AX;交换MOVABX,AXINCDL;交换次数计数器+1COTINUE:ADDBX,2;修改数组指针LOOPLOOP2CMPDL,0JZEXIT0;数组已整序,则退出MOVCX,DI;恢复循环计数器LOOPLOOP1EXIT0:RETMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT505.3分支程序设计一、分支程序的结构形式二、分支程序的设计三、跳转表51一、分支程序的结构形式AH=0fuction0NAH=1AH=2fuction1fuction2NNYYY(C)多分支结构多分支结构52分支程序的设计方法w例5.9在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一无符号数,要求在数组中查找该数,如找到则使CF=0,并在SI中给出该元素的偏移地址;如未找到,则使CF=1。5354跳跃表法w例5.10试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去。n跳转目标的地址在数据段中(5-10-1.asm)n跳转目标的地址在代码段中(5-10-2.asm)55SSEGSEGMENTPARASTACKSTACKDW100HDUP(0)SSEGENDSDSEGSEGMENTPARADATATABDWROUTINE1;程序段1在代码段的偏移量DWROUTINE2DWROUTINE3DWROUTINE4DWROUTINE5DWROUTINE6DWROUTINE7DWROUTINE8MESSDBTHISISROUTINENUMBERDB8DB0AH,0DH,$DSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFARMOVAX,DSEG;makeneccessaryinitalizalitionMOVDS,AXMOVES,AXMOVAL,NUMBERCMPAL,0JECONTINUE_MAIN_LINE;AL值为0则继续运行主程序段LEABX,TABLOP1:SHRAL,1JNCNOT_YETJMPWORDPTRBXNOT_YET:ADDBX,TYPETABJMPLOP1CONTINUE_MAIN_LINE:MOVAH,4CHINT21H56ROUTINE1:MOVNUMBER,31HJMPEXITROUTINE2:MOVNUMBER,32HJMPEXITROUTINE3:MOVNUMBER,33HJMPEXITROUTINE4:MOVNUMBER,34HJMPEXITROUTINE5:MOVNUMBER,35HJMPEXITROUTINE6:MOVNUMBER,36HJMPEXITROUTINE7:MOVNUMBER,37HJMPEXITROUTINE8:MOVNUMBER,38HJMPEXITEXIT:MOVDX,OFFSETMESSMOVAH,9INT21HJMPCONTINUE_MAIN_LINE;MOVAH,0AH;INT21H;RETURNDOSMOVAX,4C00HINT21HMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT57SSEGSEGMENTPARASTACKSTACKDW100HDUP(0)SSEGENDSDSEGSEGMENTPARADATAMESG1:DBPLEASEINPUTTHENUMBER:$MESSDB0AH,0DH,THISISROUTINENUMBERDB?DB0AH,0DH,$DSEGENDSCSEGSEGMENTPARACODEASSUMECS:CSEG,DS:DSEG,SS:SSEGMAINPROCFAR;MAKENECCESSARYINITALIZALITIONMOVAX,DSEGMOVDS,AXMOVES,AXMOVDX,OFFSETMESG1MOVAH,9INT21HMOVAH,1;从键盘获得AL值INT21HANDAL,0FHDECAL;计算表地址(号-1)*3MOVBL,ALSHLBL,1ADDBL,ALMOVBH,0ADDBX,OFFSETTABJMPBXTAB:JMPROUTINE1JMPROUTINE2JMPROUTINE3JMPROUTINE4JMPROUTINE5JMPROUTINE6JMPROUTINE7JMPROUTINE8JMPROUTINE958ROUTINE1:MOVNUMBER,31HJMPEXITROUTINE2:MOVNUMBER,32HJMPEXITROUTINE3:MOVNUMBER,33HJMPEXITROUTINE4:MOVNUMBER,34HJMPEXITROUTINE5:MOVNUMBER,35HJMPEXITROUTINE6:MOVNUMBER,36HJMPEXITROUTINE7:MOVNUMBER,37HJMPEXITROUTINE8:MOVNUMBER,38HJMPEXITROUTINE9:MOVNUMBER,39HJMPEXITEXIT:MOVDX,OFFSETMESSMOVAH,9INT21H;MOVAH,0AH;INT21H;RETURNDOSMOVAX,4C00HINT21HMAINENDPCSEGENDSENDMAIN;SETENTRYPOINT
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号