Фантазии о Вселенной и мой личный сайт
Маски опкода для дешифратора

Маски опкода для дешифратора

Маска MRM Описание Пример
Префиксы
0000_1111Расширение опкода
001s_s110Префикс сегментного регистраds:
0110_01xxПрефиксы xx={FS:, GS:, расширение операнда, расширение адреса}
1111_001xПрефиксы x={REPNZ, REPZ/REPE/REP}REP:
1111_0000Префикс блокировки шины для процессораLOCK:
Арифметико-логика
00aa_a0dwЕстьАрифметико-логические операцииADD [bx+si], al
00aa_a10wАрифметико-логические операции с операндом i8/16/32XOR al, $16
001x_x110Инструкции xx={DAA, DAS, AAA, AAS}
0100_0rrrИнкремент 16-битного регистраINC cx
0100_1rrrДекремент 16-битного регистраDEC si
0110_10x1ЕстьЗнаковое умножениеIMUL r16, rm, i16/i8
1000_00dwЕстьАрифметические с непосредственным операндом, команда берется из REG-части MRMADD [bp], $1523
1000_010wЕстьTEST rm, i8/16TEST [bx], $55
1000_011wЕстьXCHG rm, r8/16XCHG si, bx
1100_000wЕстьГрупповые инструкции сдвига с i8/16ROR [bx+si], $4512
Стек
000s_s110Вставка в стек сегментного регистраPUSH cs
000s_s111Извлечение из стека сегментного регистраPOP es
0101_0rrrВставка в стек 16-битного регистраPUSH bp
0101_1rrrИзвлечение из стека 16-битного регистраPOP sp
0110_0000PUSHA
0110_0001POPA
0110_10x0Запись в стек непосредственного значенияPUSH i16/i8
1000_1111ЕстьИзвлечение из стека в rm: POP rm16POP [bx]
1001_1100Сохранить флаги в стекPUSHF
1001_1101Загрузить флаги из стекаPOPF
Другое
0110_0010ЕстьBOUND r16, m16
0110_0011ЕстьARPL r/m, r16
0110_110wЗапись из порта по адресу DX из ES:DIINSB/INSW
0110_111wВыдача в порт по адресу DX из DS:SIOUTSB/OUTSW
0111_ccccУсловный близкий (short) переход на меткуJNE r8
1000_10dwЕстьКоманда пересылки MOVMOV cl, [si]
1000_11d0ЕстьПеремещение сегментного регистра, задан в REG-части MRMMOV es, [$1234]
1000_1101ЕстьЗагрузка эффективного адреса из rm: LEA r16, rmLEA bx, [bx+si]
1001_0000Нет операцииNOP
1001_0rrrОбмен между AX и 16-битным регистромXCHG ax, bx
1001_1000Знаковое расширение байта до слова (AL -> AX)CBW / CWDE
1001_1001Знаковое расширение слова до двойного слова (AX -> DX:AX)CWD / CDQ
1001_1010Длинный переход сегмент:адрес, адрес записыватся первымCALLF seg:addr
1001_1011Ожидание освобождения FPUFWAIT
1001_1110Загрузить флаги из AHSAHF
1001_1111Сохранить флаги в AHLAHF
1010_00dwПеренос из/в AL/AX значения по 16/32-адресуMOV al, [$BACA]
1010_010wКопировать из DS:SI в ES:DI, DI++ или DI--MOVSB
1010_011wСравнить DS:SI в ES:DI (через CMP), DI++ или DI--CMPSW
1010_100wВыполнить операцию AND над al/ax и непосредственным значением без записи результатаTEST ax, $1234
1010_101wЗапись регистра AL/AX в ES:DI, DI++ или DI--STOSB
1010_110wПрочитать из DS:SI в регистр AL/AX, SI++ или DI--LODSW
1010_111wСравнить AL, вычитает AL - ES:DI, результа не пишется, DI++ или DI--SCASB
1011_wrrrMOV r8/16, i8/16MOV dl, $12
1100_0010Возврат из процедурыRET
1100_0011Возврат из процедуры и добавление SP + i16RET $0015
1100_010xЕстьЗагрузка из памяти в регистры x={ES,DS} и r16LES dx, [bx + $1234]
1100_011xЕстьЗагрузка непосредственного значения i8/16 в rmMOV [bx+si-1], $AF
1100_1000Создание фреймов для стека и процедурENTER $1234, $56
1100_1001Покинуть стековые фреймыLEAVE
1100_1010Дальний возврат по сегменту и смещению, SP + i16RETF i16
1100_1011Дальний возвратRETF
1100_1100Вызов прерывания 3INT3
1100_1101Вызов прерывания от 0 до 255INT $10
1100_1110Вызов прерывания, если флаг OF=1INTO
1100_1111Выход из процедуры обработки прерыванийIRET
1101_00iwЕстьГрупповые инструкции сдвига со смещением i={1, cl}SHL ax, cl
1101_010xКорректировка значений после умножения или деления x={AAM, AAD}AAM
1101_0110Установка всех битов AL в значение Carry-флагаSALC
1101_0111Получение значения AL = [DS:BX + AL], AL-не знаковоеXLATB
1101_1xxxЕстьИнструкции FPU
1110_00xxИнструкции для циклов xx={LOOPNZ, LOOPZ, LOOP, JCXZ}. Декремент CX, проверка на 0 с условиямиJCXZ $+15
1110_x10wПолучение данных из порта в AL/AX из порта x={i8, dx}IN al, $61
1110_x11wЗапись данных из AL/AX в порт x={i8, dx}OUT dx, ax
1110_1000Вызов процедуры, знаковый 16-битный переходCALL $1234
1110_1001Знаковый 16-битный безусловный переходJMP $1234
1110_1010Длинный переход по смещению и сегментуJMP $1234:$5678
1110_1011Короткий знаковый 8-битный переходJMP $-1
1111_0001Вызов прерывания 1INT1
1111_0100Остановка процессораHLT
1111_0101Переброс флага C^1 => CCMC
1111_011wЕстьГрупповые инструкции #1
1111_10xxИнструкции xx={CLC, STC, CLI, STI}STC
1111_110xИнструкции xx={CLI, STD}STD
1111_111wЕстьГрупповые инструкции #2
aaa = код;
rrr = регистр al..dh(8) или (e)ax..(e)di
ss  = es, cs, ss, ds
d   = direction
w   = 8/16/32