8.6 KiB
8.6 KiB
实验三:分支程序设计
一、实验目的
- 掌握汇编语言分支程序设计的基本方法
- 熟悉条件转移指令和和无条件转移指令的使用
- 理解程序流程图的设计方法
二、实验内容
2.1 基础性实验
实验1:符号数比较
【程序清单】
; 实验三-1:符号数比较
; 功能:比较X和Y两个符号数的大小
; 说明:如果X >= Y,则Z = Y;否则Z = X
DATA SEGMENT
X DW 1234H
Y DW 5678H
Z DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, X
CMP AX, Y
JGE NEXT
MOV Z, AX
JMP EXIT
NEXT:
MOV Z, Y
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 比较X和Y两个符号数的大小
- 如果X >= Y,则Z = Y;否则Z = X
- 使用CMP指令比较,使用JGE条件转移
【运行结果】
因为5678H > 1234H,所以Z单元存放5678H
【思考题】
- 如果X = -1(假设为16位有符号数FFFFH),Y = 1,程序输出什么?
- JGE指令和JA指令有什么区别?
实验2:分支程序示例1 - 求两个数中的较大值
【程序清单】
; 实验三-2:分支程序示例1 - 求两个数中的较大值
; 功能:求X和Y中的较大值,存入Z
DATA SEGMENT
X DB 10
Y DB 20
Z DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL, X
CMP AL, Y
JA NEXT
MOV AL, Y
NEXT:
MOV Z, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 求X和Y中的较大值,存入Z
- 使用JA(高于则跳转)指令,用于无符号数比较
- 这是一个典型的双分支结构
【运行结果】
Z = 20(Y的值,因为20 > 10)
【思考题】
- 如果X = Y,程序输出什么?
- 如果要修改为求较小值,如何改动?
实验3:分支程序示例2 - 求两个数的差的绝对值
【程序清单】
; 实验三-3:分支程序示例2 - 求两个数的差的绝对值
; 功能:求X和Y的差的绝对值,存入Z
DATA SEGMENT
X DB 5
Y DB 3
Z DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL, X
CMP AL, Y
JZ EQUAL ;如果X=Y则跳转到EQUAL
JNS PLUS ;如果X>Y则跳转到PLUS(正数)
MOV BL, Y
SUB BL, AL
MOV Z, BL
JMP EXIT
PLUS:
MOV BL, AL
SUB BL, Y
MOV Z, BL
JMP EXIT
EQUAL:
MOV Z, 0
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 求X和Y的差的绝对值,存入Z
- 使用多条件分支:
- X = Y时,Z = 0
- X > Y时,Z = X - Y
- X < Y时,Z = Y - X
【运行结果】
Z = 2(5 - 3 = 2)
【思考题】
- 如果X = 3,Y = 5,程序输出什么?
- JNS指令的含义是什么?什么时候会跳转?
2.2 加强性实验
实验4:成绩分类程序
【程序清单】
; 实验三-4:成绩分类程序
; 功能:根据分数分类为A/B/C/D/E
; 90分以上为A,80-89为B,70-79为C,60-69为D,60分以下为E
DATA SEGMENT
SCORE DB 85
GRADE DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL, SCORE
CMP AL, 90
JAE A_GRADE
CMP AL, 80
JAE B_GRADE
CMP AL, 70
JAE C_GRADE
CMP AL, 60
JAE D_GRADE
MOV GRADE, 'E'
JMP EXIT
A_GRADE:
MOV GRADE, 'A'
JMP EXIT
B_GRADE:
MOV GRADE, 'B'
JMP EXIT
C_GRADE:
MOV GRADE, 'C'
JMP EXIT
D_GRADE:
MOV GRADE, 'D'
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 根据分数进行成绩分类
- 90分以上为A,80-89为B,70-79为C,60-69为D,60分以下为E
- 使用多个CMP和JAE指令实现多分支
【运行结果】
GRADE = 'B'(85分属于B级)
【思考题】
- 如果分数是100分,程序输出什么等级?
- 如何修改程序实现60分以下的提示"不及格"?
实验5:字符分类程序
【程序清单】
; 实验三-5:字符分类程序
; 功能:判断大写/小写字母或其他字符
; 结果:1=大写字母,2=小写字母,3=其他字符
DATA SEGMENT
CH DB 'A'
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AL, CH
CMP AL, 'A'
JNB NL_CHECK
JMP OTHER
NL_CHECK:
CMP AL, 'Z'
JNA UPLETTER
CMP AL, 'a'
JNB LL_CHECK
JMP OTHER
LL_CHECK:
CMP AL, 'z'
JNA LOWLETTER
JMP OTHER
UPLETTER:
MOV RESULT, 1 ;大写字母
JMP EXIT
LOWLETTER:
MOV RESULT, 2 ;小写字母
JMP EXIT
OTHER:
MOV RESULT, 3 ;其他字符
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 判断字符CH的类型
- 1 = 大写字母,2 = 小写字母,3 = 其他字符
- 使用JNB/JNA/JNN等指令进行字符比较
【运行结果】
RESULT = 1(A是大写字母)
【思考题】
- 如果CH = 'm',程序输出什么结果?
- 如果CH = '5'(数字),程序输出什么结果?
实验6:求最大值程序
【程序清单】
; 实验三-6:求最大值程序
; 功能:从10个数中找最大值
DATA SEGMENT
ORG 1000H
ARR DB 10, 25, 3, 47, 15, 38, 92, 6, 71, 20
MAX DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, ARR
MOV CX, 9
MOV AL, [SI]
INC SI
NEXT:
CMP AL, [SI]
JGE SKIP
MOV AL, [SI]
SKIP:
INC SI
LOOP NEXT
MOV MAX, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 从10个无符号数中找出最大值
- 使用循环和比较指令
- 每次比较后如果发现更大的值则更新AL
【运行结果】
MAX = 92(数组中的最大值)
【思考题】
- 如果要求最小值,程序如何修改?
- 循环次数为什么是9而不是10?
实验7:符号函数程序
【程序清单】
; 实验三-7:符号函数程序
; 功能:计算符号函数Y
; Y = 1 (X>0), Y = 0 (X=0), Y = -1 (X<0)
DATA SEGMENT
X DW 5
Y DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, X
CMP AX, 0
JG POSITIVE
JL NEGATIVE
MOV Y, 0
JMP EXIT
POSITIVE:
MOV Y, 1
JMP EXIT
NEGATIVE:
MOV Y, -1
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
【程序说明】
- 计算符号函数:Y = 1 (X>0), Y = 0 (X=0), Y = -1 (X<0)
- 使用CMP指令和JG/JL条件转移
【运行结果】
Y = 1(因为5 > 0)
【思考题】
- 如果X = -10,程序的输出结果是什么?
- 如果X = 0,程序的输出结果是什么?
三、实验步骤
- 分析题目要求,设计程序流程图
- 根据流程图编写汇编源程序
- 编辑源程序,保存为.ASM文件
- 使用MASM汇编程序进行汇编
- 使用LINK链接程序进行链接
- 运行程序并观察结果
- 使用DEBUG调试程序,验证结果
四、实验结果分析
分支程序设计要点总结
-
条件转移指令的选择
- 无符号数比较:用JA/JAE/JB/JBE等
- 有符号数比较:用JG/JGE/JL/JLE等
- 特定条件:JE/JNE/JZ/JNZ等
-
分支结构的设计方法
- 双分支:使用CMP + 条件跳转 + 无条件跳转
- 多分支:逐个比较,逐层筛选
-
流程图的重要性
- 清晰表达程序执行流程
- 便于发现逻辑错误
- 有助于程序调试
五、思考题参考答案
实验1
- 如果X = FFFFH(-1),Y = 1,程序输出Z = 1(因为JGE时-1 < 1)
- JGE用于有符号数比较(>=),JA用于无符号数比较(>)
实验2
- 如果X = Y,AL保持Y的值,Z = Y
- 将JA改为JB即可求较小值
实验3
- 如果X = 3,Y = 5,输出Z = 2
- JNS:符号位为0(即正数)时跳转
实验4
- 100分输出'A'
- 将GRADE = 'E'改为显示"不及格"字符串
实验5
- 'm'输出2(小写字母)
- '5'输出3(其他字符)
实验6
- 将JGE改为JLE即可找最小值
- 循环9次因为第1个数已经作为初始最大值
实验7
- X = -10时,输出Y = -1
- X = 0时,输出Y = 0
六、实验总结
通过本次实验,我掌握了汇编语言分支程序设计的基本方法:
- 学会了使用CMP指令进行数值比较
- 熟悉了各种条件转移指令(JE/JNE/JG/JL/JA/JB等)
- 理解了单分支、双分支和多分支程序的设计
- 掌握了循环+分支结合的复杂程序设计
- 学会了使用流程图规划程序结构