《分支程序设计》PPT课件.ppt
第5讲 分支结构程序设计,掌握:顺序结构程序设计分支结构程序设计,5.1 顺序结构程序设计,完全按程序中的书写顺序逐条执行,称为顺序程序。顺序程序往往是复杂程序结构的一部分。如分支结构的一个分支,循环结构的循环体等。,实例分析,已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生学号放在变量NO中,查出的英语成绩放在变量EN中。,实例分析,DATA SEGMENTTABDB 68,78,42,84,80,85,56,77,87,56NODB6ENDB?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV BL,NO;学号送AL寄存器MOV BH,0DEC BXMOV AL,TABBXMOV EN,AL;结果保存在ENGLISH单元MOV AX,4C00HINT 21HCODE ENDS END START,52分支结构程序设计,521分支程序结构,522转移指令,1无条件转移指令 JMP,无条件转移指令的功能是无条件转移到指定的地址去执行从该地址开始的指令。,段内转移 段内直接转移 段内间接转移 段间转移 段间直接转移 段间间接转移,分类,程序举例:manyseg.asm,(1)段内直接转移 段内直接短转移 格式:JMP SHORT 标号 功能:IPIP+8位偏移量,转移范围为-128+127 段内直接近转移 格式:JMP NEAR PTR 标号 功能:IPIP+16位偏移量,转移范围为-32768+32767(2)段内间接转移 格式:JMP WORD PTR OPR 功能:IP(EA)OPR是16位的通用寄存器或字存储器。,段内转移,段内转移指令举例,JMP SHORT L_PRO1 JMP NEAR PTR L_PRO2 JMP SI JMP BX JMP WORD PTRBX JMP WORD PTRBP+DI+20H,段间转移,(4)段间直接转移格式:JMP FAR PTR 标号功能:IPOPR的偏移地址,CSOPR的段地址(5)段间间接转移格式:JMP DWORD PTR OPR功能:IP(EA),CS(EA+2)OPR是存储器,段间转移指令举例,1 CODE2 SEGMENT CODE1 SEGMENT PRO1:MOV JMP FAR PTR PRO1 CODE1 ENDS CODE2 ENDS2 JMP DWORD PTRBX+DI DS=4000H,BX=1230H,DI=02H 计算物理地址:40000H+1230H+2=41232H,说明:,无条件转移指令不影响标志位,2.条件转移指令:(1)判断单个状态标志,格式测试条件JC/JNC地址标号;CF=1/CF=0,有进位/无进位则转移JE/JNE地址标号;ZF=1/ZF=0,结果相等/不相等则转移JZ/JNZ地址标号;ZF=1/ZF=0,结果为零/不为零则转移JS/JNS地址标号;SF=1/SF=0,结果为负/为正则转移JO/JNO地址标号;OF=1/OF=0,结果溢出/不溢出则转移JP/JNP地址标号;PF=1/PF=0,奇偶位为1/奇偶位为0则转移,计算 X-Y,X和Y为16位操作数,结果存入result。MOV AX,X;SUB AX,Y;JNS NO_NEG;(X-Y)如为正数,不求绝对值 NEG AX;求绝对值 NO_NEG:MOV result,AX;保存结果2.设字符的ASCII码在AL,给字符加上奇校验位。AND AL,7FH;D7置0,D6D0不变,测“1”个数 JNP NEXT;D6D0已有奇数个“1”,不处理 OR AL,80H;偶数个“1”,校验位置“1”NEXT:,指令举例,助记符 标志 说 明 JB/JNAE/JC CF=1 低于/不高于不等于()JNB/JAE/JNC CF=0 不低于/高于或等于()JBE/JNA CF=1或ZF=1 低于或等于/不高于()JNBE/JA CF=0且ZF=0 不低于不等于/高于()指令举例:AX和BX为无符号数,比较大小,将较大的数放入AX CMP AX,BX;JNB NEXT;如AXBX,不处理 XCHG AX,BX;AXBX,AX与BX交换 NEXT:,(2)比较无符号数高低(条件为一个标志或标志组合),A:高于,B:低于,E:等于,助记符 标志 说 明 JL/JNGE SFOF 小于/不大于且不等于()JNL/JGE SFOF 不小于/大于或等于()JLE/JNG SFOF或ZF=1 小于或等于/不大于()JNLE/JG SFOF且ZF=0 不小于且不等于/大于()指令举例:AX和BX为有符号数,比较大小,将较大的数放入AX CMP AX,BX;JNL NEXT;如AXBX,不处理 XCHG AX,BX;AXBX,AX与BX交换 NEXT:,(3)比较有符号数大小(条件为标志组合),G:大于,L:小于,E:等于,(4)JCXZ指令,CX值为0则转移,说明,条件转移指令不影响标志位条件转移指令只能实现段内转移,8086转移范围是128127,条件转移指令和无条件转移指令JMP用于实现程序的分支结构。条件转移指令是以当前标志位的状态为条件,其前要安排设置标志位的指令,如加减法、比较、测试等指令。,5.2.3 分支程序设计,根据NUM中的值(04),执行不同的操作,用逻辑分解法编写程序。DATA SEGMENT NUM DB 2 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,NUM CMP AL,0 JZ NEXT0;AL=0转 CMP AL,1 JZ NEXT1;AL=1转 CMP AL,2,1.逻辑分解法分支程序设计,JZ NEXT2;AL=2转 CMP AL,3 JZ NEXT3;AL=3转 CMP AL,4 JZ NEXT4;AL=4转 NEXT0:MOV DL,30H JMP EXIT NEXT1:MOV DL,31H JMP EXIT NEXT2:MOV DL,32H JMP EXIT NEXT3:MOV DL,33H JMP EXIT NEXT4:MOV DL,34H EXIT:MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,逻辑分解法多分支程序设计2,设数据X、Y均为字节型变量,编写计算下面函数值的程序。.MODEL SMALL.STACK.DATA X DB-5 Y DB?.CODESTART:MOVAX,DATA MOVDS,AX CMPX,0 JGE CASE1;当X0时,则到CASE1 MOVY,-1;当X0时,-1Y JMPDONECASE1:JGCASE2;当X0时,则转到 CASE2 MOVY,0;当X=0时,0Y JMPDONECASE2:MOVY,1;X0时,1YDONE:MOVAX,4C00H INT21H END START,2.地址表法多分支程序设计,把各分支程序段的入口地址(一般是偏移地址)依次存放在一起,形成地址表。各分支程序段的编号作为转移条件,根据条件首先在地址表中找到转移的目标地址,然后转到相应位置,从而实现多分支。表地址计算公式:表地址=编号*2+地址表首地址,使用地址表实现多分支。5个分支的标号分别为ADDR0,ADDR1在代码段有:ADDR0:mov dx,ADDR1:mov 设ADDR0的偏移地址为2300h,ADDR1的偏移地址为2500h。在数据段有:ADTAB dw ADDR0,ADDR1,相对ADTAB的偏移量,例 根据NUM单元中值(04)的不同,执行不同的操作,用地址表法编写程序,转入分支:按输入的数字转入不同分支按输入的数字求出分支相对ADTAB的偏移量:ADDR0为0,ADDR1为2,ADDR2为4,如输入数字1,则偏移量为12=2,将求出的偏移量存入SI。执行指令jmp ADTABSI,设SI=02 则IP ADTAB+SI 即IP 2500HCS:2500H为分支ADDR1的入口,CPU即执行分支ADDR1,DATA SEGMENT NUM DB 2 ADTAB DW ADDR0,ADDR1,ADDR2,ADDR3,ADDR4 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,NUM MOV AH,0 ADD AX,AX MOV SI,AX,地址法例题分析/1,求偏移,地址表,编号,MOV BX,ADTABSI JMP BX ADDR0:MOV DL,30H JMP EXIT ADDR1:MOV DL,31H JMP EXIT ADDR2:MOV DL,32H JMP EXIT ADDR3:MOV DL,33H JMP EXIT ADDR4:MOV DL,34H EXIT:MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,地址法例题分析/2,转移指令,5.3 位操作指令,1、逻辑运算指令AND OR XOR NOT TEST2、移位指令SHL SHR SAR,ROL ROR RCL RCR,一、逻辑运算指令1.AND 逻辑与指令,指令格式:AND DST,SRC指令功能:将源操作数和目标操作数按位进行逻辑“与”运算,然后将结果送入目标操作数。AND reg,imm/reg/mem AND mem,imm/regAND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,*AND应用举例*,AND指令可用于复位某些位(同0相与),不影响其他位 例:将某一位十进制数的ASCII码转化成十进制数 MOV AL,37H AND AL,0FH;屏蔽AL的高4位 运算结果(AL)=07H,2.OR 逻辑或指令,指令格式:OR DST,SRC指令功能:将源操作数与目标操作数按位进行逻辑“或”运算并将结果送入目标操作数。OR reg,imm/reg/mem OR mem,imm/regOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,*OR应用举例*,利用OR指令可以方便地设置某些位。例:将一位十进制数转化成相应的ASCII码 MOV AL,09H OR AL,30H;将AL的高4位设置为3 运算结果(AL)=39H,3.NOT 逻辑非指令,指令格式:NOT OPR指令功能:本指令将给定的操作数按位求反。NOT reg/mem;reg/memreg/mem对标志位的影响:不影响。,4.XOR 逻辑异或指令,指令格式:XOR DST,SRC指令功能:将源操作数与目标操作数按位进行“异或”运算,其结果保留在目标操作数中。XOR mem,imm/reg;memmemimm/reg XOR reg,imm/reg/mem;regregimm/reg/memXOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,*XOR应用*,可以用来给寄存器置0。XOR指令可用于求反某些位(同1相异或),不影响其他位。,*XOR应用举例*,例1:将CX置为0 XOR CX,CX 例2:将BL中D3和D0位求反,其他不变(对指定位)XOR BL,00001001B,5.TEST 测试指令,指令格式:TEST OPR1,OPR2指令功能:TEST指令将两个操作数按位进行逻辑“与”运算,但不保存结果,只根据特征设置状态位 TEST mem,imm/reg TEST reg,imm/reg/memOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,*TEST应用举例:*,例:测试AL第二位是否为1,若为1则转移到EXIT执行。指令序列如下:TEST AL,00000100B JNZ EXIT;结果为1转移到EXIT,不改变操作数,测试操作数或操作数的指定位,二、移位指令,移位指令循环移位指令,1.移位指令,逻辑左右移与算术左右移,SHL reg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0,SHR reg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0,SAL reg/mem,1/CL;算术左移,最高位进入CF,最低位补0,SAR reg/mem,1/CL;算术右移,最低位进入CF,最高位不变,演示,示意图,next,示意图,逻辑左移 SHL AL,1的执行,移位指令应用举例,mov cl,4mov al,0f0h;al=f0h,无符号数240d,有符号数-16dsal al,1;al=e0h,无符号数224d,有符号数-32d;CF=1,SF=1、ZF=0、PF=0,OF=0shr al,1;al=70h,无符号数112d,有符号数112d,sar al,1;al=38h,无符号数56d,有符号数56d,sar al,cl;al=03h,无符号数3d,有符号数3d,;CF=1,SF=0、ZF=0、PF=1,移位指令的应用,算术运算指令用于带符号数运算SAL用于乘2,SAR用于除2逻辑移位指令则用于无符号数运算SHR用于除2,示例,*可以做字节操作,也可以做字操作,还可以做双字操作*CNT=1,SHL OPR,1 CNT1,MOV CL,CNT SHL OPR,CL;以SHL为例*条件标志位:CF=移入的数值 1 CNT=1时,最高有效位的值发生变化 0 CNT=1时,最高有效位的值不变 当CNT1时,OF位不确定。SF、ZF、PF 根据移位结果设置,AF无定义,OF=,*移位指令注意事项:*,示意图,移位指令分析,SHL AX,1 SAR BP+SI,1 错误 SHR BH,1 SAR AL,3 错误,2.循环移位指令,ROL reg/mem,1/CL;不带进位循环左移,ROR reg/mem,1/CL;不带进位循环右移,RCL reg/mem,1/CL;带进位循环左移,RCR reg/mem,1/CL;带进位循环右移,示意图,示意图,不带进位循环移位指令,带进位循环移位指令,例:,例1.将DX,AX中的32位数左移一位。SHL AX,1 RCL DX,1移位指令和循环移位指令结合,可实现32位数乘2除2。,*循环移位指令注意事项:*,*可以进行字节操作,也可以进行字操作。*条件标志位:CF=移入的数值 1 CNT=1时,最高有效位的值发生变化 0 CNT=1时,最高有效位的值不变 当CNT1时,OF位不确定。不影响 SF、ZF、PF、AF,OF=,Thank you!,