Сборка SF флаг
Итак, у меня есть 2 регистра, eax
который содержит 0xDEADC0DE и ebx
который содержит 0x1337CA5E.
Первое число больше второго. Однако после cmp
инструкция: cmp eax, ebx
SF
(флаг знака) установлен. Зачем?
Почему если результат положительный (eax
- ebx
)
1 ответ
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 0123 -> archaic, for BCD only.
Как видите, результат имеет установленный бит 31 и, таким образом, он отрицательный.
Так же, как -3 - 1 = -4 (все еще отрицательный).
Вы не можете использовать SF
(подписать флаг), чтобы определить, если EBX > EAX
, Вам нужно использовать OF
(флаг переполнения) для чисел со знаком или CF
(нести флаг) для чисел без знака.
Положительный или отрицательный
Процессор не знает (или не заботится), является ли число положительным или отрицательным. Единственный человек, который знает, это ты. Если вы тестируете SF
а также OF
тогда вы относитесь к номеру как к подписанному. Если вы только тестируете CF
тогда вы относитесь к числу без знака.
Чтобы помочь вам, процессор отслеживает все флаги одновременно. Вы сами решаете, какие флаги проверять, и тем самым решаете, как интерпретировать числа.