0.写在前面
该程序实现了“简易学生成绩管理系统”。程序本身有点繁琐,由于程序过长,甚至超出了jmp的范围,所以中间还需要中转jmp,但我本人还是有点满意的。
这是我的汇编实验课程作业,如果大家有类似作业的话希望不要过度借鉴,本程序仅供参考和学习!不要抄袭!
1.设计目的
1)熟悉数据分类的方法;
2)掌握屏幕上显示数据格式的方法。
2.程序功能
① 循环菜单式学生成绩管理系统;
② 输入任意个0~100的数字;
③ 按<60,60~69,70~79,80~89,90~99和100共六档分类;
④ 统计出每档的个数及总数;
⑤ 输入数据将存于内存中;
⑥ 选择错误提示和正确退出提示。
3.源代码
data segment
men db 0dh,0ah
db '*****Student Score System*****',0dh,0ah
db '**-----1>Input score--------**',0dh,0ah
db '**-----2>Count class--------**',0dh,0ah
db '**-----3>Quit system--------**',0dh,0ah
db '**Please input your select:',0dh,0ah,'$'
err db ' ->Select error! Please select again!',0dh,0ah,'$'
inp db ' ->Please input scores ( to quit):',0dh,0ah,'$'
inpok db 'Finish!',0dh,0ah,'$'
cou db ' ->Here are the classification statistics :','$'
qui db ' ->Welcome to use this system next time!','$'
mes1 db '-score[<60 :','$'
mes2 db '-score[<60-69] :','$'
mes3 db '-score[<70-79] :','$'
mes4 db '-score[<80-89] :','$'
mes5 db '-score[<90-99] :','$'
mes6 db '-score[=100] :','$'
mes7 db '-Total Number :','$'
result db 100 dup(0)
total db 00
s5 db 00
s6 db 00
s7 db 00
s8 db 00
s9 db 00
s10 db 00
data ends
code segment
assume cs:code, ds:data
start: mov ax,data
mov ds,ax ;ds指向data数据段
menu:
push cx
mov cx,0ffffh
delay: loop delay ;设置输出延迟
pop cx
mov ah,9
mov dx,offset men
int 21h ;输出提示字符串
mov ah,1
int 21h ;输入选择
cmp al,'1'
je input
cmp al,'2'
je coun
cmp al,'3'
je qu
mov dx,offset err
mov ah,9
int 21h ;输入错误提示
jmp menu
;---------- INPUT ----------
input:
mov ah,9
mov dx,offset inp
int 21h ;输出提示字符串
mov si,offset result ;si指向result
mov cx,0 ;cx为输入数字个数
s: mov ah,1
int 21h ;输入数字字符
sub al,30h ;将字符转化为数字值
mov bh,al ;数字值存于bh
a: mov ah,1
int 21h ;输入数字字符
cmp al,20h ;判断输入是否为空格
je b ;如是,跳转至b标号
cmp al,0dh ;判断输入是否为回车
je c ;如是,跳转至c标号
sub al,30h ;否则,将字符转化为数字值
mov bl,al ;数字值存于bl
mov al,10 ;将al置10
mul bh ;将高位乘10,存于ax
mov bh,0 ;将bh置0
add ax,bx ;将ax与bx相加(实际结果只在al中)
mov bh,al ;将结果存于bh
jmp a ;循环至a处
b: mov al,bh ;将结果存于al
mov [si],al ;将结果存于ds:si处
inc si ;si指向下一单元
inc cx ;数字个数加一
jmp s ;循环至s处
c: mov al,bh ;将结果存于al
mov [si],al ;将结果存于ds:si处
inc si ;si指向下一单元
inc cx ;数字个数加一
mov si,offset result ;si指向result
jmp comp
coun: jmp count
qu: jmp quit
comp: mov al,[si] ;si处内容存于al
cmp al,60
jb five ;若al小于60,跳转至five
cmp al,70
jb six ;若al小于70,跳转至six
cmp al,80
jb seven ;若al小于80,跳转至seven
cmp al,90
jb eight ;若al小于90,跳转至eight
cmp al,100
jb nine ;若al小于100,跳转至nine
cmp al,100
je ten ;若al小于100,跳转至ten
jmp next ;若其他,跳转至next
five: mov al,[s5] ;s5处内容存于al
add al,01 ;al加一
daa ;转化为十进制BCD码
mov [s5],al ;将al的值存于s5处
jmp next ;跳转至next处
six: mov al,[s6] ;同上
add al,01
daa
mov [s6],al
jmp next
seven: mov al,[s7] ;同上
add al,01
daa
mov [s7],al
jmp next
eight: mov al,[s8] ;同上
add al,01
daa
mov [s8],al
jmp next
nine: mov al,[s9] ;同上
add al,01
daa
mov [s9],al
jmp next
ten: mov al,[s10] ;同上
add al,01
daa
mov [s10],al
jmp next
next: mov al,[total] ;total处内容存于al
add al,01 ;al加一
daa ;转化为十进制BCD码
mov [total],al ;将al的值存于total处
inc si ;si指向下一单元
loop comp ;循环至comp
mov ah,9
mov dx,offset inpok
int 21h ;输出提示字符串
jmp menu
;---------- COUNT ----------
count:
mov ah,9
mov dx,offset cou
int 21h ;输出提示字符串
mov ah,2
mov dl,0dh
int 21h ;输出回车
mov dl,0ah
int 21h ;输出换行
mov dx,offset mes1
mov ah,09h
int 21h ;输出字符串
mov al,[s5] ;将s5处内容存至al
call disp ;调用disp,以十进制输出al中内容
mov dx,offset mes2
mov ah,09h
int 21h
mov al,[s6]
call disp ;同上
mov dx,offset mes3
mov ah,09h
int 21h
mov al,[s7]
call disp ;同上
mov dx,offset mes4
mov ah,09h
int 21h
mov al,[s8]
call disp ;同上
mov dx,offset mes5
mov ah,09h
int 21h
mov al,[s9]
call disp ;同上
mov dx,offset mes6
mov ah,09h
int 21h
mov al,[s10]
call disp ;同上
mov dx,offset mes7
mov ah,09h
int 21h
mov al,[total]
call disp ;同上
jmp menu
;---------- QUIT ----------
quit:
mov ah,9
mov dx,offset qui
int 21h ;输出提示字符串
mov ax,4c00h
int 21h ;结束程序
disp proc near
push cx ;cx入栈
mov bl,al ;将al的值存于bl
and al,0f0h ;将低四位置零
mov cl,04 ;设置循环移动位数为4
ror al,cl ;循环右移四位
add al,30h ;将数字转化为ASCII码值
mov dl,al
mov ah,02h
int 21h ;输出al中的数字(即十位)
mov al,bl ;将bl的值存于al
and al,0fh ;将高四位置零
add al,30h ;将数字转化为ASCII码值
mov dl,al
mov ah,02h
int 21h ;输出al中的数字(即个位)
mov ah,2
mov dl,0dh ;输出回车
int 21h
mov dl,0ah
int 21h ;输出换行
pop cx
ret
disp endp
code ends
end start