2017-10-10 4 views
-2

私は2つのレジスタを持っています。eaxは0xDEADC0DEを保持し、ebxは0x1337CA5Eを保持します。アセンブリSFフラグ

最初の数値が2番目の数値よりも大きい。ただし、cmp命令の後:cmp eax, ebxSF(符号フラグ)が設定されています。どうして ?

結果が肯定的(eax-ebx)の場合、なぜですか?

+2

signフラグは、結果が* negative、* not * positiveであることを示します。*実際には、0xdeadc0de - 0x1337ca5eの符号ビットが設定されているためです。あなたの質問は何ですか? – fuz

+2

符号付き比較で符号フラグを使用します。この場合、「0xdeadc0de」は負の数であり、したがって2番目のオペランドより小さくなります(オーバーフローフラグもチェックする必要があります)。符号なし比較の場合は、ゼロであるキャリーフラグをチェックする。 – Jester

+2

アセンブリデバッガがレジスタの値をどのように表示するかは、たぶん犠牲です。常に符号なしの値を16進数で表示します。しかし、署名されたフラグに興味があるときは、その2の補数でエンコードされた値を解釈する必要があります。 0xdeadc0deには上位ビットがオンになり、ビットは符号を示します。したがって、10進数では-559038242という負の値になります。 0x1337ca5eには上位ビットが設定されていないため、正の値です。負の値は常に正の値よりも小さく、-559038242は322423390より小さい。 –

答えて

2

cmpsubを実行します(結果は保持しません)。

の手で同じことをやってみましょう:次のように

reg  hex value binary value  

eax = 0xdeadc0de ‭11011110101011011100000011011110‬ 
ebx = 0x1337ca5e ‭00010011001101111100101001011110‬ 
    - ---------- 
res 0xCB75F680 11001011011101011111011010000000 

のフラグが設定されている:

OF (overflow) : did bit 31 change  -> no 
SF (sign)  : is bit 31 set   -> yes 
CF (carry) : is abs(ebx) < abs(eax) -> no 
ZF (zero)  : is result zero   -> no 
PF (parity) : is parity of LSB even -> no (archaic) 
AF (Adjust) : overflow in bits-> archaic, for BCD only. 

あなたが見ることができるように、結果は31ビットセットを持っていますので、それが負です。
-3-1 = -4(それでも負の場合)と同じです。
EBX > EAXであるかどうかを判断するのに、SF(符号フラグ)を使用することはできません。符号付き数値の場合はOF(オーバーフローフラグ)、符号なし数値の場合はCF(キャリーフラグ)を使用する必要があります。

正または負のCPUは数が正または負であるかを知っている(または気)しません。知っている唯一の人はあなたです。 SFOFをテストする場合は、番号を署名済みとして扱います。 CFのみをテストする場合は、番号を符号なしとして扱います。
プロセッサがすべてのフラグを一度に追跡できるようにするためです。どのフラグをテストするかを決めると、数字を解釈する方法が決まります。

+0

PFは 'cmp'の後に0になります。 (下位8ビットは '1000 0000' =ビットセットなし= PF = 0) – Ped7g

関連する問題