📄 lm4.asm
字号:
STACK SEGMENT PARA STACK 'STACK'
DW 128 DUP(?)
STACK ENDS
;**************************************************************
string macro xp ;宏定义,输出提示字符串
push dx
push ax
mov ah,9
lea dx,str&xp
int 21h
pop ax
pop dx
endm
caidan macro
string 0 ;提示菜单
string 1
string 2
string 3
string 4
string 5
string 6
endm
;**************************************************************
EXTRA SEGMENT PARA 'EXTRA'
EXTRA ENDS
;**************************************************************
DATA SEGMENT PARA 'DATA'
str0 db 0ah,0dh,0ah,0dh,'* * * * Choose * * * *','$' ;数据均在数据段操作
str1 db 0ah,0dh,'* * * i.insert * * *','$'
str2 db 0ah,0dh,'* * * s.search * * *','$'
str3 db 0ah,0dh,'* * * m.modify * * *','$'
str4 db 0ah,0dh,'* * * d.delete * * *','$'
str5 db 0ah,0dh,'* * * l.list * * *','$'
str6 db 0ah,0dh,'* * * q.exit * * *',0ah,0dh,'$'
str8 db 0ah,0dh,0ah,0dh,'* * * * name :','$'
str9 db 0ah,0dh,'* * * bianhao :','$'
str10 db 0ah,0dh,'* * * author :','$'
str11 db 0ah,0dh,'* * * Input the delete name:','$'
str12 db 0ah,0dh,'* * * No Match!',0ah,0dh,'$'
str13 db 0ah,0dh,'* * * Delete finished!','$'
str14 db 0ah,0dh,'* * * Input the search name:','$'
str15 db 0ah,0dh,'* * * There no such book!','$'
messg db 30 dup(?)
geshu dw 0
num dw 0
array db 30 dup(30 dup(20h))
namesav db 10 dup(20h)
char db '$'
bianhaosav db 10 dup(20h)
char1 db '$'
authorsav db 10 dup(20h)
char2 db '$'
mshu dw 0
biaozhi dw -1
DATA ENDS
;***************************************************************
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRA
MAIN PROC FAR
START:
MOV AX,DATA
MOV DS,AX ;Let DS register have data segment address
MOV AX,EXTRA
MOV ES,AX ;Let ES register have extra segment address
;**************************************************************
lop: caidan
mov ah,01
int 21h
l1: cmp al,'i' ;通过输入(i,s,m,d,l,q)调用功能模块
jnz l2
call insert
l2: cmp al,'s'
jnz l3
call search
l3: cmp al,'m'
jnz l4
call modify
l4: cmp al,'d'
jnz l5
call delete
l5: cmp al,'l'
jnz l6
call list
l6: cmp al,'q'
jnz lop ;输入非功能键时跳回菜单
;***************************************************************
MOV AH,4CH ;DOS function call
INT 21H ;Return to DOS
MAIN ENDP ;主程序结束
;---------------------------------------------------------------
insert proc near
push si ; 先将要使用的寄存器压入栈
push di
push dx
push ax
push cx
mov si,0
mov di,si
mov bx,30 ;记录的长度固定
mov ax,geshu
mul bx ;插入新的记录时在字符串中的起始地址
mov si,ax
mov di,si
mov cx,10
string 8 ;输入书的名字,名字长度为固定值10
inname:
mov ah,01
int 21h
cmp al,13
jz innum
mov byte ptr array[si],al
inc si
loop inname
innum:
add di,9 ;输入书的编号,有10个字节空间
mov si,di
mov cx,10
string 9
iloop1: inc si
mov ah,01
int 21h
cmp al,13
jz inauth
mov byte ptr array[si],al
loop iloop1
inauth:
add di,10 ;输入书的作者,有10个字节空间
mov si,di
mov cx,10
string 10
iloop2: inc si
mov ah,01
int 21h
cmp al,13
jz i_end
mov byte ptr array[si],al
loop iloop2
i_end: add geshu,1 ;记录书的个数
pop cx ;将所有用到的寄存器按顺序出栈
pop ax
pop dx
pop di
pop si
ret
insert endp
;-----------------------------------------------------------------
search proc near
push dx ; 先将要使用的寄存器压入栈
push cx
push ax
push bx
push si
push di
mov si,0
mov di,si
mov bx,si
mov ax,geshu
mov num,ax
string 14
s1:
mov ah,01 ;接收要查找的书本的名字,并将其逐个字符送入缓冲区中
int 21h
mov byte ptr namesav[di],al
cmp al,13
jz s2
inc di
jmp s1
s2: mov ax,10
sub ax,di
mov bx,ax
s3: mov namesav[di],20h ;将未满10个字节的名字用20H填满,便于比较
inc di
dec bx
jnz s3
lea di,array
mov bx,0
s4: lea di,array ;用si,di来进行逐字符的比较
mov cx,10
add di,bx
lea si,namesav
repe cmpsb
jz s_find ;查到记录时,将该书本的所有资料全部输出
s5: mov cx,30
dec num
jz no_match
mov ax,geshu ;记录查找中的记录位置
sub ax,num
mul cx
mov bx,ax
jmp s4 ;用个数当循环控制条件
s_find:
mov cx,30
mov ax,geshu
sub ax,num
mul cx
mov di,ax
lea si,array ;查找时记录的书在字符串中的第i个,并将30当乘积因子
add si,di
mov biaozhi,si
string 8
lea di,namesav
mov cx,10
rep movsb
mov ah,9
lea dx,namesav
int 21h
string 9
lea di,bianhaosav
mov cx,10
rep movsb
mov ah,9
lea dx,bianhaosav
int 21h
string 10
lea di,authorsav
mov cx,10
rep movsb
mov ah,9
lea dx,authorsav
int 21h
jmp s_end
no_match:
string 12
s_end:
pop di ;将所有用到的寄存器按顺序出栈
pop si
pop bx
pop ax
pop cx
pop dx
ret
search endp
;------------------------------------------------------------------------
delete proc near
push dx ; 先将要使用的寄存器压入栈
push cx
push ax
push bx
push si
push di
mov si,0
mov di,si
mov bx,si
mov ax,geshu
mov num,ax
string 14
d1:
mov ah,01 ;接收要查找的书本的名字,并将其逐个字符送入缓冲区中
int 21h
mov byte ptr namesav[di],al
cmp al,13
jz d2
inc di
jmp d1
d2: mov ax,10
sub ax,di
mov bx,ax
d3: mov namesav[di],20h ;将未满10个字节的名字用20H填满,便于比较
inc di
dec bx
jnz d3
lea di,array
mov bx,0
d4: lea di,array ;用si,di来进行逐字符的比较
mov cx,10
add di,bx
lea si,namesav
repe cmpsb
jz d_find ;查到记录时,将该书本的所有资料全部输出
d5: mov cx,30
dec num
jz d6
jnz d7
d6: jmp no_be
d7: mov ax,geshu ;记录查找中的记录位置
sub ax,num
mul cx
mov bx,ax
jmp d4 ;用个数当循环控制条件
d_find:
mov cx,30
mov ax,geshu
sub ax,num
mul cx
mov di,ax
lea si,array ;查找时记录的书在字符串中的第i个,并将30当乘积因子
add si,di
mov biaozhi,si
string 8
lea di,namesav
mov cx,10
rep movsb
mov ah,9
lea dx,namesav
int 21h
string 9
lea di,bianhaosav
mov cx,10
rep movsb
mov ah,9
lea dx,bianhaosav
int 21h
string 10
lea di,authorsav
mov cx,10
rep movsb
mov ah,9
lea dx,authorsav
int 21h
mov cx,30
mov si,biaozhi
d_ccel:
mov byte ptr [si],20h
inc si
loop d_ccel
jmp d_end
no_be:
string 15
d_end:
pop di ;将所有用到的寄存器按顺序出栈
pop si
pop bx
pop ax
pop cx
pop dx
ret
delete endp
;------------------------------------------------------------------------
modify proc near
push dx ; 先将要使用的寄存器压入栈
push cx
push ax
push bx
push si
push di
mov si,0
mov di,si
mov bx,si
mov ax,geshu
mov num,ax
string 14
m1:
mov ah,01 ;接收要查找的书名,并将其逐个字符送入缓冲区中
int 21h
mov byte ptr namesav[di],al
cmp al,13
jz m2
inc di
jmp m1
m2: mov ax,10
sub ax,di
mov bx,ax
m3: mov namesav[di],20h ;将未满10个字节的名字用20H填满,便于比较
inc di
dec bx
jnz m3
lea di,array
mov bx,0
m4: lea di,array ;用si,di来进行逐字符的比较
mov cx,10
add di,bx
lea si,namesav
repe cmpsb
jz m_find
m5: mov cx,30
dec num
jz m6
jnz m7
m6:
jmp no_modify
m7: mov ax,geshu ;记录查找中的记录位置
sub ax,num
mul cx
mov bx,ax
jmp m4 ;用个数当循环控制条件
m_find:
mov cx,30
mov ax,geshu
sub ax,num
mul cx
mov si,ax
mov di,si
mov cx,10
mov biaozhi,si ;查到记录时,将该书的所有资料全部输出
string 8
mname:
mov ah,01 ;将查找的书名输出
int 21h
cmp al,13
jz mname1
mov byte ptr array[si],al
inc si
loop mname
mname1: mov byte ptr array[si],20h
inc si
loop mname1
mbianhao:
add di,9 ;将查找的书的编号输出
mov si,di
mov cx,10
string 9
mloop1: inc si
mov ah,01
int 21h
cmp al,13
jz mbianhao1
mov byte ptr array[si],al
loop mloop1
mbianhao1:
mov byte ptr array[si],20h
inc si
loop mbianhao1
mauthor:
add di,10 ;将查找的书的作者输出
mov si,di
mov cx,10
string 10
mloop2: inc si
mov ah,01
int 21h
cmp al,13
jz mauthor1
mov byte ptr array[si],al
loop mloop2
mauthor1:
mov byte ptr array[si],20h
inc si
loop mauthor1
jmp m_end
no_modify:
string 15
m_end:
pop di ;将所有用到的寄存器按顺序出栈
pop si
pop bx
pop ax
pop cx
pop dx
ret
modify endp
;-------------------------------------------------------------------------
list proc near
push si
push di
push bx
push ax
push cx
mov bx,geshu ;用个数当输出所有记录的循环控制条件
mov si,0
mov di,si
cld
lea si,array
print:
string 8
lea di,namesav ;对书名的输出
mov cx,10
rep movsb
mov ah,9
lea dx,namesav
int 21h
string 9
lea di,bianhaosav ;对编号的输出
mov cx,10
rep movsb
mov ah,9
lea dx,bianhaosav
int 21h
string 10
lea di,authorsav ;对书的作者的输出
mov cx,10
rep movsb
mov ah,9
lea dx,authorsav
int 21h
dec bx
jnz print
pop cx
pop ax
pop bx
pop di
pop si
ret
list endp
;*********************************************************************************
CODE ENDS ;子程序结束
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -