1、第六章分支结构程序,6.1分支结构程序的引出 6.2转移指令 6.3分支结构程序设计 6.4多分支结构程序设计,6.1分支结构程序的引出,用计算机处理问题过程中,总是要求计算机能做出各种逻辑判断,并根据判断的结果,做相应的处理。 例如,火车站用计算机计算托运行李的托运费,当旅客行李重量小于或等于20kg时,收费0.2元/kg,当行李重量超过20kg时,20kg以内部分0.2元/kg,超出部分,收费0.3元/kg。这个处理过程,可归纳为下面数学表达式: 0.2w(w20kg) 0.2*20+0.3*(w-20)(w20kg),P=,6.2转移指令,6.2.1无条件转移指令6.2.2条件转移指令,
2、6.2.1无条件转移指令,指令汇编格式:JMP targ 操作:段内转移:IP目标的偏移地址 段间转移:IP目标的偏移地址 CS目标所处代码段的基址 受影响的状态标志位:无 说明:指令中的targ可以是直接标号、寄存器间接或存储器间接寻址形式。,6.2.1无条件转移指令,(1)段内转移(NEAR) 1)段内直接转移 JMP LABEL_N ;LABEL_N在当前代码段 JMP SHORT LABEL_N ;LABEL_N在当前代码段,且在-128127范围内; 例:,6.2.1无条件转移指令,CSEG SEGMENTASSUME CS:CSEG START: JMP L1JMP SHORTL2
3、JMP L2JMP START L2: NOPORG L2+100H L1: NOP CSEG ENDSEND,6.2.1无条件转移指令,0000 CSEG SEGMENTASSUME CS:CSEG 0000E9010AR START: JMP L1 0003EB05 JMP SHORTL2 0005EB0390 JMP L2 0008EBF6 JMP START 000A90 L2: NOP 010A ORG L2+100H 010A90 L1: NOP 010B CSEG ENDSEND,6.2.1无条件转移指令,(1)段内转移(NEAR) 2)段内寄存器间接转移 JMP AX 3)段内
4、存储器间接转移 JMP SI JMP WORD PTRBX+DI+1000H,6.2.1无条件转移指令,(2)段间转移(FAR) 1)段内直接转移JMP LABELF 2)短内存储器直接转移 LABEL_D DD 12345678HJMP LABEL_DJMP DWORD PTR BX ,6.2.2条件转移指令,条件转移指令是根据CPU中状态标志位的状态决定程序执行的流程,既可能产生程序转移,也可能不产生程序转移。条件转移指令是以对不同的状态标志的测试为条件。如果 条件成立,则控制转移到指令中所给出的转移目标。条件不成立,程序将顺序执行。所有的条件转移指令均为短(short)转移。,6.2.2
5、条件转移指令,1.根据单标志转移的指令,Even,Odd,6.2.2条件转移指令,2.根据两数(A,B)的大小关系转移的指令 (1)使用该指令前用过比较(CMP A,B)、减法(SUB A,B、SBB A,B)指令。 (2)A与B的关系共有6种:AB A (3)比较转移时分无符号数和带符号数。例如: A=11111111B B=00000001B,6.2.2条件转移指令,Below Above Less Great Equal,6.2.2条件转移指令,JNAE JNA JNBE JNB JNGE JNG JNLE JNL,6.2.2条件转移指令,CMP A,B JL XXX SFOF=1(SF
6、=1&OF=0,SF=0&OF=1) 例: A=81H B=02H CMP A,B 结果 SF=0,OF=1,6.3分支结构程序设计-例6.1,例6.1设X为单字节带符号整数,且存于ARGX单元,计算结果Y存入RLT单元。,6.3分支结构程序设计-例6.1,X+10 (0X8) 5X-2 (8X15) X (X=0,X15) -X (X0),Y=,6.3分支结构程序设计-例6.1,1:;*EXAM6.1* 2:SSEG SEGMEN TSTACK 3:STK DB 50DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:ARGX DB -5 7:RLT DB ? 8:DSE
7、G ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:BEGIN: MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,SIZESTK,17: MOV AL,ARGX ;取X值 18: AND AL,AL ;置标志位 19: JS ABSL ;X0转 20: JZ MOVE ;X=0转 21: CMP AL,8 ;X8? 22: JLE ONE ;是,转 23: CMP AL,15 ;X15? 24: JGE MOVE ;是,
8、转 25: SAL AL,1 ;计算5X-2 26: SAL AL,1 27: ADD AL,ARGX 28: SUB AL,2 29: JMP MOVE 30:ONE: ADD AL,10 ;X8,计算X+10 31: JMP MOVE 32:ABSL: NEG AL ;取补 33:MOVE:MOV RLT,AL ;保存结果 34: MOV AH,4CH 35: INT 21H 36:CSEG ENDS 37: END BEGIN,6.3分支结构程序设计-例6.1,6.3分支结构程序设计-例6.2,例6.2设内存中有三个互不相等的无符号字数据,分别存放在ARG开始的字单元,编制程序将其中最大
9、值存入MAX单元。,6.3分支结构程序设计-例6.2,1:;*EXAM6.2* 2:SSEG SEGMENT STACK 3:STK DB 20 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:ARG DW 7138H,84A6H,29EH 7:MAXDW ? 8:DSEG ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:FMAX:MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,SIZESTK,1
10、7: LEA SI,ARG ;取数据首址 18: MOV AX,SI ;取第1个数 19: MOV BX,SI+2 ;取第2个数 20: CMP AX,BX ;两数比较 21: JAE FMAX1 ;AX中的数大 22: MOV AX,BX ;大数送AX 23:FMAX1:CMP AX,SI+4 ;大数与第3个数比较 24: JAE FMAX2 ;AX中的数大 25: MOV AX,SI+4 ;第3个数大大值 26:FMAX2:MOV MAX,AX ;保存最大值 27: MOV AH,4CH 28: INT 21H 29:CSEG ENDS 30: ENDF MAX,6.3分支结构程序设计-例
11、6.2,6.3分支结构程序设计-例6.3,例6.3内存由ADR单元开始存放两个带符号字数据,编制程序,若两数同号将FLAG单元置0,否则置全1。 判断两数是否同号,即判断两个数的最高位是否相同,若相同即为同号。判断的方法有两种:第一种方法:先取出一个数,判断符号是否为正,若为正,再判断另一个数的符号是否为正,也为正,则两数同号,否则为异号;若第一个数的符号为负判断另一个数的符号是否为负,也为负,则两数同号,否则为异号。,6.3分支结构程序设计-例6.3,1:;*EXAM6.3.1* 2:SSEG SEGMENT STACK 3:STK DB 20 DUP(0) 4:SSEG ENDS 5:DS
12、EG SEGMENT 6:ADR DW 73A5H,924BH 7:FLAG DB ? 8:DSEG ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:START: MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,SIZESTK,6.3分支结构程序设计-例6.3,17: MOV AX,ADR 18: AND AX,AX ;置标志 19: JNS PLUS ;正转 20: MOV AX,ADR+2 21: AND AX,AX
13、 ;第二个数置标志 22: JS SAME ;同为负 23:UNSAME: MOV AL,0FFH;异号标志 24: JMP LOAD 25:PLUS: TEST ADR+2,8000H;第二个数置标志 26: JS UNSAME ;异号 27:SAME: XOR AL,AL ;同号标志 28:LOAD: MOV FLAG,AL ;存标志 29: MOV AH,4CH 30: INT 21H 31:CSEG ENDS 32: END START,1001 0010 0100 1011 1000 0000 0000 0000,6.3分支结构程序设计-例6.3,0111 0011 1010 010
14、1 1001 0010 0100 1011,1110 0001 1110 1110,换个算法:,1:;*EXAM6.3.1* 2:SSEG SEGMENT STACK 3:STK DB 20 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:ADR DW 73A5H,924BH 7:FLAG DB ? 8:DSEG ENDS 9:CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12:START: MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,A
15、X 16: MOV SP,SIZE STK,6.3分支结构程序设计-例6.3,6.3分支结构程序设计-例6.3,17: MOV AX,ARG 18: XOR AX,ARG+2 ;两数异或 19: MOV AL,0 ;同号标志 20: JNS LOAD ;同号 21: DEC AL ;异号标志 22: LOAD: MOV FLAG,AL ;存标志 23: MOV AH,4CH 24: INT 21H 25: CSEG ENDS 26: END START,6.3 分支结构程序设计-例6.4,例6.4 设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性,并将它们配制成奇校 验存入原单元。
16、 字符的ASCII码是用七位二进制表示的,当用一个字节单元 (8位) 保存一个字符的ASCII码时,字节单元的第7位空闲,不同的计算机存放ASCII码时,系统软件对该位有不同的定义: 1) 第7 位总是0; 2) 第7 位总是1;3) 做为奇偶校验位; 4) 第7 位为1,扩充128 种特殊字符或图形代码(在西文状态下); 5) 做为汉字代码的标志位(在中文状态下)。,6.3 分支结构程序设计-例6.4,1: ;*EXAM 6.4 * 2: SSEG SEGMENT STACK 3: STK DB 20 DUP(0) 4: SSEG ENDS 5: DSEG SEGMENT 6: ASC DB
17、 AC 7: DSEG ENDS 8: CSEG SEGMENT 9: ASSUME CS:CSEG,DS:DSEG 10: ASSUME SS:SSEG 11: MKODD: MOV AX,DSEG 12: MOV DS,AX 13: MOV AX,SSEG 14: MOV SS,AX 15: MOV SP,LENGTH STK,16: MOV AX,WORD PTR ASC;取两字符 17: AND AL,AL ;置奇偶标志 18: JPO NEXT ;奇转 19: OR AL,80H ;配为奇性 20:NEXT:AND AH,AH ;置奇偶标志 21: JPO LOAD ;奇转 22:
18、OR AH,80H ;配为奇性 23:LOAD:MOV WORD PTR ASC,AX 24: MOV AH,4CH 25: INT 21H 26:CSEG ENDS 27: END MKODD,6.3 分支结构程序设计-例6.4,6.4 多分支结构程序设计,利用计算机解决实际问题时,常遇到这样的情况: 处理某个问题时有多种选择方案,根据实际情况选择其中一种。每种处理方案由一段程序完成,每一段程序可以看作一个分支,程序在执行过程中根据当前的状况,决定下一步应执行哪一个分支,这就构成了多个分支的程序。如用计算机控制一台电动机,该电动机有正转、逆转,在每种转动方式下又有几种转速的档次控制,这些控制
19、可以通过键盘09的数字键进行选择,进入某种档次选择后,执行相应分支程序,使电机以最佳方式由一个状态进入所选状态。假设程序的十个分支的起始地址分别为ADR0,ADR1,.ADR9。,1: ;*EXAM 6.5.1* 2: SSEG SEGMENTSTACK 3: STK DB20 DUP(0) 4: SSEG ENDS 5: DSEG SEGMENT 6: DSEG ENDS 7: CSEG SEGMENT 8: ASSUME CS:CSEG,DS:DSEG 9: ASSUME SS:SSEG 10: MOTOR:MOV AX,DSEG 11: MOV DS,AX 12: MOV AX,SSEG
20、 13: MOV SS,AX 14: MOV SP,SIZE STK 15: MOV AH,01 16: INT 21H 17: CMP AL,0 18: JZ ADR0 19: CMP AL,1 20: JZ ADR1 21: : 22: CMP AL,8 23: JZ ADR8 24:ADR9: : 25: : : ADR0: : : : : ADR1 : : : : ADR8 : : : CSEG ENDS : END MOTOR,6.4 多分支结构程序设计,6.4 多分支结构程序设计,地址常数表法 所谓地址常数表法,就是把多个分支中的每个分支程序段的起始地址顺序存放在一个存储区中,这个
21、存储区称地址表存储区。根据键值,将相应处理程序的入口地址取入某寄存器,然后用间接转移指令实现转移。,6.4 多分支结构程序设计,1: ;*EXAM 6.5.2 * 2: SSEG SEGMENT STACK 3: STK DB 20 DUP(0) 4: SSEG ENDS 5: DSEG SEGMENT 6: ADRTAB DW OFFSET ADR0,OFFSET ADR1 7: DW OFFSET ADR2,OFFSET ADR9 8: DSEG ENDS 9: CSEG SEGMENT 10: ASSUME CS:CSEG,DS:DSEG 11: ASSUME SS:SSEG 12: B
22、RANCH: MOV AX,DSEG 13: MOV DS,AX 14: MOV AX,SSEG 15: MOV SS,AX 16: MOV SP,LENGTH STK,17: LEA DI,ADRTAB ;取地址表首址 18: MOV AH,01 ;读键盘 19: INT 21H 20: SUB AL,0 ;转换为数字 21: XOR AH,AH ;扩展为字数据 22: SHL AX,1 ;乘2 23: ADD DI,AX ;形成相应地址 24: MOV AX,DI ;取程序入口 25: JMP AX ;转去执行 26:ADR0: : 27: :ADR1: : :ADR9: : : : :CSEG ENDS : END BRANCH,6.4 多分支结构程序设计,MOV BX,AX JMP ADRTABBX MOV BX,AX JMP DI+BX,