📄 1.asm
字号:
lea dx,msg02;display prompt
int 21h
iloop: cmp stustored,29
ja i1
call near ptr inputname ;输入学生姓名
cmp namelen,0
je i2
call near ptr inputnum ;输入学生学号
call near ptr inputsco ;输入成绩
call near ptr stor;往内存表中写入一项
jmp iloop
mov saveflag,0
jmp i2
i1: mov ah,9
lea dx,msg20;'There are more than 30 students.'
int 21h
i2: showmsg back;'Press any key to back.'
i3:
mov saveflag,0
pop dx
pop ax
ret
input endp
;----------------------------------------------------------------------
inputname proc near
;void inputname() 输入学生姓名
push ax
push dx
push bx
push cx
showmsg 03
mov ah,0ah
lea dx,namepar
int 21h
crlfm
mov bh,0
mov bl,namelen
mov cx,7
sub cx,bx
n10: mov namefld[bx],20h;空余部分用空格填充
inc bx
loop n10
pop cx
pop bx
pop dx
pop ax
ret
inputname endp
;-----------------------------------------------------------------------
inputnum proc near
;void inputnum() 输入学生学号
push ax
push dx
push bx
push cx
showmsg 04
mov ah,0ah
lea dx,numpar
int 21h
crlfm
mov bh,0
mov bl,numlen
mov cx,9
sub cx,bx
n20: mov numfld[bx],20h;空余部分用空格填充
inc bx
loop n20
pop cx
pop bx
pop dx
pop ax
ret
inputnum endp
;----------------------------------------------------------------------
inputsco proc near
;void inputsco() 输入学生成绩
push ax
push dx
push bx
push cx
showmsg 05
mov ah,0ah
lea dx,scopar
int 21h
crlfm
mov bh,0
mov bl,scolen
mov cx,4
sub cx,bx
n21: mov scofld[bx],20h;空余部分用空格填充
inc bx
loop n21
pop cx
pop bx
pop dx
pop ax
ret
inputsco endp
;------------------------------------------------------------------------
print proc near
;void print() 输出整个studentx表
push si
push cx
push dx
push ax
cmp stustored,0
je qprint
crlfm ;回车、换行
crlfm ;
showmsg printtitle
showmsg sepln;打印表头
lea si,studentx
mov cx,stustored
pline: call near ptr printline
loop pline ;没输完则循环输出
pop ax
pop dx
pop cx
pop si
qprint: ret
print endp
;------------------------------------------------------------------------
printline proc near
;void printline() 打印一行,需要预先设置si
push di
push cx
push dx
push ax
lea di,studisp;stutemp=studentx[i]
mov cx,6 ;每一次loop si会自动修正
rep movsb ;
mov [studisp+6],9
add di,1
mov cx,8
rep movsb
mov [studisp+15],9
add di,1
mov cx,3
rep movsb
mov ah,9
lea dx,studisp
int 21h
crlfm
showmsg sepln
pop ax
pop dx
pop cx
pop di
ret
printline endp
;------------------------------------------------------------------------
deciasc proc near
;把10进制数转换成相应的ASCII码,digit in bl
mov ch,100d
mov cl,10d
;mov dh,3d;
re:
;判断退出条件
cmp ch,0
je qdeci
;取每一10进制位上的数字
mov al,bl;
cbw
div ch;
mov bl,ah;余数继续除相应权,取相应位的10进制数字
call near ptr printit
;除数ch=ch/10
mov al,ch
cbw
div cl
mov ch,al
;dec dh
jmp re
qdeci:
ret
deciasc endp
;--------------------------------------------------------------------
printit proc near;输出1位数字对应的ASCII码,binary number in bl
add al,30h
mov dl,al
mov ah,2
int 21h
ret;ret不能少!
printit endp
;--------------------------------------------------------------------
stor2 proc near
;void stor2() 从stutemp临时变量中往内存studentx表中写入一条item
push si
push di
push ax
push bx
push cx
cmp stutemp,0;写入item不为空
je exitt
lea si,stutemp
lea di,studentx
mov ax,stustored
mov bl,17
mul bl
add di,ax
mov cx,17;
rep movsb
inc stustored
pop cx
pop bx
pop ax
pop di
pop si
exitt: ret
stor2 endp
;------------------------------------------------------------------------
get_path proc near
;void get_path() 从输入端获取文件路径
push ax
push bx
push dx
showmsg 22;'Please input the file you want to operate:'
;crlfm
mov ah,0ah
lea dx,pathpar
int 21h
;crlfm
mov bl,pathlen
mov bh,0
mov pathnam[bx],0
pop dx
pop bx
pop ax
ret
get_path endp
;--------------------------------------------------------------------
openh proc near
;void openh() 打开一个磁盘文件,取得文件句柄并保存
push ax
push cx
push dx
call near ptr get_path
mov ah,3dh
mov cx,0;0=读
lea dx,pathnam
int 21h
jc o1
mov filehandle,ax
pop dx
pop cx
pop ax
ret
o1: mov endcde,01;打开文件出错处理,置endcde为1
lea dx,opnmsg
call near ptr errm
pop dx
pop cx
pop ax
ret
openh endp
;--------------------------------------------------------------------
readall proc near
;void readall() 从磁盘文件中读取全部item信息到内存中
push ax
mov endcde,0
call near ptr openh
cmp endcde,0
jne rexit;endcde=1,结束
mov stustored,0
contin: call near ptr readh
cmp endcde,0
jne r20;endcde=1,结束
call near ptr stor2
cmp stustored,30
ja oexit
jmp contin
r20: call near ptr clseh
call clear
call cursor
showmsg 23
jmp rexit
oexit: call near ptr clseh
mov saveflag,0
showmsg 09;
rexit: showmsg back;
;mov ah,1
;int 21h
pop ax
ret
readall endp
;-----------------------------------------------------------------------
readh proc near
;void readh() 从文件中读出一条项目到临时变量stutemp中
push ax
push bx
push cx
push dx
mov ah,3fh;read file
mov bx,filehandle
mov cx,17
lea dx,stutemp
int 21h
jc c1;如果出错输出信息
cmp ax,0
je c2;ax=0,end of file,quit
cmp stutemp,1ah;EOF Marker?
je c2
pop dx
pop cx
pop bx
pop ax
ret
c1: lea dx,readmsg
call near ptr errm
c2: mov endcde,1
pop dx
pop cx
pop bx
pop ax
ret
readh endp
;-----------------------------------------------------------------------
save proc near ;将内存studnetx表中全部学生信息写入到磁盘文件
;void save()
push cx
push ax
mov errcde,0
call near ptr clear
call near ptr cursor
call near ptr creath
cmp errcde,0
jne s2
sloop: mov cx,stustored;一次循环写入一条学生信息
cmp stusaved,cx
je sexit;注意!这里是je而不是ja(调试发现)! ??
call near ptr writh
cmp errcde,0
jne sexit
jmp sloop
sexit: call near ptr clseh
mov saveflag,1
showmsg 07
s2: showmsg exit
anykey
mov stusaved,0
pop ax
pop cx
ret
save endp
;------------------------------------------------------------------------
creath proc near ;创建磁盘文件并获得句柄
;void creath()
push ax
push cx
push dx
showmsg 21
call near ptr get_path
crlfm
mov ah,3ch;3ch:建立文件
mov cx,0
lea dx,pathnam
int 21h ;03-6-10 20:42
jc a1
mov filehandle,ax
pop dx
pop cx
pop ax
ret
a1: lea dx,opnmsg
call errm
pop dx
pop cx
pop ax
ret
creath endp
;------------------------------------------------------------------------
clseh proc near
;void clseh() clsoe a file
push ax
push bx
mov ah,3eh
mov bx,filehandle
int 21h
pop bx
pop ax
ret
clseh endp
;------------------------------------------------------------------------
writh proc near ;将一条item写入到磁盘文件
mov ax,stusaved
mov bl,17
mul bl
lea dx,studentx
add dx,ax;dx指向第一条未保存的item的首地址
mov ah,40h
mov bx,filehandle
mov cx,17;cx:写入的字节数
int 21h
inc stusaved
jnc d1
lea dx,wrtmsg;出错处理
call near ptr errm
d1: ret
writh endp
;------------------------------------------------------------------------
clear proc near
;clear screen
push ax
push bx
push cx
push dx
mov AX,0600H ;clear screen
mov CX,0
mov DX,174FH
mov BH,07
int 10H
pop dx
pop cx
pop bx
pop ax
ret
clear endp
;------------------------------------------------------------------------
;SetCursor
cursor proc near
push ax
push bx
push dx
mov ah,2
mov bh,0;bh=页号
mov dx,0;dh:row,dl:column
int 10h
pop dx
pop bx
pop ax
ret
cursor endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -