11

私はしばらくの間アセンブリで遊んでいて、いくつかのコードを見てきました。ここで、ALは最初に0x84に設定され、次にcmp AL、0x30が使用されます。次に、この命令はオーバーフローフラグをトリガーします。

私が読んだものから、CMPは最初の数値から2番目の数値を減算し、フラグを設定することになっています。その場合、0x84-0x30である必要があり、結果は0x54であり、オーバーフローはありません。

4

1 に答える 1

20

これらの値を符号なしの数値として解釈する場合、オーバーフローは発生しません。符号付きとして解釈する場合、0x84オーバーフローは確実に発生します。

  1. 符号付き8ビット値として解釈される0x84は-124です
  2. 符号付き8ビット値として解釈される0x30は48です
  3. -124-48 = -172

-172は符号付き8ビット値(-128〜 + 127)の範囲外であるため、OFフラグが設定されます。CF符号なしオーバーフローを示すもの を確認する必要があります。

Intel 64およびIA-32アーキテクチャソフトウェア開発者マニュアル、第2巻、CMPから:

比較は、第1オペランドから第2オペランドを減算し、SUB命令と同じ方法でステータスフラグを設定することによって実行されます。

およびSUBの場合:

SUB命令は整数減算を実行します。符号付き整数オペランドと符号なし整数オペランドの両方の結果を評価し、OFフラグとCFフラグを設定して、それぞれ符号付きまたは符号なしの結果のオーバーフローを示します。SFフラグは、署名された結果の符号を示します。

于 2011-08-31T18:28:23.967 に答える