📄 keti2.asm
字号:
.model small
.stack 100h
.data
handle dw ?
filenampl label byte
naxlen db 30
namlen db ?
filenam db 30 dup(?)
db '$'
M_nampl label byte
M_maxlen db 10
M_namlen db ?
M_nam db 10 dup(?)
db '$'
Numpl label byte
Nummaxlen db 10
Numlen db ?
Num db 10 dup(?)
db '$'
Maxscore equ 100
N_COURSE label byte
COURSE equ 4
EVEN
score dw COURSE dup(0)
all dw 0000
ave dw 0000
inf_record dw 0001 ;第N条记录
allscore dw 0000 ;总分
EVEN
row db 00
col db 00
fileend db 00 ;文件结束标志
num_cou db 00 ;第N门课
;EVEN
; one_char db 01
;two_char db 02
;onechar db ?
;
menu db ' KETI2(BY 031YZJ)',10,13
db ' **********************************',10,13
db ' * 1.Save new information. *',10,13
db ' * 2.Print information. *',10,13
db ' * 3.Exit. *',10,13
db ' ********************************** ',10,13
db ' Your choice[1,2,3]:','$'
newinf1 db 'Please input filename:>','$'
namin_n db 10,13
namin db 'NAME','$'
numin_n db 10,13
numin db 'NUM.','$'
cource_n db 10,13
cource db 'SCORE','$'
newinf2 db 'Press[n\N] to rewrite.Any other keys to continue:','$'
allin db 'ALL','$'
avein db 'AVE.SCORE','$'
inf_recordin db '#Record:>.','$'
;-----------------------------------------------------------------------------------------------------------------------------------
.code
main proc far
mov ax,@data
mov ds,ax
mov es,ax
;--------------------------
main_loop:
mov ax,0600h
call scrn
mov row,5
mov col,0
call curs
lea dx,menu
mov ah,09h
int 21h
;--------------------------菜单
call getch
cmp al,'1'
jb main_loop
cmp al,'3'
ja main_loop
cmp al,'3'
je m_exit
cmp al,'2'
jne m_One
call inftype
jmp main_loop
m_One:
call newinf
jmp main_loop
m_exit:
mov ax,4c00h
int 21h
main endp
;------------------------------------------------------------------------------------------------------
newinf proc near
;-----------------------------
mov ax,0600h
call scrn
mov row,1
mov col,0
call curs
lea dx,newinf1
mov ah,9
int 21h
lea dx,filenampl
call newfile
cmp ax,0000
je n_exit
mov handle,ax
;------------------------------
;lea dx,N_COURSE
;mov cx,1
;mov bx,handle
;call inf_in_file
;------------------------------
inf_in:
;----------------------------开始接受数据
mov ax,0601h
mov bh,0e1h
call scrn_bx
mov row,24
call curs
lea dx,inf_recordin
mov ah,09h
int 21h
mov ax,inf_record
mov bx,0001
call printf
;----------------------------显示第 N记录
call infinput ;输入一条记录
;----------------------------输入数据
mov ax,0601h
call scrn ;上卷一行
mov row,24
call curs ;光标定位
lea dx,newinf2
mov ah,9
int 21h ;提示信息
call getch
;-----------------------------询问是否正确
cmp al,'n'
jne n_next1 ;可能是大N
jmp inf_in ;不正确
n_next1:
cmp al,'N'
jne n_next2 ;不是大N
jmp inf_in ;不正确 重来
;-----------------------------
n_next2:
cmp fileend,1
je n_exit ;文件结束
call writefile ;信息写入文件
;-------------------------------
;call clear_inf
;------------------------------
inc inf_record;记录条数加一
jmp inf_in ;下一条记录
n_exit:
;-------------------------------
;mov bx,handle
;mov cx,1
;lea dx,two_char
;call inf_in_file
;--------------------------------
lea dx,filenam
call closefile
;call getch
ret
newinf endp
;------------------------------------------------------------
infinput proc near ;输入一条记录
;---------------------------------准备工作
mov fileend,00
mov ax,0607h
mov bh,0e1h
call scrn_bx
mov row,18
mov col,0
call curs
;---------------------------------输入姓名
lea dx,namin_n
mov ah,9h
int 21h
mov dl,':'
mov ah,2
int 21h
lea dx,M_nampl
mov ah,0ah
int 21h
mov di,dx
add di,2
mov cl,10
mov bx,dx
add bx,1
mov ch,[bx]
call nam_clear_dl
;姓名的输入完成
;--------------------------------输入学号
lea dx,numin_n
mov ah,9
int 21h
mov dl,':'
mov ah,2
int 21h
lea dx,numpl
mov ah,0ah
int 21h
mov di,dx
mov bx,dx
inc bx
add di,2;di指向串
mov ch,[bx]
cmp ch,0
jne next_in
mov fileend,1
ret
next_in:
mov cl,10
call nam_clear_dl
;学号的输入完成
;----------------------------------------输入分数
mov num_cou,1
lea bx,score
mov allscore,0000 ;总分清零
ii_loop1:
lea dx,cource_n
mov ah,9
int 21h
mov dl,num_cou
add dl,30h
mov ah,2
int 21h
mov dl,':' ;提示第几门课了
int 21h
push bx
call scanf ;接受分数的输入
pop bx
;-----------------------对分数的合法性检查
cmp ax,Maxscore
ja ii_loop1
cmp ax,0
jb ii_loop1
;------------------------
mov [bx],ax ;填入合法的分数
add allscore,ax ;加总分
add bx,2 ;下一门分数
cmp num_cou,COURSE;课程数
je all_ave
add num_cou,1
jmp ii_loop1;下一次循环
;-----------------------------------------------
;
all_ave: ;计算平均分
mov ax,allscore
mov [bx],ax
add bx,2
mov cl,COURSE
div cl
mov ah,0
mov [bx],ax
;-------------------------------------------
;完成一条记录的输入 返回
ret
infinput endp
;------------------------------------------------------------------
writefile proc near ;一次写一条记录
mov bx,handle
mov cx,10
lea dx,M_nam
call inf_in_file
cmp ax,0000
je wr_exit
;---------------------------姓名写入完成10字节
mov bx,handle
lea dx,Num
mov cx,10
call inf_in_file
cmp ax,0000
je wr_exit
;---------------------------学号写入完成10字节
mov bx,handle
mov cx,COURSE
add cx,COURSE
add cx,4
lea dx,score
call inf_in_file
;--------------------------分数写入完成12字节
cmp ax,0000
je wr_exit
wr_exit:
ret
writefile endp
;------------------------------------------------------------------------
inftype proc near
;----------------------------------准备工作
mov fileend,0;结束标志清零
mov ax,0600h
call scrn
mov row,5
mov col,0
call curs
;---------------------------------打开源文件
lea dx,newinf1
mov ah,09h
int 21h
lea dx,filenampl
mov al,00
call nam_in_open
cmp ax,0000
jne inf_exit_1;文件不存在
call getch
ret
;--------------------------------
inf_exit_1:
mov handle,ax ;找到文件
mov ax,0601h
call scrn
mov row,24
mov col,0
call curs
;-----------------------------显示表头
lea dx,namin
mov ah,09h
int 21h
mov cx,6
call drow_line
lea dx,numin
mov ah,09h
int 21h
mov cx,6
call drow_line
mov cx,COURSE
inf_loop1:
lea dx,cource
mov ah,09h
int 21h
mov dl,COURSE
add dl,1
sub dl,cl
add dl,30h
mov ah,2
int 21h
mov dl,'='
mov ah,2
int 21h
int 21h
loop inf_loop1
;------------------姓名学号分数
lea dx,allin
mov ah,09h
int 21h
mov cx,5
call drow_line
mov ah,9
lea dx,avein
int 21h
;mov ah,2
;mov dl,10
;int 21h
;mov dl,13
;int 21h
;-----------------------显示表头完成
;lea dx,onechar
;mov cx,1
;mov bx,handle
;mov ah,3fh
;int 21h
;mov ax,COURSE
;cmp onechar,ax
;jne inf_exit
;-----------------------
;开始读取和显示信息
inf_loop2: ;一次循环读一条记录
mov ax,0601h
mov bh,0e1h
call scrn_bx
mov row,24
mov col,0
call curs
;-----------------------
mov bx,handle
lea dx,M_nam
mov cx,10
mov ah,3fh
int 21h
jc inf_exit
mov ah,09h
int 21h
;-----------------------姓名读取显示完成
lea dx,Num
mov cx,10
mov ah,3fh
jc inf_exit
int 21h
mov ah,09h
int 21h
;------------------------学号读取显示完成
lea dx,score
mov cx,0000
mov cx,COURSE
add cx,COURSE
add cx,4
mov ah,3fh
int 21h ;分数读取12字节
jc inf_exit
cmp ax,0000
jne score_print
mov fileend,1 ;文件结束
;jmp inf_exit
score_print:
;----------------------------显示分数
lea bx,score
mov cx,COURSE
add cx,2 ;读6次每次一个字
inf_loop3: ;显示各科分数总分平均分
mov ax,[bx]
push bx
mov bx,0008
call printf
pop bx
add bx,2
loop inf_loop3;
;-------------------------- 分数显示完成
;call clear_inf
;--------------------------
cmp fileend,1
je inf_exit ;已经到文件末尾结束显示过程
jmp inf_loop2;读取下一条记录
inf_exit:
lea dx,filenam
call closefile;关闭文件
mov ax,0608h
call scrn;上卷8行
mov col,0
mov row,17
call curs ;光标归位
call getch
ret
inftype endp
;------------------------------------------------------------------------------------------------
drow_line proc near
line_loop:
mov dl,'='
mov ah,2
int 21h
loop line_loop
ret
drow_line endp
;------------------------------------------------------------------
clear_inf proc near
lea dx,M_nam
mov cl,10
mov ch,0
call nam_clear
;
lea dx,Num
mov cl,10
mov ch,0
call nam_clear
;
lea dx,score
mov cl,COURSE
add cl,COURSE
add cl,4
mov ch,0
call nam_clear
ret
clear_inf endp
;------------------------------------------------------------------
include asm.sub
end main
;=============================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -