文档介绍:第9章分支(选择结构)程序设计
分支程序结构
双分支程序设计
多分支程序设计
⑴条件产生
在进行条件测试以前,必须执行能生成状态标志的先行指令,如:TEST、CMP、ADD、SUB、AND、OR、XOR和移位指令等,这些指令执行后能按规定影响PSW中的状态标志位OF,SF,ZF,PF与CF。为条件检测作好准备。
⑵测试与定向
条件转移指令自动对相应的状态标志位进行测试,以确定是否满足条件,决定程序的不同走向。而每一条条件转移指令,恰好有两种选择,转移或顺序执行。
⑶标号
对于每个分支,在转移的目标地址处一定要给出标号。对图9-3中的L1与L2标号作用示意如下:
图9-3(a)程序结构中的标号L1,L2作用:
┇;程序段1
JCC L1 ;CC条件成立,转L1
L2:……;程序段2
┇
L1:……
┇;分支程序段
JMP L2
图9-3(b)程序结构中的标号L1、L2作用:
┇;程序段1
JCC L2 ;CC条件成立,转L2
L1: ……;分支程序段
┇
L2: ……;程序段2
可以为C,NC,P,NP,Z,NZ,S,NS,O,NO,B,A,G,L等等。
这种结构如图9-1(a)所示,每个分支都执行一个分支程序段。
组成这种结构的双分支程序结构有以下五部分组成:
①产生条件。②测试条件。③按条件成立与否确定转移去向。
④在两个分支程序之后都汇合到一起。
双分支程序设计
【例9-2】比较两个带符号字节数的大小,找出两个数中大的存入MAX字节单元,编写源程序如下:
DATA SEGMENT
DA1 DB X1,X2 ; X1,X2为任意二个带符号数
MAX DB ?
DATA ENDS
STAK SEGMENT STACK
DW 20H DUP(?)
STAK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
GO: MOV AX,DATA
MOV DS,AX
MOV AL,DA1
CMP AL,DA1+1
JGE L1 ;若X≥X2则转到L1,这里产生分支
MOV AL, DA1+1 ;若X﹤X2则DA1+1的内容送AL
L1: MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END GO
要注意对带符号与无符号数判断的条件转移指令的选用。
【例9-3】设已经用REP MOVSB指令把数据段中从DA1开始的100个字节数据传送到附加段中以DA2开始的100个字节单元中,今要查找两个数组中是否存在有不相等之处,若发现不相等之处,将两个不相等单元地址中的偏移量分别存入ADDR1和ADDR2之中。试编写一个完整的源程序。
分析:用REPE CMPSB指令,只要出现ZF=0就表明已经找到不等之处。所以从REPE CMPSB指令退出循环,只需判断ZF断状态值,即可知道是否存在不相等的地方,当ZF=1表示两串完全相等;当ZF=0表示对应单元有不等之处。程序编写如下:
DATA SEGMENT
DA1 DB 33,33H,┉;共100个字节数据
ADDR1 DW ?
ADDR2 DW ?
DATA ENDS
EXTRA SEGMENT
DA2 DB 33,33H,┉;共100个字节数据
EXTRA ENDS
STACK1 SEGMENT PARA STACK
DW 100H DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
ASSUME ES:EXTRA
START: MOV AX,DATA
MOV DS,AX ;源串条件1①
MOV AX,EXTRA
MOV ES,AX ;目标串条件1②
LEA SI,DA1 ;源串条件2③
LEA DI,DA2 ;目标串条件2④
MOV CX,100 ;条件⑤
CLD ;条件⑥
REPE CMPSB
JZ L1 ;两个数组完全相等转L1
DEC SI ;否则处理偏移地址问题
DEC DI
MOV ADDR1,SI
MOV ADDR2,DI
L1: MOV AH,4CH
1NT 21H
CODE ENDS
END START
为了REPE CMPSB正常运行,必须准备6个条件:DS:S;ES:DI;CX;DF。