第6章 分支结构程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NEXT: : :
AL,80H
DEBUG
1.根据单个标志位的状态决定是否转移的指令
(2) 已知AL中存放有一个带符号数,若为正数,则显示‘+’ ;若为负数,则显示‘-’,若为零,则显示‘0’。
MOV AND JZ JS DL,‘0’ AL,AL L0 L1
MOV
JMP L1: MOV
DL,‘+’
L0 DL,‘-’
6.3 分支结构程序设计
例6.1 例6.2 例6.3 例6.4
例6.1 计算 Y=
X+10 (0<X≤8) 5X-2 (8<X<15) |X| (其它)
设X为单字节带符号整数,且存于ARGX单元,计算结果Y存入 RLT单元。 X+10 5X-2 X -X (0<X≤8) (8<X<15) (X=0,X≥15) (X<0)
奇校验码: 将字节的最高位与字符ASCII码的7个信息 位中“1”的个数配成奇数个。 例:将字符‘A’和‘C’分别配成奇校验码。 ‘A’的ASCII为1000001
1 1 0 0 0 0 01
‘C’的ASCII码为1000011
0 1 0 0 0 0 1 1
DSEG ASC DSEG CSEG
SEGMENT DB ENDS SEGMENT ASSUME MKODD:MOV MOV MOV AND JPO OR NEXT: AND JPO OR LOAD: MOV MOV INT CSEG ENDS END
010A 000A 000A 0000
6.2.1 无条件转移指令JMP
(1)段内转移(NEAR) 2)段内寄存器间接转移 JMP AX 3)段内存储器间接转移 JMP [SI] JMP WORD PTR[BX+DI+1000H]
6.2.1
无条件转移指令
(2)段间转移(FAR) 1)段间直接转移 JMP FAR PTR
开始
设置数据段地址
AX←第一个数据 BX←第二个数据
两个数据比较 AX-BX
AX≥BX? N AX←BX Y
AX与另一个数比较 AX大? N AX←第三个数 保存结果 Y
结束
例6.3 内存由ADR单元开始存放两个带符号字数据,编制程序,若 两数同号将FLAG单元置0,否则置全1。
正 :FLAG←0 正 Y 负 :FLAG←0FFH 正 :FLAG←0FFH 负Y
’AC’
CS:CSEG,DS:DSEG AX,DSEG DS,AX AX,WORD PTR ASC AL,AL NEXT AL,80H AH,AH LOAD AH,80H WORD PTR ASC,AX AH,4CH 21H MKODD
;取两字符 ;置奇偶标志 ;奇转 ;配为奇性 ;置奇偶标志 ;奇转 ;配为奇性
第六章
分支结构程序
6.1 分支结构程序的引出 6.2 转移指令
6.3 分支结构程序设计
6.4 多分支结构程序设计
作业
6.1 分支结构程序的引出
例如,火车站用计算机计算托运行李的托运费,当旅客行李 重量小于或等于20kg时,收费0.2元/kg,当行李重量超过20kg时, 20kg以内部分0.2元/kg,超出部分,收费0.3元/kg。这个处理过程,
6.4 多分支结构程序设计
利用计算机解决实际问题时,常遇到这样的情况: 处理某个问 题时有多种选择方案,根据实际情况选择其中一种。每种处理方 案由一段程序完成,每一段程序可以看作一个分支,程序在执行 过程中根据当前的状况,决定下一步应执行哪一个分支,这就构
成了多个分支的程序。
如用计算机控制一台电动机,该电动机有正转、逆转,在每种 转动方式下又有几种转速的档次控制,这些控制可以通过键盘 0~9的数字键进行选择,进入某种档次选择后,执行相应分支程序, 使电机以最佳方式由一个状态进入所选状态。假设程序的十个
转向ADR0 Y
转向ADR1
Y
转向ADR8
6.4 多分支结构程序设计
2. 地址常数表法
所谓地址常数表法,就是把多
个分支中的每个分支程序段的起始 地址顺序存放在一个存储区中,这个 存储区称地址表存储区。根据键值, 将相应处理程序的入口地址取入某 寄存器,然后用间接转移指令实现转 移。
ADRTAB ADR0
2.根据两数(A,B)的大小关系决定是否转移的指令
CMP A,B A>B A≥B A,B是带符号数 JG /JNLE JGE /JNL A,B是无符号数 JA /JNBE JAE/JNB
A<B
A≤B A=B A≠B
JL /JNGE
JLE /JNG JE JNE
JB /JNAE
JBE /JNA JE JNE
开始 设置数据段基址 取一个数据 和另一个数据异或
N
SF=0?
Y
FLAG←0
FLAG←0FFH
结束
6.3 已知两个带符号数X,Y分别存放在ADRX,ADRY单元,若两数同时为正, 将FLAG单元置0,若同时为负,将FLAG单元置1,否则FLAG单元置全1。
例6.4 设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性, 并将它们配制成奇校验存入原单元。
Y=பைடு நூலகம்
DSEG ARGX RLT DSEG CSEG
SEGMENT DB DB ENDS SEGMENT ASSUME BEGIN: MOV MOV MOV AND JS JZ CMP JLE CMP JGE SAL SAL ADD SUB
-5 ?
开始 设置数据段地址
CS:CSEG,DS:DSEG AX,DSEG DS,AX AL,ARGX AL,AL ABSL MOVE AL,8 ONE AL,15 MOVE AL,1 AL,1 AL,ARGX AL,2
6.2.2
条件转移指令
1.根据单个标志位的状态决定是否转移的指令
0 1
CF
PF ZF SF OF
JNC
JNP /JPO JNZ JNS JNO
JC
JP /JPE JZ JS JO
1.根据单个标志位的状态决定是否转移的指令
(1) 将AL中的字符配成奇校验码。 AND AL,AL JPO NEXT
OR
AL←数据X Y X取补 Y X<0? N X=0? N X≤8? N Y X≥15? N 计算5X-2 保存结果 结束
Y 计算X+10
开始
JMP ONE: ADD JMP ABSL: NEG MOVE: MOV MOV INT CSEG ENDS END
MOVE AL,10 MOVE AL RLT,AL AH,4CH 21H BEGIN
LABEL_F
;IP←OFFSET LABEL_F ;CS←SEG LABEL_F
2)段间存储器间接转移 LABEL_D DD JMP LABEL_D
JMP
12345678H ;IP←(LABEL_D+1, LABEL_D) ;CS←(LABEL_D+3, LABEL_D+2) DWORD PTR [BX]
设置数据段地址 AL←数据X Y X取补 Y X<0? N X=0? N X≤8? N Y X≥15? N 计算5X-2 保存结果 结束
Y 计算X+10
例6.2 设内存中有三个互不相等的无符号字数据,分别存放在 ARG开始的字单元,编制程序将其中最大值存入MAX单元。
A 大
B
C
大
DSEG ARG MAX DSEG CSEG
6.2.1 无条件转移指令JMP
CSEG SEGMENT ASSUME START: JMP JMP JMP JMP L2: NOP ORG L1: NOP CSEG ENDS END
CS:CSEG L1 SHORT L2 L2 START L2+100H
0000 E90701 JMP 0003 EB05 0005 EB03 0007 90 0008 EBF6 000A 90 010A 90 JMP JMP NOP JMP NOP NOP
Below Above Less
Great Equal
2.根据两数(A,B)的大小关系决定是否转移的指令
已知AL,BL中各存放有一个带符号数,将两个数据的差的绝对 值存入AL中。 CMP AL,BL SUB JNS AL,BL L1
JG
L1
XCHG AL,BL
NEG
L1: :
AL
L1: SUB
AL,BL
分支的起始地址分别为ADR0,ADR1,...ADR9。
6.4 多分支结构程序设计
1. 树型结构法
开始 设置数据段地址 AL←键值 AL=‘0’? N AL=‘1’? N : AL=‘8’? N 转向ADR9 Y
;*****EXAM 6.5.1***** DSEG SEGMENT DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG MOTOR: MOV AX,DSEG MOV DS,AX MOV AH,01 INT 21H CMP AL,’0’ JZ ADR0 CMP AL,’1’ JZ ADR1 : CMP AL,’8’ JZ ADR8 ADR9: : : ADR0: : : ADR1: : : : ADR8: : CSEG ENDS END MOTOR
可归纳为下面数学表达式:
P=
{ 0.2*20+0.3*(w-20)
0.2*w
(w≤20kg)
(w>20kg)
6.2 转移指令
6.2.1 无条件转移指令 6.2.2 条件转移指令
6.2.1 无条件转移指令JMP
指令汇编格式:JMP targ 操作:段内转移:IP←目标的偏移地址
段间转移:IP←目标的偏移地址
L0:
MOV
INT
AH,2
21H
2.根据两数(A,B)的大小关系决定是否转移的指令
(1)使用该指令前用过比较(CMP A,B)、减法(SUB A,B、 SBB A,B)指令。 (2)A与B的关系共有6种: A<B A≥B A≤B A=B A>B A≠B (3)比较转移时分无符号数和带符号数。例如: A=11111111B B=00000001B
ADR1
ADR2 ADR3 ADR4 ADR5 ADR6 ADR7 ADR8 ADR9
6.4 多分支结构程序设计
;*****EXAM 6.5.2 ***** DSEG SEGMENT ADRTAB DW OFFSET ADR0,OFFSET ADR1 DW OFFSET ADR2,..,OFFSET ADR9 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG BRANCH: MOV AX,DSEG MOV DS,AX LEA DI,ADRTAB ;取地址表首址 MOV AH,01 ;读键盘 INT 21H SUB AL,’0’ ;转换为数字 XOR AH,AH ;扩展为字数据 SHL AX,1 ;乘2
X
⊕
0111 0011 1010 0101 1001 0010 0100 1011 1110 0001 1110 1110
负 :FLAG←0
DSEG ADR FLAG DSEG CSEG
SEGMENT DW 73A5H,924BH DB ? ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV DL,0 ;同号标志 MOV AX,ADR XOR AX,ADR+2 ;两数异或 JNS LOAD ;同号 DEC DL ;异号标志 LOAD: MOV FLAG,DL ;存标志 MOV AH,4CH INT 21H CSEG ENDS END START
SEGMENT DW 7138H,84A6H,29EH DW ? ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG FMAX: MOV AX,DSEG MOV DS,AX LEA SI,ARG MOV AX,[SI] MOV BX,[SI+2] CMP AX,BX JAE FMAX1 MOV AX,BX FMAX1: CMP AX,[SI+4] JAE FMAX2 MOV AX,[SI+4] FMAX2: MOV MAX,AX MOV AH,4CH INT 21H CSEG ENDS END FMAX
CS←目标所处代码段的基址
受影响的状态标志位:无
说明:指令中的targ可以是直接标号、寄存器间接或存储器
间接寻址形式。
6.2.1 无条件转移指令JMP
(1)段内转移(NEAR) 1)段内直接转移 JMP LABEL_N ;LABEL_N在当前代码段
JMP SHORT LABEL_N ;LABEL_N在当前代码段, ;且在-128~127范围内 例:
AL,80H
DEBUG
1.根据单个标志位的状态决定是否转移的指令
(2) 已知AL中存放有一个带符号数,若为正数,则显示‘+’ ;若为负数,则显示‘-’,若为零,则显示‘0’。
MOV AND JZ JS DL,‘0’ AL,AL L0 L1
MOV
JMP L1: MOV
DL,‘+’
L0 DL,‘-’
6.3 分支结构程序设计
例6.1 例6.2 例6.3 例6.4
例6.1 计算 Y=
X+10 (0<X≤8) 5X-2 (8<X<15) |X| (其它)
设X为单字节带符号整数,且存于ARGX单元,计算结果Y存入 RLT单元。 X+10 5X-2 X -X (0<X≤8) (8<X<15) (X=0,X≥15) (X<0)
奇校验码: 将字节的最高位与字符ASCII码的7个信息 位中“1”的个数配成奇数个。 例:将字符‘A’和‘C’分别配成奇校验码。 ‘A’的ASCII为1000001
1 1 0 0 0 0 01
‘C’的ASCII码为1000011
0 1 0 0 0 0 1 1
DSEG ASC DSEG CSEG
SEGMENT DB ENDS SEGMENT ASSUME MKODD:MOV MOV MOV AND JPO OR NEXT: AND JPO OR LOAD: MOV MOV INT CSEG ENDS END
010A 000A 000A 0000
6.2.1 无条件转移指令JMP
(1)段内转移(NEAR) 2)段内寄存器间接转移 JMP AX 3)段内存储器间接转移 JMP [SI] JMP WORD PTR[BX+DI+1000H]
6.2.1
无条件转移指令
(2)段间转移(FAR) 1)段间直接转移 JMP FAR PTR
开始
设置数据段地址
AX←第一个数据 BX←第二个数据
两个数据比较 AX-BX
AX≥BX? N AX←BX Y
AX与另一个数比较 AX大? N AX←第三个数 保存结果 Y
结束
例6.3 内存由ADR单元开始存放两个带符号字数据,编制程序,若 两数同号将FLAG单元置0,否则置全1。
正 :FLAG←0 正 Y 负 :FLAG←0FFH 正 :FLAG←0FFH 负Y
’AC’
CS:CSEG,DS:DSEG AX,DSEG DS,AX AX,WORD PTR ASC AL,AL NEXT AL,80H AH,AH LOAD AH,80H WORD PTR ASC,AX AH,4CH 21H MKODD
;取两字符 ;置奇偶标志 ;奇转 ;配为奇性 ;置奇偶标志 ;奇转 ;配为奇性
第六章
分支结构程序
6.1 分支结构程序的引出 6.2 转移指令
6.3 分支结构程序设计
6.4 多分支结构程序设计
作业
6.1 分支结构程序的引出
例如,火车站用计算机计算托运行李的托运费,当旅客行李 重量小于或等于20kg时,收费0.2元/kg,当行李重量超过20kg时, 20kg以内部分0.2元/kg,超出部分,收费0.3元/kg。这个处理过程,
6.4 多分支结构程序设计
利用计算机解决实际问题时,常遇到这样的情况: 处理某个问 题时有多种选择方案,根据实际情况选择其中一种。每种处理方 案由一段程序完成,每一段程序可以看作一个分支,程序在执行 过程中根据当前的状况,决定下一步应执行哪一个分支,这就构
成了多个分支的程序。
如用计算机控制一台电动机,该电动机有正转、逆转,在每种 转动方式下又有几种转速的档次控制,这些控制可以通过键盘 0~9的数字键进行选择,进入某种档次选择后,执行相应分支程序, 使电机以最佳方式由一个状态进入所选状态。假设程序的十个
转向ADR0 Y
转向ADR1
Y
转向ADR8
6.4 多分支结构程序设计
2. 地址常数表法
所谓地址常数表法,就是把多
个分支中的每个分支程序段的起始 地址顺序存放在一个存储区中,这个 存储区称地址表存储区。根据键值, 将相应处理程序的入口地址取入某 寄存器,然后用间接转移指令实现转 移。
ADRTAB ADR0
2.根据两数(A,B)的大小关系决定是否转移的指令
CMP A,B A>B A≥B A,B是带符号数 JG /JNLE JGE /JNL A,B是无符号数 JA /JNBE JAE/JNB
A<B
A≤B A=B A≠B
JL /JNGE
JLE /JNG JE JNE
JB /JNAE
JBE /JNA JE JNE
开始 设置数据段基址 取一个数据 和另一个数据异或
N
SF=0?
Y
FLAG←0
FLAG←0FFH
结束
6.3 已知两个带符号数X,Y分别存放在ADRX,ADRY单元,若两数同时为正, 将FLAG单元置0,若同时为负,将FLAG单元置1,否则FLAG单元置全1。
例6.4 设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性, 并将它们配制成奇校验存入原单元。
Y=பைடு நூலகம்
DSEG ARGX RLT DSEG CSEG
SEGMENT DB DB ENDS SEGMENT ASSUME BEGIN: MOV MOV MOV AND JS JZ CMP JLE CMP JGE SAL SAL ADD SUB
-5 ?
开始 设置数据段地址
CS:CSEG,DS:DSEG AX,DSEG DS,AX AL,ARGX AL,AL ABSL MOVE AL,8 ONE AL,15 MOVE AL,1 AL,1 AL,ARGX AL,2
6.2.2
条件转移指令
1.根据单个标志位的状态决定是否转移的指令
0 1
CF
PF ZF SF OF
JNC
JNP /JPO JNZ JNS JNO
JC
JP /JPE JZ JS JO
1.根据单个标志位的状态决定是否转移的指令
(1) 将AL中的字符配成奇校验码。 AND AL,AL JPO NEXT
OR
AL←数据X Y X取补 Y X<0? N X=0? N X≤8? N Y X≥15? N 计算5X-2 保存结果 结束
Y 计算X+10
开始
JMP ONE: ADD JMP ABSL: NEG MOVE: MOV MOV INT CSEG ENDS END
MOVE AL,10 MOVE AL RLT,AL AH,4CH 21H BEGIN
LABEL_F
;IP←OFFSET LABEL_F ;CS←SEG LABEL_F
2)段间存储器间接转移 LABEL_D DD JMP LABEL_D
JMP
12345678H ;IP←(LABEL_D+1, LABEL_D) ;CS←(LABEL_D+3, LABEL_D+2) DWORD PTR [BX]
设置数据段地址 AL←数据X Y X取补 Y X<0? N X=0? N X≤8? N Y X≥15? N 计算5X-2 保存结果 结束
Y 计算X+10
例6.2 设内存中有三个互不相等的无符号字数据,分别存放在 ARG开始的字单元,编制程序将其中最大值存入MAX单元。
A 大
B
C
大
DSEG ARG MAX DSEG CSEG
6.2.1 无条件转移指令JMP
CSEG SEGMENT ASSUME START: JMP JMP JMP JMP L2: NOP ORG L1: NOP CSEG ENDS END
CS:CSEG L1 SHORT L2 L2 START L2+100H
0000 E90701 JMP 0003 EB05 0005 EB03 0007 90 0008 EBF6 000A 90 010A 90 JMP JMP NOP JMP NOP NOP
Below Above Less
Great Equal
2.根据两数(A,B)的大小关系决定是否转移的指令
已知AL,BL中各存放有一个带符号数,将两个数据的差的绝对 值存入AL中。 CMP AL,BL SUB JNS AL,BL L1
JG
L1
XCHG AL,BL
NEG
L1: :
AL
L1: SUB
AL,BL
分支的起始地址分别为ADR0,ADR1,...ADR9。
6.4 多分支结构程序设计
1. 树型结构法
开始 设置数据段地址 AL←键值 AL=‘0’? N AL=‘1’? N : AL=‘8’? N 转向ADR9 Y
;*****EXAM 6.5.1***** DSEG SEGMENT DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG MOTOR: MOV AX,DSEG MOV DS,AX MOV AH,01 INT 21H CMP AL,’0’ JZ ADR0 CMP AL,’1’ JZ ADR1 : CMP AL,’8’ JZ ADR8 ADR9: : : ADR0: : : ADR1: : : : ADR8: : CSEG ENDS END MOTOR
可归纳为下面数学表达式:
P=
{ 0.2*20+0.3*(w-20)
0.2*w
(w≤20kg)
(w>20kg)
6.2 转移指令
6.2.1 无条件转移指令 6.2.2 条件转移指令
6.2.1 无条件转移指令JMP
指令汇编格式:JMP targ 操作:段内转移:IP←目标的偏移地址
段间转移:IP←目标的偏移地址
L0:
MOV
INT
AH,2
21H
2.根据两数(A,B)的大小关系决定是否转移的指令
(1)使用该指令前用过比较(CMP A,B)、减法(SUB A,B、 SBB A,B)指令。 (2)A与B的关系共有6种: A<B A≥B A≤B A=B A>B A≠B (3)比较转移时分无符号数和带符号数。例如: A=11111111B B=00000001B
ADR1
ADR2 ADR3 ADR4 ADR5 ADR6 ADR7 ADR8 ADR9
6.4 多分支结构程序设计
;*****EXAM 6.5.2 ***** DSEG SEGMENT ADRTAB DW OFFSET ADR0,OFFSET ADR1 DW OFFSET ADR2,..,OFFSET ADR9 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG BRANCH: MOV AX,DSEG MOV DS,AX LEA DI,ADRTAB ;取地址表首址 MOV AH,01 ;读键盘 INT 21H SUB AL,’0’ ;转换为数字 XOR AH,AH ;扩展为字数据 SHL AX,1 ;乘2
X
⊕
0111 0011 1010 0101 1001 0010 0100 1011 1110 0001 1110 1110
负 :FLAG←0
DSEG ADR FLAG DSEG CSEG
SEGMENT DW 73A5H,924BH DB ? ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV DL,0 ;同号标志 MOV AX,ADR XOR AX,ADR+2 ;两数异或 JNS LOAD ;同号 DEC DL ;异号标志 LOAD: MOV FLAG,DL ;存标志 MOV AH,4CH INT 21H CSEG ENDS END START
SEGMENT DW 7138H,84A6H,29EH DW ? ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG FMAX: MOV AX,DSEG MOV DS,AX LEA SI,ARG MOV AX,[SI] MOV BX,[SI+2] CMP AX,BX JAE FMAX1 MOV AX,BX FMAX1: CMP AX,[SI+4] JAE FMAX2 MOV AX,[SI+4] FMAX2: MOV MAX,AX MOV AH,4CH INT 21H CSEG ENDS END FMAX
CS←目标所处代码段的基址
受影响的状态标志位:无
说明:指令中的targ可以是直接标号、寄存器间接或存储器
间接寻址形式。
6.2.1 无条件转移指令JMP
(1)段内转移(NEAR) 1)段内直接转移 JMP LABEL_N ;LABEL_N在当前代码段
JMP SHORT LABEL_N ;LABEL_N在当前代码段, ;且在-128~127范围内 例: