《第六章 分支结构程序设计PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第六章 分支结构程序设计PPT讲稿.ppt(108页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 分支结构程分支结构程序设计序设计第1页,共108页,编辑于2022年,星期三带着问题学习:1分支程序结构有哪几种?分支程序结构有哪几种?2都有哪些指令可以实现分支?都有哪些指令可以实现分支?3可以对二进制的某一位操作的指令有哪可以对二进制的某一位操作的指令有哪些?些?4.系统是如何把程序调入内存执行的?系统是如何把程序调入内存执行的?5.菜单程序如何设计菜单程序如何设计?第2页,共108页,编辑于2022年,星期三学习要点学习要点掌握分支结构程序设计方法掌握分支结构程序设计方法掌握与分支有关的转移指令掌握与分支有关的转移指令深入分析程序转移的特征深入分析程序转移的特征第3页,共1
2、08页,编辑于2022年,星期三任务任务1 如何将学生姓名字符串如何将学生姓名字符串“Zhang San”变成变成“ZHANG SAN”?任务任务2 如何计算下面函数的值:如何计算下面函数的值:任务任务3 如何判断某一年是否是闰年?如何判断某一年是否是闰年?任务任务4 给出一百分制成绩,如何输出相应的给出一百分制成绩,如何输出相应的A、B、C、D,E等级?等级?第4页,共108页,编辑于2022年,星期三第六章第六章 分支结构程序设计分支结构程序设计6.1 分支结构分支结构6.2 与分支有关的指令与分支有关的指令-控制转移类指令控制转移类指令6.2.1无条件转移类指令无条件转移类指令6.2.2
3、条件转移类指令条件转移类指令6.2.3 与转移地址有关的寻址方式与转移地址有关的寻址方式6.3 分支结构程序设计举例分支结构程序设计举例第5页,共108页,编辑于2022年,星期三任务:任务:从键盘输入一个字符,判断该字符是否是小从键盘输入一个字符,判断该字符是否是小写字母?如果是小写字母,请把它转换成大写字母?如果是小写字母,请把它转换成大写字母输出,否则不转换,原样输出。写字母输出,否则不转换,原样输出。第6页,共108页,编辑于2022年,星期三Ch=z?显示字符显示字符否否是是否否是是将字符转换成大写将字符转换成大写是是否否是是输入一个字符输入一个字符chCh=a?Ch=z?显示字符显
4、示字符否否将字符转换成大写将字符转换成大写第7页,共108页,编辑于2022年,星期三MOV AH,01HINT 21HCMP AL,aJB DISPLAYCMP AL,zJA DISPLAYSUB AL,20HDISPLAY:MOV DL,ALMOV AH,02HINT 21HCh=z?显示字符显示字符否否是是否否是是将字符转换成大写将字符转换成大写第8页,共108页,编辑于2022年,星期三1两路分支结构两路分支结构2多级分支结构多级分支结构3多路分支结构多路分支结构图示图示图示分支结构种类分支结构种类6.1 分支结构分支结构需要满足一定的条件,才能实现分支转移!需要满足一定的条件,才能实
5、现分支转移!第9页,共108页,编辑于2022年,星期三6.2 控制转移类指令控制转移类指令控制转移类指令控制转移类指令用于实现分支、循环、过程等程序结构,用于实现分支、循环、过程等程序结构,是仅次于传送是仅次于传送指令的最常用指令指令的最常用指令 控控制制转转移移类类指指令令通通过过改改变变IP(和和CS)值值,实实现现程序执行顺序的改变程序执行顺序的改变第13页,共108页,编辑于2022年,星期三控制转移类指令控制转移类指令无条件转移指令无条件转移指令JMP条件转移指令条件转移指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/J
6、NBE、JLE/JNLE、JCXZ 循环指令循环指令 LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE 子程序调用和返回指令子程序调用和返回指令 CALL、RET中断与中断返回指令中断与中断返回指令 INT、INTO、IRET第14页,共108页,编辑于2022年,星期三6.2.1 无条件转移指令无条件转移指令只要执行无条件转移指令只要执行无条件转移指令JMP,就使程序转到指定,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令的目标地址处,从目标地址处开始执行那里的指令操作数操作数label是要转移到的是要转移到的目标地址目标地址(目的地址目的地址、转移地址转移地址)J
7、MP指令分成指令分成4种类型:种类型:段内转移、直接寻址段内转移、直接寻址 段内转移、间接寻址段内转移、间接寻址 段间转移、直接寻址段间转移、直接寻址 段间转移、间接寻址段间转移、间接寻址JMP label;程序转向label标号指定的地址JMPJMP第15页,共108页,编辑于2022年,星期三用来确定用来确定转移指令转移指令及及CALL指令指令的转向地址。的转向地址。与转移地址有关的寻址方式:与转移地址有关的寻址方式:段内段内寻址寻址 段内直接段内直接寻址寻址 JMP NEAR PTR NEXT 段内间接段内间接寻址寻址 JMP TABLE BX 段间段间寻址寻址 段间直接段间直接寻址寻址
8、 JMP FAR PTR NEXT 段间间接段间间接寻址寻址 JMP DWORD PTR BX 第16页,共108页,编辑于2022年,星期三目标地址的寻址方式目标地址的寻址方式直接寻址方式直接寻址方式转移地址象立即数一样,直接在指令的机转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式器代码中,就是直接寻址方式间接寻址方式间接寻址方式转移地址在寄存器或主存单元中,就是通转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式过寄存器或存储器的间接寻址方式用标号表达用寄存器或存储器操作数表达第17页,共108页,编辑于2022年,星期三目标地址的范围:段内目标地址的范围:
9、段内段内转移段内转移近转移(近转移(near)在当前代码段在当前代码段64KB范围内转移(范围内转移(32KB范围)范围)不需要更改不需要更改CS段地址,段地址,只要改变只要改变IP偏偏移地址移地址段内转移段内转移短转移(短转移(short)转移范围可以用一个字节表达,在段转移范围可以用一个字节表达,在段内内128127范围的转移范围的转移代代码码段段代代码码段段第18页,共108页,编辑于2022年,星期三目标地址的范围:段间目标地址的范围:段间段间转移段间转移远转移(远转移(far)从当前代码段跳转到另一个代码从当前代码段跳转到另一个代码段,可以在段,可以在1MB范围范围需要需要更改更改C
10、S段地址和段地址和IP偏移地址偏移地址目标地址必须用一个目标地址必须用一个32位数表达,位数表达,叫做叫做32位远指针位远指针,它就是逻辑地,它就是逻辑地址址代代码码段段代代码码段段 实实际际编编程程时时,汇汇编编程程序序会会根根据据目目标标地地址址的的距距离离,自自动动处处理理成短转移、近转移或远转移成短转移、近转移或远转移 程序员可用操作符程序员可用操作符short、near ptr 或或far ptr 强制强制第19页,共108页,编辑于2022年,星期三段内转移、直接寻址段内转移、直接寻址JMP labelJMP label;IPIP+IPIP+位移量位移量位移量是紧接着位移量是紧接着
11、JMP指令后的那条指令的偏移地址,到目标指令指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负移量为负jmp jmp againagain;转移到;转移到againagain处继续执行处继续执行again:again:dec cxdec cx;标号;标号againagain的指令的指令jmp jmp outputoutput;转向;转向outputoutputoutput:output:mov result,almov result,al;
12、标号;标号outputoutput的指令的指令实际为相对寻址第20页,共108页,编辑于2022年,星期三(1)段内直接寻址段内直接寻址转向的有效地址转向的有效地址=当前当前(IP)+位移量位移量(8bit/16bit)第21页,共108页,编辑于2022年,星期三例例:JMP NEAR PTR NEXT 近转移近转移 -32768 +32767 JMP SHORT NEXT 短转移短转移 -128 +127 第22页,共108页,编辑于2022年,星期三段内转移、间接寻址段内转移、间接寻址JMP r16/m16 JMP r16/m16;IPr16/m16IPr16/m16将一个将一个1616
13、位寄存器或主存字单元内容送入位寄存器或主存字单元内容送入IPIP寄存器,作为新的指令指针,但不修改寄存器,作为新的指令指针,但不修改CSCS寄存寄存器的内容器的内容jmp axjmp ax;IPAXIPAXjmp word ptr 2000hjmp word ptr 2000h;IP2000hIP2000h第23页,共108页,编辑于2022年,星期三(2)段内间接寻址段内间接寻址 转向的有效地址转向的有效地址是一个寄存器或存储单元的内容。是一个寄存器或存储单元的内容。(可用除立即数以外的任何一种数据寻址方式得到可用除立即数以外的任何一种数据寻址方式得到)例:例:(BX)=1256H (SI)
14、=528EH TABLE=20A2H (DS)=2000H (232F8H)=3280H (264E4H)=2450H JMP BX ;(IP)=1256H JMP TABLEBX JMP WORD PTR TABLEBX ;(IP)=3280H JMP BXSI JMP WORD PTR BXSI ;(IP)=2450H第24页,共108页,编辑于2022年,星期三段间转移、直接寻址段间转移、直接寻址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址将标号所在段的段地址作为新的将
15、标号所在段的段地址作为新的CS值,值,标号在该段内的偏移地址作为新的标号在该段内的偏移地址作为新的IP值;这值;这样,程序跳转到新的代码段执行样,程序跳转到新的代码段执行jmp far ptr othersegjmp far ptr otherseg;远转移到代码段;远转移到代码段2 2的的othersegotherseg第25页,共108页,编辑于2022年,星期三code1 segment jmp far ptr next code1 endscode2 segment next:.code2 ends(3)段间直接寻址段间直接寻址 用指令中提供的用指令中提供的转向段地址转向段地址和和偏移
16、地址偏移地址取代取代CS 和和 IP。例例:第26页,共108页,编辑于2022年,星期三段间转移、间接寻址段间转移、间接寻址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem+2CSmem+2用一个双字存储单元表示要跳转的目标地用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个址。这个目标地址存放在主存中连续的两个字单元中的,低位字送字单元中的,低位字送IPIP寄存器,高位字送寄存器,高位字送CSCS寄存器寄存器mov word ptr bx,0mov word ptr bx,0mov word ptr bx+2,1500h
17、mov word ptr bx+2,1500hJMP far ptr bx JMP far ptr bx ;转移到;转移到1500h:01500h:0第27页,共108页,编辑于2022年,星期三(4)段间间接寻址段间间接寻址 用存储器中的两个相继字的内容取代用存储器中的两个相继字的内容取代CS 和和 IP。(存储单元的地址可用除立即数和寄存器以外的存储单元的地址可用除立即数和寄存器以外的 任何一种数据寻址方式得到任何一种数据寻址方式得到)例:例:JMP DWORD PTR INTERS+BX第28页,共108页,编辑于2022年,星期三无条件转移指令无条件转移指令段内段内直接短转移:直接短转
18、移:JMP SHORT OPR执行操作:(IP)(IP)+8 位位移量段内段内直接近转移:直接近转移:JMP NEAR PTR OPR执行操作:(IP)(IP)+16 位位移量段内段内间接转移:间接转移:JMP WORD PTR OPR执行操作:(IP)(EA)第29页,共108页,编辑于2022年,星期三无条件转移指令无条件转移指令段间段间直接远转移直接远转移 JMP FAR PTR OPR 执行操作:执行操作:(IP)OPR 的段内偏移地址的段内偏移地址 (CS)OPR 所在段的段地址所在段的段地址段间段间间接转移:间接转移:JMP DWORD PTR OPR执行操作:执行操作:(IP)(
19、EA)(CS)(EA+2)第30页,共108页,编辑于2022年,星期三6.2.2 条件转移指令条件转移指令指定的条件指定的条件cc如果成立,程序转移到由标如果成立,程序转移到由标号号label指定的目标地址去执行指令;条件指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令不成立,则程序将顺序执行下一条指令操作数操作数label是采用短转移,称为相对寻址是采用短转移,称为相对寻址方式方式JccJccJcc label ;条件满足,发生转移:IPIP8位位移量 ;条件不满足,顺序执行第31页,共108页,编辑于2022年,星期三相对寻址方式相对寻址方式Jcc指令的操作数指令的操作数
20、label是一个标号是一个标号一个一个8位位移量,表示位位移量,表示Jcc指令后的那条指令的指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移偏移地址,到目标指令的偏移地址的地址位移8位位移量是位位移量是相对于相对于当前当前IP的,且距当前的,且距当前IP地地址址128127个单元的范围之内,属于段内个单元的范围之内,属于段内短距离转移短距离转移Jcc目标地址就采用这种目标地址就采用这种相对寻址方式相对寻址方式Jcc指令为指令为2个字节,条件不满足时的顺序个字节,条件不满足时的顺序执行就是当前指令偏移指针执行就是当前指令偏移指针IP加加2JccJcc第32页,共108页,编辑于2022
21、年,星期三Jcc指令的分类指令的分类Jcc指令不影响标志,但要利用标志(表指令不影响标志,但要利用标志(表2.2)。根据利用的标志位不同,)。根据利用的标志位不同,16条指令条指令分成分成3种情况:种情况:1.判断单个标志位状态判断单个标志位状态2.比较无符号数高低比较无符号数高低3.比较有符号数大小比较有符号数大小JccJcc第33页,共108页,编辑于2022年,星期三(1)根据根据单个条件标志单个条件标志的设置情况转移的设置情况转移 格式格式 测试条件测试条件JZ(JE)OPR ZF=1JZ(JE)OPR ZF=1JNZ(JNE)OPR ZF=0JNZ(JNE)OPR ZF=0JS OP
22、R SF=1JS OPR SF=1JNS OPR SF=0JNS OPR SF=0JO OPR OF=1JO OPR OF=1JNO OPR OF=0JNO OPR OF=0JP OPR PF=1JP OPR PF=1JNP OPR PF=0JNP OPR PF=0JC OPR CF=1JC OPR CF=1JNC OPR CF=0JNC OPR CF=0条件转移指令条件转移指令条件转移指令条件转移指令:(只能使用段内直接寻址的只能使用段内直接寻址的只能使用段内直接寻址的只能使用段内直接寻址的 8 8 位位移量位位移量位位移量位位移量 )第34页,共108页,编辑于2022年,星期三 (2)比
23、较比较两个两个两个两个无符号数无符号数,并根据比较结果转移,并根据比较结果转移,并根据比较结果转移,并根据比较结果转移 *格式格式 测试条件测试条件=JNB(JAE,JNC)OPR CF=0 JNBE(JA)OPR CF ZF=0*适用于地址或双精度数低位字的比较适用于地址或双精度数低位字的比较第35页,共108页,编辑于2022年,星期三(3)比较比较两个两个带符号数带符号数,并根据比较结果转移并根据比较结果转移 *格式格式 测试条件测试条件=JNL(JGE)OPR SF JNL(JGE)OPR SF OF=0OF=0=JNLE(J JNLE(JG G)OPR (SF)OPR (SF OF)
24、OF)ZF=0ZF=0适用于带符号数的比较适用于带符号数的比较(4)测试测试CXCX的值,为的值,为0 0则转移则转移 格式格式 测试条件测试条件 JCXZ OPR (CX)=0JCXZ OPR (CX)=0第36页,共108页,编辑于2022年,星期三1.判断单个标志位状态判断单个标志位状态这组指令单独判断这组指令单独判断5个状态标志之一个状态标志之一JZ/JE和和JNZ/JNE:利用零标志:利用零标志ZF,判断结果是否,判断结果是否为零(或相等)为零(或相等)JS和和JNS:利用符号标志:利用符号标志SF,判断结果是正是负,判断结果是正是负JO和和JNO:利用溢出标志:利用溢出标志OF,判
25、断结果是否产生溢,判断结果是否产生溢出出JP/JPE和和JNP/JPO:利用奇偶标志:利用奇偶标志PF,判断结果,判断结果中中“1”的个数是偶是奇的个数是偶是奇JC/JB/JNAE和和JNC/JNB/JAE:利用进位标志:利用进位标志CF,判断结果是否进位或借位判断结果是否进位或借位JccJcc例题例题3.32例题例题3.33例题例题3.34例题例题3.35例题例题3.36第38页,共108页,编辑于2022年,星期三2.比较无符号数高低比较无符号数高低无符号数的大小用高(无符号数的大小用高(Above)低)低(Below)表示)表示利用利用CF确定高低、利用确定高低、利用ZF标志确定相等标志
26、确定相等(Equal)两数的高低分成两数的高低分成4种关系:种关系:低于(不高于等于):低于(不高于等于):JB(JNAE)不低于(高于等于):不低于(高于等于):JNB(JAE)低于等于(不高于):低于等于(不高于):JBE(JNA)不低于等于(高于):不低于等于(高于):JNBE(JA)JccJcc第45页,共108页,编辑于2022年,星期三例6.7a:比较无符号数cmp ax,bxcmp ax,bx;比较;比较axax和和bxbxjnb nextjnb next;若;若axaxbxbx,转移,转移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:ne
27、xt:.结果:AX保存较大的无符号数第46页,共108页,编辑于2022年,星期三3.比较有符号数大小比较有符号数大小有符号数的大(有符号数的大(Greater)小()小(Less)需要组合)需要组合OF、SF标志,并利用标志,并利用ZF标志确定相等(标志确定相等(Equal)两数的大小分成两数的大小分成4种关系:种关系:小于(不大于等于):小于(不大于等于):JL(JNGE)不小于(大于等于):不小于(大于等于):JNL(JGE)小于等于(不大于):小于等于(不大于):JLE(JNG)不小于等于(大于):不小于等于(大于):JNLE(JG)JccJcc第47页,共108页,编辑于2022年,
28、星期三例6.7b:比较有符号数cmp ax,bxcmp ax,bx;比较;比较axax和和bxbxjnl nextjnl next;若;若axaxbxbx,转移,转移xchg ax,bxxchg ax,bx;若;若axaxbxbx,交换,交换next:next:.结果:AX保存较大的有符号数第48页,共108页,编辑于2022年,星期三JCXZ指令JCXZ label;CX0,转移到标号label第49页,共108页,编辑于2022年,星期三例6.8:记录空格个数mov cx,countmov cx,count;设置循环次数;设置循环次数mov si,offset stringmov si,o
29、ffset stringxor bx,bxxor bx,bx;bxbx0 0,记录空格数,记录空格数jcxz donejcxz donemov al,20hmov al,20h;如果长度为;如果长度为0 0,退出,退出again:again:cmp al,es:sicmp al,es:sijnz nextjnz next;ZFZF0 0非空格,转移非空格,转移inc bxinc bx;ZF=1ZF=1是空格,个数加是空格,个数加1 1next:next:inc siinc siloop againloop again;字符个数减;字符个数减1 1,不为,不为0 0继续循环继续循环dec cxj
30、nz againcmp cx,0jz next第50页,共108页,编辑于2022年,星期三例例6-9:如如果果 X 50,转转到到 TOO_HIGH;计计算算 X-Y,如如果果溢溢出出 转到转到 OVERFLOW,否则,否则|X-Y|RESULT JGJGJOJOJNSJNS MOV AX,XCMP AX,50 TOO_HIGHSUB AX,Y OVERFLOW NONNEGNEG AX NONNEG:MOV RESULT,AXTOO_HIGH:OVERFLOW:第51页,共108页,编辑于2022年,星期三例例6-10:、是是双双精精度度数数,分分别别存存于于 DX,AX 及及 BX,CX
31、 中中,时转时转 L1,否则转,否则转 L2 CMP DX,BX JG L1 JL L2 CMP AX,CX JA L1L2:L1:第52页,共108页,编辑于2022年,星期三单分支程序设计方法单分支程序设计方法根据条件标志位或结果根据条件标志位或结果实现分支转移实现分支转移,否则按否则按指令顺序继续执行指令顺序继续执行if(flag=1)转移;)转移;JZ/JC/JS/JO/JP/JBIf (flag=0)转移;转移;JNZ/JNC/JNS/JNO/JNP/JNB条件是否满足?条件是否满足?否否是是目的程序段目的程序段共有程序段共有程序段第53页,共108页,编辑于2022年,星期三双分支
32、程序设计方法双分支程序设计方法如果(条件满足如果(条件满足)则执则执行程序段行程序段1,否则执行,否则执行程序段程序段2注意程序段注意程序段1和程序段和程序段2的位置的位置注意程序段的出口注意程序段的出口条件是否满足条件是否满足执行程序段执行程序段1执行程序段执行程序段2否否是是共有程序段共有程序段跳转!跳转!第54页,共108页,编辑于2022年,星期三例例6-11.从键盘输入一个小写字母,将其换成大写从键盘输入一个小写字母,将其换成大写字母,输出字母,输出2.如果任务如果任务1中允许用户中允许用户多次测试字符多次测试字符,如,如何修改何修改?3.从键盘从键盘任意输入一个字符任意输入一个字符
33、,判断判断该字符是该字符是否是小写字母?如果是小写字母,请把它否是小写字母?如果是小写字母,请把它转换成大写字母输出,否则不转换,原样转换成大写字母输出,否则不转换,原样输出。输出。第55页,共108页,编辑于2022年,星期三MOV AH,01H;完成单个字符输入;完成单个字符输入INT 21HBEGIN:程序运行能结束吗?程序运行能结束吗?CMP AL,1BH JZ EXITCMP AL,a ;判断字符是否为小写字母?;判断字符是否为小写字母?JB DISPLAYCMP AL,zJA DISPLAYSUB AL,20H ;完成小写字母转换成大写;完成小写字母转换成大写DISPLAY:MOV
34、 DL,AL ;完成单个字符的显示输出;完成单个字符的显示输出MOV AH,02HINT 21HJMP BEGINMOV AH,4CH ;程序返回;程序返回INT 21HEXIT:第56页,共108页,编辑于2022年,星期三6.3分支程序实例分支程序实例例例6-11设设A、B、C三个单元存放着三个数,三个单元存放着三个数,若三个数都不为若三个数都不为0,则求三数之和放在,则求三数之和放在D单单元内,若其中有一个为元内,若其中有一个为0,则将另外两个也,则将另外两个也清清0。分析:此题为判断分析:此题为判断A、B、C三个数是否为三个数是否为0的分支程序。存贮单元的分配,题目已告诉,的分支程序。
35、存贮单元的分配,题目已告诉,变量名分别为变量名分别为A、B、C、D,都为字变量。,都为字变量。第57页,共108页,编辑于2022年,星期三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,4CHIN
36、T 21HL1:MOV A,0MOV B,0MOV C,0JMP EXITCODEENDSEND BEGINNYYNYNa=0?b=0?c=0?a+b+cDa、b、c清0开始结束第58页,共108页,编辑于2022年,星期三6.3分支程序实例分支程序实例例例6-12设计分支程序,实现下列公式计算。假设设计分支程序,实现下列公式计算。假设X数组中保存三个数组中保存三个16位带符号数:位带符号数:9,-6,34,根,根据它们不同的值,分别进行函数值据它们不同的值,分别进行函数值Y的计算,存的计算,存入入Y数组中。数组中。第59页,共108页,编辑于2022年,星期三设计思路:1.在数据段中定义数组
37、在数据段中定义数组X、Y,均为带符号,均为带符号数;数;2.在在X单元中分别取出三个数据作判断,根单元中分别取出三个数据作判断,根据据X的大小作分支转移;的大小作分支转移;3.采用寄存器相对寻址方式采用寄存器相对寻址方式(MOV AX,XSI)分别取出分别取出X的三个值;的三个值;4.标号标号OUT1是各路分支的公共出口。是各路分支的公共出口。第60页,共108页,编辑于2022年,星期三程序框图:第61页,共108页,编辑于2022年,星期三程序如下:程序如下:;6-11.asm 用正常程序格式编写分支程序用正常程序格式编写分支程序DATA SEGMENTX DW 9,-6,34Y DW 3
38、 dup(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,3;循环三次;循环三次MOV SI,0LET0:MOV AX,XSI;取出;取出XCMP AX,0;X 0?JGE LET1;是,转到;是,转到let1MOV BX,AX;否,计算;否,计算X*XIMUL BXJMP OUT;跳到公共出口;跳到公共出口out1第62页,共108页,编辑于2022年,星期三LET1:CMP AX,10;X 10?JGE LET2;是,转到;是,转到let2SAL AX,1;否,计算;否,计算2X+
39、3ADD AX,3JMP OUT;跳到公共出口;跳到公共出口out1LET2:MOV BL,6;计算;计算X/6IDIV BL;商在;商在al,余数在,余数在ahOUT:MOV YSI,AX;保存;保存YADD SI,2DEC CX;CX-1CMP CX,0JNZ LET0;CX0转移到转移到let0MOV AH,4CH;CX=0,程序结束,程序结束INT 21HCODE ENDSEND START返回第63页,共108页,编辑于2022年,星期三运行结果:运行结果:在在DOS下执行程序下执行程序5-1.exe后又返回到后又返回到DOS,没有显,没有显示。要观察运行结果,采用示。要观察运行结果
40、,采用DEBUG执行执行5-1.exe。在。在DEBUG下,用下,用U命令查看,找到断点命令查看,找到断点0039,用,用G 0039执行,再用执行,再用D命令查看结果命令查看结果。第64页,共108页,编辑于2022年,星期三设计思路:设计思路:(1)用用TEST测试指令来区分数字和字母:测试指令来区分数字和字母:数字的数字的ASCII码:码:30H39H 00110000B00111001B大写字母的大写字母的ASCII码:码:41H5AH 01000001B01011010B小写字母的小写字母的ASCII码:码:61H7AH 01100001B01111010B例例6-12 从从键键盘盘
41、输输入入一一串串字字符符,如如果果是是数数字字存存入入NUMB单单元元,如如果果是是字字母母,将将大大写写字字母母存存入入CAPI单单元元,小小写写字字母母存存入入LETT单元,分别统计个数,输入回车时退出。单元,分别统计个数,输入回车时退出。第65页,共108页,编辑于2022年,星期三数字和字母的第数字和字母的第6位不同。因此,区别数字和字母用位不同。因此,区别数字和字母用TEST AL,40H:第:第6位为位为0是数字,第是数字,第6位为位为1 则为字母。则为字母。大小写字母为第大小写字母为第5位不同。区别大小写字母用位不同。区别大小写字母用TEST AL,20H:第:第5位位为为0是大
42、写字母,第是大写字母,第5位为位为1则为小写字母。则为小写字母。用用CMP指令排除其它字符;指令排除其它字符;数字、大写字母、小写字母的个数分别放在数字、大写字母、小写字母的个数分别放在DI、SI、BX中。中。第66页,共108页,编辑于2022年,星期三程序如下:程序如下:data segment numb db 10 dup(?)capi db 10 dup(?)lett db 10 dup(?)data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlet0:mov ah,1;键盘输入键盘输入int 21h
43、cmp al,0dh;回车回车?jz exit;是,转是,转EXITtest al,40h;区分数字和字母区分数字和字母jz digit;排除字母,可能是数字,转排除字母,可能是数字,转digittest al,20h;区分大小写字母区分大小写字母jz char1;是大写,转是大写,转CHAR1mov lettbx,alinc bx;小写个数加小写个数加1 jmp let0第67页,共108页,编辑于2022年,星期三char1:cmp al,5ah;排除大小写之间的字符排除大小写之间的字符 ja exit mov capisi,al inc si;大写个数加大写个数加1 jmp let0di
44、git:cmp al,0;排除其它字符排除其它字符 jb exit cmp al,9 ja exitmov numbdi,al ;是数字;是数字inc di;数字个数加数字个数加1jmp let0exit:mov ah,4chint 21hcode endsend start第68页,共108页,编辑于2022年,星期三运行结果:运行结果:在在DEBUG下执行:下执行:第69页,共108页,编辑于2022年,星期三多分支程序设计方法多分支程序设计方法方法方法1 设计多路分支,通过设计多路分支,通过条件控制条件控制在程序在程序中直接使用控制转移指令实现多分支跳转中直接使用控制转移指令实现多分支跳
45、转方法方法2 组建组建分支表分支表,实现各分支跳转,实现各分支跳转2-1建立转移地址表建立转移地址表2-2建立转移指令表建立转移指令表方法方法3 设计逻辑尺设计逻辑尺第70页,共108页,编辑于2022年,星期三菜单程序设计菜单程序设计例例6-13设计菜单程序。实现三个功能:设计菜单程序。实现三个功能:1、小写字母转换为大写、小写字母转换为大写2、计算立方值、计算立方值3、退出、退出设计思路:设计思路:(1 1)在数据段中定义菜单。每行换行显示;)在数据段中定义菜单。每行换行显示;(2 2)用用9号功能显示菜单;号功能显示菜单;(3 3)根据输入选择执行某段程序。)根据输入选择执行某段程序。第
46、71页,共108页,编辑于2022年,星期三运行结果:运行结果:第72页,共108页,编辑于2022年,星期三data segmentmsg0 db 0ah,0dh,1.input string db 0ah,0dh,2.calculate cube db 0ah,0dh,3.exit db 0ah,0dh,select:$msg1 db 0ah,0dh,input:$msg2 db 0ah,0dh,output:$buff db 10,?,10 dup(?)x db?,?,?data ends程序如下:程序如下:第73页,共108页,编辑于2022年,星期三code segmentassum
47、e cs:code,ds:datastart:mov ax,data mov ds,axlet0:mov dx,offset msg0;显示菜单显示菜单 mov ah,9 int 21h mov ah,1;输入选择输入选择 int 21h cmp al,1 je prog1 cmp al,2 je prog2 jmp prog3;按其它键均退出按其它键均退出 第74页,共108页,编辑于2022年,星期三prog1:;菜单菜单1;6-1.asm 程序部分程序部分;输入英文单词输入英文单词,将小写字母转换为大写将小写字母转换为大写;jmp let0;返回主菜单返回主菜单prog2:;菜单菜单2;
48、6-2.asm 程序部分程序部分;计算计算0-9立方值立方值;jmp let0;返回主菜单返回主菜单prog3:;菜单菜单3.退出退出mov ah,4chint 21hcode endsend start设计多路分支完成,用控制转移类指令实现跳转!设计多路分支完成,用控制转移类指令实现跳转!方法方法1第75页,共108页,编辑于2022年,星期三方法2 用分支表实现多路转移 所所谓谓分分支支表表是是在在数数据据段段中中建建立立一一个个表表,表表中中存存放放要要转转移移的的程程序序段段的的名名字字(标标号号),也也就就是是偏偏移移地地址址,称称之之为为分分支支表表。在在程程序序中中访访问问这这个
49、个分分支支表表,取取得得程程序序段段名名字字,就就可可以以转转移移到相应的标号去执行。到相应的标号去执行。例例6-12 用分支表设计多路分支用分支表设计多路分支 1.计算并显示计算并显示z=x+y,2.将输入的字母改变大小写将输入的字母改变大小写,0.退出退出第76页,共108页,编辑于2022年,星期三用分支表设计多路分支用分支表设计多路分支方法方法2-1(建立转移地址表)(建立转移地址表)(建立转移地址表)(建立转移地址表)1.计算并显示计算并显示z=x+y,2.将输入的字母改变大小写将输入的字母改变大小写,0.退出退出设计思路:设计思路:1.在数据段中建立分支表在数据段中建立分支表TAB
50、LE,保存分支转移的标号,保存分支转移的标号2.根据键盘输入的根据键盘输入的02,计算分支标号在,计算分支标号在TABLE表中的地址表中的地址3.采用采用JMP TABLEBX,实现多路转移。,实现多路转移。第77页,共108页,编辑于2022年,星期三数据段定义数据段定义DATA SEGMENTTABLE DW prog0,prog1,prog2,prog0;分支表分支表MESS1 DB 0ah,0dh,input0-2:$MESS2 DB 0ah,0dh,z=x+y=$X DB 3 Y DB 6Z DB?DATA ENDS第78页,共108页,编辑于2022年,星期三code segmen