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

📄 express.inc

📁 一个使用asm实现的压缩算法 一个使用asm实现的压缩算法
💻 INC
字号:
;=======================================================================================
;!			条件取反,取反条件必须使用表达式包含,如!(\.),不是制表符或空格,!(.)*表示跳过所有空格与制表符(如果有)
;?			一个任意字符
;.			一个空格或制表符
;,			一个字词分隔符(包含.)
;%			一个单词字符,字符是否是一个单词以字符表来定义
;*<>|[]	0或更多,如果有结束条件,是直到[结束条件],如:?*<=>,直到碰到=号
;+<>|[]	1或更多,如果有结束条件,是直到[结束条件],如:?+<=>,直到碰到=号
			;<>与[]的区别在于,<>是表示如果匹配结束是<结束条件>起的使用,结束条件也是匹配目标,如:
			;在"abcd"中查找"abc*<d>",匹配目标为abcd,如果使用abc*[d],则匹配目标为abc
			;*号为可忽略符号,带条件的*表达式可理解为如果没有则忽略继续,如果有则跳到匹配之后继续.
;#			转义符,后面跟十六进制数,如#0D表达回车符号,#09表示制表符
			;#?表示中文字符,众所周知的原因,向后查找中文字符时请在表达式中加上行首的条件,否则将会有错误
;			如向后查找^.*#?+,查找行首开始的第一个中文词组,如果中文词组前有空格制表符跳过,向下查找时没有限制
;\			字符,中间的字符是实际符号 如.表示空格制表符\.表示一个"."
;[-]		在范围内 [a-b],或者清单,[abcdef],其中不能使用表达式,除'-'与'\'字符所有均看做正常字符
;" "		不管是否区分大小写,""内包含的必须完全一样
;(...)	表达式,可嵌套,嵌套层次数无限制
;{}		标记并返回{}所包含的区域,可用在任何表达式内.
;|			或者,支持任意表达式成员组合,如:(.)|(a)|((.*<%>)|(%+))
;^			行首
;$			行尾
;所有符号除特别说明均可随意组合.所有符号均支持*与+.均可设置条件.
;(*/+)-<>/[]与|的组合能实现很复杂的多条件复合查找.只要是文本,就可以按自己的意思进行查找.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EF_DEC						=   1h		;向上查找,默认向下
EF_USEEXPRESS				=   2h		;使用表达式
EF_WORDCASE					=   4h		;区分大小写
EF_MATCHWORD				=   8h		;匹配整个单词,包含EF_USEEXPRESS时此标志无效
EF_BEGINNOTLINEBEGIN		=  10h		;开始地址不是行首
EF_ENDNOTLINEEND			=  20h		;结束地址不是行尾
EF_ENDISSIZE				=  40h		;结束地址是一个长度(对EF_DEC无效)
EF_FINDONCE					=  80h		;只查找一遍,只对EF_USEEXPRESS有效并且对EF_DEC无效)
EF_MODIFLINESTARTEND		= 100h		;修正行首与行尾
EF_DOUBLEISWORD			= 200h		;中文字符也是单词
EF_RANGENOTCASE			= 400h		;符号[]内的字符总是不大小写
DATARANGE	struct
	lpStart	dd ?
	lpEnd		dd ?
DATARANGE	ends
									;字符表,开始地址,结束地址,表达式地址,返回信息数组地址,数组大小,查找标志EF_*
ExpressSearch				PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
                        ;成功返回非零值,找不到返回0,错误返回负数,看EFERR_*
;字符表:                可以为0,使用默认字符表,关于字符表,在Express.lib中,这个变量已声明为Public,在你的代码中
;                       使用:EXTERN DefCharTable:DWORD,即可引用,可直接修改和使用.也可复制一份,稍做修改为一个不同的字符表
;开始地址:              查找的地址
;结束地址:              结束地址
;                       注意,如果查找标志包含EF_DEC,则开始地址与结束地址要交换
;表达式地址:            表达式字符地址,必须以0结束
;返回信息数组地址:      不能为0,必须提供一个指向DATARANGE的结构数组地址,用于返回{}的地址信息
;数组大小:              lpDATARANGE的大小,是结构数据元素大小,如:lpdr[100]:DATARANGE,那大小为100
;查找标志:              看EF_*

;脚本折分表达式例子:
;lpExpStr	db '^.*{%+}(.+((\"+<{?+[\"]}\">)|({?+[.|($)]})))*[.*$]',0
;lpRetList	DATARANGE 100 dup(<?>)
;iCount		dd ?
;... ...
;mov iCount,100
;invoke ExpressSearch,0,hMem,lpEndMem,lpExpStr,addr lpRetList,addr iCount,EF_USEEXPRESS
;("+<{?+["]}">)的意思是如果有引号,把引号开始到另一个引号之间的内容做为匹配条件
;如:dir "c:\pro file\1.asm" 4.asm /a /c,表达式查找此行后:
;修改iCount为5
;参数 lpRetList[sizeof DATARANGE*0].lpStart指向匹配字符串的开头
;参数 lpRetList[sizeof DATARANGE*0].lpEnd指向匹配字符串的结束
;-----------------------------------
;参数 lpRetList[sizeof DATARANGE*1].lpStart指向:dir
;参数 lpRetList[sizeof DATARANGE*1].lpEnd指向: "c:\pro.... (注意空格)
;参数 lpRetList[sizeof DATARANGE*2].lpStart指向:c:\pro file\1.asm
;参数 lpRetList[sizeof DATARANGE*2].lpEnd指向: 4.as... (注意空格,以下同)
;参数 lpRetList[sizeof DATARANGE*3].lpStart指向:4.asm
;参数 lpRetList[sizeof DATARANGE*3].lpEnd指向: /a
;参数 lpRetList[sizeof DATARANGE*4].lpStart指向:/a
;参数 lpRetList[sizeof DATARANGE*4].lpEnd指向: /c
;参数 lpRetList[sizeof DATARANGE*5].lpStart指向:/c
;参数 lpRetList[sizeof DATARANGE*5].lpEnd指向:结束
;即第一个DATARANGE数组的成员总是为当前匹配的匹配,其它的为{}返回的地址区域,注意全部都是地址,需要得到第3个返回的内容:
;mov eax,lpRetList[sizeof DATARANGE*3].lpEnd
;sub eax,lpRetList[sizeof DATARANGE*3].lpStart
;invoke lstrcpyn,addr buffer,lpRetList[sizeof DATARANGE*3].lpStart,eax
;-------------------------------------------
;表达式查找时有可能发生的错误:
EFERR_NOTCONST				equ -1		;没有常数定义
EFERR_EXPNOTSUPPORT		equ -2		;不能这样使用符号
EFERR_NOTCLOSEBRACKET	equ -3		;没有关闭括号
EFERR_EMPTYEXPRESS		equ -4 		;空的表达式,()/[]/{}/<>
EFERR_NOTEXISTEXP			equ -5		;多余的表达式结束符,请使用\],\),\>等等
EFERR_NOTBYONSELF			equ -6		;表达式符号不能单独使用
EFERR_NOTLOOPEND			equ -7		;对于?*/?+必须设置结束条件,同时,*/+对于?来说是一样的
EFERR_DEADLOOP				equ -8		;在使用*/+的表达式里面的整个表达式均是可忽略的,如(.*)+,因为.*总是成功,后面
												;的+要求成功时继续,这是一个死循环.
EFERR_INVALIDEXP			equ -9		;无效表达式,如%*,因为*是可忽略符号,则上述表达式总是成功.
;发生错误后,错误表达式位置返回在 lpRetList[sizeof DATARANGE*1].lpStart 和 lpRetList[sizeof DATARANGE*1].lpEnd 中
;ASCII字符对应标识表,用于快速识别一个字符,类别如下:
;-------------------------------------------------
CF_WORD			equ        1h		;单词
CF_NUMBER		equ        2h		;数字
CF_HEX			equ        4h		;十六进制
CF_BIN			equ        8h		;二进制
CF_UPCHAR		equ       10h		;大写字符
CF_LOWCHAR		equ       20h		;小写字符
CF_COMMENT		equ       40h		;注释字符
CF_COMMENTEND	equ       80h		;注释第二个字符
CF_TAB			equ      100h		;语法线对齐符
CF_SPACE			equ      200h		;空格
CF_ENTER			equ      400h		;回车
CF_WARP			equ      800h		;换行符
CF_MATCH			equ     1000h		;包含符,如双引号
CF_SELFMATCH	equ     2000h		;包含符,如单引号
CF_INVALID		equ 40000000h		;无效/无意义字符字符
CF_DOUBLEBYTE	equ 80000000h		;中文字符首
;默认的字符表定义如下:
;	DefCharTable	dd	CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID or CF_TAB or CF_SPACE		;制表符
;						dd CF_INVALID or CF_WARP					;换行符
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID or CF_ENTER					;回车符
;						dd CF_INVALID
;						dd CF_INVALID
;						dd	CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd CF_INVALID
;						dd	CF_SPACE	;空格
;						dd 0		;!
;						dd CF_MATCH		;"
;						dd 0		;#
;						dd CF_WORD		;$
;						dd 0		;%
;						dd 0		;&
;						dd CF_SELFMATCH		;'
;						dd 0		;(
;						dd 0		;)
;						dd 0		;*
;						dd 0		;+
;						dd 0		;,
;						dd 0		;-
;						dd 0		;.
;						dd 0		;/
;						;  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?
;						dd	CF_WORD or CF_NUMBER or CF_HEX or CF_BIN
;						dd CF_WORD or CF_NUMBER or CF_HEX or CF_BIN
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd CF_WORD or CF_NUMBER or CF_HEX
;						dd 0
;						dd 0
;						dd 0
;						dd 0
;						dd 0
;						dd 0
;						;  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
;						dd	CF_WORD
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR or CF_HEX
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						;  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _
;						dd	CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd CF_WORD or CF_UPCHAR
;						dd 0
;						dd 0
;						dd 0
;						dd 0
;						dd CF_WORD
;						;  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o
;						dd	0
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR or CF_HEX
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						;  p  q  r  s  t  u  v  w  x  y  z  {  |  }  ~
;						dd	CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd CF_WORD or CF_LOWCHAR
;						dd 0
;						dd 0
;						dd 0
;						dd 0
;						dd CF_INVALID
;						dd CF_INVALID
;						dd	127 dup(CF_INVALID or CF_DOUBLEBYTE)

⌨️ 快捷键说明

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