私は2つのレジスタを持っています。eax
は0xDEADC0DEを保持し、ebx
は0x1337CA5Eを保持します。アセンブリSFフラグ
最初の数値が2番目の数値よりも大きい。ただし、cmp
命令の後:cmp eax, ebx
SF
(符号フラグ)が設定されています。どうして ?
結果が肯定的(eax
-ebx
)の場合、なぜですか?
私は2つのレジスタを持っています。eax
は0xDEADC0DEを保持し、ebx
は0x1337CA5Eを保持します。アセンブリSFフラグ
最初の数値が2番目の数値よりも大きい。ただし、cmp
命令の後:cmp eax, ebx
SF
(符号フラグ)が設定されています。どうして ?
結果が肯定的(eax
-ebx
)の場合、なぜですか?
cmp
はsub
を実行します(結果は保持しません)。
の手で同じことをやってみましょう:次のように
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は数が正または負であるかを知っている(または気)しません。知っている唯一の人はあなたです。 SF
とOF
をテストする場合は、番号を署名済みとして扱います。 CF
のみをテストする場合は、番号を符号なしとして扱います。
プロセッサがすべてのフラグを一度に追跡できるようにするためです。どのフラグをテストするかを決めると、数字を解釈する方法が決まります。
PFは 'cmp'の後に0になります。 (下位8ビットは '1000 0000' =ビットセットなし= PF = 0) – Ped7g
signフラグは、結果が* negative、* not * positiveであることを示します。*実際には、0xdeadc0de - 0x1337ca5eの符号ビットが設定されているためです。あなたの質問は何ですか? – fuz
符号付き比較で符号フラグを使用します。この場合、「0xdeadc0de」は負の数であり、したがって2番目のオペランドより小さくなります(オーバーフローフラグもチェックする必要があります)。符号なし比較の場合は、ゼロであるキャリーフラグをチェックする。 – Jester
アセンブリデバッガがレジスタの値をどのように表示するかは、たぶん犠牲です。常に符号なしの値を16進数で表示します。しかし、署名されたフラグに興味があるときは、その2の補数でエンコードされた値を解釈する必要があります。 0xdeadc0deには上位ビットがオンになり、ビットは符号を示します。したがって、10進数では-559038242という負の値になります。 0x1337ca5eには上位ビットが設定されていないため、正の値です。負の値は常に正の値よりも小さく、-559038242は322423390より小さい。 –