13

x86でオーバーフローとキャリーフラグに頭を悩ませようとしています。

私が理解しているように、符号付き 2 の補数の加算では、フラグは 4 つの方法のいずれかでのみ生成できます (私の例は 4 ビットの数値です)。

  1. pos+pos = neg (オーバーフロー)
    • 0111 + 0001 = 1000 (7 + 1 = -8)
  2. pos+neg = pos (キャリー)
    • 0011 + 1110 = 0001 (3 + -2 = 1)
  3. neg+neg = neg (キャリー)
    • 1111 + 1111 = 1110 (-1 + -1 = -2)
  4. neg+neg = pos (オーバーフロー & キャリー)
    • 1000 + 1001 = 0001 (-8 + -7 = 1)

では、x86 アセンブリでは、A から B を減算すると、A と -B を加算した場合と同じフラグが生成されますか?

4

2 に答える 2

21

参考になりそうな表を載せておきます。これは、 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
于 2012-01-24T05:49:04.923 に答える
9

加算または減算では、キャリー値とオーバーフロー値の 4 つの組み合わせすべてが可能です。この回答でさらに例を見ることができます。

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

ただし、符号付きオーバーフロー フラグの値は、 と の両方A-Bで同じでなければなりませA+(-B)ん。これは、結果に正しい符号ビットがあるかどうかに依存し、どちらの場合も符号ビットが同じになるためです。

于 2012-01-23T03:18:35.383 に答える