循环与分支程序设计课件.ppt

上传人:牧羊曲112 文档编号:3765120 上传时间:2023-03-21 格式:PPT 页数:58 大小:949KB
返回 下载 相关 举报
循环与分支程序设计课件.ppt_第1页
第1页 / 共58页
循环与分支程序设计课件.ppt_第2页
第2页 / 共58页
循环与分支程序设计课件.ppt_第3页
第3页 / 共58页
循环与分支程序设计课件.ppt_第4页
第4页 / 共58页
循环与分支程序设计课件.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《循环与分支程序设计课件.ppt》由会员分享,可在线阅读,更多相关《循环与分支程序设计课件.ppt(58页珍藏版)》请在三一办公上搜索。

1、第五章 循环与分支程序设计,5.1 循环与转移指令5.2 循环程序设计5.3 分支程序设计,5.1 循环与转移指令,一、循环控制指令二、转移指令,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,一、循环控制指令,8086指令系统的循环控制指令均为二字节指令一字节为转移的相对位移量(8位带符号的二进制数)IP IP+相对位移量 EIP EIP+相对位移量隐含使用CX作为循环计数器,程序中的某段需反复执行若干次时,用循环来实现,短转移,LOOP label;CXCX1,CX0,循环到标号label,一、循环控制指令,LOOPE/LOOPZ label;CXCX1,CX0 且ZF1,

2、循环到标号label,LOOPNE/NZ label;CXCX1,CX0且ZF0,循环到标号label,等于时循环,不等于时循环,一、循环控制指令(例),MOV CX,COUNT;设置循环次数MOV SI,OFFSET DATA_BYTEXOR AX,AX;BX清0,用于存放累加和 AGAIN:ADD AL,SIADC AH,0INC SILOOP AGAIN;计数器减1,不为0继续循环,一、循环控制指令(例),MOV CX,COUNT;设置循环次数MOV SI,OFFSET STRINGXOR BX,BX;BX清0,用于记录空格数MOV AL,20H AGAIN:CMP AL,SIJNZ N

3、EXT;ZF=0,非空格,转移INC BX;ZF=1,是空格,个数加1NEXT:INC SILOOP AGAIN;计数器减1,不为0继续循环,二、转移指令,无条件转移指令条件转移指令,无条件转移指令,JMP label;程序转向label标号指定的地址,NEARFAR,只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令,JMP指令分成4种类型:段内转移、直接寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,1.无条件转移指令目标地址的寻址方式,直接寻址方式转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式间接寻址方式转移地址在

4、寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式,用标号表达,用寄存器或存储器操作数表达,1.无条件转移指令目标地址的范围:段内,段内转移近转移(near)在当前代码段64KB范围内转移(32KB范围)不需要更改CS段基值,只要改变IP偏移地址段内转移短转移(short)转移范围可以用一个字节表达,在段内128127范围的转移,1.无条件转移指令目标地址的范围:段间,段间转移远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段基值和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址,实际编程时,汇编程序会根据目标地址的距离,自动处理成

5、短转移、近转移或远转移程序员可用操作符short、near ptr 或far ptr 强制,段内直接寻址转移,JMP label;IPIP+位移量位移量是紧接着JMP指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负,实际为相对寻址,JMP AGAIN;转移到AGAIN处继续执行AGAIN:DEC CX;标号AGAIN的指令JMP OUTPUT;转向OUTPUTOUTPUT:MOV RESULT,AL;标号OUTPUT的指令,段内间接寻址转移,JMP r16/m16;IPr16/m16将一个16位寄存器或主存字单元内容

6、送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容,JMP AX;IPAXJMP WORD PTR BX;IPBX,段间直接寻址转移,JMP far ptr label;IPlabel的偏移地址;CSlabel的段基值将标号所在段的段基值作为新的CS值,标号在该段内的偏移地址作为新的IP值;程序跳转到新的代码段执行JMP FAR PTR OTHERSEG;远转移到代码段2的otherseg,段间间接寻址转移,JMP far ptr mem;IPmem,CSmem+2用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存

7、器MOV WORD PTR BX,0MOV WORD PTR BX+2,1500HJMP FAR PTR BX;转移到1500H:0,2.条件转移指令,Jcc label;条件满足,发生转移:IPIP8位位移量;条件不满足,顺序执行,指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令操作数label是采用短转移,称为相对寻址方式,2.条件转移指令,Jcc指令的操作数label是一个标号一个8位位移量是相对于当前IP的,且距当前IP地址128127个单元的范围之内,属于段内短距离转移Jcc指令为2个字节,条件不满足时的顺序执行就是当

8、前指令偏移指针IP加2,2.条件转移指令指令的分类,Jcc指令不影响标志,但要利用标志。,根据利用的标志位不同,19条指令分成4种情况:判断单个标志位状态 比较无符号数高低 比较有符号数大小 判断计数器CX为0,实际虽然指令只有19条,但却有31个助记符 采用多个助记符,只是为了方便记忆和使用,判断单个标志位状态,这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)JS和JNS:利用符号标志SF,判断结果是正是负JO和JNO:利用溢出标志OF,判断结果是否产生溢出JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇JC

9、和JNC:利用进位标志CF,判断结果是否进位或借位,例 题,例 题,例 题,例 题,例 题,2.条件转移指令 JZ/JNZ指令,REPZ CMPSB;重复比较两个字符JNZ UNMAT;ZF0(不等),转移MOV AL,0;顺序执行(相等)JMP OUTPUT UNMAT:MOV AL,0FFH OUTPUT:MOV RESULT,ALREPZ CMPSB;重复比较两个字符JZ MAT;ZF1(相等),转移MOV AL,0FFH;顺序执行(不等)JMP OUTPUTMAT:MOV AL,0 OUTPUT:MOV RESULT,AL,2.条件转移指令 JS/JNS指令,计算|XY|(绝对值)。X

10、和Y为存放于X单元和Y单元的16位操作数,结果存入RESULT。,MOV AX,XSUB AX,YJNS NONNEGNEG AXNONNEG:MOV RESULT,AX,2.条件转移指令 JO/JNO指令,计算XY。X和Y为存放于X单元和Y单元的16位操作数,若溢出,则转移到OVERFLOW处理,MOV AX,XSUB AX,YJO OVERFLOW.;无溢出,结果正确OVERFLOW:.;有溢出处理,2.条件转移指令 JP/JNP指令,设字符的ASCII码在AL寄存器中。将字符加上奇校验位:在字符ASCII码中为“1”的个数为奇数时令其最高位为“0”,否则令最高位为“1”,AND AL,7

11、FH;最高位置“0”,同时判断“1”的个数JNP NEXT;个数已为奇数,则转向NEXTOR AL,80H;否则,最高位置“1”NEXT:.,2.条件转移指令 JC/JNC指令,记录BX中1的个数,XOR AL,AL;AL0,CF0AGAIN:TEST BX,0FFFFH;等价于 CMP BX,0JZ NEXTSHL BX,1JNC AGAININC ALJMP AGAINNEXT:.;AL保存1的个数,2.条件转移指令无符号数的比较,无符号数的大小用高(Above)低(Below)表示利用CF确定高低、利用ZF标志确定相等(Equal)两数的高低分成4种关系:高于(不低于等于):JA(JNB

12、E)高于等于(不低于):JAE(JNB)低于(不高于等于):JB(JNAE)低于等于(不高于):JBE(JNA),2.条件转移指令无符号数的比较(例),CMP AX,BX;比较AX和BXJAE NEXT;若AXBX,转移XCHG AX,BX;若AXBX,交换NEXT:.,结果:AX保存较大的无符号数,2.条件转移指令有符号数的比较,有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)两数的大小分成4种关系:小于(不大于等于):JL(JNGE)小于等于(不大于):JLE(JNG)大于(不小于等于):JG(JNLE)大于等于(不小于):JGE(J

13、NL),2.条件转移指令有符号数的比较(例),CMP AX,BX;比较AX和BXJGE NEXT;若AXBX,转移XCHG AX,BX;若AXBX,交换NEXT:.,结果:AX保存较大的有符号数,2.条件转移指令计数器CX为0转移,JCXZ label;CX0,发生转移:IPIP8位位移量;CX0,顺序执行,CX寄存器通常在程序中用做计数器JCXZ指令用来判断计数是否为0,5.2 循环程序设计,一、循环程序的结构形式二、循环程序设计三、多重循环程序设计,一、循环程序的结构形式,先循环,后判断,一、循环程序的结构形式,先判断,后循环,xor ax,ax;被加数ax清0mov cx,100agai

14、n:add ax,cx;从100,99,.,2,1倒序累加loop again,.model small.stack 256.datasumdw?.code.startupmov sum,ax;将累加和送入指定单元.exit 0end,二、循环程序设计(例),例5.2 在ADDR单元存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中,循环次数固定,完全由循环计数器控制,DATA SEGMENT YDW 1234H ADDRDW Y COUNTDB?DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,

15、AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16,REPEAT:SHL AX,1 JNC NEXT INC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DL MOV AH,4CH INT 21HCODE ENDS END START,例5.2,例5.2,DATA SEGMENTY DW 1234HADDR DW YCOUNT DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DL,0 MOV BX,ADDR MOV AX,BX MOV

16、 CX,16,REPEAT:SHL AX,1JNC NEXTINC DL NEXT:LOOP REPEAT EXIT0:MOV COUNT,DLADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21H CODEENDSEND START,CMP AX,0JZ EXIT0,例5.2,JMP REPEAT,例5.4 将正数N插入一个已升序排列的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_ HEAD 和ARRAY_ END,其中所有的数均为正数。,解法一:从数组的尾部开始比较,N较大,则在比较对象后插入,结束循环N较小,则把比较对象及其后元素后移一个字,若N

17、比所有元素都小,扫描整个数组后仍无法结束循环,将-1加在数组前可解决该问题,-1,例5.4,DATAREASEGMENT XDW?ARRAY_HEADDW 3,5,15,23,37,49 ARRAY_ENDDW 105 NDW 32 DATAREAENDS PROGRAMSEGMENT MAINPROC FAR ASSUME CS:PROGRAM,DS:DATAREA START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAREAMOV DS,AX,MOV AX,NMOV ARRAY_HEAD-2,-1MOV SI,0COMP:CMP ARRAY_ENDSI,AXJLE

18、 INSERTMOV BX,ARRAY_ENDSIMOV ARRAY_ENDSI+2,BXSUB SI,2JMP COMPINSERT:MOV ARRAY_ENDSI+2,AXRETMAINENDPPROGRAM ENDSEND START,例5.4,MOV BX,ARRAY_ENDSI CMP BX,AXJLE INSERT,例5.4 将正数N插入一个已升序排列的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_ HEAD 和ARRAY_ END,其中所有的数均为正数。,解法二:从数组的头部开始比较,N较小,则在比较对象前插入,结束循环N较大,则把比较对象及其前元素前移一个字,循环结

19、束的控制:,可扫描整个数组,循环次数为数组元素个数执行插入操作后结束循环,若N比所有元素都小,形成新的头;若N比所有元素都大,则被置于尾部,DSEGSEGMENT PARA DATADW?ARRAY_HEAD DW 3,5,13H,23H,37HDW 49H,52H,65H,78H,99H,105HCOUNTEQU($-ARRAY_HEAD)/2 NDW 32H DSEG ENDS CSEG SEGMENT PARA CODEASSUME CS:CSEG ASSUME DS:DSEG,SS:SSEG MAIN PROC FAR;MAKE NECCESSARY INITALIZALITIONMO

20、V AX,DSEGMOV DS,AXMOV ES,AX,MOV AX,NMOV SI,0MOV CX,COUNTREPEAT:MOV BX,ARRAY_HEADSICMP BX,AXJAE INSERT;N较小,则转插入操作MOV ARRAY_HEADSI-2,BX;数组元素前移1字单元INC SIINC SILOOP REPEATINSERT:MOV ARRAY_HEADSI-2,AX;将N加入到数组中MOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND MAIN;SET ENTRY POINT,例5.5 设有数组X和Y,每个数组都有10个元素,完成以下计算:Z1

21、=X1+Y1Z2=X2+Y2Z3=X3-Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10结果存入数组Z。比例尺:0000000011011100B,DATASEGMENTXDW 11,33,10,60,4,7,19,80,45,23YDW 44,5,2,90,78,32,12,10,100,98ZDW 10H DUP(?)FLAGDW 0000000011011100B DATAENDSSTKSEGMENT STACKDW 20H DUP(0)STKENDSCODESEGMENTASSUME CS:CODE,DS:DAT

22、A,SS:STKSTART:MOV AX,DATAMOV DS,AX,MOV BX,0MOV CX,10MOV DX,FLAGNEXT:MOV AX,XBXSHR DX,1JC SUBTRACTADD AX,YBXJMP RESULTSUBTRACT:SUB AX,YBXRESULT:MOV ZBX,AXADD BX,2LOOP NEXTMOV AH,4CHINT 21HCODEENDSEND START,三、多重循环程序设计,例5.7 有一个首地址为A的N字数组,请编制程序使该数组中的数按照从大到小的次序整序,冒泡法从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不小于后一个元素

23、;将所有元素比较完之后,最小的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次小的元素排在后面;如此重复,直至完成就实现元素从大到小的排序这需要一个双重循环程序结构,冒泡法的排序,CSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FAR;MAKE NECCESSARY INITALIZALITIONPUSH DSXOR AX,AXPUSH AXMOV AX,DSEGMOV DS,AXMOV ES,AXMOV CX,NDEC CXLOOP1:MOV DI,CX;保存计数器MOV BX,0;数组地

24、址指针清零LOOP2:MOV AX,ABXCMP AX,ABX+2JGE COTINUEXCHG ABX+2,AX;交换MOV ABX,AXCOTINUE:ADD BX,2;修改数组指针LOOP LOOP2MOV CX,DI;恢复循环计数器LOOP LOOP1RETMAIN ENDPCSEG ENDSEND MAIN;SET ENTRY POINT,CSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FAR;MAKE NECCESSARY INITALIZALITIONPUSH DSXOR AX,AXPUSH AXMOV

25、AX,DSEGMOV DS,AXMOV ES,AXMOV CX,NDEC CXLOOP1:MOV DI,CX;保存计数器MOV BX,0;数组地址指针清零MOV DL,0LOOP2:MOV AX,ABXCMP AX,ABX+2JGE COTINUEXCHG ABX+2,AX;交换MOV ABX,AXINC DL;交换次数计数器+1COTINUE:ADD BX,2;修改数组指针LOOP LOOP2CMP DL,0JZ EXIT0;数组已整序,则退出MOV CX,DI;恢复循环计数器LOOP LOOP1 EXIT0:RET MAIN ENDP CSEG ENDSEND MAIN;SET ENTRY

26、 POINT,5.3 分支程序设计,一、分支程序的结构形式二、分支程序的设计三、跳转表,一、分支程序的结构形式,分支程序的设计方法,例5.9 在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一无符号数,要求在数组中查找该数,如找到则使CF=0,并在SI中给出该元素的偏移地址;如未找到,则使CF=1。,跳跃表法,例5.10 试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去。跳转目标的地址在数据段中(5-10-1.asm)跳转目标的地址在代码段中(5-10-2.asm),SSEG SEGMENT

27、 PARA STACK STACKDW 100H DUP(0)SSEG ENDSDSEG SEGMENT PARA DATATABDW ROUTINE1;程序段1在代码段的偏移量DW ROUTINE2DW ROUTINE3DW ROUTINE4DW ROUTINE5DW ROUTINE6DW ROUTINE7DW ROUTINE8MESSDB THIS IS ROUTINE NUMBERDB 8DB 0AH,0DH,$DSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FARMOV AX,DSEG;MAK

28、E NECCESSARY INITALIZALITIONMOV DS,AXMOV ES,AX,MOV AL,NUMBERCMP AL,0JE CONTINUE_MAIN_LINE;AL值为0则继续运行主程序段LEA BX,TABLOP1:SHR AL,1JNC NOT_YETJMP WORD PTR BXNOT_YET:ADD BX,TYPE TABJMP LOP1CONTINUE_MAIN_LINE:MOV AH,4CHINT 21H,ROUTINE1:MOV NUMBER,31HJMP EXITROUTINE2:MOV NUMBER,32HJMP EXITROUTINE3:MOV NUMB

29、ER,33HJMP EXITROUTINE4:MOV NUMBER,34HJMP EXITROUTINE5:MOV NUMBER,35HJMP EXITROUTINE6:MOV NUMBER,36HJMP EXITROUTINE7:MOV NUMBER,37HJMP EXITROUTINE8:MOV NUMBER,38HJMP EXIT,EXIT:MOV DX,OFFSET MESSMOV AH,9INT 21HJMP CONTINUE_MAIN_LINE;MOV AH,0AH;INT 21H;RETURN DOSMOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND

30、 MAIN;SET ENTRY POINT,SSEG SEGMENT PARA STACK STACKDW 100H DUP(0)SSEG ENDSDSEG SEGMENT PARA DATAMESG1:DB PLEASE INPUT THE NUMBER:$MESSDB 0AH,0DH,THIS IS ROUTINE NUMBERDB?DB 0AH,0DH,$DSEG ENDSCSEG SEGMENT PARA CODEASSUME CS:CSEG,DS:DSEG,SS:SSEGMAIN PROC FAR;MAKE NECCESSARY INITALIZALITIONMOV AX,DSEGM

31、OV DS,AXMOV ES,AX,MOV DX,OFFSET MESG1MOV AH,9INT 21HMOV AH,1;从键盘获得AL值INT 21HAND AL,0FHDEC AL;计算表地址(号-1)*3MOV BL,ALSHL BL,1ADD BL,ALMOV BH,0ADD BX,OFFSET TABJMP BXTAB:JMP ROUTINE1JMP ROUTINE2JMP ROUTINE3JMP ROUTINE4JMP ROUTINE5JMP ROUTINE6JMP ROUTINE7JMP ROUTINE8JMP ROUTINE9,ROUTINE1:MOV NUMBER,31HJM

32、P EXITROUTINE2:MOV NUMBER,32HJMP EXITROUTINE3:MOV NUMBER,33HJMP EXITROUTINE4:MOV NUMBER,34HJMP EXITROUTINE5:MOV NUMBER,35HJMP EXITROUTINE6:MOV NUMBER,36HJMP EXITROUTINE7:MOV NUMBER,37HJMP EXITROUTINE8:MOV NUMBER,38HJMP EXITROUTINE9:MOV NUMBER,39HJMP EXIT,EXIT:MOV DX,OFFSET MESSMOV AH,9INT 21H;MOV AH,0AH;INT 21H;RETURN DOSMOV AX,4C00HINT 21HMAIN ENDPCSEG ENDSEND MAIN;SET ENTRY POINT,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号