2012-03-09 2 views

答えて

29

方向フラグは、文字列命令がポインタレジスタをオフセットする方向に影響を与えるために使用されます。これらは、操作を繰り返すために使用できる同じ指示です。 (lodsrepではあまり役に立ちませんが)。

ストリング命令は、次のとおりMOVS(MEMは、MEMにコピー)、STOS(店舗AL/AX/EAX/RAX)、SCAS(走査列)、CMPS(文字列比較)、及びLODS(負荷列)。メモリとIOポート間のコピーにはins/outsもあります。これらの各命令は、バイト、ワード、ワード、およびワードのオペランド・サイズで使用できます。

一言で言えば、方向フラグが0の場合、指示はすべての繰り返しの後に(ECXが0またはその他の条件になるまで、REP接頭辞のフレーバに応じて)データのポインタをインクリメントして機能します。ifフラグが1の場合、ポインタはデクリメントされます。例えば

movsdコピー(64ビットモードまたはRDI)[ds:esi]から[es:edi]にDWORD、この行います(インテル社のPDFファイルから抽出されたリンクされたISAリファレンスマニュアルエントリに「操作」の項を参照)

dword [es:edi] = dword [ds:esi]  // 4-byte copy memory to memory 
if (DF == 0) 
    esi += 4; 
    edi += 4; 
else // DF == 1 
    esi -= 4; 
    edi -= 4; 
fi 

REP接頭辞を使用すると、このECX回数が実行され、現代のx86 CPUは16バイトまたは32バイトの内部操作でコピー(またはstosが格納)される「ファースト・ストリング」マイクロコードを最適化しました。 this Q&A about memory bandwidth and the ERMSB featureも参照してください。 (repne/repe scasまたはcmpsではなく、rep stosrep movsのみが最適化されています)。

2

その後、STDCALL呼び出し規約どおりのWindows、使用している場合 - STDCALLの下

を、方向フラグは、エントリに明確であると は明確返さなければなりません。

DFを設定すると、API呼び出しの前にクリアする必要があります。

+0

オペレーティングシステムに依存します。 – amanuel2

+0

これは、i386 System Vやx86-64 System Vを含むほとんどの32ビット/ 64ビット呼び出し規約に共通しています。CLD命令を使用せずに 'rep movsd' /' rep stosd'を効率的にインライン化することができます。 (現代のx86では、DF = 0の場合、多くの場合、上向きにしか高速化しません) –

6

CLD CLears方向フラグには、データが先に進みます。 STD Directionフラグに設定され、データが逆方向に移動します。

0

CLD:明確な方向フラグので、各文字列操作後に、その文字列のポインタ オートインクリメント

STD: STDは、Siおよび/またはDIを自動的にデクリメントされるように、1方向フラグを設定するために使用され文字列命令の1つが実行されたときに次の文字列要素をポイントします。方向フラグが設定されている場合、SI/DIはバイト文字列では1、ワード列では2減算されます。

この回答は役に立ちます。

関連する問題