Когда используется флаг переполнения?

Я думаю, что пришел, чтобы изучить варианты использования, когда установлен флаг переполнения: когда бит со знаком изменяется в арифметике со знаком. Например, следующие три случая:

    # For example, with overflow:
    mov $0b00100000, %al # 32
    add $0b01100000, %al # 96
    # ---------------------
    #   $0b10000000  # Notice how the signed bit is set so the answer is -128, not +128

    # And with negative numbers (subtracting two negative numbers) where the sign =-bit is different
    # mov $-0b00100000, %al # 
    mov  $0b10000000, %al # -128
    add  $0b10000001, %al # -127
    # ---------------------
    #    $0b00000001  # +1 -- again the sign bit changes, so we have the overflow on

    # Doing the same thing but subtracting a positive number to get the overflow instead
    mov  $0b10000000, %al # -128
    sub  $0b00000100, %al # 4
    # ---------------------
    #    $0b01111100 # + 124 -- result is positive, so again we have overflow

Однако в каких приложениях или вариантах использования используется флаг overflow? В моих минимальных знаниях asm кажется, что флаги Zero и Sign используются все время для сравнения, но в каких случаях используется флаг Overflow?


person carl.hiass    schedule 26.09.2020    source источник
comment
Каждый раз, когда вас интересует, переполнялось ли подписанное сложение или вычитание (что также неявно проверяется с помощью сравнения со знаком). Обратите внимание, что флаг знака сам по себе используется реже, чем вместе с флагом переполнения. Например. JG проверяет ZF == 0 && SF == OF   -  person Jester    schedule 27.09.2020
comment
@Шут спасибо. Не могли бы вы уточнить это, возможно, в ответе? Например, почему он проверяет, что SF == OF ?   -  person carl.hiass    schedule 27.09.2020
comment
Потому что, как вы сами описали, SF переворачивается, если происходит переполнение. Таким образом, чтобы проверить больше, чем у вас есть либо положительный результат без переполнения (SF = OF = 0), либо отрицательный результат с переполнением (SF = OF =1).   -  person Jester    schedule 27.09.2020
comment
@Jester, это имеет смысл, спасибо за объяснение.   -  person carl.hiass    schedule 27.09.2020
comment
Таблицы типа ref.x86asm.net/geek.html показывают, какие инструкции могут изменить этот флаг. По сути, это просто сложение, вычитание и умножение со знаком, и они используют его для обозначения переполнения в естественном смысле арифметики со знаком. Примечание cmp — это вариант вычитания. Побитовые операции, как правило, безоговорочно очищают его.   -  person Nate Eldredge    schedule 27.09.2020
comment
Инструкции ротации RCL / RCR / ROL / ROL устанавливают его в сложный путь, который, несомненно, имеет какую-то цель, которая не сразу мне ясна. О, см. stackoverflow.com/questions/31125111 / и комментарий к ответу.   -  person Nate Eldredge    schedule 27.09.2020
comment
Также связано: Понимание знака и флага переполнения в сборке - очень похоже на Разница между инструкциями JS и JL x86, но SO допускает только 5 дубликатов. Кажется, вы упустили тот факт, что OF является неотъемлемой частью сравнения со знаком между двумя ненулевыми числами, и для этого есть несколько дубликатов, а также один о фактическом обнаружении переполнения целого числа со знаком после каждой математической операции.   -  person Peter Cordes    schedule 27.09.2020