5

MASM32を使用しています。

このコードで:

mov eax,5
sub eax,10

CFステータスフラグが設定されます。しかし、私の鉛筆と紙を使用すると、実際にはMSBからのキャリーがないことがわかります。はい、私は少数からの減算から多数のセットCFを知っています。しかし、私はなぜ知りたいですか?

このコードを使用しているため:

mov eax,5
mov ebx,10
not ebx
add ebx,1
add eax,ebx

CFフラグは設定されません。

4

2 に答える 2

5
5 - 10 = 5 + (-10) = 0x05 + (0xF5 + 1) = 0x05 + 0xF6 = 0xFB

  00000101 -- 0x05
  11110101 -- 0xF5
+ 00000001 -- 0x01
==========
  11111011 -- 0xFB

そして、これは16または32または64ビット0 + 1 + 0 = 1、キャリー0の間続きます

あなたはそれが実行されないという意味で正しいです。減算は、2番目のオペランドが反転され、キャリーインが反転された加算です。一部のプロセッサフ​​ァミリは、一部の実行を反転します。減算の実行を反転させる何かを見ているように聞こえます。

したがって、5〜10で実行(借用)が行われ、同じプロセッサで10〜5を試してみると、キャリービットが設定されている(借用がない)ことはありません。

2番目の例は加算操作です。私が知っているプロセッサでは実行が反転されず、借用を示す正論理であるキャリービットがさらにサポートされます。

于 2012-09-02T17:06:38.923 に答える
1

最初のケースでは、小さい数値から大きい数値を減算したため、キャリーフラグが設定されています。2番目のケースでは、eaxが8ビットレジスタであると仮定します。

    eax=00000101=05
    ebx=00010000=10
not ebx=11101111
         +     1
---------------------
        11110000
         +  0101
 ---------------------
        11110101

オーバーフローは発生しません。つまり、キャリーフラグは設定されません。

于 2012-09-02T17:09:30.947 に答える