datarea segment
mathematics dw 10 dup(?) 存放数学成绩
physicaldw 10 dup(?) 存放物理成绩
grade dw 10 dup(?)
rank dw 10 dup(?)
rank1 dw 10 dup(?)
rank2 dw 10 dup(?)
rank3 dw 10 dup(?)
s5 dw 0
s6 dw 0
s7 dw 0
s8 dw 0
s9 dw 0
s10 dw 0
count1 dw ?
count2 dw ?
count3 dw ?
count4 dw ?
mess1 db 'Grade of English:$'
mess2 db 'Grade of Mathematics:$'
mess3 db 'Grade of Physical:$'
mess4 db 13,10,'Input Error!Please input repeat.',13,10,'$'
mess5 db 'Rank student number of English:$'
mess6 db 'Rank studentnumber of Math:$'
mess7 db 'Rank studentnumber of Physical:$'
mess8 db ' Student Grade Management System',0ah,0dh,'$'
mess9 db 'Plese choose: 1:Continue 2:Exit$'
mess10 db 'Average grade of English:$'
mess11 db 'Average grade of Math:$'
mess12 db 'Average grade of Physical:$'
mess13 db 'Plese choose: 1:Enter 2:Exit$'
mess14 db 'Rank of overallscore:$'
mess15 db 'Rank of student number with overallscore:$'
mess16 db 'Please input grade(English,Math,Physical):$'
mess17 db 'People of Englsh grade(<60,60---69,70---79,80---89,90---99,=100):$'
mess18 db 'People of Math grade(<60,60---69,70---79,80---89,90---99,=100):$'
mess19 db 'People of Physical grade(<60,60---69,70---79,80---89,90---99,=100):$'
datarea ends
*****************************************************************************
show macro addrs
lea dx,addrs
mov ah,9 宏定义,显示字符串
int 21h
endm
*******************************************************************************
prognam segment
*******************************************************************************
main proc far
assume cs:prognam,ds:datarea
START:
设置堆栈为了返回dos
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
callclear
mov ah,2 调用置光标位置功能
mov dh,1 使光标位置置为位置(1,8)
mov dl,8
mov bh,0 页号为0
int 10h BIOS显示中断调用
showmess8
callchoose
ret
main endp
*******************************************************************************
choose procnear菜单选择
showmess13
callcrlf 调用换行函数
mov ah,01
int 21h
cmp al,31h
jnz exit
next17:
callcrlf
showmess16
callcrlf
call input1 英语成绩输入
call rankp英语成绩排序
call output1 英语成绩按学号对应的排名输出
call input2 数学成绩输入
call rankp1数学成绩排序
call output2 数学成绩按学号对应的排名输出
call input3物理成绩输入
call rankp2物理成绩排序
call output3 物理成绩按学号对应的排名输出
callcrlf
callengrade英语平均成绩
callmagrade数学平均成绩
callphgrade物理平均成绩
callcrlf
callencount 英语各分数段统计
calloutput7
callmacount 数学各分数段统计
calloutput8
callphcount 物理各分数段统计
calloutput9
callcrlf
callgraderank计算每个人的总成绩
callrankp3
calloutput5 总成绩按其学号对应的排名输出
callrankg
calloutput4 总成绩按分数总和从大至小排行输出
showmess9
callcrlf
mov ah,01
int 21h
cmp al,31h
jnz exit
jmp next17
exit:
ret
choose endp
*******************************************************************************
input1 proc near 英语成绩输入
next18:
showmess1
mov si,0 至数组下标为0
mov count1,0
mov cx,10
next30:
mov english[si],0
add si,2
loopnext30
mov si,0
enter:
call decibin 十进制转二进制数
inc count1 count自增1
cmp dl,',' dl里的内容与‘,’相等则转移至store
je store
cmp dl,13
je exit2
jne error
store:
mov english[si],bx将成绩送入储存单元
add si,2
jmp enter
error:
showmess4
jmp next18
exit2:
mov english[si],bx
call crlf
ret
input1 endp
*******************************************************************************
input2 proc near 数学成绩输入
next19:
showmess2
mov si,0
mov count2,0
mov cx,10
next31:
mov mathematics[si],0
add si,2
loopnext31
mov si,0
enter1:
call decibin
inc count2
cmp dl,','
je store1
cmp dl,13
je exit3
jne error1
store1:
mov mathematics[si],bx
add si,2
jmp enter1
error1:
showmess4
jmp next19
exit3:
mov mathematics[si],bx
call crlf
ret
input2 endp
******************************************************************************
input3 proc near 物理成绩输入
next20:
showmess3
mov si,0
mov count3,0
mov cx,10
next32:
mov physical[si],0
add si,2
loopnext32
mov si,0
enter3:
call decibin
inc count3
cmp dl,','
je store2
cmp dl,13
je exit4
jne error3
store2:
mov physical[si],bx
add si,2
jmp enter3
error3:
showmess4
jmp next20
exit4:
mov physical[si],bx
call crlf
ret
input3 endp
******************************************************************************
rankp proc near 英语成绩排序
mov di,count1
mov bx,0
loop1:
mov ax,english[bx]
mov word ptr rank[bx],0
mov cx,count1
lea si,english
next:
cmp ax,[si]
jg no_count
inc word ptr rank[bx]
no_count:
add si,2
loop next
add bx,2
dec di
jne loop1
ret
rankp endp
*****************************************************************************
rankp1 proc near数学成绩排序
mov di,count2
mov bx,0
loop2:
mov ax,mathematics[bx]
mov word ptr rank1[bx],0
mov cx,count2
lea si,mathematics
next1:
cmp ax,[si]
jg no_count1
inc word ptr rank1[bx]
no_count1:
add si,2
loop next1
add bx,2
dec di
jne loop2
ret
rankp1 endp
*****************************************************************************
rankp2 proc near 物理成绩排序
mov di,count3
mov bx,0
loop3:
mov ax,physical[bx]
mov word ptr rank2[bx],0
mov cx,count3
lea si,physical
next3:
cmp ax,[si]
jg no_count2
inc word ptr rank2[bx]
no_count2:
add si,2
loop next3
add bx,2
dec di
jne loop3
ret
rankp2 endp
*****************************************************************************
rankp3 proc near 总分数按学号对应的名次输出
mov di,count4
mov bx,0
loopc:
mov ax,grade[bx]
mov word ptr rank3[bx],0
mov cx,count3
lea si,grade
nextc:
cmp ax,[si]
jg no_count3
inc word ptr rank3[bx]
no_count3:
add si,2
loop nextc
add bx,2
dec di
jne loopc
ret
rankp3 endp
*****************************************************************************
output1 proc near 英语成绩按学号对应的名次输出
showmess5
mov si,0
mov di,count1
next10:
mov bx,rank[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz next10
call crlf
ret
output1 endp
*****************************************************************************
output2 proc near 数学成绩按学号对应的名次输出
showmess6
mov si,0
mov di,count2
next11:
mov bx,rank1[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz next11
call crlf
ret
output2 endp
*****************************************************************************
output3 proc near物理成绩按学号对应的名次输出
showmess7
mov si,0
mov di,count3
next13:
mov bx,rank2[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz next13
call crlf
ret
output3 endp
*****************************************************************************
output4 proc near总分成绩按分数排序输出
showmess14
mov si,0
mov di,count1
next21:
mov bx,grade[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz next21
call crlf
ret
output4 endp
******************************************************************************
output5 proc near 总分成绩按学号排序输出
showmess15
mov si,0
mov di,count1
nextb:
mov bx,rank3[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz nextb
call crlf
ret
output5 endp
******************************************************************************
output7 procnear 输出英语各分数段人数
showmess17
mov bx,s5
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s6
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s7
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s8
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s9
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s10
callbinidec
callcrlf
ret
output7 endp
*********************************************************************************
output8 procnear 输出数学各分数段人数
showmess18
mov bx,s5
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s6
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s7
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s8
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s9
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s10
callbinidec
callcrlf
ret
output8 endp
*********************************************************************************
output9 procnear 输出物理各分数段成绩
showmess19
mov bx,s5
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s6
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s7
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s8
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s9
callbinidec
mov dl,','
mov ah,02
int 21h
mov bx,s10
callbinidec
callcrlf
ret
output9 endp
*********************************************************************************
engrade procnear计算英语平均成绩
mov cx,10
mov bx,0
mov si,0
next14:
mov dx,english[si]
add bx,dx
add si,2
loopnext14
lea dx,mess10
mov ah,09
int 21h
mov cx,1000
calldec_div
mov cx,100
calldec_div
mov cx,10
calldec_div
callcrlf
ret
engrade endp
*****************************************************************************
magrade procnear 计算数学平均成绩
mov cx,10
mov bx,0
mov si,0
next15:
mov dx,mathematics[si]
add bx,dx
add si,2
loopnext15
lea dx,mess11
mov ah,09
int 21h
mov cx,1000
calldec_div
mov cx,100
calldec_div
mov cx,10
calldec_div
callcrlf
ret
magrade endp
******************************************************************************
phgrade procnear 计算物理平均成绩
mov cx,10
mov bx,0
mov si,0
next16:
mov dx,physical[si]
add bx,dx
add si,2
loopnext16
lea dx,mess12
mov ah,09
int 21h
mov cx,1000
calldec_div
mov cx,100
calldec_div
mov cx,10
calldec_div
callcrlf
ret
phgrade endp
******************************************************************************
rankg procnear 总成绩按进行分数排序
mov cx,10
dec cx
loop4:
mov di,cx
mov bx,0
loop5:
mov ax,grade[bx]
cmp ax,grade[bx+2]
jge continue
xchgax,grade[bx+2]
mov grade[bx],ax
continue:
add bx,2
looploop5
mov cx,di
looploop4
ret
rankg endp
******************************************************************************
graderank proc near 个人总成绩分数的和的计算
mov cx,10
mov bx,0
mov si,0
mov count4,0
loop10:
mov bx,english[si]
add bx,mathematics[si]
add bx,physical[si]
mov grade[si],bx
add si,2
inc count4
looploop10
ret
graderank endp
********************************************************************************
encount procnear 英语各分数段的统计
mov s5,0
mov s6,0
mov s7,0
mov s8,0
mov s9,0
mov s10,0
mov cx,10
mov bx,offset english
compare:
mov ax,[bx]
cmp ax,60
jl five
cmp ax,70
jl six
cmp ax,80
jl seven
cmp ax,90
jl eight
cmp ax,100
jne nine
inc s10
jmp short change_addr
nine:
inc s9
jmp short change_addr
eight:
inc s8
jmp short change_addr
seven:
inc s7
jmp short change_addr
six:
inc s6
jmp short change_addr
five:
inc s5
change_addr:
add bx,2
loopcompare
ret
encount endp
********************************************************************************
macount procnear 数学各分数段的统计
mov s5,0
mov s6,0
mov s7,0
mov s8,0
mov s9,0
mov s10,0
mov cx,10
mov bx,offset mathematics
compare1:
mov ax,[bx]
cmp ax,60
jl five1
cmp ax,70
jl six1
cmp ax,80
jl seven1
cmp ax,90
jl eight1
cmp ax,100
jne nine1
inc s10
jmp short change_addr1
nine1:
inc s9
jmp short change_addr1
eight1:
inc s8
jmp short change_addr1
seven1:
inc s7
jmp short change_addr1
six1:
inc s6
jmp short change_addr1
five1:
inc s5
change_addr1:
add bx,2
loopcompare1
ret
macount endp
********************************************************************************
phcount procnear 物理各分数段的统计
mov s5,0
mov s6,0
mov s7,0
mov s8,0
mov s9,0
mov s10,0
mov cx,10
mov bx,offset physical
compare2:
mov ax,[bx]
cmp ax,60
jl five2
cmp ax,70
jl six2
cmp ax,80
jl seven2
cmp ax,90
jl eight2
cmp ax,100
jne nine2
inc s10
jmp short change_addr2
nine2:
inc s9
jmp short change_addr2
eight2:
inc s8
jmp short change_addr2
seven2:
inc s7
jmp short change_addr2
six2:
inc s6
jmp short change_addr2
five2:
inc s5
change_addr2:
add bx,2
loopcompare2
ret
phcount endp
********************************************************************************
decibin proc near二进制转十进制
mov bx,0将bx里的内容清零
newchar:
mov ah,1
int 21h调用dos,输入字符,字符存于al
mov dl,al
sub al,30h 将字符数字转为十进制数字
jl exit1 小于字符0就转移至exit1
cmp al,9d 输入数字与9比较,大于9就转移至exit1
jg exit1
cbw 将al符号扩展到ah
xchg ax,bx 将ax里的内容和bx里的内容交换
mov cx,10d
mul cxal里的内容*10送到ax
xchg ax,bx
add bx,ax
jmp newchar 转移至newchar,重新输入成绩
exit1: ret
decibin endp
*****************************************************************************
binidec proc near
push bx
push cx
push si
push di
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
pop di
pop si
pop cx
pop bx
ret
binidec endp
*****************************************************************************
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
dec_div endp
*****************************************************************************
crlf proc near
mov dl,0ah 换行
mov ah,02h
int 21h调用dos,显示dl里的内容
mov dl,0dh 回车
mov ah,02h
int 21h
ret
crlf endp
*****************************************************************************
clear procnear
pushax
pushbx
pushcx
pushdx
mov ah,6 调用屏幕初始化或上卷功能
mov al,0 使全屏幕为空白
mov bh,7
mov ch,0
mov cl,0 规定上卷的范围为从左上角(0,0)至右下角(24,79)
mov dh,24
mov dl,79
int 10h BIOS显示中断调用
pop dx
pop cx
pop bx
pop ax
ret
clear endp
*****************************************************************************
prognam ends
END START
end