21

私は次のコードを持っています:

mov al, -5
add al, 132
add al, 1

調べてみると、1回目はオーバーフローフラグとキャリーフラグがセットされ、2回目はオーバーフローのみがセットされます。

しかし、理由がわかりません:

  1. 符号なし数では、結果は 143 (8FH) となり、8 ビットの符号なし数 (255 より小さい) に適合します => キャリー フラグを設定しないでください。符号付き数では、結果は 127 です。8 ビットの符号付きに適合し、オーバーフローは設定されません。

どうしたの?ありがとう。

4

2 に答える 2

31

オーバーフローは、2 つの正の数を加算した結果が負の場合、または 2 つの負の数を加算した結果が正の場合に発生します。例えば: +127+1=?

+127=0111 1111
  +1=0000 0001
     ---------
     1000 0000 

2 つのオペランドの符号ビットと結果の符号ビットを見ると、オーバーフローが発生し、答えが正しくないことがわかります。

于 2012-11-16T21:31:56.657 に答える
19

符号なし算術演算では、251 + 132 を加算0xFBしたため0x84、実際には 8 ビットより大きいため、キャリー フラグが設定されます。

2 番目のケースでは、+127 を 1 に加算していますが、これは実際に符号付き 8 ビット範囲を超えているため、オーバーフロー フラグが設定されています。

于 2011-12-13T21:16:23.097 に答える