资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第六讲第六讲 选择结构程序设计选择结构程序设计6.1 分支程序设计的两种结构分支程序设计的两种结构形式形式判定条件分支1分支2判定条件分支1分支2分支nYN(1)(2)相当于C语言的if、else相当于C语言的switch()6.2 与分支程序有关的指令与分支程序有关的指令n n1.无条件转移指令JMP1)段内直接短转移n n格式格式:JMPSHORTOPR:JMPSHORTOPRn n执行的操作执行的操作:(IP)-(IP)+8:(IP)-(IP)+8位位移量位位移量2)段内直接近转移n n 格式格式:JMPNEARPTROPR:JMPNEARPTROPRn n执行的操作执行的操作:(IP)-(IP)+16:(IP)-(IP)+16位位移量位位移量1.无条件转移指令无条件转移指令JMP 3)3)段内间接转移段内间接转移 n n 格式格式:JMPWORDPTROPR:JMPWORDPTROPRn n执行的操作执行的操作:(IP)-(EA):(IP)-(EA) 4)4)段间直接段间直接( (远远) )转移转移 n n格式格式:JMPFARPTROPR:JMPFARPTROPRn n执行的操作执行的操作:(IP)-OPR:(IP)-OPR的段内偏移地址的段内偏移地址 n n(CS)-OPR(CS)-OPR所在段的段地址所在段的段地址 5)5)段间间接转移段间间接转移n n格式格式:JMPDWORDPTROPR:JMPDWORDPTROPRn n执行的操作执行的操作:(IP)-(EA)(CS)-(EA+2):(IP)-(EA)(CS)-(EA+2)2.条件转移指令条件转移指令n n1)根据单个条件标志的设置情况转移JZ(JZ(或或JE)(Jumpifzero,orequal)JE)(Jumpifzero,orequal)n n结果为零结果为零( (或相等或相等) )则转移则转移n n格式格式:JE(:JE(或或JZ)OPRJZ)OPRn n测试条件测试条件:ZF=1:ZF=1JNZ(JNZ(或或JNE)(Jumpifnotzero,ornotJNE)(Jumpifnotzero,ornotequal)equal)n n结果不为零结果不为零( (或不相等或不相等) )则转移则转移n n格式格式:JNZ(:JNZ(或或JNE)OPRJNE)OPRn n测试条件测试条件:ZF=0:ZF=01)根据单个条件标志的设置情根据单个条件标志的设置情况转移况转移JS(Jumpifsign)结果为负则转移n n格式格式:JSOPR:JSOPRn n测试条件测试条件:SF=1:SF=1JNS(Jumpifnotsign)结果为正则转移n n格式格式:JNSOPR:JNSOPRn n测试条件测试条件:SF=0:SF=01)根据单个条件标志的设置情根据单个条件标志的设置情况转移况转移JO(Jumpifoverflow)溢出则转移n n格式格式:JOOPR:JOOPRn n测试条件测试条件:OF=1:OF=1JNO(Jumpifnotoverflow)不溢出则转移n n格式格式:JNOOPR:JNOOPRn n测试条件测试条件:OF=0:OF=01)根据单个条件标志的设置情根据单个条件标志的设置情况转移况转移JP(JP(或或JPE)(Jumpifparity,orparityeven)JPE)(Jumpifparity,orparityeven)奇偶位为奇偶位为1 1则转移则转移n n格式格式:JPOPR:JPOPRn n测试条件测试条件:PF=1:PF=1JNP(JNP(或或JPO)(Jumpifnotparity,orparityJPO)(Jumpifnotparity,orparityodd)odd)奇偶位为奇偶位为0 0则转移则转移n n格式格式:JNP(:JNP(或或JPO)OPRJPO)OPRn n测试条件测试条件:PF=0:PF=02)比较两个无符号数比较两个无符号数,并根据并根据比较的结果转移比较的结果转移n nJB(JB(或或JNAE,JC)OPRJNAE,JC)OPR低于,或者不高于或等低于,或者不高于或等于,或进位位为于,或进位位为1 1则转移则转移n nJNB(JNB(或或JAE,JNC)JAE,JNC)不低于,或者高于或等于,不低于,或者高于或等于,或进位位为或进位位为0 0则转移则转移n nJBE(JBE(或或JNA)(Jumpifbeloworequal,ornotJNA)(Jumpifbeloworequal,ornotabove)above)低于或等于低于或等于, ,或不高于则转移或不高于则转移n nJNBE(JNBE(或或JA)(Jumpifnotbeloworequal,orJA)(Jumpifnotbeloworequal,orabove)above)不低于或等于不低于或等于, ,或者高于则转移或者高于则转移3)比较两个带符号数比较两个带符号数,并根据并根据比较的结果转移比较的结果转移n nJL(JL(或或J JNGE)(Jumpifless,ornotgreaterorNGE)(Jumpifless,ornotgreaterorequal)equal)小于小于, ,或者不大于或者等于则转移或者不大于或者等于则转移n nJNL(JNL(或或JGE)(Jumpifnotless,orgreaterorJGE)(Jumpifnotless,orgreaterorequal)equal)不小于不小于, ,或者大于或者等于则转移或者大于或者等于则转移n nJLE(JLE(或或JNG)(Jumpiflessorequal,ornotJNG)(Jumpiflessorequal,ornotgreater)greater)小于或等于小于或等于, ,或者不大于则转移或者不大于则转移n nJNLE(JNLE(或或JG)(Jumpifnotlessorequal,orJG)(Jumpifnotlessorequal,orgreater)greater)不小于或等于不小于或等于, ,或者大于则转移或者大于则转移4)测试测试CX的值为的值为0则转移指令则转移指令n nJCXZ(JumpifCXregisteriszero)CX寄存器的内容为零则转移n n格式:JCXZOPRn n测试条件:(CX)=0分析下列程序段分析下列程序段n nADDAX,BXn nJNOL1n nJNCL2n nSUBAX,BXn nJNCL3n nJMPSHORTL5n n如果AX和BX的内容给定如下:n nAXBXn n1.147B 80DCn n2.B56854B7n n3.42C8608Dn n4.D0239FD0n n5.94B7B568n n问该程序执行完后,程序转向哪里?6.2 分支程序设计举例分支程序设计举例code segmentcode segmentassume cs:codeassume cs:codeinput:input:mov ah,01hmov ah,01hint 21hint 21hcmp al,20hcmp al,20hjz exitjz exitcmp al,61hcmp al,61hjl inputjl inputcmp al,7bhcmp al,7bhjge inputjge input例1 编写一个汇编语言程序,对键盘输入的小写字母用大写字母显示出来sub al,20hsub al,20hmov dl,almov dl,almov ah,02hmov ah,02hint 21hint 21hjmp inputjmp inputexit:exit: mov ah,4ch mov ah,4chint 21hint 21hcode endscode endsendend例例例例2 2 编写程序,从键盘接收一个小写字母,然后找出编写程序,从键盘接收一个小写字母,然后找出编写程序,从键盘接收一个小写字母,然后找出编写程序,从键盘接收一个小写字母,然后找出他的前导字母和后续字母,再按顺序显示这三个字符。他的前导字母和后续字母,再按顺序显示这三个字符。他的前导字母和后续字母,再按顺序显示这三个字符。他的前导字母和后续字母,再按顺序显示这三个字符。code segmentcode segmentassume cs:codeassume cs:codeinput:input:mov ah,07hmov ah,07hint 21hint 21hcmp al,20hcmp al,20hje exitje exitcmp al,61hcmp al,61hjl inputjl inputcmp al,7ahcmp al,7ahjg inputjg inputprint: sub al,01hprint: sub al,01hmov dl,almov dl,almov ah,02hmov ah,02hint 21hint 21hadd al,01hadd al,01hmov dl,almov dl,almov ah,02hmov ah,02hint 21hint 21hadd al,01hadd al,01hmov dl,almov dl,al mov ah,02h mov ah,02hint 21hint 21hjmp inputjmp inputexit: mov ah,4chexit: mov ah,4chint 21hint 21hcode endscode endsend end 例例例例3 3 将将将将AXAX寄存器中的寄存器中的寄存器中的寄存器中的1616位数分成位数分成位数分成位数分成4 4组,每组组,每组组,每组组,每组4 4位,然后把这四组数分别放在位,然后把这四组数分别放在位,然后把这四组数分别放在位,然后把这四组数分别放在AL,BL,CLAL,BL,CL和和和和DLDL中中中中Data segmentData segment X db 4 dup(?)X db 4 dup(?)Data endsData endsCode segmentCode segment assume cs:code,ds:data assume cs:code,ds:datastart:push dsstart:push ds sub ax,axsub ax,ax push axpush ax mov ax,datamov ax,data mov ds,ax mov ds,ax mov ax,1234hmov ax,1234h mov cl,04hmov cl,04h mov ch,4mov ch,4 mov si,0mov si,0 mov di,0mov di,0repeat: rol ax,clrepeat: rol ax,cl mov bl,almov bl,al and bl,0fhand bl,0fh mov xsi,blmov xsi,bl inc siinc si dec chdec ch jnz repeatjnz repeat mov al,xmov al,x mov bl,x1mov bl,x1 mov cl,x2mov cl,x2 mov dl,x3mov dl,x3 retretcode endscode endsend startend start例例例例4 4 已知三个数在数据区中存放,将它们按照已知三个数在数据区中存放,将它们按照已知三个数在数据区中存放,将它们按照已知三个数在数据区中存放,将它们按照从大到小的顺序排列出来从大到小的顺序排列出来从大到小的顺序排列出来从大到小的顺序排列出来dat segmentdat segment a db 1,5,3 a db 1,5,3dat endsdat endscod segmentcod segment assume cs:cod,ds:dat assume cs:cod,ds:datstart:start: mov ax,dat mov ax,dat mov ds,ax mov ds,ax mov ah,2 mov ah,2 mov dl,a mov dl,a or dl,30h or dl,30h int 21h int 21h mov dl,a+1 mov dl,a+1 or dl,30h or dl,30h int 21hint 21h mov dl,a+2 mov dl,a+2 or dl,30h or dl,30h int 21h int 21h mov dl,0ah mov dl,0ah int 21h int 21h mov dl,0dh mov dl,0dh int 21h int 21h mov al,a mov al,a cmp al,a+1 cmp al,a+1 ja l1 ja l1 mov ah,a+1 mov ah,a+1 mov a,ah mov a,ah mov a+1,al mov a+1,all1: mov al,al1: mov al,a cmp al,a+2 cmp al,a+2 jal2jal2movah,a+2movah,a+2mova,ahmova,ahmova+2,almova+2,all2:moval,a+1l2:moval,a+1cmpal,a+2cmpal,a+2jal3jal3movah,a+2movah,a+2mova+2,almova+2,almova+1,ahmova+1,ahl3:movah,2l3:movah,2movdl,amovdl,aordl,30hordl,30hint21hint21hmovdl,a+1movdl,a+1ordl,30hordl,30hint21hint21hmovdl,a+2movdl,a+2ordl,30hordl,30hint21hint21hmovah,4chmovah,4chint21hint21hcodendscodendsendstartendstart例例例例5 5 比较数组比较数组比较数组比较数组BUFBUF中的三个中的三个中的三个中的三个1616位补码,位补码,位补码,位补码,若三个数都不相等则显示若三个数都不相等则显示若三个数都不相等则显示若三个数都不相等则显示0 0,有两个相,有两个相,有两个相,有两个相等则显示等则显示等则显示等则显示1 1,都相等则显示,都相等则显示,都相等则显示,都相等则显示2 2。 n n假定三个假定三个数为数为a a、b b、c c,D D为比为比较结果较结果 STACKSEGMENTSTACKDB 200 DUP(0)STACKENDSDATASEGMENTBUFDW a, b, cDATAENDSCODESEGMENT ASSUME CS: CODE, DS: DATA, SS: STACKBEGIN:MOV AX, DATAMOV DS, AXMOV DL, 0MOV AX, BUF; aAXCMP AX;BUF+2; a=b?JNZ L1INC DLL1:MOV BX; BUF+2; bBXCMP BX, BUF+4; b=c?JZ L2; b=c转转L2CMP AX, BUF+4JNZ L3; ac转转L3L2:INC DLL3:ADD DL, 30H;(DL)变变为为ASCII码码MOV AH, 2INT 21HMOV AH, 4CHINT 21HCODEENDSEND BEGINL3L2L1NYYNYND = 0a=b?D+1Db=c?a=c?D+1D显示显示D开始开始结束结束例例例例6 6 设设设设A A、B B、C C三个单元存放着三个数,三个单元存放着三个数,三个单元存放着三个数,三个单元存放着三个数,若三个数都不为若三个数都不为若三个数都不为若三个数都不为0 0,则求三数之和放在,则求三数之和放在,则求三数之和放在,则求三数之和放在DD单元内,若其中有一个为单元内,若其中有一个为单元内,若其中有一个为单元内,若其中有一个为0 0,则将另外两,则将另外两,则将另外两,则将另外两个也清个也清个也清个也清0 0。 此题为判断此题为判断A A、B B、C C三三个数是否为个数是否为0 0的分的分支程序。存贮单支程序。存贮单元的分配,题目元的分配,题目已告诉,变量名已告诉,变量名分别为分别为A A、B B、C C、D D,都为字变量,都为字变量。 STACKSEGMENTSTACKDB 200 DUP(0)STACKENDSDATASEGMENTADW aBDW bCDW cDDW ?DATAENDSCODESEGMENTASSUME CS: CODE, DS: DATA, SS: STACKBEGIN:MOV AX, DATAMOV DS, AXCMP A, 0JZ L1CMP B, 0JZ L1CMP C, 0JZ L1MOV AX, AADD AX, BADD AX, CMOV D, AXEXIT:MOV AH, 4CHINT 21HL1:MOV A, 0MOV B, 0MOV C, 0JMP EXITCODEENDSEND BEGINNYYNYNa=0?b=0?c=0?a+b+cDa、b、c清0开始结束例例例例7 7 从键盘上键入从键盘上键入从键盘上键入从键盘上键入0 0至至至至9 9中的任一自然数中的任一自然数中的任一自然数中的任一自然数x x,求,求,求,求其立方值。若输入的字符不是其立方值。若输入的字符不是其立方值。若输入的字符不是其立方值。若输入的字符不是0 0至至至至9 9中的数字,中的数字,中的数字,中的数字,则显示错误信息,并要求重新输入。则显示错误信息,并要求重新输入。则显示错误信息,并要求重新输入。则显示错误信息,并要求重新输入。DatasegmentDatasegmentInputdbpleaseinputx(09):$Inputdbpleaseinputx(09):$Tabdw0,1,8,27,64,125,216,343,512,729Tabdw0,1,8,27,64,125,216,343,512,729Xdb?Xdb?Xxxdw?Xxxdw?Inerrdb0ah,0dh,inputerror!TryInerrdb0ah,0dh,inputerror!Tryagain.,0ah,0dh,$again.,0ah,0dh,$DataendsDataendsStacksegmentStacksegmentDb200dup(0)Db200dup(0)StackendsStackendsCodesegmentCodesegmentAssumecs:code,ds:data,ss:stackAssumecs:code,ds:data,ss:stackBegin:movax,dataBegin:movax,dataMovds,axMovds,axNext:movdx,offsetinputNext:movdx,offsetinputMovah,9Movah,9Int21hInt21hCmpal,0Cmpal,0JberrJberrCmpal,9Cmpal,9JaerrJaerrAndal,0fhAndal,0fhMovx,alMovx,alXorbxXorbxMovbl,alMovbl,alSalbx,1Salbx,1Movax,tabbxMovax,tabbxMovxxx,axMovxxx,axExit:movah,4chExit:movah,4chInt21hInt21hErr:movdx,offsetinerrErr:movdx,offsetinerrMovah,9Movah,9Int21hInt21hJmpnextJmpnextCodeendsCodeendsEndbeginEndbegin练习练习n n试编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号