2016-12-11 11 views
4

、私はしばしばこのように、その文字列操作命令が方向フラグ(DF)の状態に関係なく使用されている参照:デフォルト状態は分解で

or  ecx, 0FFFFFFFFh 
xor  eax, eax 
mov  edi, ebp 
repne scasb 
関数が始まるので、

CLDまたはSTD命令が見つかりません。DFフラグに影響する可能性のある命令もありません。
コンパイラは、プログラムの起動以来、このフラグの定義済みの状態を想定しています。ローダーが好きで、プログラムの実行中は変更されません。

+2

リセット時に、方向フラグがクリアされます。それを変更する前に 'DF'を保存し、後でそれを復元することは礼儀正しいと考えられます。 –

+3

呼び出し規約/ ABIは 'DF'の状態を指定しており、コンパイラはそれに依存しています。 – Jester

答えて

1

オペレーティングシステム用にコンパイルされたコードを含むコンパイラのランタイムでは、フラグが特定の状態になると予想されます。他のコードでもこの仮定を使用することができ、常にフラグをクリアする必要はありません。

MSDN on Direction Flag

2

これは、あなたが使用しているプラ​​ットフォームのABIで指定されています。

方向フラグが 方向入る前と関数から出るときに(つまり、ゼロである)「フォワード」に設定する必要があります:System V Intel386 ABI(章レジスタとスタックフレームは)と述べています。

が同じ要件がAMD64 ABI (Dropbox link, since x86-64.org is down)(セクション3.2.1 レジスタとスタックフレーム)に保存されている:

%rFLAGSレジスタの方向フラ​​グDFは透明でなければならない( に設定"forward" direction)を関数の入力と戻りに使用します。

したがって、はい、ユーザーランドコードは、DFがゼロに設定されていると見なすことができます。

関連する問題