?? 成績管理程序.exe.~asm
字號:
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 + -