Почему в этом случае устанавливаются флаги OF и CF при использовании инструкции IMUL r/m8

При использовании инструкции IMUL с одним 8-битным операндом результат сохраняется в регистре AX. У меня есть следующий код

    mov eax, 0
    mov ebx, 0

    mov al, 48
    mov bl, 4

    call dumpregs

    imul bl

    call dumpregs

48 * 8 – это 192 (C0 в шестнадцатеричном формате), которое правильно хранится в регистре AX как 00C0 (см. вывод ниже). Диапазон значений регистра AX со знаком составляет от -32 768 до +32 767, а диапазон значений без знака — от 0 до 65 535. Поэтому оба флага OF и CF должны быть очищены (0). Но, как вы можете видеть в следующем выводе, они оба установлены (1).

ВЫВОД


person Tayyab Mazhar    schedule 18.05.2019    source источник
comment
Согласно felixcloutier.com/x86/imul «Установлены флаги CF и OF когда целочисленное значение со знаком промежуточного произведения отличается от знакового усеченного произведения с расширенным размером операнда, в противном случае флаги CF и OF сбрасываются».   -  person Paul R    schedule 18.05.2019
comment
Логика заключается в том, что результат всегда будет соответствовать месту назначения двойного размера, поэтому использование флагов для этого было бы бессмысленным. Таким образом, флаги сообщают вам, можно ли безопасно урезать результат до исходного размера исходного операнда, в данном случае 8 бит. Поскольку 192 не помещается в 8 бит со знаком, флаги установлены. Другими словами, он переполнил 8-битный размер, поэтому вам нужно использовать полный 16-битный вывод.   -  person Jester    schedule 18.05.2019
comment
Итак, OF установлен, потому что 192 не помещается в 8-битные числа со знаком. Но почему установлен CF? Я знаю, что CF устанавливается, когда беззнаковое значение выходит за пределы диапазона, но для 8-битного 255 максимальный диапазон, а 192 ниже этого диапазона, поэтому CF должен быть четким, но это не так, почему??   -  person Tayyab Mazhar    schedule 18.05.2019
comment
CF и OF в операциях умножения всегда устанавливаются/сбрасываются параллельно, как указано в документе, упомянутом @PaulR.   -  person vitsoft    schedule 18.05.2019
comment
И почему AL учитывается при установке AL, когда весь флаг AX является пунктом назначения.   -  person Tayyab Mazhar    schedule 18.05.2019
comment
@vitsoft, почему они установлены параллельно? Логика для обоих флагов разная.   -  person Tayyab Mazhar    schedule 18.05.2019
comment
Потому что так решила Intel. логика касается только арифметических операций (добавить, подставить). Перенос флага не означает переполнение без знака в других инструкциях, таких как сдвиги, повороты, умножения.   -  person vitsoft    schedule 18.05.2019