2012-09-02 14 views
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フラグは、これまで設定されません。

+0

これは8086プログラミングか何ですか? – nKandel

答えて

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

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

、これは16または32または64ビットの0 + 1 + 1 = 0継続は、あなたがそれを行うdoesntのという意味で正しい0

を運びます。減算は、第2オペランドが反転され、キャリーが反転された加算である。いくつかのプロセッサフ​​ァミリは、実行を逆転させるものはありません。あなたが減算して実行を逆転させる何かを見ているように聞こえる。

したがって、5〜10が同じプロセッサで10〜5回実行した場合、キャリービットは設定されません(借用なし)。

あなたの2番目の例は、私が知っているどのプロセッサでもキャリーアウトが反転されず、キャリービットが借りを示す正論理であることをサポートしています。 2番目のケースone.In小さいから大きい数を減算するので第一ケースキャリーフラグに

+1

確かに、すべてのx86は、引き算の際にキャリーアウトを反転することに関して同じように動作します。 – harold

+0

そうですね、私はそれを編集してプロセッサーファミリーと言いました。私が意味することは、あなたがx86、arm、avr、msp430、6502、z80などのキャリーフラグを比較する場合です。家族や会社内でも、同じソリューションを使用することを期待しています。 –

+1

oh ok、missed that – harold

1

を仮定するEAXは、キャリーフラグがセットされていない

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

ていないオーバーフローがあるが、すなわち発生、8ビット・レジスタであることができます設定されています。

+2

を指摘していただきありがとうございます。ハードウェアは、同じロジックが使用されているのと同じ答えを加算または減算しますが、違いはそのプロセッサの処理方法です。このプロセッサフ​​ァミリ(x86)は、減算のために反転を行い(また、キャリーインと第2オペランドを入れ替える)ように聞こえるが、加算のための反転はない。 –