汇编编写程序键盘输入学生成绩并显示信息
项目要求:编写一完整程序,要求显示班级号,班级人数,接收年月日信息并送显,键盘输入班级34位同学高数成绩,求最高分、最低分、平均分,并全部显示出来。
首先根据项目要求讨论汇编代码的基本内容,划分程序编程部分
- 显示班级号,班级人数,接收年月日信息并且送显;
- 键盘输入班级34位同学的高数成绩;
- 求最高分、最低分、平均分、并且全部显示出来。
然后根据程序分工画出该程序流程图,其次根据流程图进行汇编代码。
以下是调用的子程序以及其流程图:
CALL Ent;显示单个字符,并且使用循环,输入BX中存储的个数。
CALL DISPL;保护AX,并且使用09号系统功能调用显示DX中的内容
CALL DATEEE;调用键盘输入AL,并且采用AX=0或1来判断是否键盘输入成功
图1-DATEEE-键盘输入数据
CALL StuData;键盘输入学生成绩,从TAB表的尾部逆向输入成绩
图2-StuData-键盘输入学生成绩
CALL FUNC1;进行分数格式调整,我们采用键盘输入学生成绩时使用指针从最后一个地址开始移动,并且先输入高位数字再输入低位数字,因此这里进行分数格式调整将其输入的值调整,将地位与高位对调再进行最大数、最小数、平均数的求值。
图3-FUNC1-分数格式调整
CALL MAX ;这里采用了选择排序法,将最大值选出来
图4-MAX-求最大值
CALL MIN;采用了选择排序法,将最小值选出来
图5-MIN-求最小值
CALL AVER;用来求平均值
图6- AVER-求平均值
CALL CHANG ;用来将ASCII码值转换成十六进制数
CALL FUNC;将非压缩BCD码转化压缩性BCD码
CALL DISP1;用来显示AX的值
最后汇编代码进行程序运行尝试、调试程序过程并且对程序调试中出现的问题讨论和改善。
主流程图:
图8-程序总图
DATAS SEGMENT
Class DB "Class :212211 Number of people:",'$'
DATE DB "Typing DATE(Format:20231204):",'$'
Shabi DB "Wrong format,typing the fucking number again!",'$'
ShowDate DB "The Date is :",'$'
Pleace DB "Pleace enter the math grade (format:Double-digit) of student212211",'$'
TIPMAX DB "THE MAXEST NUM IS " ,'$'
TIPMIN DB "THE MINEST NUM IS " ,'$'
TIPAVER DB "THE AVERAGE NUM IS " ,'$'
EN DB 0DH,0AH
Year DD 0
TAB1 DW 34 DUP(?)
MaoHao DB ':'
NUMOFSTU DW 34 ;修改班级人数,改这两个
NUMOFSTU1 DB 34
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS ;分数储存格式 60 -> 3036H
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,Class
CALL DISPL;显示班级
MOV AX,NUMOFSTU
MOV CL,10
DIV CL
MOV CH,AH
ADD AL,90H
DAA
ADC AL,40H
DAA
MOV DL,AL
MOV AH,02
INT 21H
CLC ;CF=0
MOV AL,CH
ADD AL,90H
DAA
ADC AL,40H
DAA
MOV DL,AL
MOV AH,02
INT 21H ;显示人数
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
JJ: LEA DX,DATE
CALL DISPL;输入日期提示
LEA SI,Year
MOV CX,8
CALL DATEEE;输入日期
CMP AX,0
JA JJ
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
LEA DX,ShowDate
CALL DISPL;输出日期提示
MOV BX,8
LEA SI,Year
CALL Ent;显示日期
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
CALL StuData;输入数据
CALL FUNC1 ;;分数格式调整 3036H->3630H
CALL MAX ;find max
LEA DX,TIPMAX
CALL DISPL
CALL DISP1 ;display
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
CALL MIN ;find min
LEA DX,TIPMIN
CALL DISPL
CALL DISP1
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
CALL CHANG ;ASCII->16 3630H->0600H
CALL FUNC ;非压缩->压缩 0600H->0060H
CALL AVER ;get average并且将结果调整为ASCII 0060H->0600H
LEA DX,TIPAVER
CALL DISPL
CALL DISP1
MOV AH,4CH
INT 21H
FUNC1 PROC ;分数格式调整
LEA SI,TAB1
MOV CX,NUMOFSTU ;NUM
LLL: MOV AX,[SI]
MOV BX,AX
MOV AH,AL
MOV AL,BH
MOV [SI],AX
INC SI
INC SI
LOOP LLL
RET
FUNC1 ENDP
MAX PROC
LEA SI,TAB1
MOV CX,NUMOFSTU ;NUM
MOV AX,[SI]
L9: CMP AX,[SI]
JA L1
MOV AX,[SI]
L1: INC SI
INC SI
LOOP L9
RET
MAX ENDP
MIN PROC
LEA SI,TAB1
MOV CX,NUMOFSTU ;NUM
MOV AX,[SI]
L21:CMP AX,[SI]
JB L11
MOV AX,[SI]
L11:INC SI
INC SI
LOOP L21
RET
MIN ENDP
CHANG PROC ;ASCII->16
LEA DI,TAB1
MOV CX,NUMOFSTU
L41: MOV AX,[DI]
SUB AH,30H
SUB AL,30H
MOV [DI],AX
INC DI
INC DI
LOOP L41
RET
CHANG ENDP
DISP1 PROC ; display
MOV BX,AX
MOV DL,BH
MOV AH,2
INT 21H
MOV DL,BL
MOV AH,2
INT 21H
RET
DISP1 ENDP
AVER PROC
LEA SI,TAB1
MOV AX,0
MOV CX,NUMOFSTU ;NUM
L31:ADD AX,[SI]
INC SI
INC SI
LOOP L31 ;SUM
MOV BH,NUMOFSTU1
DIV BH ;除法 BH为个数
MOV AH,0
MOV BX,AX
SHL AX,1
SHL AX,1
SHL AX,1
SHL AX,1
MOV AL,BL
AND AL,0FH
ADD AL,30H
ADD AH,30H ;调整为ACSII
RET
AVER ENDP
FUNC PROC
LEA DI,TAB1
MOV CX,NUMOFSTU
MOV BX,0
L51: MOV AX,[DI]
MOV BL,AL
SHR AX,1
SHR AX,1
SHR AX,1
SHR AX,1
ADD AX,BX
MOV [DI],AX
INC DI
INC DI
LOOP L51
RET
FUNC ENDP
DATEEE PROC NEAR
L5: MOV AH,1
INT 21H
CMP AL,30H
JB L2
CMP AL,39H
JA L2
MOV [SI],AL
INC SI
LOOP L5
MOV AX,0;0表示成功
RET
L2: MOV BX,2
LEA SI,EN
CALL Ent;回车换行
LEA DX,Shabi
CALL DISPL;显示错误信息
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
MOV AX,1;一表示失败
RET
DATEEE ENDP
DISPL PROC NEAR
PUSH AX
MOV AH,09
INT 21H
POP AX
RET
DISPL ENDP
Ent PROC NEAR
PUSH AX
EN1: MOV AH,02
MOV DL,[SI]
INT 21H
INC SI
DEC BX
JNZ EN1
POP AX
RET
Ent ENDP
StuData PROC NEAR
MOV AX,NUMOFSTU
LEA SI,TAB1
LL6:LEA DX,Pleace
CALL DISPL;请输入第
PUSH AX
MOV CL,10
DIV CL;留下高位,在AL里面
AND AX,0FH
ADD AX,30H
MOV DL,AL
MOV AH,02
INT 21H
POP AX
PUSH AX
DIV CL;留下低位,在AH里面
MOV CL,8
SHR AX,CL
ADD AX,30H
MOV DL,AL
MOV AH,02
INT 21H
;几个
MOV BX,1
LEA SI,MaoHao
CALL Ent;冒号
POP AX
LEA SI,TAB1
PUSH AX
MOV CL,2
MUL CL
ADD SI,AX
DEC SI
DEC SI
MOV CX,2
CALL DATEEE;输入成绩
; CMP AX,0
; JA NO
;输入的不是数字
MOV BX,2
LEA SI,EN
CALL Ent;回车换行
POP AX
DEC AX
JNZ LL6
RET
;NO: POP AX
; PUSH AX
; JMP LL6
StuData ENDP
CODES ENDS
END START
三、程序结果截图: