Добрый денечек! Ковырял одну вещь, обнаружил там такую инструкцию: "D0 F0". Opcode = D0 ModRM = F0 = (Mod=11) (R/O=110) (R/M=000) В манах от Intel и AMD такого не нашёл, Olly распознаёт как нечто вроде "sal r/m8, 1", при выполнении и правда производит умножение на 2. Вопрос вот в чём - нельзя ли объяснить это явление с помощью официальной документации, или это действительно недокументированная инструкция?
По логике кодировки поля Reg в сдвиговых операциях 100\101 соответствует логическим сдвигам shl\shr, а 110\111 арифметическим sal\sar, но т.к. sal==shl, то значение 110 для sal практически не используется, хотя декодируется правильно
Awk Кодировка арифметических, логических и циклических сдвигов имеет следующий формат: 15|14|13|12|11|10|09| 08 | 7-6| 5-4| 03 |2-0| ------------------------------------------------ 1 | 1 | 0 | C| 0 | 0 |V |W/B |MOD|КОП|R/L|R/M| Бит С, в данном случае, определяет количество сдвигов, если он равен 0 — количество сдвигов задается непосредственно в команде, если C=1 количество сдвигов или равно 1, или задается регистром CL. Бит W/B определяет размер операнда — байт или слово/двойное слово. Бит V установлен в 0, если счетчик равен 1, V=1 если счетчик задается регистром CL. Биты 7 и 6 во втором байте определяют режим адресации, биты 5 и 4 — код операции сдвига, бит R/L — направление сдвига, биты R/M — операнд-получатель, определяемый из режима адресации. Обычно по команде «SAL» транслятор генерирует код команды SHL, хотя существует код команды SAL — D0Fx, который не всегда распознается дебагерами, но выполняется микропроцессором. КОП|R/L| Название |Команда |код ---------------------------------------------------------------------------------- 00 | 0 |циклический сдвиг операнда влево |ROL AL,1 |D0C0 01 | 0 |циклический сдвиг через перенос влево|RCL AL,1 |D0D0 10 | 0 |логический сдвиг влево |SHL AL,1 |D0E0 11 | 0 |арифметический сдвиг влево |SAL AL,1 (только в кодах)|D0F0 11 | 1 |арифметический сдвиг вправо |SAR AL,1 |D0F8