📄 jiami.asm
字号:
dseg segment
; addition db ?
mark db 6 dup(1)
buffer db 150 dup(?) ;没读一次文件时,都留出5个字节空位,与addition合起来正好可以存放密码
len dw 0 ;文件长度
filename db 20,?,20 dup(?)
psword db 7,?,7 dup (?)
handle1 dw ?
handle2 dw ?
enword db 8,8,8,8,8,8
msg db 'input filename',0dh,0ah,'$'
msgnewf db 'save as:',0dh,0ah,'$'
msgno db 'can not open the file',0dh,0ah,'$'
cerr db 'error', 0dh,0ah,'$'
msgmerr db 'move pointer error',0dh,0ah,'$'
msgin db 'encrypt,press 0;disencrypt press 1',0dh,0ah,'$'
msgwrong db 'poor choice',0dh,0ah,'$'
msgwrps db 'password wrong',0dh,0ah,'$'
msgbuilderr db 'can not build file',0dh,0ah,'$'
msgpw db 'input a password with 6 chars',0dh,0ah,'$'
msgenc db 'the file has been encrypted',0dh,0ah,'$'
msgexit db 'press any key to continue',0dh,0ah,'$'
werror db 'error while writing',0dh,0ah,'$'
dseg ends
cseg segment
assume cs:cseg,ds:dseg
start: mov ax,dseg
mov ds,ax
mov dx,offset msg ;提示输入文件名
mov ah,9
int 21h
mov dx,seg filename
mov ds,dx
mov dx,offset filename ;输入文件名
mov ah,0ah
int 21h
mov al,filename+1 ;将输入字符串的最后一个回车字符改为0
mov ah,0
mov si,ax
mov filename[si+2],00h
mov bx,offset handle1 ;打开文件
call opfile
mov dx,offset buffer ;读文件
mov bx,handle1
call rdfile
mov ah,42h ;将读写指针移动到文件开始
mov bx,handle1
mov cx,0ffffh
mov si,len
neg si
mov dx,si
mov al,2
int 21h
jnc chooce
mov dx,offset msgmerr ;移动指针出错,输出信息后退出
mov ah,9
int 21h
jmp done
chooce:
mov dx,offset msgin ;提示选择操作类型
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov ah,1 ;选择
int 21h
mov bl,al
mov dl,0dh
mov ah,2
int 21h
cmp bl,30h ;判断选择是否正确
jb exit
jz encrypt
cmp bl,31h
ja exit
jmp disencrypt ;disencrypt
exit: ;选择操作时错误
mov dx,offset msgwrong
mov ah,9
int 21h
jmp done
encrypt: ;加密
mov cx,6 ;判断文件是否加密过
lea bx,buffer
again2:
cmp byte ptr [bx],1
jnz outlp
inc bx
loop again2
outlp: cmp cx,0
jz encrypted ;若已加密,结束操作
mov bx,handle1 ;将加密标志写入原文件
mov dx,offset mark
mov cx,len
add cx,6
call wtfile
call inputpsword ;输入密钥
mov cx,len
lea di,buffer
call do ;加密操作
call infname ;建立新文件
call newf
mov di,offset psword
add di,2
call enpsword ;将密码加密
mov bx,handle2 ;将加密过的密码写入文件头
mov dx,offset psword
add dx,2
mov cx,6
call wtfile
mov bx,handle2 ;将加密过的数据写入新文件
mov dx,offset buffer
mov cx,len
call wtfile
jmp done
encrypted:
mov dx,offset msgenc ;加密过,输出信息
mov ah,9
int 21h
jmp done
disencrypt: ;解密
call inputpsword ;输入密钥
lea di,buffer ;将文件的密码解密
call enpsword
mov si,offset buffer ;判断密码是否正确
mov di,offset psword
add di,2
mov cx,6
again4: mov al,[si]
cmp [di],al
jnz out4
inc si
inc di
loop again4
mov cx,len
sub cx,6
lea di,buffer
add di,6
call do ;解密操作
call infname ;建立新文件
call newf
mov bx,handle2 ;将解密过的数据写入新文件
mov dx,offset buffer
add dx,6
mov cx,len
sub cx,6
call wtfile
jmp done
out4: mov dx,offset msgwrps
mov ah,9
int 21h
done:
mov dx,offset msgexit
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch
int 21h
;----------------------------------------------------------------------
;密码加密或解密
;入口参数: di=要进行操作的缓冲区首地址
enpsword proc
mov cx,6
lea si,enword
again3: mov al,[si]
xor [di],al
inc si
inc di
loop again3
ret
enpsword endp
;----------------------------------------------------------------------
;输入文件名
infname proc
mov dx,offset msgnewf ;提示输入文件名
mov ah,9
int 21h
mov dx,seg filename
mov ds,dx
mov dx,offset filename ;输入文件名
mov ah,0ah
int 21h
mov al,filename+1 ;将输入字符串的最后一个回车字符改为0
mov ah,0
mov si,ax
mov filename[si+2],00h
ret
infname endp
;-------------------------------------------------------------------------
;打开文件
;入口参数 bx指向存储文件号的内存单元
opfile proc
mov ah,3Dh
mov dx,offset filename ;打开文件操作
add dx,2
mov al,2
int 21h
mov [bx],ax
jc m1
ret
m1: mov dx,offset msgno ;找不到文件时,输出提示信息
mov ah,9
int 21h
jmp done
ret
opfile endp
;---------------------------------------------------------------------
;建立新文件
newf proc
lea dx,filename
add dx,2
mov cx,00
mov ah,3ch
int 21h
mov handle2,ax
jc builderr
ret
builderr:
mov dx,offset msgbuilderr
mov ah,9
int 21h
ret
newf endp
;-------------------------------------------------------------
;读文件
;入口参数 dx=缓冲区首地址 bx=文件号
rdfile proc
again1:
mov ah,3Fh
mov cx,1
int 21h
inc dx
add len,ax
cmp ax,0
jnz again1
ret
rdfile endp
;----------------------------------------------------------------------
;输入密码
inputpsword proc
mov dx,offset msgpw ;提示输入密码
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov dx,offset psword ; 输入密码
mov ah,10
int 21h
ret
inputpsword endp
;----------------------------------------------------------------------
;加密解密操作
;入口参数:cx=加密的字节数 di=缓冲区首地址
do proc
mov bp,0
lp1: lea si,psword
add si,2
mov ax,0
lp2: mov bl,[si] ;内层循环,6次
xor [di],bl
inc si
inc di
inc ax
inc bp
cmp bp,len ;判断是否加密到最后一个字节
jz outlp1
cmp ax,6
jnz lp2
loop lp1
outlp1: ret
do endp
;---------------------------------------------------------------------
;写文件
;入口参数 bx=文件号 dx=缓冲区首地址 cx=写入字节数
wtfile proc
mov ah,40h
int 21h
jc wterr
ret
wterr: ;写文件时出错
mov dx,offset werror
mov ah,9
int 21h
ret
wtfile endp
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -