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

📄 testfind.asm

📁 一个使用asm实现的压缩算法 一个使用asm实现的压缩算法
💻 ASM
字号:
;----------------
;编译模式="DLG"
;----------------
.586
.Model Flat, StdCall
Option Casemap :None
;;-------------------------------------------------------
Include windows.inc
Include user32.inc
Include kernel32.inc
include express.inc
include comctl32.inc
includelib comctl32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
includelib express.lib
include macro.asm
;-------------------------------------------------------

;过程声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
;-------------------------------------------------------
.const
	;常数定义,只使用一次的ID无需定义为常数,这里仅做为例子
	DLG_MAIN equ 100
	EXTERN DefCharTable:DWORD			;直接声明LIB中的全局变量
.data  ;数据段

.data?
	hInstance dd ?
	ShowValue	dd ?
	memsize		dd ?
	hmem			dd ?
	hShowMem		dd ?
	CpuSpeed		dd ?
	dwTickCount	dd ?
	dwTSC			dd ?
					dd ?

;-------------------------------------------------------

.CODE
START:
	invoke GetModuleHandle,NULL
	mov hInstance,eax
	invoke InitCommonControls
	invoke DialogBoxParam,hInstance,DLG_MAIN,0,offset DlgProc,0
	invoke ExitProcess,0

;当参数类型为DWORD时,不需要进行类型声明,以下过程详细应该为:
;uses ebx esi edx,
;DlgProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
DlgProc proc uses esi edi ebx,hWnd,uMsg,wParam,lParam
local buffer[500]:BYTE,hfile,SelS,SelE,iTime,FindFlags
local buff[500]:BYTE,ErrorBuffer[500]:BYTE
local lpAddress[100]:DATARANGE,iCount,textsize
.if uMsg==WM_INITDIALOG
	invoke LoadIcon,hInstance,100
	invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
	invoke SetDlgItemText,hWnd,1001,CTXT("^.*{%+}(.+equ.+)|(.*=.*){?+[(;+<{?+[$]}>)|($)]}")
	;!(<\!)D
	invoke CreateFile,CTXT("readme.txt"),GENERIC_READ,0,0,OPEN_EXISTING,0,0
	.if eax!=-1
		mov hfile,eax
		invoke GetFileSize,hfile,0
		shl eax,1
		mov memsize,eax
		invoke LocalAlloc,LMEM_FIXED or LMEM_ZEROINIT,memsize
		mov hmem,eax
		invoke ReadFile,hfile,hmem,memsize,offset ShowValue,0
		invoke SetDlgItemText,hWnd,1000,hmem
		invoke CloseHandle,hfile
	.endif
	invoke	GetTickCount		;TSC 初始值
	mov	dwTickCount,eax
	rdtsc
	mov	dwTSC,eax
	mov	dwTSC+4,edx
	invoke	SetTimer,hWnd,1,100,NULL
.elseif	uMsg == WM_TIMER
	invoke	GetTickCount
	push	eax
	sub	eax,dwTickCount
	pop	dwTickCount
	push	eax
	rdtsc
	push	edx
	push	eax
	sub	eax,dwTSC
	sbb	edx,dwTSC+4
	pop	dwTSC
	pop	dwTSC+4

	mov	ecx,1000000
	div	ecx			;除以1Mhz=1000000hz
	.if	edx >= 500000		;四舍五入
		inc	eax
	.endif
	mov	ecx,1000
	mul	ecx			;1秒=1000毫秒
	pop	ecx			;pop出经过的毫秒数
	div	ecx
	mov	CpuSpeed,eax
	invoke	wsprintf,addr buffer,CTXT("CPU:, %d MHz"),CpuSpeed
	invoke	SendDlgItemMessage,hWnd,10,WM_SETTEXT,0,addr buffer
.elseif uMsg==WM_COMMAND
	mov eax,wParam
	and eax,0ffffh
	.if ax==1 || ax==2
		mov wParam,eax
		invoke SendDlgItemMessage,hWnd,1003,LB_RESETCONTENT,0,0
		mov iCount,50
		mov FindFlags,0
		invoke IsDlgButtonChecked,hWnd,1002
		.if eax == BST_CHECKED 
			or FindFlags,EF_WORDCASE
		.endif
		or FindFlags,EF_USEEXPRESS or EF_DOUBLEISWORD
		invoke GetDlgItemText,hWnd,1001,addr ErrorBuffer,sizeof ErrorBuffer
		invoke GetDlgItemText,hWnd,1000,hmem,memsize
		mov textsize,eax
		invoke SendDlgItemMessage,hWnd,1000,EM_GETSEL,addr SelS,addr SelE
		rdtsc
		mov iTime,eax
		.if wParam==1
			mov ecx,hmem
			mov edx,ecx
			add ecx,textsize
			and SelS,0ffffh
			and SelE,0ffffh
			mov eax,SelE
			.if SelS!=eax
				add edx,eax
				or FindFlags,EF_BEGINNOTLINEBEGIN
			.endif
			invoke ExpressSearch,offset DefCharTable,edx,ecx,addr ErrorBuffer,addr lpAddress,addr iCount,FindFlags
		.else
			mov ecx,hmem
			and SelS,0ffffh
			and SelE,0ffffh
			mov eax,SelS
			.if SelE!=eax
				add ecx,eax
				or FindFlags,EF_ENDNOTLINEEND
			.else
				add ecx,textsize
			.endif
			or FindFlags,EF_DEC
			invoke ExpressSearch,offset DefCharTable,ecx,hmem,addr ErrorBuffer,addr lpAddress,addr iCount,FindFlags
		.endif
		mov ShowValue,eax
		rdtsc
		xor edx,edx
		sub eax,iTime
		mov ecx,CpuSpeed
		div ecx
		invoke wsprintf,addr buffer,CTXT("- 耗时: %d 微秒"),eax
		invoke SetDlgItemText,hWnd,3,addr buffer
		mov eax,ShowValue
		.if SDWORD PTR ShowValue>0
			mov ecx,hmem
			sub lpAddress.lpStart,ecx 
			sub lpAddress.lpEnd,ecx
			invoke SendDlgItemMessage,hWnd,1000,EM_SETSEL,lpAddress.lpStart,lpAddress.lpEnd
			invoke SendDlgItemMessage,hWnd,1000,EM_SCROLLCARET,0,0
			.if iCount>1
				lea esi,lpAddress
				mov ebx,1
				@@:
				mov eax,[esi+ebx*8+4]
				sub eax,[esi+ebx*8]
				.if eax>sizeof buffer-10
					mov eax,sizeof buffer-10
				.endif
				inc eax
				invoke lstrcpyn,addr buffer,[esi+ebx*8],eax
				invoke wsprintf,addr buff,CTXT("返回缓冲%d: %s"),ebx,addr buffer
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,addr buff
				inc ebx
				cmp ebx,iCount
				jl @B
			.endif
		.else
			.if eax!=0
				pushad
					invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,addr ErrorBuffer
					lea esi,lpAddress
					mov eax,[esi+4]
					lea ebx,ErrorBuffer
					sub eax,ebx
					mov ShowValue,eax
					invoke RtlFillMemory,addr ErrorBuffer,eax,'-'
					mov eax,ShowValue
					mov WORD ptr [ebx+eax-1],'^'
					mov eax,[esi]
					sub eax,ebx
					mov BYTE ptr [ebx+eax],'^'
					invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,addr ErrorBuffer
				popad
			.endif
			.if eax==-1
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("语法错误: 没有常数,请使用两个十六进制字符的常数定义")
			.elseif eax==-2
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("语法错误: 范围只能小到大,如[z-a]是错误的")
			.elseif eax==-3
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("表达式错误: 没有关闭括号")
			.elseif eax==-4
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("表达式错误: 空的表达式")
			.elseif eax==-5
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("表达式错误: 不存在的表达式结束符")
			.elseif eax==-6
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("语法错误: 这个符号不能单独使用,请使用\号")
			.elseif eax==-7
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("语法错误: 对于?*或?+,必须有结束条件,如:?*<\.if> - 任意字符直到碰到'.if',同时对于?,+与*是相同的")
			.elseif eax==-8
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("在使用*/+的表达式里面的整个表达式均是可忽略的")
			.elseif eax==-9
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("不支持的操作,如果整个表达式是可忽略的它将无任何意义,*号是可忽略符号,")
			.else
				invoke SendDlgItemMessage,hWnd,1003,LB_ADDSTRING,0,CTXT("找不到更多的匹配字符串")
			.endif
		.endif
	.endif
.elseif uMsg==WM_CLOSE
	invoke KillTimer,hWnd,1
	invoke EndDialog,hWnd,FALSE
.else
	mov eax,FALSE
	ret
.endif
mov eax,TRUE
ret
DlgProc endp

END START

⌨️ 快捷键说明

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