📄 test.asm
字号:
;*************************************************************************
;汇编程序_班级04407_学号041165_序号10_陈见雨
; 完成于2006年12月16日
; email: colama_man@qq.com
;
;输入学生总数:1-99
;输入格式为:班级-学号-姓名
;如04407-041165-chen 字符个数必须为5-6-姓名(最大为5个字符)
;字符个数即为:班级5个,学号6个,姓名不大于5个字符
;*************************************************************************
data segment
number_tip db 'Please input the number of student(1-99):$'
name_tip db 0dh,0ah,'Please input the information(Class-XueHao-Name):',0dh,0ah,'$'
gradetip db 0dh,0ah,'Please input the grades(qimo qizhong shiyan pingshi):',0dh,0ah,'$'
show_result db 0dh,0ah,'Class-XueHao-Name : ChengJi',0dh,0ah,0dh,0ah,'$'
stars db 0dh,0ah,'************************************','$'
maohao db ' : $'
space db ' $'
fenshuduan db 0dh,0ah,'[Below 60][60-70][70-80][80-90][90-100]',0dh,0ah,'$'
snumber1 db 3 dup(0) ;存储学生总数(ASCII表示)
snumber2 db 0 ;存储学生总数(十进制)
student db 1980 dup(0) ;输入格式为:班级-学号-姓名,最多支持99个人,每个人占用21个空间单元
buffer1 db 8 dup(0) ;为学生成绩分配空间(ASCII表示)
buffer2 db 4 dup(0) ;为学生成绩分配空间(十进制表示)
resultes db 99 dup(3 dup(0)) ;存储每个学生平均分,每个人的平均分占用3单元,共99人
n db 5 dup(0) ;存储60以下、60-70、70-80、80-90、90-100分段内的人数
data ends
;**************************************************************************
code segment
;-----------------------------------------------------------
main proc far
assume cs:code,ds:data
start:
mov ax,data ;数据段初始化
mov ds,ax
mov es,ax
mov si,0 ;指向每个学生姓名
mov di,0 ;指向每个学生总评成绩
mov cx,100 ;初始化学生数
;---------------------------------------------------------------------------
lea dx,number_tip ;请求输入学生总数
mov ah,09
int 21h
call store_number ;存储学生总数,结果送cx中
cmp cx,0 ;输入为0退出
jle retdos
cmp cx,100 ;学生数超出本程序范围,退出
jge retdos
;--------------------------------------------------------------------------------
begin:
lea dx,name_tip ;请求输入学生信息,格式为:班级-学号-姓名,字符长度必须为5-6-4
mov ah,09
int 21h
call store_name ;存储学生姓名
add si,20 ;指向下一个学生姓名
lea dx,gradetip ;请求输入学生成绩
mov ah,09
int 21h
call store_grades ;存储每个学生成绩
call compute ;计算每个学生平均分
add di,3 ;分别存储每个学生的平均分,di指向每个学生平均分
;因为存储的是3位,di每次加3才能指向下一个学生
loop begin ;循环,直到输入所有学生成绩
call sort ;排序
call display ;显示结果
;----------------------------------------------------------------------
retdos:
mov ah,1 ;任意键结束
int 21h
mov ax,4c00h ;返回DOS
int 21h
;**************************************************************************
; 以下为子程序部分
;**************************************************************************
; 以下为子程序部分
;*************************************************************************
store_number proc
push ax
push bx
mov bx,0
store:
mov ah,01
int 21h ;输入字符
cmp al,0dh ;判断是否输入回车
je cr_ ;输入结束
and al,0fh ;转换成非压缩的BCD码
mov snumber1[bx],al
inc bx ;输入未结束,则继续输入
jmp store
cr_:
cmp bx,2 ;学生数大于10,还是小于10,最多支持99人
jz llll
jg large ;学生数大于99返回,bx>2
mov al,snumber1 ;输入学生数小于10,大于0
jmp lllll
llll: mov ah,snumber1
mov al,snumber1+1
aad ;BCD码转换为二进制数
lllll: mov snumber2,al
mov cx,0
mov cl,snumber2
large:
pop bx
pop ax
ret
store_number endp
;****************************************************************************
store_name proc
push dx
push ax
push bx
mov al,18 ;每个学生单元最大可存储字符数,包括回车
mov student[si],al
lea dx,student[si] ;读取学生姓名
mov ah,0ah
int 21h
mov bl,student[si+1] ;bl存储实际输入字符个数,不包括回车
mov al,' ' ;将实际输入字符最后键入的回车换成空格
mov student[si+bx+2],al
mov student[si+19],'$' ;在一个学生存储单元的最后加上'$',一个学生的输入结束
;存储的时候必须加上这个'$'否则打印的时候出错
pop bx
pop ax
pop dx
ret
store_name endp
;*****************************************************************************
store_grades proc
push ax
push di
mov di,0
input:
mov ah,1
int 21h ;输入字符
cmp al,0dh ;判断是否输入回车
je return ;输入结束
cmp al,' ' ;判断是否输入空格
;************重大失误!!!我竟然写成cmp al,0ah!!!结果使计算结果老是出错!浪费一个下午!
je input ;跳过空格
and al,0fh ;转换成非压缩的BCD码
mov buffer1[di],al
inc di ;输入未结束,则继续输入
jmp input
return:
pop di
pop ax
ret
store_grades endp
;****************************************************************************
compute proc ;计算平均成绩主程序
push ax
push si
push cx
push dx
push bx ;bx用做临时存储数据用
mov si,0
mov ax,0
mov dx,0
mov bx,0
;-----------------------------------------------------------------
mov cx,4 ;循环实现BCD码转换为二进制数
next1:
mov ah,buffer1[si]
mov al,buffer1[si+1]
aad
mov buffer2[bx],al
add si,2
inc bx
loop next1
;------------------------------------------
;期末成绩×0.6+期中成绩×0.2+实验成绩*0.1+平时成绩*0.1
mov si,0 ;计算平均成绩,结果用十进制表示
mov bx,0 ;清零
mov al,6
mul buffer2[si]
add bx,ax
mov al,2
mul buffer2[si+1]
add bx,ax
mov al,1
mul buffer2[si+2]
add bx,ax
mov al,1
mul buffer2[si+3]
add bx,ax
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -