1

AX=8FFEおよびBX=0FFFと仮定し
ます。

Cmp ax,bx 

この時点で、ソース(bx)が宛先(ax)から差し引かれ、適切なフラグが更新されます。コンピューターは各数値を2の補数形式で表すため、8FFEはある数値の2の補数であり、同様に0FFFはある数値の2の補数です。

2の補数のように、減算は加算によって実装されるため、これら2つの数値を2進数に変換して加算します。

 8FFE---------->    1000    1111    1111    1110
0FFF---------->    0000    1111    1111    1111
                   --------------------------------
                   1001    1111    1111    1101 

これが16進数で9FFDの結果です。

ご覧のとおり、オーバーフローは発生しておらず、符号ビットは結果の1です。

質問:サインフラグを設定し、オーバーフローフラグを0のままにするというこの想像力で
、デバッガーでこれをチェックアウトしましたが、反対に
、サインフラグは0のままで、オーバーフローフラグは1であることがわかりました。なぜ
それが起こるのですか?

4

1 に答える 1

2

引き算を間違えたと思います。私の結果は次のとおりです。

8FFE---------->    1000    1111    1111    1110
0FFF---------->    0000    1111    1111    1111
                   ----------------------------------
7FFF---------->    0111    1111    1111    1111     

何が起こったのかというと、その操作は符号ビットからのみ借用されたものです。これは、OFフラグを設定する必要があることを意味します。アセンブリCF(キャリー)およびOF(オーバーフロー)フラグについては、 http: //en.wikipedia.org/wiki/Carry_flag、http ://en.wikipedia.org/wiki/Overflow_flagを参照してください。これは、署名された操作であるということは正しくないことを意味します。署名されていない場合は問題ありません。

于 2010-05-24T11:53:47.440 に答える