«

汇编编写程序键盘输入学生成绩并显示信息

Sweetiey 发布于 阅读:275 课程笔记


项目要求:编写一完整程序,要求显示班级号,班级人数,接收年月日信息并送显,键盘输入班级34位同学高数成绩,求最高分、最低分、平均分,并全部显示出来。

首先根据项目要求讨论汇编代码的基本内容,划分程序编程部分

  1. 显示班级号,班级人数,接收年月日信息并且送显;
  2. 键盘输入班级34位同学的高数成绩;
  3. 求最高分、最低分、平均分、并且全部显示出来。

然后根据程序分工画出该程序流程图,其次根据流程图进行汇编代码。

 

以下是调用的子程序以及其流程图:

CALL Ent;显示单个字符,并且使用循环,输入BX中存储的个数。

CALL DISPL;保护AX,并且使用09号系统功能调用显示DX中的内容

CALL DATEEE;调用键盘输入AL,并且采用AX=01来判断是否键盘输入成功

汇编编写程序键盘输入学生成绩并显示信息

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

三、程序结果截图

汇编编写程序键盘输入学生成绩并显示信息

汇编编写程序键盘输入学生成绩并显示信息

 

emu8086v408r11_官网+注册机+汉化.zip

汇编


扫描二维码,在手机上阅读
收到1条评论
avatar
Sweetiey 2023-12-18 15:46
哈哈
回复