?? 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 + -