オーバーフローフラグを設定/クリアするための簡単なコード(またはアルゴリズム)を書きたいと思います。 OFを設定するには、符号付きの値を使用できることがわかります。しかし、どうすればそれをクリアすることができますか?x86アセンブリでオーバーフローフラグを設定またはクリアするにはどうすればよいですか?
答えて
多くの解決策があります。
たとえば、test al, al
は、レジスタの内容に影響を与えずにOF
フラグをクリアします。
それとも、あなたは他のフラグに影響を与えたくない場合は、あなただけの直接*FLAGS
レジスタを変更することができます。
pushfd ; Push EFLAGS onto the stack
and dword [esp], ~0x800 ; Clear bit 11 (OF)
popfd ; Pop the modified result back into EFLAGS
編集:Peter Cordesごとtest al, al
にor al, al
を変更し「勧告例えば、32ビットで、これは次のようになります。 (効果は同じですが、後者はパフォーマンス上の理由により優れています)
'test al、al'は、レジスタの内容に応じてフラグを設定するより良いイディオムです。フラグだけを書くので、 'al'を含む依存関係の長さは増えません。しかし、 'pushf' /' popf'メソッドの場合+1です。 ( 'sahf' /' lahf'は 'OF'を含まないので)。 –
'または'と 'test'に関する良い点。それに応じて私の答えを更新しました。ありがとう! – user1354557
オーバーフローを起こさない操作を実行しますか?例えば'mov ax、1; –