2012-01-23 8 views
8

私はオーバーフローを回避するために、&のキャリーフラグをx86に入れようとしています。x86のキャリー/オーバーフローと減算

私はそれを理解するように、符号付き2の補数の加算のために、フラグが唯一の4つの方法(私の例は、4ビットの数である)のいずれかで生成することができる。

  1. POS + POS = NEG(オーバーフロー)= 1000
    • 0111 + 0001(7 + 1 = -8)
  2. POS = 0001 + NEG = POS(キャリー)
    • 0011 + 1110(3 + -2 = 1)
  3. NEG + NEG = NEG(キャリー)= 1110
    • 1111 + 1111(-1 + -1 = -2)
  4. NEG + NEG = POS(オーバーフロー&キャリー) x86アセンブリ中のSO
    • 1000年+ 1001 = 0001(-8 + -7 = 1)

、D AからBを取り除くと、Aと-Bを加えたのと同じフラグが生成されますか?

+0

は(http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt)。符号なし対署名付きのオーバーフロー条件/フラグ対理解キャリー]をも参照し、他のリンクで[x86タグwiki](https://stackoverflow.com/tags/x86/info)。 –

答えて

16

ここに参考になる参考表があります。これは、の例を示しています。 x86のADD命令とSUB命令から得られる4つの算術フラグの組み合わせです。 'h' 'ud'と 'd'は、各値の16進数、符号なし10進数、符号付き10進数を表します。たとえば、SUBの最初の行には、フラグが設定されていない0xFF - 0xFE = 0x1と表示されます。

しかし、私は短い話はアレックスの答えが正しいことだと思います。

ADD 
     A     B     A + B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d | OF | SF | ZF | CF 
---+------+-------+----+------+-------+----+------+-------+----+----+----+--- 
7F | 127 | 127 | 0 | 0 | 0 | 7F | 127 | 127 | 0 | 0 | 0 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 7E | 126 | 126 | 0 | 0 | 0 | 1 
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 
FF | 255 | -1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 
FF | 255 | -1 | 0 | 0 | 0 | FF | 255 | -1 | 0 | 1 | 0 | 0 
FF | 255 | -1 | FF | 255 | -1 | FE | 254 | -2 | 0 | 1 | 0 | 1 
FF | 255 | -1 | 80 | 128 | -128 | 7F | 127 | 127 | 1 | 0 | 0 | 1 
80 | 128 | -128 | 80 | 128 | -128 | 0 | 0 | 0 | 1 | 0 | 1 | 1 
7F | 127 | 127 | 7F | 127 | 127 | FE | 254 | -2 | 1 | 1 | 0 | 0 


SUB 
     A     B     A - B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d || OF | SF | ZF | CF 
----+------+-------+----+------+-------+----+------+-------++----+----+----+---- 
FF | 255 | -1 | FE | 254 | -2 | 1 | 1 | 1 || 0 | 0 | 0 | 0 
7E | 126 | 126 | FF | 255 | -1 | 7F | 127 | 127 || 0 | 0 | 0 | 1 
FF | 255 | -1 | FF | 255 | -1 | 0 | 0 | 0 || 0 | 0 | 1 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 80 | 128 | -128 || 0 | 1 | 0 | 0 
FE | 254 | -2 | FF | 255 | -1 | FF | 255 | -1 || 0 | 1 | 0 | 1 
FE | 254 | -2 | 7F | 127 | 127 | 7F | 127 | 127 || 1 | 0 | 0 | 0 
7F | 127 | 127 | FF | 255 | -1 | 80 | 128 | -128 || 1 | 1 | 0 | 1 
+0

あなたのテーブルは参考になりますが、127 - -1は128でなく-128です。 –

+2

@James - いいえ、x86プログラマのリファレンス「整数値の範囲はバイト整数の場合、-128から+127の範囲」 – srking

+0

OK、正しいですが、とにかくテーブルは素晴らしいです。 :) –

6

加算または減算すると、キャリー値とオーバーフロー値の4つの組み合わせがすべて可能です。 this answerにもっと多くの例があります。

This answerあなたはA-Bから取得キャリーは、あなたがA+(-B)から取得キャリーの逆数であるという事実の証拠が含まれています。最初のリンクのコードはこのプロパティを利用してADCSBBに変換します。

ただし、符号付きオーバーフローフラグの値は、結果に正しい符号ビットが含まれているかどうかによって異なり、両方の場合で符号ビットが同じになるため、A-BA+(-B)の両方で同じでなければなりません。