kvs/доки/kvs_instructions.csv
2026-05-02 23:04:46 +03:00

90 lines
17 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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