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

17 KiB
Raw Blame History

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