|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"メモリをスキャンする関数"
C言語で言うところの mem シリーズがないのに気がついたので作りました。
Delphi には str シリーズに相当するものは存在しているため、これでペアがそ
ろいます。ネーミングは Str シリーズに準じています。使い方も、スキャンす
るメモリの長さを Len で指定する以外は Str シリーズと同じです。
なお、MemR シリーズは、メモリの末尾(Pointer + Len - 1)から逆方向にス
キャンする関数です。
{ Code に一致するバイトをさがす }
function MemScan(P: Pointer; Len:Integer; Code: Byte ): Pointer;
assembler;
asm // P:EAX Len:EDX Code:CL
PUSH EDI
MOV EDI,&P
MOV AL,&Code
MOV ECX,&Len
REPNE SCASB
MOV EAX,0
JNE @@1
MOV EAX,EDI
DEC EAX
@@1: POP EDI
end;
{ Code に一致するバイトをさがす(リバース)}
function MemRScan(P: Pointer; Len:Integer; Code: Byte ): Pointer;
assembler;
asm
PUSH EDI
MOV EDI,&P
ADD EDI,&Len
DEC EDI
MOV AL,&Code
MOV ECX,&Len
STD
REPNE SCASB
MOV EAX,0
JNE @@1
MOV EAX,EDI
INC EAX
@@1: CLD
POP EDI
end;
{ Code に一致しないバイトを探す }
function MemNScan(P: Pointer; Len:Integer; Code: Byte ): Pointer;
assembler;
asm
PUSH EDI
MOV EDI,&P
MOV AL,&Code
MOV ECX,&Len
REPE SCASB
MOV EAX,0
JE @@1
MOV EAX,EDI
DEC EAX
@@1: POP EDI
end;
{ Code に一致しないバイトを探す(リバース) }
function MemNRScan(P: Pointer; Len:Integer; Code: Byte ): Pointer;
assembler;
asm
PUSH EDI
MOV EDI,&P
ADD EDI,&Len
DEC EDI
MOV AL,&Code
MOV ECX,&Len
STD
REPE SCASB
MOV EAX,0
JE @@1
MOV EAX,EDI
INC EAX
@@1: CLD
POP EDI
end;
{ メモリを比較 }
function MemComp(P1: Pointer; P2: Pointer; Len:Integer): Integer;
assembler;
asm
PUSH ESI
PUSH EDI
MOV ESI,&P1
MOV EDI,&P2
MOV ECX,&Len
REPE CMPSB
MOV EAX,0
JE @@1
MOV EDX,0
MOV AL,BYTE PTR [ESI-1]
MOV DL,BYTE PTR [EDI-1]
SUB EAX,EDX
@@1: POP EDI
POP ESI
end;
注)ええと、最近の CPU ではオペコードのクロック数が分からないのでレジス
タのゼロクリアに XOR を使うとか、そういう技は使っていません。より高速化
する方法がありましたら、コメントをよろしく(笑)。
98/8/17(Mon) 00:53pm [AirCraft 97開発] PFF01344 DUDE
Original document by DUDE 氏 ID:(PFF01344)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|