⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cv.asm

📁 汇编语言闹钟程序
💻 ASM
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Programmed by 罗云彬, bigluo@telekbird.com.cn
;	Website: http://asm.yeah.net
;	LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	版本信息
;	程序名:Convert program
;	编写时间:
;	Ver 1.0	-- 1992.10 (In ZheJiang University)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	2000.12 公布于 http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	说明:
;
;	由于 Win32Asm 编程论坛 (http://win32asm.netsh.net)上近日对
;	.exe 文件上附加代码有不少讨论,所以把这个很老的程序发表出来
;	这个程序是我 1992 年在大学里编写的,对大家有用的是两个模块:
;
;	1. .exe => .com 部分,可以帮助理解 .exe 文件重定位的原理,
;	   因为程序去除了 .exe 的文件头,把映象部分存成了一个 .com
;	   文件,同时在尾部附加了一段重定位的代码及原来文件的重定
;	   位表。
;
;	2. 在 .exe 后加密码的部分
;	   可以为在 .exe 文件上加一段代码做参考,注意密码一定要输
;	   满 8 位,否则中间的回车等所有键都会被当作密码。
;
;	另外:
;
;	1. 本程序对命令行的处理要求比较严格
;	   附加密码程序请用 CV p input.exe output.exe
;	   处理.exe到.com程序亚用 CV c input.exe output.com
;
;	2. 那时候的编程习惯不好,不喜欢加注释,大家将就着看吧
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

CODE		SEGMENT

		ASSUME CS:CODE,DS:CODE
		ORG 100H
 		
start:
		mov bl,ds:[80h]
		or bl,bl
		jnz n1
		
		mov dx,offset d_help
		mov ah,9
		int 21h
		int 20h
n1:
		mov si,81h
		cld
		
n2:
		lodsb
		cmp al,' '
		jz n2
		
		and al,0dfh
		mov command,al
		
		lodsb
		cmp al,' '
		jz n3
c_er:		
		mov dx,offset d_command_error
quit:
		mov ah,9
		int 21h
		int 20h
		
n3:		
		mov di,offset in_file
		call analy

		cmp cr,1
		jnz n4
		jmp short c_er
n4:		
		mov di,offset out_file
		call analy

		mov al,command
		mov di,offset c_table
		mov cx,3*5
		
		cld
		repnz scasb
		jz n5
		
		mov dx,offset d_no_command
		mov ah,9
		int 21h
		int 20h
n5:
		xchg si,di
		lodsw
		call ax
		
		int 20h
				
ANALY		PROC NEAR

a1:
		lodsb
		cmp al,' '
		jz a1
		
		cmp al,0dh
		jz c_er
		
		dec si
a2:
		lodsb
		cmp al,' '
		jz a3
		
		cmp al,0dh
		jz a3
		
		stosb
		jmp short a2
a3:
		cmp al,0dh
		jnz a4
		
		mov cr,1
a4:
		mov al,0
		stosb
		
		ret

ANALY		ENDP				
		
DO_IT		PROC NEAR

		call open
d0:
		mov ah,3fh
		mov bx,old_handle
		mov cx,50000
		mov dx,offset buffer
		int 21h
		
		cmp ax,cx
		jz d1
		
		mov do_end,1
		mov cx,ax
d1:
		mov si,offset buffer
		mov di,si
		cld
		call in_address
		
		mov ah,40h
		mov bx,new_handle
		mov dx,offset buffer
		int 21h
		
		test do_end,0ffh
		jz d0
		
		call close
		
		ret
		
DO_IT		ENDP

LOW_TO_UP	PROC NEAR

		mov in_address,offset ltu
		call do_it
		ret
		
LOW_TO_UP	ENDP

LTU		PROC NEAR

		push cx
l0:		
		lodsb
		cmp al,'a'
		jb l1
		
		cmp al,'z'
		ja l1
		
		sub al,20h
l1:
		stosb
		loop l0
		
		pop cx
		ret

LTU		ENDP

UP_TO_LOW	PROC NEAR

		mov in_address,offset utl
		call do_it
		ret
		
UP_TO_LOW	ENDP

UTL		PROC NEAR

		push cx
u0:
		lodsb
		cmp al,'A'
		jb u1
		
		cmp al,'Z'
		ja u1
		
		add al,20h
u1:
		stosb
		loop u0
		pop cx
		ret

UTL		ENDP

CUT_CR		PROC NEAR

		mov in_address,offset c_c
		call do_it
		ret

CUT_CR		ENDP

C_C		PROC NEAR

		cld
cc0:		
		mov ax,offset buffer
		add ax,cx
		cmp si,ax
		jb cc1
		
		mov cx,di
		sub cx,offset buffer
		ret
cc1:
		lodsb
		cmp al,' '
		jz find_sp
		cmp al,09
		jz find_sp
		
		stosb
		jmp short cc0
find_sp:
		push si
find_sp1:
		lodsb
		cmp al,' '
		jz find_sp1
		cmp al,09
		jz find_sp1
		
		cmp al,0dh
		jz cut_it
		
		cmp al,0ah
		jz cut_it
		
		pop ax
		dec ax
		push cx
		mov cx,si
		sub cx,ax
		mov si,ax
not_cut:
		lodsb
		stosb
		loop not_cut
		pop cx
		jmp short cc0
cut_it:
		add sp,2
		stosb
		jmp short cc0
		
C_C		ENDP

EXE_TO_COM	PROC NEAR

		call open
		
		mov ah,3fh
		mov bx,old_handle
		mov cx,20h
		mov dx,offset etc_exehead
		int 21h
		
		cmp etc_exehead,5a4dh
		jz e1
		
		cmp etc_exehead,4d5ah
		jz e1
		
		call close
		mov dx,offset etc_not_exe
		jmp quit
e1:		
		mov cx,etc_sss
		mov ssss,cx
		
		mov cx,etc_ssp
		mov sssp,cx
		
		mov cx,etc_iip
		mov iiip,cx
		
		mov cx,etc_ccs
		mov cccs,cx
		
		mov cx,etc_num
		mov re_number,cx
		
		xor cx,cx
		xor dx,dx
		mov ax,4202h
		int 21h
		
		test dx,0ffffh
		jz e3
e2_1:		
		call close
		mov dx,offset not_convert
		jmp quit
e3:		
		cmp ax,0fc00h
		jb e4
		
		jmp short e2_1
e4:
		mov etc_long,ax
		mov ax,etc_headlong
		mov cx,4
		shl ax,cl
		sub etc_long,ax
		
		mov dx,ax
		xor cx,cx
		mov ax,4200h
		int 21h
		
		mov cx,etc_long
		mov dx,offset buffer
		mov ah,3fh
		int 21h
		
		mov di,offset oldf
		mov si,offset buffer
		cld
		movsb
		movsw
		
		mov ax,etc_long
		mov di,ax
		
		sub ax,3
		add di,offset buffer
		
		mov buffer,0e9h
		mov word ptr buffer+1,ax
		
		mov si,offset add_file
		mov cx,offset oldf-offset add_file+3
		add etc_long,cx
		cld
		rep movsb
		
		mov ah,40h
		mov bx,new_handle
		mov cx,etc_long
		mov dx,offset buffer
		int 21h
		
		mov dx,etc_offset
		xor cx,cx
		mov ax,4200h
		mov bx,old_handle
		int 21h
		
		mov cx,etc_num
		add cx,cx
		add cx,cx
		push cx
		mov dx,offset buffer
		push dx
		mov ah,3fh
		int 21h
		
		mov ah,40h
		mov bx,new_handle
		pop dx
		pop cx
		int 21h
		
		call close
		ret
add_file:
		call etc_off
		
ETC_OFF	PROC NEAR

		pop bx

ETC_OFF	ENDP

		sub bx,offset etc_off
		
		mov di,100h
		mov si,offset oldf
		add si,bx
		cld 
		movsb
		movsw
		
		mov cx,ds:[bx+offset re_number]
		jcxz ea1
		
		mov di,offset oldf+3
		add di,bx
		mov ax,es
		add ax,10h
ea2:
		lds si,dword ptr es:[di]
		add di,4
		mov bp,ds
		add bp,ax
		mov ds,bp
		add ds:[si],ax
		loop ea2
ea1:
		push es
		pop ds
		add ds:[bx+offset cccs],ax
		add ax,ds:[bx+offset ssss]
		mov ss,ax
		
		mov sp,ds:[bx+offset sssp]
		
		xor ax,ax
		xor bx,bx
		xor si,si
		xor di,di
		xor bp,bp
		
		db 0eah
				
IIIP		DW ?
CCCS		DW ?

SSSS		DW ?
SSSP		DW ?
RE_NUMBER	DW ?

OLDF		DB 0,0,0
		
EXE_TO_COM	ENDP

PASS		PROC NEAR
		
		call open
		mov bx,old_handle
		mov ah,3fh
		mov cx,20h
		mov dx,offset etc_exehead
		int 21h
		
		cmp etc_exehead,4d5ah
		jnz pl1
		jmp p_exe
pl1:		
		cmp etc_exehead,5a4dh
		jnz p_com
		jmp p_exe
p_com:
		mov isexe,0
		mov ax,4202h
		mov bx,old_handle
		xor cx,cx
		xor dx,dx
		int 21h
		
		or dx,dx
		jz pl2
		
		call close
		mov dx,offset not_convert
		jmp quit
pl2:		
		mov etc_long,ax
		mov ax,4200h
		mov bx,old_handle
		xor cx,cx
		xor dx,dx
		int 21h
		
		mov cx,etc_long
		mov bx,old_handle
		mov ah,3fh
		mov dx,offset buffer
		int 21h
		
		call get_pass
		
		mov si,offset buffer
		push si
		mov di,offset old_f3
		movsb
		movsw
		
		mov ax,etc_long
		sub ax,3
		mov word ptr buffer+1,ax
		mov buffer,0e9h
		
		mov bx,offset buffer
		add bx,etc_long
		
		pop di
pl3:		
		cmp di,bx
		jnb pl5
		mov si,offset pass_of_file
		mov cx,4
pl4:
		mov ax,ds:[di]
		xor ax,ds:[si]
		add si,2
		stosw
		dec di
		loop pl4
		jmp short pl3
pl5:
		mov si,offset password
		mov di,offset buffer
		add di,etc_long
		mov cx,offset pass_of_file-offset password
		push cx
		cld
		rep movsb
		
		mov ax,etc_long
		sub ax,3
		mov word ptr buffer+1,ax
		mov buffer,0e9h
		
		mov ah,40h
		mov bx,new_handle
		pop cx
		add cx,etc_long
		mov dx,offset buffer
		int 21h
		
		call close
		
		ret
p_exe:
		mov isexe,1
		
		call get_pass
		
		mov si,offset pass_of_file
		lodsw
		mov bx,etc_sss
		xor bx,ax
		mov sss,bx
		mov bx,etc_ssp
		lodsw
		xor bx,ax
		mov ssp,bx
		mov bx,etc_iip
		lodsw
		xor bx,ax
		mov iip,bx
		mov bx,etc_ccs
		lodsw
		xor bx,ax
		mov ccs,bx
		mov etc_ssp,300h
		
		mov ax,4202h
		mov bx,old_handle
		xor cx,cx
		xor dx,dx
		int 21h
		
		mov cx,0010h
		div cx
		sub ax,etc_headlong
		mov etc_sss,ax
		mov etc_ccs,ax
		mov etc_iip,dx
		
		mov ah,40h
		mov dx,offset etc_exehead
		mov cx,20h
		mov bx,new_handle
		int 21h
		
		mov ax,4200h
		mov bx,old_handle
		xor cx,cx
		mov dx,20h
		int 21h
pl6:		
		mov ah,3fh
		mov bx,old_handle
		mov cx,0d000h
		mov dx,offset buffer
		int 21h
		cmp cx,ax
		jz pl7
		mov cx,ax
		mov do_end,1
pl7:
		mov ah,40h
		mov bx,new_handle
		mov dx,offset buffer
		int 21h
		cmp do_end,1
		jnz pl6
		
		mov ah,40h
		mov bx,new_handle
		mov cx,offset pass_of_file-offset password
		mov dx,offset password
		int 21h
		
		call close
		
		ret
password:
		push cs
		pop ds
		push dx
		push cx
		call know_pass
		
KNOW_PASS	PROC NEAR

		pop bx
		mov dx,bx
		sub dx,7
		
KNOW_PASS	ENDP

		sub bx,offset know_pass
		push dx
		mov dx,bx
		add dx,offset mass
		mov ah,9
		int 21h
		
		mov si,bx
		add si,offset pass_of_file
		push si
		xor dx,dx
		mov cx,8
p_1:
		mov ah,8
		int 21h
		mov ds:[si],al
		add dl,al
		inc si
		loop p_1
		
		pop si
		cmp dl,byte ptr ds:[bx+offset check_sum]
		jz p_11
		
		mov dx,offset dd_quit
		add dx,bx
		mov ah,9
		int 21h
		
		mov ax,4c00h
		int 21h
p_11:
		pop dx
		
		cmp byte ptr ds:[bx+offset isexe],1
		jz pass_exe
		
		mov di,100h
p_2:
		cmp di,dx
		jnb exec_com
		mov cx,4
		push si
p_3:
		mov ax,ds:[di]
		xor ax,ds:[si]
		add si,2
		stosw
		dec di
		loop p_3
		
		pop si
		jmp short p_2
exec_com:
		mov si,offset old_f3
		add si,bx
		mov di,100h
		cld
		movsb
		movsw
		
		pop cx
		pop dx
		mov ax,100h
		push ax
		xor ax,ax
		xor bx,bx
		xor si,si
		xor di,di
		sub cx,(offset pass_of_file-offset password)
		
		ret
pass_exe:
		lodsw
		xor ds:[bx+offset sss],ax
		lodsw
		xor ds:[bx+offset ssp],ax
		lodsw
		xor ds:[bx+offset iip],ax
		lodsw
		xor ds:[bx+offset ccs],ax
		mov ax,es
		add ax,10h
		mov ds,ax
		pop cx
		pop dx
		add ax,cs:[bx+offset sss]
		mov ss,ax
		mov ax,cs:[bx+offset ssp]
		mov sp,ax
		mov ax,ds
		add cs:[bx+offset ccs],ax
		push cs:[bx+offset ccs]
		push cs:[bx+offset iip]
		push es
		pop ds
		xor ax,ax
		xor bx,bx
		xor si,si
		sub cx,(offset pass_of_file-offset password)
		sbb dx,0
		
EXEC		PROC FAR

		ret
		
EXEC		ENDP

MASS		DB 0dh,0ah,9,'Please enter password:',0DH,0AH,'$'
DD_QUIT	DB 9,'Bad password !',0DH,0AH,'$'
ISEXE		DB 0

CCS		DW ?
IIP		DW ?
SSS		DW ?
SSP		DW ?

OLD_F3		DB 0,0,0

CHECK_SUM	DB 0,'Converted by LYB'

PASS_OF_FILE	DB 8 DUP (?)
		
PASS		ENDP

GET_PASS	PROC NEAR

		mov dx,offset in_pass
		mov ah,9
		int 21h
		
		mov di,offset pass_of_file
		xor dx,dx
		mov cx,8
gt1:
		mov ah,8
		int 21h
		add dl,al
		stosb
		loop gt1
		
		mov check_sum,dl
		ret
		
GET_PASS	ENDP

OPEN		PROC NEAR

		mov ah,3ch
		xor cx,cx
		mov dx,offset out_file
		int 21h
		
		jnb o1
		
		mov dx,offset d_cre_error
		jmp quit
		
o1:
		mov new_handle,ax
		mov ax,3d00h
		mov dx,offset in_file
		int 21h
		jnb o2
		
		mov dx,offset d_ope_error
		jmp quit
o2:
		mov old_handle,ax
		ret

OPEN		ENDP

CLOSE		PROC NEAR

		mov bx,new_handle
		mov ah,3eh
		int 21h
		
		mov bx,old_handle
		mov ah,3eh
		int 21h
		
		ret
		
CLOSE		ENDP

D_HELP		DB '         Convert Program by LYB',0DH,0AH,0AH
		DB ' Usage:CV command inputfile outputfile',0DH,0AH
		DB ' command:',0DH,0AH
		DB '    u: Convert UP letters to LOW letters.',0DH,0AH
		DB '    l: Convert LOW letters to UP letters.',0DH,0AH
		DB '    d: Cut SPACE before <cr/lf> in file.',0DH,0AH
		DB '    c: Convert .EXE file to .COM file.',0DH,0AH
		DB '    p: Add password on a executable file.',0DH,0AH
		DB '$'
		
D_COMMAND_ERROR:

		DB 0DH,0AH,9,'Command line error ,type CV to see help.',0dh,0ah,'$'

D_CRE_ERROR	DB 0dh,0ah,9,'Can not create output file.',0DH,0AH,'$'
D_OPE_ERROR	DB 0dh,0ah,9,'Can not find input file.',0DH,0AH,'$'

ETC_NOT_EXE	DB 0dh,0ah,9,'Miss .EXE file!',0DH,0AH,'$'
NOT_CONVERT	DB 0dh,0ah,9,'File can not be converted!',0DH,0AH,'$'

D_NO_COMMAND	DB 0dh,0ah,9,'I do not recognize command: '
COMMAND	DB 0,0DH,0AH,'$'

IN_PASS	DB 0dh,0ah,9,'What password do you want? [ 8 letters ]',0DH,0AH,'$'

NEW_HANDLE	DW 0
OLD_HANDLE	DW 0

C_TABLE	DB 'U'
		DW UP_TO_LOW
		
		DB 'L'
		DW LOW_TO_UP
		
		DB 'C'
		DW EXE_TO_COM
		
		DB 'D'
		DW CUT_CR
		
		DB 'P'
		DW PASS
		
IN_ADDRESS	DW ?
CR		DB 0
DO_END		DB 0

IN_FILE	DB 43 DUP (0)
OUT_FILE	DB 43 DUP (0)

ETC_EXEHEAD	DW 0,0,0
ETC_NUM	DW 0
ETC_HEADLONG	DW 0,0,0 
ETC_SSS	DW 0
ETC_SSP	DW 0,0
ETC_IIP	DW 0
ETC_CCS	DW 0
ETC_OFFSET	DW 0,0,0,0

ETC_LONG	DW 0

BUFFER		DB ?

CODE		ENDS

		END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -