Сборка 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 тогда вы относитесь к числу без знака.
Чтобы помочь вам, процессор отслеживает все флаги одновременно. Вы сами решаете, какие флаги проверять, и тем самым решаете, как интерпретировать числа.

Другие вопросы по тегам