📄 testfind.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 + -