📄 save.asm
字号:
.model small
.stack 64
.data
clrf db 0dh,0ah,"$" ;换行设置
Error1 db "Create file fail.",13,10,"$" ;创建复制文件出错提示
Error31 db "Write file fail.",13,10,"$" ;写复制文件内容出错提示
Error2 db "error open source file$" ;源文件 打开出错提示
Error4 db "error move$" ;源文件的读写指针变化出错提示
error3 db "read error$" ;源文件的读 出错提示
choseerr db 'input error' ;选功能号出错
copyhead db '*****************copy file *****************$'
inputmsg db 'input file name',0dh,0ah,'$' ;提示用户输入预先建立的文件名
sournam db 32,0,32 dup('$') ;存放预先建立的文件名。由用户输入
inputstr db "input search string $" ;输入查找串提示
searstri db 100,0,100 dup("$") ;查找串的存放单元
repmsg db "input replace string $" ;输入替换串提示
repstr db 100,0,100 dup('$') ;替换串存放地址
preline dw 0001
result1 dw 0000 ;存放源文件字符数
result1msg db 'the number of letter:$'
result2 dw 0001 ;存放源文件行数
result2msg db 'the number of line:$'
handle dw ? ;存放源文件标号
handle1 dw ? ;存放标号
handle2 dw ?
linebank dw 0000
temp db ? ;存放输入功能号标志,调用相关要求的功能
dowhat db '****** to do what?choose number:*******',0dh,0ah,0dh,0ah,'( 1: scan,2: search,3: replace,4: exit )$'
succin db 'succ input msg $'
suc1 db "ok open $" ;源文件的缓冲区
suc2 db "ok read $" ;源文件的缓冲区
buff db -1,5000 dup("$") ;源文件的缓冲区
buff1 db 5000 dup ("$") ;替换后的缓冲区
succinsear db "in sear $"
outmsg db "search one ok $" ;查找到匹配字符串提示
endmsg db "end search,find string number: $" ;查找匹配串结束
endrep db "replace string number: $"
searres1 dw 0000
searres2 dw 0000
copypath db "copy.txt",00 ;复制文件名称,也即存放地址
copysucc db "copy file success.please check!",0dh,0ah,"replace string number:$" ;复制文件完成提示
.code
main proc far
Mov AX,@data
Mov DS,AX
whatdo: ;选择相关功能号
Mov ah,9
Mov DX,Offset dowhat
Int 21H
mov ah,09
lea dx,clrf
int 21h
mov ah, 1
int 21h
mov temp,al
mov ah, 1
int 21h
mov al,temp
cmp al,'1'
je temp1
cmp al,'2'
je temp2
cmp al,'3'
je temp3
cmp al,'4'
je temp4
jmp errorinput
temp1: call toscan
temp2: call tosear
temp3: call torep
temp4: mov ax,4c00h
int 21h
errorinput:
Mov ah,9
Mov DX,Offset choseerr
Int 21H
jmp whatdo
main Endp
;---------------------- ---- 取得一些必需的信息
toscan proc near
Mov Ah,09h
Mov DX,Offset inputmsg
Int 21H ;提示输入文件名
Mov ah,0ah ;取文件名
lea dx, sournam
int 21h
sub bh, bh
mov bl,[sournam+1]
mov sournam[bx+2],0
mov sournam[bx+3],0
add dx,2
mov ah,09h
int 21h
mov ah,09
lea dx,clrf
int 21h
call openread
toscan endp
;-------------------------------
tosear proc near
Mov Ah,09h
Mov DX,Offset inputmsg
Int 21H ;提示输入文件名
Mov ah,0ah ;取文件名
lea dx, sournam
int 21h
sub bh, bh
mov bl,[sournam+1]
mov sournam[bx+2],0
mov sournam[bx+3],0
add dx,2
mov ah,09h
int 21h
mov ah,09
lea dx,clrf
int 21h
Mov Ah,09h
Mov DX,Offset inputstr
Int 21H ;提示输入查找串
mov ah,09
lea dx,clrf
int 21h
Mov ah,0ah ;取查找串
lea dx, searstri
int 21h
sub bh, bh
mov bl,[searstri+1]
mov searstri[bx+2],'$'
add dx,2
mov ah,09
int 21h
call openread
tosear endp
;-------------------------------
torep proc near
Mov Ah,09h
Mov DX,Offset inputmsg
Int 21H ;提示输入文件名
Mov ah,0ah ;取文件名
lea dx, sournam
int 21h
sub bh, bh
mov bl,[sournam+1]
mov sournam[bx+2],0
mov sournam[bx+3],0
add dx,2
mov ah,09h
int 21h
mov ah,09
lea dx,clrf
int 21h
Mov Ah,09h
Mov DX,Offset inputstr
Int 21H ;提示输入查找串
mov ah,09
lea dx,clrf
int 21h
Mov ah,0ah ;取查找串
lea dx, searstri
int 21h
sub bh, bh
mov bl,[searstri+1]
mov searstri[bx+2],'$'
add dx,2
mov ah,09h
int 21h
mov ah,09
lea dx,clrf
int 21h
Mov Ah,09h
Mov DX,Offset repmsg
Int 21H ;提示输入替换串
mov ah,09
lea dx,clrf
int 21h
Mov ah,0ah
lea dx, repstr ;取替换串
int 21h
sub bh, bh
mov bl,[repstr+1]
mov repstr[bx+2],'$'
add dx,2
mov ah,09h
int 21h
mov ah,09
lea dx,clrf
int 21h
call openread
torep endp
;--------------------------------------------------------字符读进缓冲区buff
openread proc near
Mov AX,@data
Mov DS,AX
mov al,0
Mov Ah,3dH
lea dx,sournam
add dx,2
Int 21H ;按读写方式打开文件
Jc Err2
Mov bx,AX;
push bx
mov handle,ax
jmp read
Err2:
mov dl,al
mov ah,2
add dl,30h
int 21h
Mov DX,Offset Error2
jmp ShowErr
read:
mov cx, 0
mov dx, 0
pop bx
cmp dx, 0
jge point
not cx
point:
mov al,00
mov ah, 42h
int 21h;调节读写指针位置,基本上没发挥作用
mov ah,09
lea dx,clrf
int 21h
mov si,1
loopread:
mov ah,3fh
lea dx,buff[si]
mov bx,handle
mov cx,1
int 21h
inc result1
and ax,ax; 文件尾吗
jz close;是,退出
cmp buff[si],0ah;文件行尾吗?
je addline ;是,加一行
inc si
jmp loopread
addline:
inc result2
inc si
jmp loopread
close: mov buff[si],-1
mov ah,3eh
int 21h
mov ch,temp
cmp ch,'1'
je totoscan
jmp tocmp
totoscan:
lea dx,result1msg
mov ah,9
int 21h
mov cx,result2;显示行数和字符数
sub cx,1
add cx,cx
sub si,cx
sub si,1
mov ax,si
mov cl,0
jmp dis
dis:
mov dl,10
div dl
mov bx,ax; ah余数 al商
mov dl,bh;显示余数
push dx
inc cl
cmp bl,0ah;是否除尽
jb gonext;显示最后一位商
mov ah,0 ;清零
jmp dis;继续除
gonext:
mov dl,bl
add dl,30h
mov ah,02
int 21h
shang:
pop dx
add dl,30h
mov ah,02
int 21h
dec cl
cmp cl,0
jne shang
mov ah,09
lea dx,clrf
int 21h
mov ah,09
lea dx,result2msg
int 21h
mov ax,result2
mov dl,10
div dl
mov dx,ax
add dl,30h
mov ah,02
int 21h
add dh,30h
mov dl,dh
mov ah,02
int 21h
mov ah,09
lea dx,clrf
int 21h
mov bx,1
scanloop:
mov dl,buff[bx]
cmp dl,-1
je scannext
cmp dl, '$'
je scannext
mov ah, 2
int 21h
inc bx
jmp scanloop
scannext:
mov ah,3eh
int 21h
call exit
tocmp:
mov ch,temp
cmp ch,'2'
je totosear
jne totorep
totosear:
call sear
totorep:
call repl
openread endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -