记录第三次微机实验(子程序设计)
题目:编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。最大值放在BH,最小值放在BL(显示一位16进制)
代码如下:
DATA SEGMENT
NUM DB 14, 1, 3, 2, 9, 8, 14, 13, 10, 5;定义数据
LEN DB $ - NUM ;计算数据长度
STR1 DB 'MAX:$' ;定义提示语句
STR2 DB 0DH, 0AH, 'MIN:$' ;中间换行
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
XOR CX, CX
MOV CL, LEN - 1 ;定义循环次数
MOV SI, OFFSET NUM
MOV BH, [SI]
MOV BL, [SI]
INC SI ;指针加一指向下一位
CALL MAXMIN ;调用最大最小值函数
MOV DX, OFFSET STR1 ;DOS 9号调用
MOV AH, 09H ;显示字符串
INT 21H
MOV DL, BH ;将最大值赋给DL
CALL OUTPUT ;调用输出函数
;输出最大值
MOV DX, OFFSET STR2 ;DOS 9号调用
MOV AH, 09H ;显示字符串
INT 21H
MOV DL, BL ;将最小值赋给DL
CALL OUTPUT ;调用输出函数
;输出最小值
MOV AH, 4CH ;DOS 4C号调用
INT 21H ;返回操作系统
;最大最小值函数
MAXMIN PROC
ONE: MOV AL, [SI]
CMP AL, BL
JB MIN_BL ;如果AL<BL跳转
TWO: CMP AL, BH
JA MAX_BH ;如果AL>BH跳转
NEXT: INC SI
LOOP ONE ;判断循环是否结束
RET
MIN_BL: MOV BL, AL ;更新最小值
JMP NEXT
MAX_BH: MOV BH, AL ;更新最大值
JMP NEXT
MAXMIN ENDP
;输出函数
OUTPUT PROC
CMP DL, 9 ;判断DL的值是否小于9
JB MIN_9
ADD DL, 07H ;DL>9,加37H变为字母
MIN_9: ADD DL, 30H ;DL<=9,加30H变为数字
MOV AH, 02H ;DOS 2号调用
INT 21H ;显示单字符
RET
OUTPUT ENDP
CODE ENDS
END START
PS:CSDN没有给汇编语言(assembly)提供语法高亮,所以为了方便阅读,下面给出代码贴图和运行结果。
代码贴图
运行结果
最大值为14,输出E
最小值为1,输出1