お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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