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

8.6 KiB
Raw Permalink Blame History

实验三:分支程序设计

一、实验目的

  1. 掌握汇编语言分支程序设计的基本方法
  2. 熟悉条件转移指令和和无条件转移指令的使用
  3. 理解程序流程图的设计方法

二、实验内容

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

【思考题】

  1. 如果X = -1假设为16位有符号数FFFFHY = 1程序输出什么
  2. 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 = 20Y的值因为20 > 10

【思考题】

  1. 如果X = Y程序输出什么
  2. 如果要修改为求较小值,如何改动?

实验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 = 25 - 3 = 2

【思考题】

  1. 如果X = 3Y = 5程序输出什么
  2. JNS指令的含义是什么什么时候会跳转

2.2 加强性实验

实验4成绩分类程序

【程序清单】

; 实验三-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字符分类程序

【程序清单】

; 实验三-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求最大值程序

【程序清单】

; 实验三-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符号函数程序

【程序清单】

; 实验三-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. 学会了使用流程图规划程序结构