⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 成績管理程序.exe.~asm

📁 滙編語言的一個應用實例﹐該程序的功能為統計學生信息的系統。
💻 ~ASM
📖 第 1 页 / 共 2 页
字号:
DSEG    SEGMENT 'DATA'
stu  DB 110 DUP(?) ;存放第一至十个学生记录
ave DB 5 DUP(?)    ;存放各科平均分和总成绩平均分
poi DB 15 DUP(?)   ;存放各分数段人数

head DB '******The Manage System of Student`s Achievement******',0DH,0AH,0DH,0AH,'$'
choose DB 'Please choose a handle below (Input the number 1 to 7)',0DH,0AH,'$'
menu  DB '1.Add 2.Edit 3.Delete 4.Taxis 5.Find 6.Stat. 7.Quit',0DH,0AH,'$'

Add_num  DB 'Please input the student`s number(1-255)',0DH,0AH,'$'
Add_cn   DB 'Please input chinese score(0-100)',0DH,0AH,'$'
Add_math DB 'Please input math score(0-100)',0DH,0AH,'$'
Add_en   DB 'Please input english score(0-100)',0DH,0AH,'$'
Add_confirm1 DB 'These are the infomation what you input',0DH,0AH,'$'
Add_confirm2 DB 'Please confirm you want to save the record(YES:y;NO:n)',0DH,0AH,'$'

AskForEdit DB 'Which record do you want to edit?(Input the student`s number)',0DH,0AH,'$'
Delete_confirm DB 'Please confirm you want to remove the record(YES:y;NO:n)',0DH,0AH,'$'
AskForDelete DB 'Which record do you want to delete?(Input the student`s number)',0DH,0AH,'$'
AskForTaxis DB 'Please choose a way to taxis',0DH,0AH,'$'
AskForTaxis1 DB '1.Single Subject taxis    2.Overall Subject taxis',0DH,0AH,'$'
AskForFind DB 'Which student do you want to find?',0DH,0AH,'$'
AskForFind1 DB '1.Chinese  2.Math  3.English  4.Overall 5.Quit',0DH,0AH,'$' 
AskForFind3 DB '1.Find Single person 2.Who fail',0DH,0AH,'$'
AskForStat DB '1.Single subject ave  2.Overall subject ave  3.Sorce segment',0DH,0AH,'$'
DispSingleTaxis DB 'These are the single subject taxis below',0DH,0AH,'$'  

ShowAllNum DB 'There are all student`s number below',0DH,0AH,'$'

Err_full DB 'The record is full',0DH,0AH,'$'
Err_notnum DB 'Only can input number',0DH,0AH,'$'
Err_empty DB 'The record can`t be empty',0DH,0AH,'$'
Err_toolarge DB 'The number must less then 255',0DH,0AH,'$'
Err_toolarge1 DB 'The number must less then 100',0DH,0AH,'$'
Err_WrongNum DB 'The first number can`t be 0',0DH,0AH,'$'
Err_WrongNum1 DB 'You input a wrong number',0DH,0AH,'$'
Err_WrongChoose DB 'Must input the integer 1-7',0DH,0AH,'$'
Err_yn DB 'You must input `y` or `n` ',0DH,0AH,'$'
Err_CantFindRecord DB 'Can not find the record',0DH,0AH,'$'
Err_Not1or2 DB 'You only can input 1 or 2',0DH,0AH,'$'
Err_Not12345 DB 'You only can input 1,2,3,4,5',0DH,0AH,'$'
Err_Not123 DB 'You only can input 1,2,3',0DH,0AH,'$'
Err_SameNum DB 'The student`s num is already existed',0DH,0AH,'$'

num DB        'Number:    ','$'
cn_score DB   'Chinese Score: ','$'
cn_place DB   'Chinese Place: ','$'
math_score DB 'Math Score:    ','$'
math_place DB 'Math Place: ','$'
en_score DB   'English Score: ','$'
en_place DB   'English Place: ','$'
AverageScore DB 'Average Score: ','$'
Score DB 'Score: ','$'
Place DB 'Place: ','$'
Chinese DB 'Chinese: ','$'
Math DB 'Math: ','$'
English DB 'English: ','$'
Overall DB 'Overall: ','$'

T59     DB '<60    : ','$'
T60_69  DB '60-69  : ','$'
T70_79  DB '70-79  : ','$'
T80_89  DB '80-89  : ','$'
T90_100 DB '90-100 : ','$'

HowManyRecord DB ?
Temp DB 10 DUP(?)

DSEG    ENDS

SSEG    SEGMENT STACK   'STACK'
db   256  DUP(0)
SSEG    ENDS

CSEG    SEGMENT 'CODE'
START:
; set segment registers:
MOV AX, DSEG
MOV DS, AX
MOV ES, AX

;程序头
LEA DX, head 
CALL DISPCHS   ;显示程序名

;主菜单
Begin:LEA DX, choose
CALL DISPCHS   ;显示提示信息
LEA DX, menu  
CALL DISPCHS   ;显示选择菜单

MOV AH,01H  ;从键盘输入一个字符到AL并回显
INT 21H     
CMP AL,'1'  
JE  AddInfo  ;如果=1,跳到"录入(Add)"模块
CMP AL,'2'  
JE  EditInfo  ;如果=2,跳到"修改(Edit)"模块
CMP AL,'3'  
JE  DeleteInfo  ;如果=3,跳到"删除(Delete)"模块
CMP AL,'4'  
JE  Taxis  ;如果=4,跳到"排序(Taxis)"模块
CMP AL,'5'  
JE  Find  ;如果=5,跳到"查找(Find)"模块
CMP AL,'6'  
JE  Stat.  ;如果=6,跳到"统计(Stat.)"模块
CMP AL,'7'
JE Quit
JMP Error   ;否则就无条件转移到ERROR


;************功能块**************

;--------------------------------------------录入(Add)-------------------------------------
AddInfo:
CALL ENTER  

;;;;;;;;;;;;;;;;;;;找空块;;;;;;;;;;;;;;;;;

MOV SI,0
FullorNot:CMP stu[SI],0
JE num_Add
ADD SI,11
CMP SI,122;判断记录是否满,是则跳到“输入学生编号”块,否则返回“主界面”
JNE FullorNot
LEA DX,Err_full
CALL ENTER
CALL DISPCHS
JMP Begin     

;;;;;;;;;;;;;;;;输入学生编号;;;;;;;;;;;;;;

;提示语句,提示要输入学生编号
num_Add:MOV CX,0            ;记录字符数目
LEA DX, Add_num
CALL DISPCHS

CALL InputNum   ;调用子程序“输入编号”        

CMP DI,1;出口参数DI为1是,表示输入出错,返回提示语句,要求重新输入 
JE num_Add

;确认学号是否已经存在
LEA DI,stu
A:CMP BL,[DI]
JNE B
CMP DI,SI
JE C
LEA DX,Err_SameNum
CALL ENTER
CALL DISPCHS
JMP num_Add

B:ADD DI,11
CMP DI,110
JNE A

;记录学生编号  
C:  MOV stu[SI],BL

;;;;;;;;;;;;;;;输入语文成绩;;;;;;;;;;;;;;

;提示语句,提示要输入语文成绩
cn_Add:MOV CX,0            ;记录字符数目
LEA DX,Add_cn       ;打印提示语句
CALL DISPCHS

CALL InputScore       

CMP DI,1             ;出口参数DI为1是,表示输入出错,返回提示语句,要求重新输入
JE cn_Add

;记录语文成绩  
MOV stu[SI+1],BL

;;;;;;;;;;;;;;;输入数学成绩;;;;;;;;;;;;;;

;提示语句,提示要输入数学成绩
math_Add:LEA DX,Add_math
CALL DISPCHS

CALL InputScore      

CMP DI,1
JE math_Add

;记录数学成绩  
MOV stu[SI+3],BL

;;;;;;;;;;;;;;;输入英语成绩;;;;;;;;;;;;;;

;提示语句,提示要输入英语成绩
en_Add:LEA DX,Add_en
CALL DISPCHS

CALL InputScore 

CMP DI,1
JE en_Add

;记录英语成绩  
MOV stu[SI+5],BL

;;;;;;;;;;;;计算总成绩和平均成绩;;;;;;;;;;;;

MOV AX,0
MOV CX,2
MOV DL,3
MOV DI,SI
INC DI
MOV AL,[DI]
hahaha:MOV BL,[DI+2]
ADD AL,BL
JNC lalala
INC AH
lalala:INC DI
INC DI
LOOP hahaha

MOV stu[SI+7],AL;记录总成绩
MOV stu[SI+8],AH

DIV DL

MOV stu[SI+10],AL;记录平均成绩



;;;;;;;;;;;;;;;;;;;;确认输入;;;;;;;;;;;;;;;;;;;;;
;输出所输入的记录,要求用户确认是否正确
LEA DX,Add_confirm1 
CALL DISPCHS

MOV DI,0   ;记录输出到哪项

confirm_repeat:MOV AX,0
CMP DI,0
JNE not0
LEA DX,num
CALL DISPCHS
MOV AL,stu[SI]
JMP GO
not0:CMP DI,1
JNE not1
LEA DX,cn_score
CALL DISPCHS
MOV AL,stu[SI+1]
JMP GO
not1:CMP DI,2
JNE not2
LEA DX,math_score
CALL DISPCHS
MOV AL,stu[SI+3]
JMP GO
not2:
LEA DX,en_score
CALL DISPCHS
MOV AL,stu[SI+5]

GO: CALL ToAsc2&Show
CALL ENTER

INC DI
CMP DI,3
JNA confirm_repeat

ha:LEA DX,Add_confirm2
CALL DISPCHS         

MOV AH,01H
INT 21H
CALL ENTER
CMP AL,'n'
JNE notn
JMP num_Add
notn:CMP AL,'y'
JE isy 
LEA DX,Err_yn   
CALL DISPCHS
JMP ha

isy:MOV AL,HowManyRecord
INC AL
MOV HowManyRecord,AL
CALL ClearPlace

JMP Begin        

;--------------------------------------编辑(Edit)--------------------------------

EditInfo:   CALL ENTER
CALL DISPALLNUM

edit_begin:LEA DX,AskForEdit
CALL DISPCHS

CALL InputNum

CMP DI,1
JE edit_begin

;查找相应记录
MOV SI,0
edit_GO:CMP BL,stu[SI]
JNE edit_again
MOV AL,HowManyRecord
DEC AL
MOV HowManyRecord,AL
JMP num_Add
edit_again:ADD SI,11
CMP SI,110
JNE edit_GO
LEA DX,Err_CantFindRecord
CALL DISPCHS

JMP Begin 


;-------------------------------------删除(Delete)--------------------------------

DeleteInfo: CALL ENTER
CALL DISPALLNUM

delete_begin:LEA DX,AskForDelete
CALL ENTER
CALL DISPCHS

CALL InputNum

CMP DI,1
JE delete_begin

;删除相应记录
MOV SI,0
delete_GO:CMP BL,stu[SI]
JNE delete_again

;确认是否真的删除
LEA DX,Delete_confirm
CALL DISPCHS
ho:   MOV AH,01H
INT 21H
CMP AL,'n'
JNE d_notn
CALL ENTER
JMP Begin
d_notn:CMP AL,'y'
JE d_isy 
LEA DX,Err_yn
CALL ENTER
CALL DISPCHS
JMP ho

;将该记录的所有项置0
d_isy:MOV CX,11
ooo:MOV stu[SI],0
INC SI
LOOP ooo
MOV AL,HowManyRecord
DEC AL
MOV HowManyRecord,AL
CALL ClearPlace
CALL ENTER
JMP Begin

delete_again:ADD SI,11
CMP SI,110
JNE delete_GO
LEA DX,Err_CantFindRecord
CALL DISPCHS

JMP Begin


;---------------------------------排序(Taxis)-------------------------------------

Taxis:      CALL ENTER
LEA DX,AskForTaxis
CALL DISPCHS
LEA DX,AskForTaxis1
CALL DISPCHS

MOV AH,01H
INT 21H
CMP AL,31H
JE Choose1
CMP AL,32H
JE Choose2
LEA DX,Err_Not1or2
CALL DISPCHS
JMP Taxis

Choose1:MOV DL,1  
CALL TheTaxis
MOV DL,2
CALL TheTaxis
MOV DL,3
CALL TheTaxis

;显示单科排名情况
LEA DX,DispSingleTaxis
CALL ENTER
CALL DISPCHS

LEA SI,stu

X:CMP [SI],0
JE Z

CALL ENTER
MOV DI,0   ;记录输出到哪项       
taxis_repeat:MOV AX,0
CMP DI,0
JNE taxis_not0
LEA DX,num
CALL DISPCHS
MOV AL,stu[SI]
JMP taxis_GO
taxis_not0:CMP DI,1
JNE taxis_not1
LEA DX,cn_place
CALL ENTER
CALL DISPCHS
MOV AL,stu[SI+2]
JMP taxis_GO
taxis_not1:CMP DI,2
JNE taxis_not2
LEA DX,math_place
CALL DISPCHS
MOV AL,stu[SI+4]
JMP taxis_GO
taxis_not2:LEA DX,en_place
CALL DISPCHS
MOV AL,stu[SI+6]

taxis_GO: MOV AH,0
CALL ToAsc2&Show
CALL TAB

INC DI
CMP DI,3
JNA taxis_repeat   

Z:ADD SI,11
CMP SI,110
JNE X    

CALL ENTER
JMP Begin   


;总成绩排序    
Choose2:MOV CL,0     ;当前排到第几名

Choose21:INC CL       
LEA DI,stu+7
LEA BX,temp+11;BX用来存放该轮排序中暂时最打的数的偏移地址   
MOV [BX],0
MOV [BX+1],0
MOV [BX+2],0
LEA SI,stu

Choose22:CMP [SI],0      ;过滤出空记录
JE next22      
CMP [DI+2],0 ;过滤出已经排了名的
JNE next22 

;把最大的那个数的偏移地址放到BX
MOV AX,[BX]
CMP AX,[DI] 
JNB next22 
MOV BX,DI

next22:ADD SI,11
ADD DI,11
CMP SI,110
JNE Choose22

;赋予它和与它同分的所有同学的该科排名
MOV [BX+2],CL 
MOV AX,[BX]
LEA SI,stu
LEA DI,stu+7

huao2:CMP [SI],0
JE xiao2
CMP [DI+2],0
JNE xiao2       
CMP AX,[DI]
JNE xiao2

MOV [DI+2],CL 

xiao2:ADD SI,11
ADD DI,11
CMP SI,110
JNE huao2

CMP CL,HowManyRecord
JB Choose21

;显示总成绩排名
LEA DX,DispSingleTaxis
CALL ENTER
CALL DISPCHS

LEA SI,stu

X2:MOV CL,2 
CMP [SI],0
JE Z2

CALL ENTER
LEA DX,num
CALL DISPCHS
MOV AL,stu[SI]
JMP taxis_GO2
k:MOV AL,stu[SI+9]

taxis_GO2:MOV AH,0  
CALL ToAsc2&Show
CALL TAB

LOOP k

Z2:ADD SI,11
CMP SI,110
JNE X2 

CALL ENTER
JMP Begin


;-----------------------------------查找(Find)-------------------------------------

Find:       CALL ENTER
LEA DX,AskForFind3
CALL DISPCHS
MOV AH,01H
INT 21H
CALL ENTER
CMP AL,31H
JE Find1
CMP AL,32H
JE Find2
LEA DX,Err_not1or2
CALL DISPCHS
JMP Find

Find1:CALL DISPALLNUM
Find_again:LEA DX,AskForFind
CALL DISPCHS
CALL InputNum
CALL ENTER
CMP DI,1
JE Find_again

LEA SI,stu
Find_begin:CMP BL,[SI]

JE Find_ok

ADD SI,11
CMP SI,110
JNE Find_begin
LEA DX,Err_CantFindRecord
CALL DISPCHS
JMP Find_exit

Find_ok:LEA DX,AskForFind1
CALL DISPCHS
MOV AH,01H
INT 21H
CALL ENTER

MOV AH,0
CMP AL,31H
JNE Find_not1
JMP Find_is1
Find_not1:CMP AL,32H
JNE Find_not2
JMP Find_is2
Find_not2:CMP AL,33H
JNE Find_not3
JMP Find_is3
Find_not3:CMP AL,34H
JNE Find_not4
JMP Find_is4
Find_not4:CMP AL,35H
JNE Find_not5 
JMP Find_exit    
Find_not5:LEA DX,Err_Not12345
CALL DISPCHS
JMP Find_ok

Find_is1:MOV AL,stu[SI+1]
MOV CL,stu[SI+2]
JMP Find_output
Find_is2:MOV AL,stu[SI+3]
MOV CL,stu[SI+4]
JMP Find_output
Find_is3:MOV AL,stu[SI+5]
MOV CL,stu[SI+6]
JMP Find_output
Find_is4:MOV AL,stu[SI+7]
MOV AH,stu[SI+8]
MOV CL,stu[SI+9]

Find_output:LEA DX,Score
CALL DISPCHS

CALL ToAsc2&Show
CALL ENTER           

LEA DX,Place
CALL DISPCHS
ADD CL,30H
MOV DL,CL
MOV AH,02H
INT 21H
CALL ENTER     
JMP Find_ok 

Find2:MOV CL,3
Find2_repeat:LEA SI,stu
CMP CL,3        
JNE Find2_not3
LEA DI,stu+1
LEA DX,Chinese
CALL DISPCHS
CALL ENTER
JMP Find2_go
Find2_not3:CMP CL,2
JNE Find2_not2
LEA DI,stu+3
LEA DX,Math
CALL DISPCHS
CALL ENTER
JMP Find2_go
Find2_not2:LEA DI,stu+5
LEA DX,English
CALL DISPCHS
CALL ENTER

Find2_go:CMP [SI],0
JE Find2_again
CMP [DI],60
JNB Find2_again

MOV AH,0
MOV AL,[SI]
CALL ToAsc2&Show
CALL TAB        

Find2_again:ADD SI,11
ADD DI,11
CMP SI,110
JNE Find2_go

CALL ENTER
LOOP Find2_repeat        

Find_exit:CALL ENTER
JMP Begin


;----------------------------------------统计(Stat.)--------------------------------

Stat.:      CALL ENTER
LEA DX,AskForStat
CALL DISPCHS
MOV AH,01H
INT 21H
CALL ENTER

CMP AL,31H
JE Stat_is1
CMP AL,32H
JE Stat_is2
CMP AL,33H
JE Stat_is3
LEA DX,Err_Not123
CALL DISPCHS
JMP Stat.

Stat_is1:   MOV CL,3

Stat_GO1:LEA SI,stu
MOV AX,0     

CMP CL,3
JNE Stat_not3           
LEA DX,Chinese
CALL DISPCHS
LEA DI,stu+1
JMP Stat_begin
Stat_not3:CMP CL,2
JNE Stat_not2
LEA DX,Math
CALL DISPCHS
LEA DI,stu+3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -