x86 オーバーフロー フラグを 2 つのオペランドの関数として表現する簡潔な方法が必要です。両方のオペランドの符号が同じであるが、結果の符号が異なる場合、コアが OF を設定することを理解しています。
例えば、
SRC[31..0]、DEST[31..0] を追加
OF は、SRC と DEST のビットの「ワンライナー」ブール関数として合理的に表現できますか?
オーバーフローフラグは、符号ビットへのキャリーインを伴う符号ビットのキャリーアウトのXORであるため、次のように表すことができます。
((SRC[31..0] + DEST[31..0]) shr 32) xor ((SRC[30..0] + DEST[30..0]) shr 31)
これは、2 つの符号付き (2 の補数) 32 ビット整数の加算に対する符号付きオーバーフロー フラグ値を表す方法です。
OV = ((( SRC XOR DST ) XOR 80000000H) AND (( SRC + DST ) XOR SRC ) AND 80000000H) ≠ 0
SRCとDSTは、全体が 32 ビットの整数値です。
この式は、基本的に和と加数の符号を比較します。
完全な 32 ビット加算器を効果的に複製する必要があるため、オーバーフローを個々のビットだけで表現することはあまり実用的ではありません。そして、それはワンライニングの良い候補ではありません.
減算に同様の式が必要な場合は、それを導出するか、この回答Sbb()
の関数で行われているように加算の観点から減算を表現してみてください。難しくないはずです。
テストを使用してコードが機能することを確認することも良い考えです。オーバーフロー フラグを返す加算/減算用の小さなアセンブリ ルーチンを作成し、それを使用してワンライナーの正確性をテストすることもできます。