资源描述
第5章 分支与循环程序设计
5.1. 概述
设计步骤:
描述问题à确定算法à绘制流程图à分配存储空间和工作单元à编写程序à上机调试
5.2. 分支程序设计
5.2.1 分支程序结构
条件?
。。。
条件?
二路分支结构 多路分支结构
5.2.2 二路分支程序设计方法
例5.2.1
-128≤x≤127
DATA SEGMENT
XX1 DB 10; X=给定一个值
YY1 DB ? ; Y
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DS
MOV DS, AX
MOV AL,XX1
CMP AL, 0
JZ AA1; =0
JNS AA2
MOV AL,0FFH; =-1
JMP AA1
AA2: MOV AL,1; =1
AA1: MOV YY1,AL;
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.2.3 多路分支程序设计方法
逻辑分解法;地址表法; 段内转移表法;
1. 逻辑分解法
CODE SEGMENT
ASSUME CS:CODE
START: MOV AH,1
INT 21H ;键入值
CMP AL,31H
JZ WORK1
CMP AL,32H
JZ WORK2
CMP AL,33H
JZ WORK3
CMP AL,34H
JZ WORK4
CMP AL,35H
JZ WORK5
JMP WORK0
WORK1: …(jmp work0)
WORK2: …(jmp work0)
WORK3: …(jmp work0)
WORK4: …(jmp work0)
WORK5: …(jmp work0)
WORK0: MOV AH,4CH
INT 21H
CODE ENDS
END START
2. 地址表法
把模块的地址保存在一个表中,通过查表跳到相应模块。
表地址 = 表首地址 + (键号-1)*2
DATA SEGMENT
TABLE DW WORK1,WORK2,WORK3,WORK4,WORK5
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA BX,TABLE ;表首地址
MOV AH,1
INT 21H
AND AL,0FH
DEC AL ;键号-1
ADD AL,AL ;(键号-1)*2
SUB AH,AH
ADD BX,AX ;表地址 = 表首地址 + (键号-1)*2
JMP WORD PTR[BX]
WORK1: …(jmp work0)
WORK2: …(jmp work0)
WORK3: …(jmp work0)
WORK4: …(jmp work0)
WORK5: …(jmp work0)
WORK0:MOV AH,4CH
INT 21H
CODE ENDS
END START
3. 段内转移表法
段内短转移:(jmp disp8为2字节指令)
转移表地址=转移表首地址+(键号-1)*2
段内近转移:(jmp disp16为3字节指令)
转移表地址=转移表首地址+(键号-1)*3
段间远转移:(jmp disp32为4字节指令)
转移表地址=转移表首地址+(键号-1)*4
CODE SEGMENT
ASSUME CS:CODE
START: LEA BX,WORK
MOV AH,1
INT 21H
AND 0FH
DEC AL
MOV AH,AL
ADD AL,AL
ADD AL,AH ;x3
SUB AH,AH
ADD BX,AX
JMP BX
;转移表
WORK: JMP NEAR PTR WORK1
JMP NEAR PTR WORK2
JMP NEAR PTR WORK3
JMP NEAR PTR WORK4
JMP NEAR PTR WORK5
;工作模块
WORK1: …(jmp work0)
WORK2: …(jmp work0)
WORK3: …(jmp work0)
WORK4: …(jmp work0)
WORK5: …(jmp work0)
WORK0:MOV AH,4CH
INT 21H
CODE ENDS
END START
5.3. 循环程序设计
5.3.1 循环程序的结构形式
5.3.2 循环程序的设计方法
方法:计数控制循环;条件控制循环;变量控制循环
1. 计数控制循环(循环次数已知)
例:5.3.1, 把1,2,3 …255加起来。
(1)先执行后判断(计数控制)
DATA SEGMENT
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1
MOV AX, 0
MOV DH, 0
MOV CL, 255
AA1: MOV DL, [BX]
ADD AX, DX
INC BX
SUB CL,1 ; DEC CL
JNZ AA1
MOV SUM1, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)先判断后执行(计数控制)
DATA SEGMENT
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1-1
MOV AX, 0
MOV DH, 0
MOV CL, 0 ; 初值256
AA1: INC BX
SUB CL,1
JZ AA2
MOV DL, [BX]
ADD AX, DX
JMP AA1
AA2: MOV SUM1, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2. 条件控制循环(结束条件已知)
(1)先执行后判断(条件控制)
DATA SEGMENT
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1
MOV AX, 0
MOV DH, 0
AA1: MOV DL, [BX]
ADD AX, DX
INC BX
CMP DL,255
JNZ AA1
MOV SUM1, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)先判断后执行(条件控制)
DATA SEGMENT
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1-1 ;***
MOV AX, 255 ; 初值为255,原因如下说明
MOV DH, 0
AA1: INC BX
MOV DL, [BX]
CMP DL,255 ; DL=255时,循环结束
JZ AA2
ADD AX, DX
JMP AA1
AA2: MOV SUM1, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
3. 变量控制循环(结束条件已知)
数据255的地址为10Feh,做为变量控制的结束条件
(1)先执行后判断(变量控制)
DATA SEGMENT
地址10FEh
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1
MOV AX, 0
MOV DH, 0
AA1: MOV DL, [BX]
ADD AX, DX
INC BX
CMP BX, 10FFH
JNZ AA1
MOV SUM, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)先判断后执行(变量控制)
DATA SEGMENT
ORG 1000H
NUMBER1 DB 1,2,3,…255
SUM1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA BX, NUMBER1-1 ;***
MOV AX, 0 ;
MOV DH, 0
AA1: INC BX
CMP BX,10FFH ;255的地址为10FEH
JZ AA2
MOV DL, [BX]
ADD AX, DX
JMP AA1
AA2: MOV SUM1, AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.3.3 单重循环
例5.3.2 求无符号整数的平方根的整数部分,
DATA SEGMENT
NUMBER1 DW 25
ROOT1 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
MOV AX, NUMBER1
MOV CX, 0;
MOV BX, 1
AA1: SUB AX, BX
INC CX
ADD BX, 2
JNC AA1
DEC CX
MOV ROOT1, CX
MOV AH,4CH
INT 21H
CODE ENDS
END START
例5.3.3在CRT上显示“中”字的源程序
DATA SEGMENT
NUMBER1 DB 0AH, 0DH
DB ‘ A ‘, 0AH, 0DH
DB ‘AAAAAAA’, 0AH, 0DH
DB ‘A A A’, 0AH, 0DH
DB ‘A A A’, 0AH, 0DH
DB ‘AAAAAAA’, 0AH, 0DH
DB ‘ A ‘, 0AH, 0DH
DB ‘ A ‘, 0AH, 0DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA, BX, NUMBER1
MOV CX, 65
AA1: MOV DL, [BX]
MOV AH, 2
INT 21H
INC BX
LOOP AA1
MOV AH,4CH
INT 21H
CODE ENDS
END START
例 5.3.4 在CRT上显示16位十进制数8988998899989899
DATA SEGMENT
RULER1 DW 0100110011101011 ;(逻辑尺法)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
MOV BX, RULER1
MOV CX, 16
AA1: MOV DL, 38H
SHL BX, 1
JNC AA2
INC DL ; MOV DL, 39H
AA2: MOV AH, 2
INT 21H
LOOP AA1
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.3.4 多重循环
例5.3.5用逻辑尺法,在CRT上显示“中”
空格---0表示
‘A’-----1表示
00010000à10h
11111110à0Feh
10010010à92h
10010010à92h
11111110à0Feh
00010000à10h
00010000à10h
DATA SEGMENT
RULER1 DB 10h, 0Feh, 92h, 92h, 0Feh, 10h, 10h
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA SI, RULER1
MOV CX, 7 ; 外循环计数次数
AA1: MOV DH, 8 ;内循环计数次数
MOV DL, 0AH
MOV AH, 2
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV BL, [SI]
AA2: MOV DL, 20H
SHL BL, 1
JNC AA3
ADD DL, 21H ; MOV DL, 41H; ‘A’
AA3: MOV AH, 2
INT 21H
DEC DH
JNZ AA2 ;内循环控制
MOV DL, 0AH
MOV AH, 2
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
INC SI
LOOP AA1 ; 外循环控制
MOV AH,4CH
INT 21H
CODE ENDS
END START
例5.3.6 五个学生参加4门课的考试,成绩以压缩BCB码方式存放在COURSE1数组中,计算每个学生的总分。
DATA SEGMENT
COURSE1 DB 70H, 88H, 92H, 90H, 99H ; 第一门课成绩
DB 67H, 77H, 88H, 76H, 69H ; 第二门课成绩
DB 74H, 87H, 77H, 74H, 70H ; 第三门课成绩
DB 99H, 97H, 94H, 98H, 96H ; 第四门课成绩
NUM1 DW 5 DUP(0) ;5个学生的总成绩结果单元
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
LEA SI, COURSE1
LEA DI, NUM1
MOV CL, 5 ; 外循环计数次数
AA1: MOV BX, SI
MOV AX, 0 ; 放累加结果
MOV CH, 4 ;内循环计数次数
AA2: ADD AL, [BX]
DAA
ADC AH, 0
ADD BX, 5
DEC CH
JNZ AA2; 内循环控制
MOV [DI], AX ; 存一个学生的总分成绩
INC SI
ADD DI, 2
DEC CL
JNZ AA1 ; 外循环控制
MOV AH,4CH
INT 21H
CODE ENDS
END START
例 5.3.7 键入3~9间的数字,输出一个用“*“组成的三角形。
例如键入5,输出如下:
*
* *
* **
* ***
* ****
CODE SEGMENT
ASSUME CS:CODE
START: MOV AH, 1
INT 21H
CMP AL, 33H
JC START; JB start
CMP AL,3AH
JNC START ;界限为3~9 ,JAE start
AND AL, 0FH
MOV BL, AL;保存键入的值,作为外循环的次数
MOV BH, 1;内循环次数, 它是可变的,但不大于BL
AA1: MOV DL, 0AH
MOV AH, 2
INT 21H
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV CL, BH
AA2: MOV DL, ‘*’
MOV AH, 2
INT 21H
DEC CL
JNZ AA2 ;内循环控制, 显示一行的”*”,个数由BH定
INC BH
CMP BL, BH
JNC AA1 ; 外循环控制 JBE AA1
MOV AH,4CH
INT 21H
CODE ENDS
END START
例5.3.8
冒泡法排序算法:图
1
2
3
4
.
.
N
大
小
1)(N-1)*(N-1)次比较法
l 第一次内循环比较N-1次,第二次循环比较N-1次,…,最后一次(N-1次)循环比较N-1次。
DATA SEGMENT
NUMBER1 DB 100,3,90,80,99,77,44,66,50
N_1 EQU $-NUMBER1 –1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DX, N_1 ;外循环计数次数
AA1: LEA BX, NUMBER1
MOV CX, N_1 ;内循环计数次数
AA2: MOV AL, [BX]
CMP AL, [BX+1]
JNC AA3 ;JGE AA3
XCHG AL, [BX+1]
MOV [BX], AL ;交换
AA3: INC BX
LOOP AA2
DEC DX
JNZ AA1
MOV AH, 4CH
INT 21H
CODE ENDS
END STARTS
2)(N-1)!次比较法
l 第一次内循环比较N-1次,第二次循环比较N-2次,…,最后一次(N-1次)循环比较1次。
DATA SEGMENT
NUMBER1 DB 100,3,90,80,99,77,44,66,50
N_1 EQU $-NUMBER1 –1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DX, N_1 ;外循环计数次数
AA1: LEA BX, NUMBER1
MOV CX, DX ; ***内循环计数次数N-1, N-2,…,1
AA2: MOV AL, [BX]
CMP AL, [BX+1]
JNC AA3 ;JGE AA3
XCHG AL, [BX+1]
MOV [BX], AL ;交换
AA3: INC BX
LOOP AA2
DEC DX
JNZ AA1
MOV AH, 4CH
INT 21H
CODE ENDS
END STARTS
3)(N-1)(N-2)…(N-m)次比较法
l 第一次内循环比较N-1次,第二次循环比较N-2次,…,最后一次(m次)循环比较N-m次(此次比较时无交换,排序结束)。
l 内循环有交换标志AH=1,无交换标志AH=0,若内循环一次无交换,则排序完成。
DATA SEGMENT
NUMBER1 DB 100,3,90,80,99,77,44,66,50
N_1 EQU $-NUMBER1 –1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DX, N_1 ;外循环计数次数
AA1: LEA BX, NUMBER1
MOV AH, 0 ;标志清零
MOV CX, DX ; ***内循环计数次数N-1, N-2,…,1
AA2: MOV AL, [BX]
CMP AL, [BX+1]
JNC AA3 ;JGE AA3
XCHG AL, [BX+1]
MOV [BX], AL ;交换
MOV AH, 1 ;表示有交换
AA3: INC BX
LOOP AA2
OR AH, AH
JZ AA4 ; AH=0, 表示无新交换,排序结束,
;SHR AH,1; JNC AA4
DEC DX
JNZ AA1
AA4: MOV AH, 4CH
INT 21H
CODE ENDS
END STARTS
考试题:P200 5.4,5.2,5.8
1.试编写从键盘上接收一个4位的16进制数,并在CRT上显示出与它等值的二进制数的源程序。
展开阅读全文