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フラグは設定されません。
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番目の例は加算操作です。私が知っているプロセッサでは実行が反転されず、借用を示す正論理であるキャリービットがさらにサポートされます。
最初のケースでは、小さい数値から大きい数値を減算したため、キャリーフラグが設定されています。2番目のケースでは、eaxが8ビットレジスタであると仮定します。
eax=00000101=05
ebx=00010000=10
not ebx=11101111
+ 1
---------------------
11110000
+ 0101
---------------------
11110101
オーバーフローは発生しません。つまり、キャリーフラグは設定されません。