waqur: (Default)
[personal profile] waqur
При реверсировании микрокода процессоров Intel 8086/8088 обнаружилась интересная недокументированная особенность: префикс REP/REPNE перед инструкциями целочисленного умножения и деления со знаком (MUL, IMUL, IDIV) обращает знак результата (произведения или частного):

https://www.reenigne.org/blog/8086-microcode-disassembled/

Перед тем, как процессор начнёт исполнять микрокод для инструкции умножения или деления, отрицательные операнды этих инструкций преобразуются в положительные, а их изначальный знак попутно XOR-ится на некий 1-битный внутренний регистр, состояние которого используется микропрограммой умножения или деления как флаг отрицательного результата. Поскольку у инструкций умножения и деления сложные и длинные микропрограммы с десятками микроопераций, которые портят состояние всех внутренних временных регистров процессора, проектировщиками из Intel для хранения знака результата операции умножения/деления было решено переиспользовать тот же самый 1-битный флаг, который взводится инструкционным префиксом REP/REPNE и сбрасывается на каждой новой инструкции (и который официально предназначен совсем для других целей: для повторения строковых инструкций типа MOVS/CMPS/SCAS, и соответственно не определён для инструкций умножения и деления). Таким образом, если у инструкций умножения или деления есть этот префикс, тогда начальное состояние флага знака результата равно 1 (–), а не 0 (+), как обычно.

Логично, не правда ли?

Жаль только, что трюк не работает, начиная с Intel 80286.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

March 2024

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Автор стиля

Развернуть

No cut tags
Page generated 2025-08-03 10:50 am
Powered by Dreamwidth Studios