Files
Operating-System/Experiment/asm-exp/实验三/分支程序设计.md
2026-06-25 00:09:09 +08:00

477 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验三:分支程序设计
## 一、实验目的
1. 掌握汇编语言分支程序设计的基本方法
2. 熟悉条件转移指令和和无条件转移指令的使用
3. 理解程序流程图的设计方法
## 二、实验内容
### 2.1 基础性实验
#### 实验1符号数比较
**【程序清单】**
```assembly
; 实验三-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
**【思考题】**
1. 如果X = -1假设为16位有符号数FFFFHY = 1程序输出什么
2. JGE指令和JA指令有什么区别
---
#### 实验2分支程序示例1 - 求两个数中的较大值
**【程序清单】**
```assembly
; 实验三-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 = 20Y的值因为20 > 10
**【思考题】**
1. 如果X = Y程序输出什么
2. 如果要修改为求较小值,如何改动?
---
#### 实验3分支程序示例2 - 求两个数的差的绝对值
**【程序清单】**
```assembly
; 实验三-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 = 25 - 3 = 2
**【思考题】**
1. 如果X = 3Y = 5程序输出什么
2. JNS指令的含义是什么什么时候会跳转
---
### 2.2 加强性实验
#### 实验4成绩分类程序
**【程序清单】**
```assembly
; 实验三-4成绩分类程序
; 功能根据分数分类为A/B/C/D/E
; 90分以上为A80-89为B70-79为C60-69为D60分以下为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分以上为A80-89为B70-79为C60-69为D60分以下为E
- 使用多个CMP和JAE指令实现多分支
**【运行结果】**
GRADE = 'B'85分属于B级
**【思考题】**
1. 如果分数是100分程序输出什么等级
2. 如何修改程序实现60分以下的提示"不及格"
---
#### 实验5字符分类程序
**【程序清单】**
```assembly
; 实验三-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 = 1A是大写字母
**【思考题】**
1. 如果CH = 'm',程序输出什么结果?
2. 如果CH = '5'(数字),程序输出什么结果?
---
#### 实验6求最大值程序
**【程序清单】**
```assembly
; 实验三-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数组中的最大值
**【思考题】**
1. 如果要求最小值,程序如何修改?
2. 循环次数为什么是9而不是10
---
#### 实验7符号函数程序
**【程序清单】**
```assembly
; 实验三-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
**【思考题】**
1. 如果X = -10程序的输出结果是什么
2. 如果X = 0程序的输出结果是什么
---
## 三、实验步骤
1. 分析题目要求,设计程序流程图
2. 根据流程图编写汇编源程序
3. 编辑源程序,保存为.ASM文件
4. 使用MASM汇编程序进行汇编
5. 使用LINK链接程序进行链接
6. 运行程序并观察结果
7. 使用DEBUG调试程序验证结果
## 四、实验结果分析
### 分支程序设计要点总结
1. **条件转移指令的选择**
- 无符号数比较用JA/JAE/JB/JBE等
- 有符号数比较用JG/JGE/JL/JLE等
- 特定条件JE/JNE/JZ/JNZ等
2. **分支结构的设计方法**
- 双分支使用CMP + 条件跳转 + 无条件跳转
- 多分支:逐个比较,逐层筛选
3. **流程图的重要性**
- 清晰表达程序执行流程
- 便于发现逻辑错误
- 有助于程序调试
## 五、思考题参考答案
### 实验1
1. 如果X = FFFFH-1Y = 1程序输出Z = 1因为JGE时-1 < 1
2. JGE用于有符号数比较>=JA用于无符号数比较>
### 实验2
1. 如果X = YAL保持Y的值Z = Y
2. 将JA改为JB即可求较小值
### 实验3
1. 如果X = 3Y = 5输出Z = 2
2. JNS符号位为0即正数时跳转
### 实验4
1. 100分输出'A'
2. 将GRADE = 'E'改为显示"不及格"字符串
### 实验5
1. 'm'输出2小写字母
2. '5'输出3其他字符
### 实验6
1. 将JGE改为JLE即可找最小值
2. 循环9次因为第1个数已经作为初始最大值
### 实验7
1. X = -10时输出Y = -1
2. X = 0时输出Y = 0
## 六、实验总结
通过本次实验,我掌握了汇编语言分支程序设计的基本方法:
1. 学会了使用CMP指令进行数值比较
2. 熟悉了各种条件转移指令JE/JNE/JG/JL/JA/JB等
3. 理解了单分支、双分支和多分支程序的设计
4. 掌握了循环+分支结合的复杂程序设计
5. 学会了使用流程图规划程序结构