17 KiB
17 KiB
| 1 | мнемоника | ориг на англ | опкод | длина в байтах | пояснение |
|---|---|---|---|---|---|
| 2 | переместить_имм | MOV reg, imm | (кодируется динамически) | 7-10 | Переместить непосредственное значение в регистр. Поддерживает 8/16/32/64 битные регистры |
| 3 | переместить | MOV reg, reg | 48 89 + ModR/M | 3 | Переместить данные из одного регистра в другой (64-бит) |
| 4 | загрузить | MOV reg, mem | 48 8B + ModR/M | 2-9 | Загрузить значение из памяти в регистр. Поддержка всех форм адресации |
| 5 | сохранить | MOV mem, reg | 48 89 + ModR/M | 2-9 | Сохранить значение регистра в память. Поддержка всех форм адресации |
| 6 | загрузить_байт_из_памяти | MOV reg8, mem8 | 8A + ModR/M | 2-6 | Загрузить байт из памяти в 8-битный регистр |
| 7 | сохранить_байт | MOV mem8, reg8 | 88 + ModR/M | 2-6 | Сохранить 8-битный регистр в память |
| 8 | загрузить_адрес | LEA reg, mem | 48 8D + ModR/M | 3-9 | Загрузить эффективный адрес (вычисленный адрес, не значение по адресу) |
| 9 | переместить_с_нулями | MOVZX reg, mem8 | 48 0F B6 + ModR/M | 4-10 | Загрузить байт из памяти с расширением нулями до 32/64 бит |
| 10 | переместить_со_знаком | MOVSX reg, mem8 | 48 0F BE + ModR/M | 4-10 | Загрузить байт из памяти с расширением знака до 32/64 бит |
| 11 | загрузить_байт | MOV reg8, imm8 | (кодируется динамически) | 2-3 | Загрузить непосредственный байт в 8-битный регистр (B0+reg + imm8) |
| 12 | сравнить_с | CMP reg, imm | (кодируется динамически) | 6-8 | Сравнить регистр с непосредственным значением |
| 13 | сравнить | CMP reg, reg | 48 39 + ModR/M | 3 | Сравнить два регистра |
| 14 | сравнить_байт | CMP reg8, reg8 | 38 + ModR/M | 2 | Сравнить два 8-битных регистра |
| 15 | проверить | TEST reg, reg | 48 85 + ModR/M | 3 | Логическое сравнение (побитовое И), не изменяет операнды |
| 16 | прибавить | ADD reg, reg | 48 01 + ModR/M | 3 | Сложить два регистра |
| 17 | прибавить_непосредственно | ADD reg, imm | (кодируется динамически) | 6-8 | Прибавить непосредственное значение к регистру |
| 18 | прибавить_байт | ADD reg8, reg8 | 00 + ModR/M | 2 | Сложить два 8-битных регистра |
| 19 | вычесть | SUB reg, reg | 48 29 + ModR/M | 3 | Вычесть второй регистр из первого |
| 20 | вычесть_непосредственно | SUB reg, imm | (кодируется динамически) | 6-8 | Вычесть непосредственное значение из регистра |
| 21 | вычесть_байт | SUB reg8, reg8 | 28 + ModR/M | 2 | Вычесть два 8-битных регистра |
| 22 | увеличить | INC reg | FF /0 + ModR/M | 2-3 | Увеличить регистр на 1 (не меняет CF) |
| 23 | уменьшить | DEC reg | FF /1 + ModR/M | 2-3 | Уменьшить регистр на 1 (не меняет CF) |
| 24 | умножить | MUL reg/mem | F7 /4 + ModR/M | 2-9 | Беззнаковое умножение RAX = RAX * операнд. Результат в RDX:RAX |
| 25 | умножить_знаковое | IMUL reg/mem | F7 /5 + ModR/M | 2-9 | Знаковое умножение RAX = RAX * операнд. Результат в RDX:RAX |
| 26 | разделить | DIV reg/mem | F7 /6 + ModR/M | 2-9 | Беззнаковое деление RDX:RAX / операнд. Частное в RAX, остаток в RDX |
| 27 | разделить_знаковое | IDIV reg/mem | F7 /7 + ModR/M | 2-9 | Знаковое деление RDX:RAX / операнд. Частное в RAX, остаток в RDX |
| 28 | и | AND reg, reg | 48 21 + ModR/M | 3 | Побитовое И двух регистров |
| 29 | или | OR reg, reg | 48 09 + ModR/M | 3 | Побитовое ИЛИ двух регистров |
| 30 | исключающее_или | XOR reg, reg | 48 31 + ModR/M | 3 | Побитовое исключающее ИЛИ двух регистров |
| 31 | инвертировать | NOT reg | F7 /2 + ModR/M | 2-3 | Побитовое НЕ (инверсия всех бит) |
| 32 | отрицать | NEG reg | F7 /3 + ModR/M | 2-3 | Арифметическое отрицание (дополнительный код) |
| 33 | переход | JMP rel32 | E9 | 5 | Безусловный переход на 32-битное смещение |
| 34 | короткий_переход | JMP SHORT rel8 | EB | 2 | Короткий безусловный переход на 8-битное смещение |
| 35 | переход_если_равно | JE/JZ rel32 | 0F 84 | 6 | Условный переход если равно (ZF=1) |
| 36 | переход_если_неравно | JNE/JNZ rel32 | 0F 85 | 6 | Условный переход если не равно (ZF=0) |
| 37 | переход_если_меньше | JL rel32 | 0F 8C | 6 | Условный переход если меньше (знаковое, SF≠OF) |
| 38 | переход_если_больше | JG rel32 | 0F 8F | 6 | Условный переход если больше (знаковое, ZF=0 и SF=OF) |
| 39 | переход_если_меньше_или_равно | JLE rel32 | 0F 8E | 6 | Условный переход если меньше или равно (знаковое) |
| 40 | переход_если_больше_или_равно | JGE rel32 | 0F 8D | 6 | Условный переход если больше или равно (знаковое) |
| 41 | переход_если_перенос | JC rel32 | 0F 82 | 6 | Условный переход если перенос (CF=1). Для беззнаковых: меньше |
| 42 | переход_если_нет_переноса | JNC rel32 | 0F 83 | 6 | Условный переход если нет переноса (CF=0). Для беззнаковых: больше/равно |
| 43 | переход_если_ноль | JZ rel32 | 0F 84 | 6 | Условный переход если ноль (ZF=1). Синоним JE |
| 44 | переход_если_не_ноль | JNZ rel32 | 0F 85 | 6 | Условный переход если не ноль (ZF=0). Синоним JNE |
| 45 | короткий_переход_если_равно | JE SHORT rel8 | 74 | 2 | Короткий условный переход если равно |
| 46 | короткий_переход_если_неравно | JNE SHORT rel8 | 75 | 2 | Короткий условный переход если не равно |
| 47 | короткий_переход_если_меньше | JL SHORT rel8 | 7C | 2 | Короткий условный переход если меньше (знаковое) |
| 48 | короткий_переход_если_больше | JG SHORT rel8 | 7F | 2 | Короткий условный переход если больше (знаковое) |
| 49 | короткий_переход_если_меньше_или_равно | JLE SHORT rel8 | 7E | 2 | Короткий условный переход если меньше или равно |
| 50 | короткий_переход_если_больше_или_равно | JGE SHORT rel8 | 7D | 2 | Короткий условный переход если больше или равно |
| 51 | короткий_переход_если_перенос | JC SHORT rel8 | 72 | 2 | Короткий условный переход если перенос |
| 52 | короткий_переход_если_нет_переноса | JNC SHORT rel8 | 73 | 2 | Короткий условный переход если нет переноса |
| 53 | короткий_переход_если_ноль | JZ SHORT rel8 | 74 | 2 | Короткий условный переход если ноль |
| 54 | короткий_переход_если_не_ноль | JNZ SHORT rel8 | 75 | 2 | Короткий условный переход если не ноль |
| 55 | вызвать | CALL rel32 | E8 | 5 | Вызов процедуры (подпрограммы). Адрес возврата в стек |
| 56 | вернуться | RET | C3 | 1 | Возврат из процедуры. Адрес из стека |
| 57 | втолкнуть | PUSH reg | 50 + reg | 1-2 | Поместить регистр в стек (RSP = RSP - 8) |
| 58 | вытолкнуть | POP reg | 58 + reg | 1-2 | Извлечь регистр из стека (RSP = RSP + 8) |
| 59 | втолкнуть_непосредственно | PUSH imm32 | 68 | 5 | Поместить 32-битное значение в стек |
| 60 | втолкнуть_байт | PUSH imm8 | 6A | 2 | Поместить 8-битное значение в стек с расширением знака |
| 61 | втолкнуть_из_памяти | PUSH mem | FF /6 + ModR/M | 2-9 | Поместить в стек значение из памяти |
| 62 | вытолкнуть_в_память | POP mem | 8F /0 + ModR/M | 2-9 | Извлечь из стека в память |
| 63 | сдвиг_влево | SHL reg, imm | 48 C1 E0 + ModR/M | 4 | Логический сдвиг влево (умножение на 2) |
| 64 | сдвиг_вправо | SHR reg, imm | 48 C1 E8 + ModR/M | 4 | Логический сдвиг вправо (деление на 2 без знака) |
| 65 | сдвиг_арифметический_вправо | SAR reg, imm | 48 C1 F8 + ModR/M | 4 | Арифметический сдвиг вправо (деление на 2 со знаком) |
| 66 | вращать_влево | ROL reg, imm | 48 C1 C0 + ModR/M | 4 | Вращение бит влево (биты не теряются) |
| 67 | вращать_вправо | ROR reg, imm | 48 C1 C8 + ModR/M | 4 | Вращение бит вправо (биты не теряются) |
| 68 | цикл | LOOP rel8 | E2 | 2 | Инструкция цикла: RCX = RCX - 1; если RCX != 0, переход |
| 69 | обменять | XCHG reg, reg | 48 87 + ModR/M | 3 | Обменять значения двух регистров |
| 70 | обменять_с_памятью | XCHG mem, reg | 48 87 + ModR/M | 2-9 | Обменять значение регистра и памяти |
| 71 | вызов_системы | SYSCALL | 0F 05 | 2 | Системный вызов в ядро Linux |
| 72 | прервать | INT imm8 | CD | 2 | Программное прерывание. Номер прерывания из операнда |
| 73 | войти_в_систему | SYSENTER | 0F 34 | 2 | Быстрый системный вызов (32-битный режим) |
| 74 | остановить | HLT | F4 | 1 | Остановить процессор до следующего прерывания |
| 75 | нет_операции | NOP | 90 | 1 | Нет операции. Процессор ничего не делает |
| 76 | отладка | INT3 | CC | 1 | Точка останова для отладчика |
| 77 | переместить_байт | MOVSB | A4 | 1 | Переместить байт: [RDI] = [RSI]; RSI++, RDI++ |
| 78 | переместить_слово | MOVSW | A5 | 1 | Переместить слово (2 байта): [RDI] = [RSI]; RSI+=2, RDI+=2 |
| 79 | сравнить_байты | CMPSB | A6 | 1 | Сравнить байты: сравнить [RSI] и [RDI]; RSI++, RDI++ |
| 80 | сканировать_байт | SCASB | AE | 1 | Сканировать байт: сравнить AL и [RDI]; RDI++ |
| 81 | установить_перенос | STC | F9 | 1 | Установить флаг переноса CF = 1 |
| 82 | сбросить_перенос | CLC | F8 | 1 | Сбросить флаг переноса CF = 0 |
| 83 | установить_направление | STD | FD | 1 | Установить флаг направления DF = 1 (строковые операции назад) |
| 84 | сбросить_направление | CLD | FC | 1 | Сбросить флаг направления DF = 0 (строковые операции вперёд) |
| 85 | втолкнуть_флаги | PUSHF | 9C | 1 | Поместить регистр флагов в стек |
| 86 | вытолкнуть_флаги | POPF | 9D | 1 | Извлечь регистр флагов из стека |
| 87 | ввод_байта | IN imm8 | E4 | 2 | Ввод байта из порта ввода-вывода в AL |
| 88 | вывод_байта | OUT imm8 | E6 | 2 | Вывод байта из AL в порт ввода-вывода |
| 89 | идентифицировать_процессор | CPUID | 0F A2 | 2 | Получить информацию о процессоре (производитель, возможности) |
| 90 | прочитать_счётчик | RDTSC | 0F 31 | 2 | Прочитать счётчик времени (TSC) в EDX:EAX |