【分享】Delphi的內部字串處理函式/過程不完全列表

看雪資料發表於2015-11-15

  在破解用Delphi寫的軟體時,經常會碰到一些諸如System.@LStrCmp、System.@LStrAddRef之類的函式。實際上它們都是Delphi內部用來處理字串的過程/函式。這些函式在System裡都可以找到。但是它們的引數和返回值有點特別。於是抽空看了一下system.pas。

  首先,這些函式名都有一定的格式:

_xStryyy

  其中x可以是字元P、L、W。P代表該函式是處理傳統Pascal字串的,L代表該函式是處理長字串的,W當然就是Unicode了。yyy就是表示函式的實際作用了。比如_PStrCat就是表示傳統Pascal字串的連線函式。大家可以查閱system.pas來驗證一下。不過一般不大見到W開頭的函式。

  下面是經過整理的結果,算是為大家提供一個方便。說明一下,列表不全,但沒列出來的函式完全可以見名知意。當然,前提是你看完列表。

  另外,需要注意的是,對於在堆疊裡的返回值,一般以EBP引用。如果你看到函式呼叫後下一條語句是MOV xxx,[EBP+yy],那通常就是儲存返回值了。特別是_LStrCopy。

名稱

引數

返回值

作用

等價形式 / 備註

_PStrCat

EAX :目標字串

EDX :源字串

EAX

連線兩個 Pascal 字串

s:=copy(s+s1,1,255)

_PStrNCat

EAX :目標字串

EDX :源字串

CL :結果字串最大長度

EAX

連線兩個 Pascal 字串

s:=copy(s+s1,1,n)

_PStrCpy

EAX :目標字串

EDX :源字串

EAX

Pascal 字串複製

s:=s1

_PStrNCpy

EAX :目標字串

EDX :源字串

CL :結果字串最大長度

EAX

Pascal 字串複製

s:=copy(s1,1,n)

_PStrCmp

EAX :左字串

EDX :右字串

標誌位 Z

Pascal 字串比較

if s=s1

_AStrCmp

EAX :左字串

EDX :右字串

ECX :要比較的字元個數

標誌位 Z

Ansi 字串比較

if s=s1

procedure _LStrClr(var S: AnsiString);

EAX :字串

 

清空字串

s:=''

Procedure _LStrArrayClr(var str: AnsiString; cnt: longint);

EAX :字串陣列指標

EDX :陣列長度

 

清空字串陣列

 

procedure _LstrAsg(var dest: AnsiString; source: AnsiString)

EAX :目標字串

EDX :源字串

 

複製 Ansi 字串

 

Procedure _LstrLAsg(var dest: AnsiString; source: AnsiString)

   

複製 Ansi 字串。但是和 _LstrAsg 的區別不詳

 

Procedure _NewAnsiString(length: Longint)

EAX :長度

EAX (指標)

分配指定長度的 AnsiString

 

procedure _LStrFromPCharLen(var Dest: AnsiString; Source: PAnsiChar; Length: Integer)

EAX :目標字串

EDX :源字串

ECX :要複製的長度

 

分配並從 PChar 複製指定長度的 AnsiString

 

procedure _LStrFromPWCharLen(var Dest: AnsiString; Source: PWideChar; Length: Integer)

EAX :目標字串

EDX :源字串

ECX :要複製的長度

 

分配並從 PWideChar 複製指定長度的 AnsiString

 

procedure _LStrFromChar(var Dest: AnsiString; Source: AnsiChar)

EAX :目標字串

EDX :源字串

 

單字元的分配和複製

 

procedure _LStrFromWChar(var Dest: AnsiString; Source: WideChar)

EAX :目標字串

EDX :源字串

 

單字元的分配和複製

 

procedure _LStrFromPChar(var Dest: AnsiString; Source: PAnsiChar)

   

Pchar 到 AnsiStr 的轉換

 

procedure _LStrFromPWChar(var Dest: AnsiString; Source: PWideChar)

   

PWideChar 到 AnsiStr 的轉換

 

procedure _LStrToString(var Dest: ShortString; const Source: AnsiString; MaxLen: Integer)

EAX :目標字串

EDX :源字串

ECX :要複製的長度

 

AnsiString 到 Pascal 字串的轉換

 

Function _LstrLen(str: AnsiString): Longint

EAX :目標字串

EAX

AnsiStr 的長度

 

Procedure _LstrCat(var dest: AnsiString; source: AnsiString)

EAX :目標字串

EDX :源字串

 

Ansi 字串的連線

dest+=source

Procedure _LStrCat3(var dest:AnsiString; source1: AnsiString; source2: AnsiString)

EAX :目標字串

EDX :源字串 1

ECX :源字串 2

 

Ansi 字串的連線

dest+=source

Procedure _LstrCatN(var dest:AnsiString; argCnt: Integer; ...)

EAX :目標字串

EDX :源字串的個數 +2

[ESP+4*i] :第 i 個源字串的指標

 

Ansi 字串的連線

這裡的入口引數比較特別

_LStrCmp

EAX :左字串

EDX :右字串

標誌位 Z

Ansi 字串比較

if s=s1

_LStrAddRef

EAX :目標字串

 

增加 Ansi 字串的引用計數

這個可以不用管

_LStrToPChar

EAX

EAX

型別轉換

 

Procedure _LstrCopy(const s : AnsiString; index, count : Integer): AnsiString

EAX :目標字串

EDX :起始位置

ECX :要複製的長度

[ESP+4]

複製指定長度的 Ansi 子串

 

_LStrDelete

EAX :目標字串

EDX :起始位置

ECX :要刪除的長度

 

同 Delete

 

Procedure _LstrInsert(const source : AnsiString; var s : AnsiString; index : Integer)

EAX :要插入的字串

EDX :目標字串

ECX :要插入的位置

 

將 source 插入到 s 的 index 位置

結果是 s 加長

_LStrPos

EAX :子串

EDX :目標字串

EAX

同 POS

 

_LStrSetLength

EAX :目標字串

EDX :新長度

     

相關文章