
Code Segment
Assume CS:Code,DS:Code
-----------------------------------------
功能:显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法: Output Str_Addr
用法举例:Output PromptStr
Output MACRO Str_Addr
push dx
lea dx,Str_Addr
mov ah,9
int 21h
pop dx
EndM
-----------------------------------------
功能:打开指定路径下的文件。若打开成功,保存文件代号,设置进位标志;
否则,建立文件,保存文件代号,清进位标志
入口参数:dx=文件名地址,bx=文件代号保存地址
Open_File Proc Near
mov ax,3d02h 以读写方式打开文件
int 21h
jc @@Error
mov [bx],ax 成功打开,保存文件代号
stc 设置进位标志
ret
@@Error: Output Open_Error
xor cx,cx 新建文件属性
Create_File:mov ah,3ch 建立文件
int 21h
jc Create_File 建立不成功,尝试再建
mov [bx],ax 成功建立,保存文件代号
clc 清进位标志
ret
Open_File EndP
-----------------------------------------
功能:对字符串缓冲区中的内容逐个字符加密
入口参数:si=字符串地址,cx=字符数
Encode_Str Proc Near
push si
push cx
lea di,Handle_File
mov al,[di][88] 读取密钥
@@Encoding: xor byte ptr [si],al 异或,第一步加密
push cx
mov cx,188
rol byte ptr [si],cl 循环左移188位,第二步加密
pop cx
inc si 下一个字符地址
loop @@Encoding 处理下一个字符
pop cx
pop si
ret
Encode_Str EndP
-----------------------------------------
功能:对字符串缓冲区中的内容逐个字符加密
入口参数:si=字符串地址,cx=字符数
Uncode_Str Proc Near
push si
push cx
lea di,Handle_File
mov al,[di][88] 读取密钥
@@Uncoding: push cx
mov cx,188
ror byte ptr [si],cl 循环右移188位,第一步解密
pop cx
xor byte ptr [si],al 异或,第二步解密
inc si 下一个字符地址
loop @@Uncoding 处理下一个字符
pop cx
pop si
ret
Uncode_Str EndP
-----------------------------------------
Handle_File dw ?,?,? 文件代号
File_Name1 db 'c:\masm\rory00.txt',0 未加密的文本文件
File_Name2 db 'c:\masm\rory01.txt',0 加密后的文本文件
File_Name3 db 'c:\masm\rory02.txt',0 解密后的文本文件
Open_Error db 'Open file error,creat a new file.',13,10,13,10,7,'$'
Input_New db 'Input the new information:',13,10,'$'
Press_Key db 13,10,13,10,'The Encode and Uncode have been completed.',7
db 13,10,13,10,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es 使数据段、附加段与代码段同段
-----------------------------------------
打开或建立三个文件
lea dx,Buffer 文本内容处理缓冲区
mov cx,0ffc0h 预留32个字的堆栈空间
sub cx,dx 设置读写一次文件内容的字节数
mov bp,cx 暂存
lea dx,File_Name2 文件名地址
lea bx,Handle_File[2] 文件代号保存地址
call Open_File 打开指定路径下的文件。若打开成功,保存文件代号;否则,建立文件,保存文件代号
lea dx,File_Name3 文件名地址
lea bx,Handle_File[4] 文件代号保存地址
call Open_File
lea ax,@@jump000
push ax
call @@Locate_01
@@Locate_00:lea dx,File_Name1 文件名地址
lea bx,Handle_File 文件代号保存地址
call Open_File
jc Read_File
-----------------------------------------
若是新建文件,输入文件内容,实施加密,写到另一个文件
Input_Str: Output Input_New 提示输入新信息
lea dx,Buffer 文本内容处理缓冲区
mov ah,0ah 键盘输入字符串
int 21h
lea si,Buffer[1] 实际输入的字符个数地址
lodsb 读取实际输入的字符数
test al,0ffh
jz Input_Str 若直接回车,未输入任何字符,再次提示输入新信息
mov dx,si 数据缓冲区地址
mov cl,al 实际输入的字符数
xor ch,ch
mov bx,Handle_File 读取未加密的文本文件代号
Write_Uncod:mov ah,40h
int 21h
jc Write_Uncod 写入失败,尝试再写
call Encode_Str 逐个字符加密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[2] 文件代号
Write_Coded:mov ah,40h
int 21h
jc Write_Coded 写入失败,尝试再写
jmp @@Uncode
@@Locate_01:pop ax
ret
-----------------------------------------
若成功打开文件,读取文件内容,实施加密,写到另一个文件
Read_File: lea dx,Buffer 文本内容处理缓冲区
mov cx,bp
mov bx,Handle_File 读取未加密的文本文件代号
mov ah,3fh 读文件内容
int 21h
jc Read_File 读文件失败,尝试再读
test ax,0ffffh
jz @@Uncode 若实际读取的字节数为0,结束读写 *** 作
lea si,Buffer
mov cx,ax
call Encode_Str 逐个字符加密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[2] 读取目标文件代号
Write_File: mov ah,40h 写文件
int 21h
jc Write_File 写文件失败,尝试再写
jmp Read_File
-----------------------------------------
修改子程序Encode_Str和Encode_Str中的循环移位次数
@@jump000: mov byte ptr Encode_Str[13],6
mov byte ptr Uncode_Str[11],6
lea ax,@@Locate_00
push ax
call @@Locate_01
-----------------------------------------
将加密完的内容解密,写入第三个文本文件
@@Uncode: xor dx,dx
xor cx,cx
Loca_Seek1: mov bx,Handle_File[4] 读取解密后的文本文件代号
mov ax,4200h 移动文件指针至文件头
int 21h
jc Loca_Seek1
Loca_Seek2: mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ax,4200h 移动文件指针至文件头
int 21h
jc Loca_Seek2
lea dx,Buffer 文本内容处理缓冲区
Read_File1: mov cx,bp
mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ah,3fh 读文件内容
int 21h
jc Read_File1 读文件失败,尝试再读
test ax,0ffffh
jz Close_File1 若实际读取的字节数为0,结束读写 *** 作,关闭文件
lea si,Buffer
mov cx,ax
call Uncode_Str 逐个字符解密
mov dx,si 数据缓冲区地址,要写入的字符数已在cx中
mov bx,Handle_File[4] 读取解密后的文本文件代号
Write_File1:mov ah,40h 写文件
int 21h
jc Write_File1 写文件失败,尝试再写
jmp Read_File1
Close_File1:mov bx,Handle_File 读取未加密的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File1
Close_File2:mov bx,Handle_File[2] 读取加密后的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File2
Close_File3:mov bx,Handle_File[4] 读取解密后的文本文件代号
mov ah,3eh 关闭文件
int 21h
jc Close_File3
Output Press_Key 提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
Exit_Proc: mov ah,4ch 结束程序
int 21h
ALIGN 10h 节对齐
Buffer db 255 文本内容处理缓冲区
Code ENDS
END Start 编译到此结束
1、p macro buflea dx,buf
mov ah,9
int 21h
endm
定义一个宏,名称为p,以后在程序中出现p的地方时,就相当于将中间的三行插入到了那里,这个宏调用了DOS中断,9号,输出DS:DX指向的内存中的一段字符串,以$为结束符,所以
p pp
p qq
等即表示输出pp qq中的字符串
2、mov ah,0
mov al,3
int 10h
mov ah,0bh
mov bh,0
mov bl,3
int 10h
这是BIOS中断,对CRT即显示器进行初始化(功能号AH=0)和设置屏幕彩色背景(AH=0B),具体入口参数你查一下就知道了
3、mov dx,0405h
mov ah,15
int 10h
mov ah,2
inc dl
int 10h
是15号和2号BIOS中断调用,取当前屏幕状态和设置光标位置到第四行第6列(DX=行 列)
4、mov bl,[si]
mov cx,1
mov ah,9
int 10h
inc si
jnz lp
输出qw的字符串
5、 lea dx,bufa
mov ah,10
int 21h
利用DOS中断从键盘输入一段字符串,存到DS:DX的内存区域,其中第二个字节存放实际输入的字符数,具体格式自查
6、lea si,bufa+1
mov ch,0
mov cl,[si]
lea di,bufb
n: mov bx,offset bufa
mov al,0
xlat bufa
mov [di],al
inc di
loop n
mov byte ptr [di],'$'
是将刚才输入的字符串拷贝到bufb缓冲区中,并在结尾加$结束符
7、p info2
p bufb
p info1
输出info2、bufb\info1中的字符串
8、下面的程序与上面的思路和功能相同,结果是要求用户输入4段不超过20个字符的字符串(以回车结束),并将这些字符串原样输出
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)