📄 book.asm
字号:
itemno EQU 68 ;读写文件操作时处理的每条信息的长度
nno EQU 15 ;信息当中 书名 所占的长度
ano EQU 15 ;信息当中 作者 所占的长度
pno EQU 15 ;信息当中 出版社 所占的长度
ino EQU 15 ;信息当中 ISBN 所占的长度
prcno EQU 8 ;信息当中 价格 所占的长度
data segment
w1 db ' Welcome to the Book Information Management System!',0ah,0dh,0ah,0dh,'$'
w2 db ' Designed and produced by Zhang Huanren ',0ah,0dh,'$'
w3 db ' From Information Science&Engineering College of CSU',0ah,0dh,0ah,0dh,'$'
w4 db ' (c) All rights reserved 2005-2006',0ah,0dh,'$'
m1 db ' ***********************************************************',0ah,0dh,'$'
m2 db ' * Book Information Management System *',0ah,0dh,'$'
m3 db ' * *',0ah,0dh,'$'
m4 db ' * Insert (i) List (l) *',0ah,0dh,'$'
m5 db ' * Modify (m) About (h) *',0ah,0dh,'$'
m6 db ' * Delete (d) Query (q) *',0ah,0dh,'$'
m7 db ' * Exit (e) *',0ah,0dh,'$'
m8 db ' * *',0ah,0dh,'$'
m9 db ' * Please choose corresponding function... *',0ah,0dh,'$'
m10 db ' ***********************************************************',0ah,0dh,'$'
re db 0ah,0dh,'Do you really want to exit?(y/n) $'
thk db 0ah,0dh,0ah,0dh,'Thank you for using this system! ',0ah,0dh,'$'
messin db 'Please input the information of the book you want to insert:',0ah,0dh,'$'
messn db ' Book Name: $'
messa db ' Author: $'
messpub db ' Publisher: $'
messi db ' ISBN: $'
messprc db ' Price: $'
messsuc db 0ah,0dh,'The operation has been excuted successfully!',0ah,0dh,'$'
messrtn db 0ah,0dh,'Press any key to return...',0ah,0dh,'$'
mess11 db ' Book Name Author Publisher ISBN price',0ah,0dh,'$'
messqur db 'Please input the name of the book: $'
messrlt db 0ah,0dh,'The book information you want is listed as follow:',0ah,0dh,'$'
messmdf db 0ah,0dh,'Please input new book information:',0ah,0dh,'$'
messdm db 0ah,0dh,'Do you really want to delete the item?(y/n) $'
err1 db 'The book you want does not exist in the database!',0ah,0dh,'$'
err2 db ' file close wrong$'
err3 db 'File written wrong!',0ah,0dh,'$'
fname db 'list.txt',0
ftmp db 'list.tmp',0
buffer1 db itemno+1 dup(?) ;从键盘读取15个字符(图书名称)到首地址为buffer1缓冲区当中
buffer2 db itemno+10 dup(?) ;从文件读取15个字符(图书名称)到首地址为buffer2缓冲区当中
handle dw ?
htmp dw ?
data ends
score struc
names db nno dup(' ')
author db ano dup(' ')
publish db pno dup(' ')
isbn db ino dup(' ')
price db prcno dup(' ')
score ends
show macro addrs ;显示字符串
lea dx,addrs
mov ah,9
int 21h
endm
set_p macro
mov ah,2 ;置光标位置
mov dh,0 ;行
mov dl,0 ;列
mov bh,0 ;页号
int 10h
endm
set_p0 macro ;光标置于第11行,第2列
mov ah,2
mov dh,6
mov dl,0
mov bh,0
int 10h
endm
clear macro ;全屏幕清除
mov al,0
mov cl,0
mov ch,0
mov dh,24
mov dl,79
mov bh,7
mov ah,6
int 10h
mov ah,2 ;置光标位置
mov dh,0 ;行
mov dl,0 ;列
mov bh,0 ;页号
int 10h
endm
newline macro ;回车换行
push ax
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop ax
endm
;-----------------------------------------------------------
showmenu macro
clear
show m1
show m2
show m3
show m4
show m5
show m6
show m7
show m8
show m9
show m10
endm
;-----------------------------------------------------------
show_item macro addrs
local iloop,w10,againsi,againprc
push bx
push cx
mov dl,' ' ;输出1个空格
mov ah,2
int 21h
mov bx,0
iloop: mov dl,addrs[bx] ;display char 输出addrs开始的nno个字符
mov ah,2
int 21h
inc bx
cmp bx,nno
jl iloop
mov cx,3 ; 输出格式: 01 23 45 67
w10: mov dl,' '
mov ah,2
int 21h
mov si,ano ;输出addrs开始的ano个字符
againsi:
mov dl,addrs[bx]
mov ah,2
int 21h
inc bx
dec si
cmp si,0
jne againsi
loop w10
mov dl,' '
mov ah,2
int 21h
mov si,ano ;输出addrs开始的ano个字符
againprc:
mov dl,addrs[bx]
mov ah,2
int 21h
inc bx
dec si
cmp si,0
jne againprc
pop cx
pop bx
endm
;---------------------------------------------------------
getin macro addrs,count2
local zeroit,lp,input_end,exitg ;将count2个字符输入到addrs为首的内存单元当中,以回车换行作为终止,多余15个字符的忽略
push bx
push ax
mov bx,0 ;addrs为首的15个字符置为空格
zeroit: mov addrs[bx],' '
inc bx
cmp bx,nno
jl zeroit
mov bx,0 ;将count2个字符输入到addrs为首的内存单元当中
lp: mov ah,1
int 21h
cmp al,0ah ;输入字符若为 回车 或 换行,则输入结束
jz input_end
cmp al,0dh
jz input_end
mov addrs[bx],al
inc bx
cmp bx,count2
jl lp
input_end: ;多输入的字符忽略,直到输入为回车换行时输入停止
cmp al,0dh
jz exitg
cmp al,0ah
jz exitg
mov ah,7
int 21h ;无回显的键盘输入
jmp input_end
exitg:
pop ax
pop bx
endm
code segment
;-----------------------------------------------------------
main proc far
assume cs:code,ds:data,es:data
start:
mov ax,data
mov ds,ax
mov es,ax
mov ah,0
mov al,3
int 10h
clear
set_p0
show w1
show w2
show w3
show w4
mov ah,07h
int 21h
clear
showmenu
newline
;检测选择的功能
w: mov ah,7
int 21h ;无回显键盘输入
cmp al,'i' ;插入功能
jnz n1
call insert
jmp w
n1: cmp al,'m'
jnz n2
call modify ;修改功能
jmp w
n2: cmp al,'d'
jnz n3 ;删除功能
call delete
jmp w
n3: cmp al,'q'
jnz n4
call query ;查询功能
jmp w
n4: cmp al,'l' ;显示功能
jnz n5
call list
jmp w
n5: cmp al,'h' ;帮助提示功能
jnz n6
call help
jmp w
n6: cmp al,'e' ;退出
jz exitf
jmp w
exitf:
clear ;清屏,鼠标置位,显示退出提示信息
set_p
show re
mov ah,01h
int 21h
show thk
mov ah,07h
int 21h
mov ah,4ch
int 21h
ret
main endp
;--------------------------------------------------------------
list proc near ; 列出所有图书信息
push ax
push bx
push cx
push dx
clear
show messrlt
show mess11
call openf
again:
mov dx,offset buffer2
mov cx,itemno
mov ah,3fh
int 21h
cmp ax,0
jz p
show_item buffer2
jmp again
p:
mov ah,3eh
int 21h
show messrtn
mov ah,7
int 21h
showmenu
pop dx
pop cx
pop bx
pop ax
ret
list endp
;-----------------------------------------------------------------------
insert proc near ;插入新的图书信息
push ax
push bx
push cx
push dx
call openf
clear ;清屏
show messin
call get_rec ;获取输入数据到首地址为buffer1的缓冲区当中
;move file pointer to end
mov cx,0 ;偏移值的高位字
mov dx,0 ;偏移值的低位字
mov al,2 ;绝对倒移方式
mov ah,42h ;读写指针功能
int 21h
;write file
mov cx,itemno ;写入的字节数
mov dx,offset buffer1 ;数据缓冲区的偏移地址
mov ah,40h
int 21h
newline
cmp ax,itemno
je i1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -