日韩精品中文字幕一区二区-日韩精品中文字幕一区-日韩精品中文字幕视频-日韩精品在线一区二区三区-第一页在线-第一福利视频

軟件首頁 |  文章首頁
最新更新 軟件分類 設為首頁 加入收藏 聯系我們
當前位置:首頁文章首頁 IT學院 Delphi

DELPHI7的通配符比較的匯編函數

作者:東坡下載  來源:uzzf  發布時間:2010-10-14 9:42:35  點擊:

      DELPHI7中的POS()函數是不能用通配符的,但是有匯編代碼公開的,于是我想能否把此匯編函數改編成可能用通配符,有此想法已有多年了,最近我重新研究這個問題,發現是可行了,并做了出來,由于時間倉促,錯誤在所難免,希望能發現此匯編函數有BUG者能反饋給我知,我就多謝大家了。下面是我修改DELPHI7中的POS()而成的POSLI()的匯編源碼,我試過可以通配符的,未知有無什么BUG,希望有人通知我BUG在何處。
     此匯編函數支持?號只匹配一個中文。只支持?號和*號,不支持[]號。例如:子串為"Edit*1*2*3?4*5",源串為"Edit111www222123國45qEdit222www333qq"時將返回最后一個*號之后第一個字符的匹配處INDEX。
如果子串沒有*號,返回子串第一個字符的匹配INDEX,如果子串有*號,返回最后一個最接近*號的字符的匹配INDEX值。總之,返回值大于0就表示匹配成功了。
此函數支持中文查找,如子串為"謝",源串為"中華",返回0,雖然中之后半字節和華之前半字節合成謝字,但我這匯編函數已做了處理了。
此匯編函數參數為PCHAR,可以傳多于255個字符的字串作參數也!
function Posli( substr :pchar ; s : pchar ) : Integer;
var
dlen,sublen,esi0,edi0,starnum,starnum2,ifbacknum:integer;
asm
{ ->EAX Pointer to substr }
{ EDX Pointer to string }
{ <-EAX Position of substr in s or 0 }

PUSH EBX
PUSH ESI
PUSH EDI
MOV ESI,EAX { Point ESI to substr }
MOV EDI,EAX
MOV starnum,0
MOV starnum2,0
MOV dlen,0
MOV sublen,0
XOR ECX,ECX
MOV CL,[EDI]
INC EDI
////////////////////////
XOR ECX,ECX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
NOT ECX
MOV sublen,ECX
//SUB sublen,2
/////////////////////////
MOV EDI,ESI
MOV AL,'*'
@@start0:
REPNE SCASB
JNE @@start
ADD starnum,1
JMP @@start0
//////////////////////////////

@@start:
///////////////////////////////
MOV EDI,EDX
INC EDI
XOR ECX,ECX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
NOT ECX
MOV dlen,ECX
//SUB dlen,1
/////////////////////////////////////////
MOV EDI,EDX { Point EDI to s }
MOV esi0,ESI
MOV edi0,EDI
XOR ECX,ECX { ECX = Length(s) }
MOV CL,[EDI]

MOV ECX, dlen
PUSH EDI { remember s position to calculate index }
//INC EDI { Point EDI to first char of s }
XOR EDX,EDX { EDX = Length(substr) }
MOV DL,[ESI]
//INC ESI { Point ESI to first char of substr }
MOV EDX, sublen
CMP EDX,0 { EDX = Length(substr) - 1 }
JS @@fail { < 0 ? return 0 }
MOV AL,[ESI] { AL = first char of substr }
//INC ESI { Point ESI to 2'nd char of substr }

DEC EDX
SUB ECX,EDX { #positions in s to look at }
{ = Length(s) - Length(substr) + 1 }

ADD ECX,starnum
JLE @@fail
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }
MOV ECX,sublen
ADD EDI,1
JMP @@star

@@loop:
REPNE SCASB
JNE @@fail
MOV EBX,ECX { save outer loop counter }
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }

MOV ECX,EDX
@@loopwww:
// MOV AL,[ESI]
// MOV AL,[ESI-1]
//MOV AL,[ESI-2]
REPE CMPSB
//PUSH ESI

JE @@found
//INC EDI
///////////////
//MOV AL,[ESI]
//MOV AL,[ESI-1]
//MOV AL,[EDI-1]
//CMP AL,[ESI-1]
//JE @@found
CMP ECX,0
JE @@iffound1
{MOV AL,[ESI]
CMP AL,$12
JE @@found
CMP AL,$0
JE @@found
CMP AL,$FF
JE @@found}
/////////////////

@@iffound2:
//PUSH EAX
MOV AL,[ESI]
SUB ESI,1
MOV AL,[ESI]
INC ESI
//INC ESI
CMP AL,'?'

//POP ESI

JE @@what
CMP AL,'*'
JE @@star
//MOV AL,[ESI]
//CMP AL,$12
//JE @@fail2
//CMP AL,$0
//JE @@fail2
//POP EAX
MOV AL,[EDI]
CMP AL,$12
JE @@fail2
CMP AL,$0
JE @@fail2
////////////////有可能源串短于子串也,因?號匹配中文也
POP EDI { restore outer loop s pointer }
POP ESI { restore outer loop substr pointer }
MOV ECX,EBX { restore outer loop counter }
JMP @@loopOK
@@what:
MOV EAX,0
MOV EAX,EDI
SUB EAX,dlen
CMP EAX,edi0
JGE @@fail2
///////如果源串已結束則必NO //BUG
MOV AL,[ESI]
CMP AL,$12 //此當結束
//POP EAX
JE @@found
CMP AL,$0
JE @@found
//push eax
//MOV AL,[ESI]
//CMP AL,$0 //此也當結束,為經驗,不知何解
//POP EAX
CMP ECX,0
JE @@found
/////////////////////
MOV AL,[EDI]
CMP AL,$80
JNB @@chinese
@@whatchinese:
MOV AL,[ESI]
////////////////////////
JMP @@loopwww
@@chinese:
ADD EDI,1
JMP @@whatchinese
@@star:
ADD starnum2,1
SUB EDI,1
MOV AL,[ESI]
CMP AL,$12
//POP EAX
JE @@found
CMP AL,$0
JE @@found
// POP EAX
// POP EAX
/////////
//XOR ECX,ECX
// MOV CL,[EDI]
// INC EDI { Point EDI to first char of s }

// PUSH EDI { remember s position to calculate index }

// XOR EDX,EDX { EDX = Length(substr) }
// MOV DL,[ESI]
// INC ESI { Point ESI to first char of substr }

// DEC EDX { EDX = Length(substr) - 1 }
// JS @@fail { < 0 ? return 0 }
// XOR EAX,EAX
//////////////////////////
////////////////////
//PUSH EAX
@@www:
CMP ECX,0
JE @@found
MOV EAX,0
MOV EAX,EDI
SUB EAX,dlen
CMP EAX,edi0
JG @@fail2
////////////////////
MOV AL,[ESI]
ADD ESI,1

上一篇: 下一篇: Delphi XE 產品技術發布會

文章評論

本類推薦文章

關于本站 | 網站幫助 | 廣告合作 | 下載聲明 | 友情連接 | 網站地圖
Copyright © 20098-2010 uzzf下載站. All Rights Reserved .
主站蜘蛛池模板: 欧美变态sososo另类| https://www.douyin.com| 2024韩国三级电影| 小猪佩奇最新第十季| 余男狂怒| 浙江卫视直播入口| 真的爱你中文谐音歌词| 色戒》| 2016美国大选| 惊虹| 好好歌词| 一夜风流| 卢昱晓电视剧| 伦理<禁忌1| 黄视频免费观看网站| 叶子楣地下裁决| 山西影视频道| 基础设施建设产业市场| 黄子华最新电影| 琪琪色影院| 红灯停绿灯行电影观看| 少妇bbbbbbb| 爱丽丝梦游仙境电影| 黑龙江卫视节目| 血疑电视剧| 龙凤店| 宫心计1电视剧全集免费高清国语| 雀鬼| 非常外父| cctv16体育节目表今天目表| 《爱的温暖》电影在线观看| 鹌鹑图片| 曹东| 姑娘主动把生米煮成熟饭| 美女罐头| 神犬奇兵 电视剧| 大乔未久电影| 张柏芝惊艳照片| 什么是实现碳达峰碳中和目标的基础路径| 李美琪主演的电影| 1988年英国的白蛇传说|