《二分支程序设计.ppt》由会员分享,可在线阅读,更多相关《二分支程序设计.ppt(41页珍藏版)》请在三一办公上搜索。
1、2023/5/31,宁波大学科技学院计算机系,1,第五章(二)分支程序设计,2023/5/31,宁波大学科技学院计算机系,2,二.分支程序设计,CASE 结构 IF-THEN-ELSE 结构,分支实现方法:(1)逻辑分解法(2)地址表法(3)转移表法(跳跃表法)(值与地址有对应关系的表)逻辑尺法,2023/5/31,宁波大学科技学院计算机系,3,一、与转移地址有关的寻址方式:,1、段内寻址 段内直接寻址 JMP NEAR PTR 标号名 段内间接寻址 JMP BX JMP WORD PTR 存储单元寻址2、段间寻址 段间直接寻址 JMP FAR PTR 标号名 段间间接寻址 JMP DWORD
2、 PTR 存储单元寻址,用来确定转移指令及CALL指令的转移地址。与转移有关的寻址方式(参见P28):,2023/5/31,宁波大学科技学院计算机系,4,(1)段内直接寻址(目的地址由标号给出),转向的有效地址=当前(IP)+位移量(8bit/16bit)位移量位移量64KB,IP,2023/5/31,宁波大学科技学院计算机系,5,目的地址是相对于IP当前地址来转移的,它是相对寻址方式。例:JMP NEAR PTR NEXT 近转移16位-32768+32767 JMP SHORT NEXT 短转移8位-128+127 EA CS:EA 指令地址注意:用于无条件转移时可以是16位或8位;用于条
3、件转移时只能是8位。,位移量,IP当前值,2023/5/31,宁波大学科技学院计算机系,6,(2)段内间接寻址(目的地址在存储器中)转向的有效地址EA在一个寄存器或存储单元中。(可以用除了立即数以外的任何一种寻址方式得到)例:(BX)=1256H(SI)=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注意:这种寻址方式只能用于无条件转
4、移,且要用WORD PTR标志内存 单元的类型是有效地址的字类型。,2023/5/31,宁波大学科技学院计算机系,7,段间直接寻址(目的地址由标号给出)完成从一个段到另一个段的转移。CS和IP两项都要修改。用指令中提供的转移目标的段地址和偏移地址取代CS 和 IP。注意:只能用于无条件转移,且要用far ptr说明目标标号的属性。例:执行时:将next的段属性值送CS,将其有效地址值送IP。,2023/5/31,宁波大学科技学院计算机系,8,段间间接寻址(目的地址在存储器中)完成从一个段到另一个段的转移。用存储器中的两个相继字的内容取代CS 和 IP。(存储单元的地址可用除立即数和寄存器以外的
5、 任何一种数据寻址方式得到)只能用于无条件转移。例:JMP DWORD PTR INTERS+BX,2023/5/31,宁波大学科技学院计算机系,9,二、控制转移指令:无条件转移指令 JMP 条件转移指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ 循环指令 LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE 子程序调用和返回指令 CALL、RET 中断与中断返回指令 INT、INTO、IRET,2023/5/31,宁波大学科技学院计算机系,10,1、无条件转移指令JMP(参见P47):
6、分类:段内转移只改变IP的值段间转移既改变IP的值又改变CS的值段内直接短转移:JMP SHORT OPR 执行操作:(IP)(IP)+8位位移量(OPR$)例如:JMP SHORT NEXT段内直接近转移:JMP NEAR PTR OPR 执行操作:(IP)(IP)+16位位移量(OPR$)例如:JMP NEAR PTR NEXT段内间接转移:JMP WORD PTR OPR 执行操作:(IP)(EA)例如:JMP WORD PTR BX,2023/5/31,宁波大学科技学院计算机系,11,段间直接远转移:JMP FAR PTR OPR 执行操作:(IP)OPR 的段内偏移地址(CS)OPR
7、 所在段的段地址例如:JMP FAR PTR NEXT段间间接转移:JMP DWORD PTR OPR 执行操作:(IP)(EA)(CS)(EA+2)例如:JMP DWORD PTR BX其中:EA为OPR所给定的寻址方式的EA JMP指令不影响标志位,2023/5/31,宁波大学科技学院计算机系,12,2、条件转移指令:注意:只能使用段内直接寻址的8 位位移量(-128+127)(1)根据单个条件标志的设置情况转移 格式 测试条件JZ(JE)OPR ZF=1JNZ(JNE)OPR ZF=0JS OPR SF=1JNS OPR SF=0JO OPR OF=1JNO OPR OF=0JP OPR
8、 PF=1JNP OPR PF=0JC OPR CF=1JNC OPR CF=0其中:OPR只能是标号,不能是存储单元寻址。,2023/5/31,宁波大学科技学院计算机系,13,课堂练习,一位有符号十进制数的输入、输出:1、键盘输入X(9X7)2、求Y=X+2(7Y9)3、输出Y注意:X的输入要判断符号位如果是负数则需要输入两次,第二次接收值,且要求补码;正数只要输入一次。Y的输出也一样对负数要先输出负号,其值要求补码再输出。,2023/5/31,宁波大学科技学院计算机系,14,JS/JNS 否 是CMP AL,否 是 JZ/JNZ JMP B B JMP A A,开始,输入AL,AL=,X=
9、AL-30H,输入AL,AL-30H,X=AL求补,ALX,Y=AL+2,Y是负数,求Y的绝对值,输出,DLY+30H,输出Y,返回DOS,结束,2023/5/31,宁波大学科技学院计算机系,15,比较两个无符号数,并根据比较结果转移 格式 测试条件=JNB(JAE,JNC)OPR CF=0 JNBE(JA)OPR CFZF=0其中:CF ZF CFZF 含义 表示的条件0 0 0 无借位,不为0 0 1 1 无借位,为0=1 0 1 有借位,不为0 1 1 1 有借位,为0=适用于地址或双精度数低位字的比较,2023/5/31,宁波大学科技学院计算机系,16,例如:判断X,等于100则输出=
10、,大于100输出,小于100输出,100=100 100,程序段:MOV AL,XCMP AL,100JA NEXTA;100转NEXTAJZ NEXTE;=100转NEXTEMOV DL,JMP EXITNEXTE:MOV DL,=EXIT:MOV AH,2;输出一个字符 INT 21H,AL(X),AL与100比较,DL=,DL=,DL=,输出,2023/5/31,宁波大学科技学院计算机系,17,(3)比较两个带符号数,并根据比较结果转移 格式 测试条件=JNL(JGE)OPR SFOF=0 JNLE(JG)OPR(SFOF)ZF=0适用于带符号数的比较其中:SF OF SFOF 含义 表
11、示的条件0 0 0 为正或0,无溢出 0 1 1 为正或0,有溢出 1 0 1 为负,无溢出 1 1 0 为负,有溢出 若有溢出则为其逆条件,2023/5/31,宁波大学科技学院计算机系,18,SF OF ZF SFOF(SFOF)ZF含义表示的条件 0 0 000为正,不为0,无溢出 0 0 101为0 0 1 011见前页 0 1 111 1 0 011 1 0 011 1 1 000为负,溢出 1 1 101为0,2023/5/31,宁波大学科技学院计算机系,19,例:求A字节单元中数据的绝对值,存放到B字节单元中。程序段:MOVAL,ACMP AL,0;与0比较JGE NEXT;0则不
12、求补NEG AL;否则求补NEXT:MOV B,AL,2023/5/31,宁波大学科技学院计算机系,20,例:如果有符号数 X50,转到TOO_HIGH;否则计算 XY,如果溢出则转到 OVERFLOW;否则|XY|RESULT,JGJOJNS,2023/5/31,宁波大学科技学院计算机系,21,例:A、B 是有符号双精度数,分别存于 DX,AX 及 BX,CX 中,A B 时转 GREATER,否则转 LESS。分析:先比较高字,若相等再比较低字;高字要考虑符号。,CMP DX,BX JG GREATER JL LESS CMP AX,CX JA GREATERLESS:GREATER:,2
13、023/5/31,宁波大学科技学院计算机系,22,思考,P142/4,2023/5/31,宁波大学科技学院计算机系,23,三.多分支程序设计,用来完成多分支的实现,类似于高级语言中的CASE语句。实现方法:1、逻辑分解法利用条件语句实现,用于双分支或多分支。2、转移表法转移的入口地址集中放到程序中,用标号表示起始地址,段内短转移每地址占2字节,近转移则3字节。3、跳跃表法(地址表法)将转移的入口地址集中放到数据段,其起始地址用变量名表示,因为地址占2字节,所以表地址=地址表首址+控制字*24、逻辑尺法利用一个控制字作为逻辑尺,根据其中的每一位是0还是1来作为是或不是两种不同操作的判断依据。操作
14、前必须事先根据需要设置好逻辑尺的数据。,2023/5/31,宁波大学科技学院计算机系,24,1、逻辑分解法,否 是 否 是,程序段:MOV AL,X MOV BL,Y CMP AL,BL JZ ZERO JL LESS MOV DL,JMP EXITLESS:MOV DL,JMP EXITZERO:MOV DL,=EXIT:MOV AH,02H INT 21H,开始,输入X、Y,XY?,XY?,输出,输出,输出,返回DOS,结束,2023/5/31,宁波大学科技学院计算机系,25,2、转移表法,格式:转移指令集中放在在代码段中START:LEA BX,TABLE;转移表首址BX MOV AH,
15、01H INT 21H;输入控制字AL SUB AL,30H MOV AH,0 ADD AX,AX;控制字*2,因为短转移占2字节 ADD BX,AX;BX基址+偏移地址 JMP BX;注意!BX不能加,因为目标;地址在指令中,而不是在存储单元中。TABLE:JMP SHORT MODE0;转移表 JMP SHORT MODE1 JMP SHORT MODE2,2023/5/31,宁波大学科技学院计算机系,26,MODE0:;相应的分支程序JMP EXITMODE1:JMP EXITMODE2:JMP EXITEXIT:,2023/5/31,宁波大学科技学院计算机系,27,3、跳跃表法(地址表
16、法),格式:转移地址集中放在在数据段中做成一个表DATA SEGMENTX DB?;转移地址序号TABLE DWADDR0,ADDR1,ADDR2,;转移地址表DATA ENDS 如果分支地址比较多也可以表示为:TABLEDWADDR0DWADDR1DWADDR2,2023/5/31,宁波大学科技学院计算机系,28,CODE SEGMENTMOV AH,01H;输入控制字INT 21HSUB AL,30HMOV X,ALMOV AH,0;扩展到AXADD AX,AX;AX*2,因为每个地址占2字节 MOV SI,AX;偏移量SILEA BX,TABLESI;转移地址BXJMP BX;取数据段中
17、的地址值,;注意BX的 不能少,2023/5/31,宁波大学科技学院计算机系,29,ADDR0:JMP EXITADDR1:JMP EXITADDR2:JMP EXITEXIT:,2023/5/31,宁波大学科技学院计算机系,30,课堂练习1,分别用逻辑分解法、转移表法和跳跃表法实现:键盘输入一位数(04),根据其值分别输出MODE0MODE4,2023/5/31,宁波大学科技学院计算机系,31,1、逻辑分解法,DATA SEGMENTNUM DB?TB0 DB MODE0$TB1 DB MODE1$TB2 DB MODE2$TB3 DB MODE3$TB4 DB MODE4$DATA END
18、SCODE SEGMENT,2023/5/31,宁波大学科技学院计算机系,32,接收键盘输入AL LEA DX,TB4AL30HNUM JMP EXIT另起一行EXIT0:LEA DX,TB0MOV AL,NUM JMP EXITCMP AL,0EXIT1:LEA DX,TB1JZ EXIT0 JMP EXITCMP AL,1EXIT2:LEA DX,TB2JZ EXIT1 JMP EXITCMP AL,2EXIT3:LEA DX,TB3JZ EXIT2EXIT:MOV AH,09HCMP AL,3 INT 21HJZ EXIT3 CODE ENDSEND START,2023/5/31,宁波
19、大学科技学院计算机系,33,2、转移表法,DATA SEGMENTNUM DB?TB0 DB MODE0$TB1 DB MODE1$TB2 DB MODE2$TB3 DB MODE3$TB4 DB MODE4$DATA ENDSCODE SEGMENT,2023/5/31,宁波大学科技学院计算机系,34,接收键盘输入ALAL30H NUM换行MOV AL,NUMLEA BX,BTABMOV AH,0SHL AX,1ADD BX,AXJMP BXBTAB:JMP SHORT MD0JMP SHORT MD1JMP SHORT MD2JMP SHORT MD3 JMP SHORT MD4,MD0:
20、LEA DX,TB0 JMP EXIT MD1:LEA DX,TB1 JMP EXITMD2:LEA DX,TB2 JMP EXIT MD3:LEA DX,TB3 JMP EXITMD4:LEA DX,TB4EXIT:MOV AH,09H INT 21HCODE ENDS END START,2023/5/31,宁波大学科技学院计算机系,35,3、地址表法(跳跃表法),DATA SEGMENTNUM DB?ADTAB DW MD0,MD1,MD2,MD3,MD4TB0 DB MODE0$TB1 DB MODE1$TB2 DB MODE2$TB3 DB MODE3$TB4 DB MODE4$DA
21、TA ENDSCODE SEGMENT,2023/5/31,宁波大学科技学院计算机系,36,接收键盘输入ALAL30H NUM换行MOV AL,NUMMOV AH,0ADD AX,AXMOV SI,AXMOV BX,ADTABSIJMP BX,MD0:LEA DX,TB0 JMP EXIT MD1:LEA DX,TB1 JMP EXITMD2:LEA DX,TB2 JMP EXIT MD3:LEA DX,TB3 JMP EXITMD4:LEA DX,TB4EXIT:MOV AH,09H INT 21H CODE ENDS END START,2023/5/31,宁波大学科技学院计算机系,37,
22、4、逻辑尺法,对于被控对象进行两种不同的处理时可以使用逻辑尺方法,逻辑尺中每一位控制一个对象,根据其为0或为1的不同来决定对对象的不同操作,所以逻辑尺的长度取决于被控对象的个数。方法:1、使用一个字节(字)来控制8(16)个对象设计逻辑尺:其中0表示处理序列0,1表示处理序列1 2、逻辑尺左移/右移一位 3、判CF=0/1?若为0则转移到处理序列0,否则转移 到处理序列1 4、循环转移到2、进行下一个对象的控制,直到全部处 理完毕。所以逻辑尺方法往往用于循环结构中来实现,目前只能用条件语句来控制循环。,1 1 0 1 0 1 0 0,2023/5/31,宁波大学科技学院计算机系,38,例如:在
23、STR中存放了8个不同的字符,已知逻辑尺的值已经放在AL中,1表示输出该位对应的字符,0表示不输出。DATA SEGMENTSTR DB ABCDEFGHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA NEXT:INC BXMOV DS,AX DEC CXLEA BX,STR JNZ LOPMOV CX,8 MOV AH,4CH LOP:ROR AL,1 INT 21H JNC NEXT;不输出 CODE ENDS MOV DL,BX;输出 END STARTMOV AH,02HINT 21H,2023/5/31,宁波大
24、学科技学院计算机系,39,课堂练习2,用逻辑尺法实现:键盘输入一位数(1、2、4、8),根据其值分别输出MODE1MODE8data segment num db?adtab dw addr1,addr2,addr4,addr8 tb1 db mode1$tb2 db mode2$tb4 db mode4$tb8 db mode8$next db 0dh,0ah,$data ends,2023/5/31,宁波大学科技学院计算机系,40,code segment assume cs:code,ds:datastart:mov ax,data mov ds,ax mov ah,01h;输入一个数
25、int 21h sub al,30h;得其值 mov num,al lea dx,next;换行 mov ah,09h int 21h mov al,num lea bx,adtablop:shr ax,1;判是1、2、4、8吗?jnc nxt;不是 jmp word ptr bx;是nxt:add bx,type adtab;修改指针 jmp lop;继续判断,addr1:lea dx,tb1 mov ah,09h int 21h jmp exitaddr2:lea dx,tb2 mov ah,09h int 21h jmp exitaddr4:lea dx,tb4 mov ah,09h int 21h jmp exitaddr8:lea dx,tb8 mov ah,09h int 21hexit:mov ah,4ch int 21hcode ends end start,2023/5/31,宁波大学科技学院计算机系,41,思考,Page 142 4 5 6,