📄 ppp.asm
字号:
;输出字符串的宏定义
strings macro op1
push dx
push ax
lea dx,op1
mov ah,09h
int 21h
pop dx
pop ax
endm
;*******************************************************************
;参数乘以20的宏
times macro op2
mov cl,50
mov al,op2
mul cl
endm
;**********************************************************************************
;堆栈段定义
stack segment para stack 'stack'
dw 128 dup(?)
stack ends
;**************************************************************
;数据段定义
data segment para 'data'
namepath db 'd:\music.txt',00
nhandle dw ?
inputname label byte
namelen db ?
iname db 10 dup(?)
song db 38 dup(?),13d,10d
allname label byte
namesum db ?
names db 500 dup(' ')
ppp db '$'
fno db ?
fname db 10 dup(?)
exist db ' '
intro db '*********************************************************'
db 13d,10d,'*********************************************************'
db 13d,10d,' * 1.insert *'
db 13d,10d,' * 2.search *'
db 13d,10d,' * 3.infomation * '
db 13d,10d,' * 4.quit * '
db 13d,10d,'*********************************************************$'
sel db 13d,10d,'** select:$'
sw db 13d,10d,'** The select is out of range!**$'
tip db 13d,10d,'*********************************************************'
db 13d,10d,'* INSERT UNIT *'
db 13d,10d,'********************************************************$'
tip1 db 13d,10d,'The name of Singer and Songs(xx-xx):$'
tip2 db 13d,10d,'Please input the Name of Singer:$'
tip4 db 13d,10d,'ReadFile Error!!$'
tip3 db 13d,10d,'CreatFile Error!!$'
tip5 db 13d,10d,'WriteFile Error!!$'
tip6 db 13d,10d,'OpenFile Error!!$'
tip7 db 13d,10d,'Sorry,Cannot find!$'
tip8 db 13d,10d,'----------All Singers And Their Songs---------'
tip9 db 13d,10d,'SINGER && SONGS'
db 13d,10d,'$'
tip10 db 13d,10d,'---------- The Search Result ---------------$'
data ends
;**************************************************************
code segment
assume cs:code,ds:data,ss:stack
main proc far
start: mov ax,data ;//传送数据段
mov ds,ax
call open ;//打开歌曲文件
call read ;//读入缓冲区
call select ;//功能选择
ret
main endp
;*****************************************************************
; THE MENU 输出菜单
introduce proc near
strings intro
ret
introduce endp
;******************************************************************
;To present a space 输出一个空格
space proc near
mov dl,0dh
mov ah,02
int 21h
mov dl,0ah
mov ah,02
int 21h
ret
space endp
;****************************************************************
;TO input a stop 输出一个无回显
stop proc near
mov ah,07h
int 21h
ret
stop endp
;***************************************************************
;Select a function 选择功能
select proc near
menu:
call space
call introduce
choose:
strings sel
mov ah,01h
int 21h
cmp al,30h
jb again ;//输入不合法
cmp al,34h
ja again ;//输入不合法
jz exit ;//退出
cmp al,31h
jnz a
call insert ;//插入
jmp menu
a: cmp al,32h ;//查找
jnz u
call search
jmp menu
u: cmp al,33h ;//输出全部信息
jnz all
call allinform
all: jmp menu
again:
strings sw
jmp choose ;//不合法处理
exit:
call creat
call write
ret
select endp
;***************************************************************
; 输出所有信息
allinform proc near
call space
strings tip8
call space
mov bl,[allname]
times bl
mov cx,ax
mov si,0
lop13: mov dl,names[si]
mov ah,02
int 21h
inc si
loop lop13
ret
allinform endp
;***************************************************************
; Insert information to file
insert proc near
call space
strings tip
call space
strings tip1 ;//输出提示输入信息的提示:
call inputm ;//输入信息
call compare
ret
insert endp
;***************************************************************
inputm proc near
push si
mov si,1
mov dx,10
a2: mov ah,01h
int 21h
cmp al,0dh
jz w
cmp al,2dh
jz x
mov inputname[si],al
inc si
jmp a2
x: cmp si,dx
ja a3
mov inputname[si],20h
inc si
jmp x
a3:
add dx,10
jmp a2
w: cmp si,49
jz jieshu
mov inputname[si],20h
inc si
jmp w
jieshu:
pop si
ret
inputm endp
;*******************************************************************
search proc near
call space
strings tip2
mov si,0
s: mov ah,01h
int 21h
cmp al,13d
jz sea
mov fname[si],al
inc si
jmp s ;//输入查找的歌手名,以space结束
sea:
mov cx,si
mov [fno],cl
mov al,[namesum]
cmp al,0 ;//文档为空时,找不到
jz cannotfind
dec al
c: mov bl,al
mov ah,0
mov cl,50
mul cl
mov si,ax ;//文档缓冲区的偏移量
mov cl,[fno]
xor ch,ch
lea di,fname ;//字符串的偏移地址给DI
lop6: mov al,names[si] ;//字符串进行比较
mov dl,[di]
cmp dl,al
jnz still ;//不匹配
inc si
inc di
loop lop6
jmp canfind ;//匹配
still:
mov al,bl
dec al
jl cannotfind ;//全部不匹配
jmp c ;//进行下一次匹配
cannotfind:
mov dl,[exist]
cmp dl,0
jnz b
strings tip7 ;//输出查找失败信息
jmp b
canfind:
mov dl,[exist]
cmp dl,0
jnz v
call space
mov dl,1
mov [exist],dl
v: mov bh,bl ;//找到
times bl
mov si,ax
mov cx,50
call space
call space
strings tip10
strings tip9
n:
mov dl,names[si] ;//输出找到信息
mov ah,02
int 21h
inc si
loop n
mov al,bh
dec al
jmp c
b: mov dl,0
mov [exist],0
ret
search endp
;**************************************************************
;比较字符串
compare proc near
mov al,[namesum]
cmp al,0
jz firstin
jmp k ;//文档为空时头插
firstin:
mov cx,50
lea di,names
lea si,iname
lop4: mov al,[si]
mov [di],al
inc si
inc di
loop lop4
jmp j ;//头插
k: dec al
mov bl,al
mov ah,0
mov cl,50
mul cl
mov si,ax ;//找文档缓冲区的偏移量
mov cl,[inputname]
xor ch,ch
lea di,iname ;//插入歌手的偏移量给DI
lop: mov al,names[si]
mov dl,[di]
cmp dl,al ;//比较
jnz notequal ;//不等
inc si
inc di
loop lop
jmp sert ;//相等则插入
notequal:
jae sert
mov dl,bl ;//比较小于的时候,后移一个名字的为数并继续下一次的比较
inc bl
times dl
lea si,names
add si,ax
times bl
lea di,names
add di,ax
mov bl,dl
mov cx,50
shift: mov al,[si]
mov [di],al
inc si
inc di
loop shift ;//文档缓冲区向后移位
g: dec bl
cmp bl,0
jl firstin ;//匹配到第一个时头插
times bl
mov si,ax
lea di,iname
mov cl,[inputname]
xor ch,ch
jmp lop
sert: ;//大于或等于的时候插入
times bl
add ax,50
mov cx,50
lea si,names
add si,ax
lea di,iname
lop1: mov al,[di]
mov [si],al
inc si
inc di
loop lop1
j: add [namesum],1 ;//文档信息数目计数加一
ret
compare endp
;*************************************************************
;建立文件
creat proc near
mov ah,3ch
mov cx,00
lea dx,namepath
int 21h
mov nhandle,ax
jc went
jmp l
went: strings tip3
l: ret
creat endp
;*************************************************************
;Open File 为读写打开文件
open proc near
mov ah,3dh
mov al,02
lea dx,namepath
int 21h
jc ow
mov nhandle,ax
jmp p
ow:
call creat
mov ah,3dh
mov al,02
lea dx,namepath
int 21h
mov nhandle,ax
p:
ret
open endp
;******************************************************************
;READ PART 读文件到缓冲区
read proc near
mov ah,3fh
mov bx,nhandle
mov cx,501
lea dx,allname
int 21h
jc rerror
jmp to
rerror:
strings tip4
to:
ret
read endp
;****************************************************************
;WRITE INTO FILE 写文件到缓冲区
write proc near
mov ah,40h
mov bx,nhandle
mov cx,501
lea dx,allname
int 21h
jc werror
mov ah,3eh
mov bx,nhandle
int 21h
jmp good
werror: strings tip5
good: ret
write endp
;****************************************************************
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -