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

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

📁 滙編語言的一個應用實例﹐該程序的功能為統計學生信息的系統。
💻 ~ASM
📖 第 1 页 / 共 2 页
字号:
JMP Stat_begin
Stat_not2:LEA DI,stu+5
LEA DX,English
CALL DISPCHS

Stat_begin: CMP [SI],0
JE Stat_next

ADD AL,[DI]
JNC Stat_next
INC AH

Stat_next:ADD SI,11
ADD DI,11
CMP SI,110
JNE Stat_begin

MOV DL,HowManyRecord
DIV DL
MOV AH,0
CMP CL,3
JNE Stat2_not3
MOV ave,AL
JMP CHN
Stat2_not3:CMP CL,2
JNE Stat2_not2
MOV ave+1,AL
JMP CHN
Stat2_not2:MOV ave+2,AL

CHN:CALL ToAsc2&Show
CALL ENTER           

LOOP Stat_GO1   
JMP Begin      

Stat_is2:LEA SI,stu
MOV AX,0            
LEA DI,stu+7

Stat2_begin:CMP [SI],0
JE Stat2_next

ADD AX,[DI]

Stat2_next:ADD SI,11
ADD DI,11
CMP SI,110
JNE Stat2_begin

MOV DX,0
MOV BL,HowManyRecord
MOV BH,0
DIV BX
MOV ave+3,AL
MOV ave+4,AH

CALL ToAsc2&Show
CALL ENTER    

JMP Begin

Stat_is3:MOV CL,3
LEA DI,poi
Stat3_start:LEA SI,stu

Stat3_begin:CMP [SI],0
JE Stat3_again

CMP CL,3
JNE Stat3_cl_not3
MOV BL,[SI+1]  
JMP Stat3_go
Stat3_cl_not3:CMP CL,2
JNE Stat3_cl_not2
MOV BL,[SI+3]  
JMP Stat3_go
Stat3_cl_not2:MOV BL,[SI+5]  

Stat3_go:CALL SorceSegment

CMP BH,6
JNE Stat4_not6
MOV AL,[DI]
INC AL
MOV [DI],AL
JMP Stat3_again
Stat4_not6:CMP BH,7
JNE Stat4_not7
MOV AL,[DI+1]
INC AL
MOV [DI+1],AL
JMP Stat3_again
Stat4_not7:CMP BH,8
JNE Stat4_not8
MOV AL,[DI+2]
INC AL
MOV [DI+2],AL
JMP Stat3_again
Stat4_not8:CMP BH,9
JNE Stat4_not9
MOV AL,[DI+3]
INC AL
MOV [DI+3],AL
JMP Stat3_again
Stat4_not9:MOV AL,[DI+4]
INC AL
MOV [DI+4],AL
JMP Stat3_again

Stat3_again:ADD SI,11
CMP SI,110
JNE Stat3_begin

ADD DI,5
LOOP Stat3_start

;显示     
MOV CX,3
DISP_Stat_LOOP:
CMP CX,3
JNE Stat5_not3
LEA DI,poi
LEA DX,Chinese
CALL DISPCHS
CALL ENTER
JMP Stat5_go
Stat5_not3:CMP CX,2
JNE Stat5_not2
LEA DI,poi+5
LEA DX,Math        
CALL DISPCHS
CALL ENTER
JMP Stat5_go
Stat5_not2:LEA DI,poi+10
LEA DX,English
CALL DISPCHS
CALL ENTER

Stat5_go:MOV AH,0
LEA DX,T59   
CALL DISPCHS
MOV AL,[DI]
CALL ToAsc2&Show
CALL ENTER
MOV AH,0     
LEA DX,T60_69
CALL DISPCHS
MOV AL,[DI+1]
CALL ToAsc2&Show
CALL ENTER
MOV AH,0           
LEA DX,T70_79
CALL DISPCHS 
MOV AL,[DI+2]
CALL ToAsc2&Show
CALL ENTER
MOV AH,0      
LEA DX,T80_89
CALL DISPCHS
MOV AL,[DI+3]
CALL ToAsc2&Show
CALL ENTER
MOV AH,0      
LEA DX,T90_100 
CALL DISPCHS      
MOV AL,[DI+4]
CALL ToAsc2&Show
CALL ENTER          

LOOP DISP_Stat_LOOP

CALL ENTER
JMP Begin

;--------------------------------------------退出程序(Quit)---------------------------------

Quit:       MOV AX,4C00H
INT 21H    

;--------------------------------------------选择错误(Error)---------------------------------

Error:      CALL ENTER

LEA DX,Err_WrongChoose
CALL DISPCHS

JMP Begin


;====================================    子程序    =====================================      

;;;;;;;;;;;;;;;;;;;;显示单个字符
DISPCH PROC NEAR  
PUSH AX
MOV AH,02H  
INT 21H
POP AX  
RET 
DISPCH  ENDP 

;;;;;;;;;;;;;;;;;;;;显示回车换行
ENTER   PROC NEAR  
PUSH DX
MOV     DL,0DH  
CALL    DISPCH  
MOV     DL,0AH  
CALL    DISPCH  
POP DX
RET   
ENTER   ENDP  
;;;;;;;;;;;;;;;;;;;;输出TAB
TAB PROC NEAR
PUSH DX
MOV DL,09H
CALL DISPCH
POP DX
RET
TAB ENDP        
;;;;;;;;;;;;;;;;;;;;   3.显示字符串
DISPCHS PROC NEAR
PUSH AX
MOV AH,09H  
INT 21H
POP AX  
RET
DISPCHS ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;位数判断
;入口参数:AX---被判断位数的数
;出口参数:BL---存放位数  
HowManyBit PROC NEAR

CMP AX,9
JA next1
MOV BL,1
JMP OK
next1:CMP AX,99
JA next2
MOV BL,2
JMP OK
next2:MOV BL,3

OK:
ret
HowManyBit ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;输入分数
;入口参数:无
;出口参数:DI---为1时代表有错误,为0时代表正常
;         BL---存放已经被转为数子的分数 
InputScore PROC NEAR
PUSH AX
PUSH CX
PUSH DX
MOV CX,0
MOV DI,0
;循环输入单字符
score_repeat:MOV AH,01H       
INT 21H 
;判断是否为数字,是则继续,否则转到“判断是否回车”
CMP AL,2FH
JNA  EnterOrNot
CMP AL,39H
JA  EnterOrNot
INC CX

CMP CX,3  ;判断输入的是否第3个字符
JNE score_pass1 ;否则判断输入的是否第4个字符                 
;判断用户输入的整串语文成绩是否大于100     
CMP BL,10
JE score_pass3
LEA DX,Err_toolarge1
CALL ENTER
CALL DISPCHS
JMP score_Add    
score_pass3:CMP AL,30H
JE score_FromAsc2
LEA DX,Err_toolarge1
CALL ENTER
CALL DISPCHS
JMP score_Add

score_pass1:CMP CX,4   ;判断输入的是否第4个字符
JNE score_pass4
LEA DX,Err_toolarge1  ;是则报错(大于100),并要求重新输入
CALL ENTER
CALL DISPCHS
JMP score_Add

score_pass4:CMP CX,2
JNE score_pass2
CMP BL,0
JNE score_FromAsc2
LEA DX,Err_WrongNum1
CALL ENTER
CALL DISPCHS
JMP score_Add

score_pass2:CMP CX,1
JNE score_FromAsc2
SUB AL,30H     ;将ASC2字符转为数字,结果存在BL
MOV BL,AL
JMP score_repeat

;将ASC2字符转为数字,结果存在BL
score_FromAsc2:PUSH AX
MOV AL,BL
MOV DL,10
MUL DL
MOV BX,AX
POP AX
SUB AL,30H
ADD BL,AL
JMP score_repeat

;判断是否“回车”,是则转到“判断用户输入是否为空”,否则显示错误“Only can input number”并要求重新输入     
EnterOrNot:CMP AL,0DH       
JE  EmptyOrNot
LEA DX,Err_notnum
CALL ENTER
CALL DISPCHS
JMP score_Add             

;判断用户是否输入“空”,是则重新输入,否则跳到“返回”         
EmptyOrNot:CMP CX,0
JNE exitp
LEA DX,Err_empty  
CALL DISPCHS
JMP score_Add    

score_Add: MOV DI,1         

exitp:POP DX
POP CX
POP AX
RET
InputScore ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;输入学生编号子程序
;入口参数:无
;出口参数:DI---为1时代表有错误,为0时代表正常
;         BL---存放已经被转为数子的学生编号
InputNum PROC NEAR
PUSH AX
PUSH CX
PUSH DX

MOV DI,0
MOV CX,0
MOV BX,0
;循环输入单字符
num_repeat:MOV AH,01H       
INT 21H 
;判断是否为数字,是则继续循环,否则转到“判断是否回车”
CMP AL,2FH
JNA  num_EnterOrNot
CMP AL,39H
JA  num_EnterOrNot
INC CX

;判断输入的是否第3个字符
CMP CX,3  
JNE num_pass1 ;否则判断输入的是否第4个字符 
;判断用户输入的整串学生编号是否大于255       
CMP BL,24
JNA num_FromAsc2
CMP BL,25
JE num_pass3
LEA DX,Err_toolarge
CALL ENTER
CALL DISPCHS
JMP num_error  
num_pass3:CMP AL,35H
JNA num_FromAsc2
LEA DX,Err_toolarge
CALL ENTER
CALL DISPCHS
JMP num_error

;判断输入的是否第4个字符
num_pass1:CMP CX,4   
JNE num_pass2
LEA DX,Err_toolarge  ;是则报错(大于255),并要求重新输入
CALL ENTER
CALL DISPCHS
JMP num_error

;判断输入的是否第1个字符
num_pass2:CMP CX,1
JNE num_FromAsc2
CMP AL,30H     ;如果第一个数是0,则报错并要求重新输入
JNE num_pass4      
LEA DX,Err_WrongNum
CALL ENTER
CALL DISPCHS
JMP num_error

num_pass4:SUB AL,30H     ;将ASC2字符转为数字,结果存在BL
MOV BL,AL
JMP num_repeat

;将ASC2字符转为数字,结果存在BL
num_FromAsc2:PUSH AX
MOV AL,BL
MOV DL,10
MUL DL
MOV BX,AX
POP AX
SUB AL,30H
ADD BL,AL
JMP num_repeat

;判断是否“回车”,是则转到“判断用户输入是否为空”,否则显示错误“Only can input number”并要求重新输入     
num_EnterOrNot:CMP AL,0DH       
JE  num_EmptyOrNot
LEA DX,Err_notnum
CALL ENTER
CALL DISPCHS
JMP num_error             

;判断用户是否输入“空”,是则重新输入,否则跳到“记录学生编号”         
num_EmptyOrNot:CMP CX,0
JNE thEND 
LEA DX,Err_empty  
CALL DISPCHS

num_error:MOV DI,1    

thend:POP DX  
POP CX       
POP AX 
RET
InputNum ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;输出所有学生编号
;入口参数:无
;出口参数:无
DISPALLNUM PROC NEAR
PUSH AX
PUSH BX
PUSH DX
PUSH SI

LEA DX,ShowAllNum
CALL DISPCHS

MOV SI,0    
N_findagain:CMP stu[SI],0
JE N_EmptyRecord

MOV AX,0

MOV AL,stu[SI]            

CALL HowManyBit

;转成ASC2码放到内存
MOV DL,64H
DIV DL
ADD AL,30H                        
MOV Temp,AL            
MOV AL,AH
MOV AH,0
MOV DL,0AH
DIV DL                       
ADD AL,30H
MOV Temp+1,AL
ADD AH,30H
MOV Temp+2,AH         
MOV Temp+3,'$'

;输出内容,不显示前面的0
CMP BL,3
JNE N_next3
LEA DX,Temp
N_next3:CMP BL,2
JNE N_next4
LEA DX,Temp+1     
N_next4:CMP BL,1  
JNE N_next5
LEA DX,Temp+2                
N_next5:CALL DISPCHS
CALL ENTER           

N_EmptyRecord:ADD SI,11 
CMP SI,110
JNE N_findagain

POP SI
POP DX
POP BX
POP AX
RET
DISPALLNUM ENDP  

;;;;;;;;;;;;;;;;;;;;;;;;;;单科排序
;入口参数:DL---DL为1,2,3时分别为语文,数学,英语成绩排序
;出口参数:无
TheTaxis PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI

MOV CL,0     ;当前排到第几名

Choose11:INC CL       

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

CMP DL,1
JNE F
LEA DI,stu+1
F:CMP DL,2
JNE U
LEA DI,stu+3
U:CMP DL,3
JNE Choose12
LEA DI,stu+5

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

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

next:ADD SI,11
ADD DI,11
CMP SI,110
JNE Choose12

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

CMP DL,1
JNE F1
LEA DI,stu+1
F1:CMP DL,2
JNE U1
LEA DI,stu+3
U1:CMP DL,3
JNE huao
LEA DI,stu+5

huao:
CMP [SI],0
JE xiao
CMP [DI+1],0
JNE xiao       
CMP AL,[DI]
JNE xiao

MOV [DI+1],CL 

xiao:ADD SI,11
ADD DI,11
CMP SI,110
JNE huao

CMP CL,HowManyRecord
JB Choose11

POP DI
POP SI
POP CX
POP BX
POP AX     
ret
TheTaxis ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;清除全部名次,总平均成绩,单科平均成绩
;入口参数:无
;出口参数:无
ClearPlace PROC NEAR
PUSH SI
PUSH CX

LEA SI,stu+2
Clear_again:MOV [SI],0            
ADD SI,11
CMP SI,112
JNE Clear_again

LEA SI,stu+4
Clear_again1:MOV [SI],0            
ADD SI,11
CMP SI,114
JNE Clear_again1

LEA SI,stu+6
Clear_again2:MOV [SI],0            
ADD SI,11
CMP SI,116
JNE Clear_again2

LEA SI,stu+9
Clear_again3:MOV [SI],0            
ADD SI,11
CMP SI,119
JNE Clear_again3

MOV CL,20                
LEA SI,ave
Clear_LOOP:MOV [SI],0
INC SI
LOOP Clear_LOOP

POP CX
POP SI
RET
ClearPlace ENDP

;;;;;;;;;;;;;;;;;;;;;;;;;;判断分数属哪个段
;入口参数:BL---一个分数
;出口参数:BH---标志 (6,<60  7,60-69  8,70-79...........)

SorceSegment PROC NEAR       
CMP BL,60
JNB Stat3_not6
MOV BH,6
JMP ENDDD
Stat3_not6:CMP BL,70
JNB Stat3_not7
MOV BH,7
JMP ENDDD
Stat3_not7:CMP BL,80
JNB Stat3_not8
MOV BH,8
JMP ENDDD
Stat3_not8:CMP BL,90
JNB Stat3_not9
MOV BH,9
JMP ENDDD
Stat3_not9:MOV BH,10

ENDDD:RET
SorceSegment ENDP


;;;;;;;;;;;;;;;;;;;;;;;;;;;;将内存中的数转为ASC2码后输出屏幕
;入口参数:AX---要被转化饼干输出屏幕的数
;出口参数:无
ToAsc2&Show PROC NEAR
PUSH DX
PUSH BX  

CALL HowManyBit

;转成ASC2码放到内存
MOV DL,64H
DIV DL
ADD AL,30H                        
MOV Temp,AL            
MOV AL,AH
MOV AH,0
MOV DL,0AH
DIV DL                       
ADD AL,30H
MOV Temp+1,AL
ADD AH,30H
MOV Temp+2,AH         
MOV Temp+3,'$'

;输出内容,不显示前面的0
CMP BL,3
JNE next3
LEA DX,Temp
next3:CMP BL,2
JNE next4
LEA DX,Temp+1     
next4:CMP BL,1  
JNE next5
LEA DX,Temp+2                
next5:CALL DISPCHS

POP BX
POP DX
RET
ToAsc2&Show ENDP
;=============================================================    


CSEG    ENDS
END    START    ; set entry point.


⌨️ 快捷键说明

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