58 KiB
58 KiB
Шпаргалка по x86‑64 ASM
Адресация
-
Без сегментации (кроме
fsиgsдля специальных целей, например, потоков) -
Относительно базового регистра
- используется для данных в стеке, массивов, структур и членов классов
- [
base+index*scale+immediate_offset] baseобязателен, может быть любым 64‑битным регистромindexможет быть любым 64‑битным регистром, кромеrspscaleможет быть 1, 2, 4 или 8immediate_offset(в GAS называется displacement) — смещение относительно базового регистра- Синтаксис GAS:
immediate_offset(base, index, scale)
-
Относительно RIP (также PC‑relative)
- используется для статических данных
- содержит 32‑битное знаково расширяемое смещение относительно указателя команд
- явно задаётся в NASM через
mov eax [rel label]или директивыdefault rel/default abs(в противном случае используется 32‑битная абсолютная адресация) - явно задаётся в GAS через
mov eax label(%rip)
-
32‑битная абсолютная адресация
- 32‑битный константный адрес, знаково расширяемый до 64 бит
- работает для адресов ниже 2^31
- не используйте для простых операндов памяти: RIP‑relative короче, быстрее (не нужны релокации) и работает везде
- используется для доступа к статическим массивам с индексным регистром, например
mov ebx, [intarray + rsi*4], однако это не работает для DLL в Windows и Linux, а также для исполняемых файлов и DLL в macOS, потому что адреса выше 2^32 (gcc и clang используют это для Linux‑исполняемых файлов; для Windows‑исполняемых MASM использует адресацию относительно базы образа) - альтернативный, работающий везде вариант: сначала загрузить адрес статического массива в
rbxчерезleaс RIP‑relative адресом, а затем адресовать относительно этого базового регистра (lea rbx, [array], затемmov eax, [rbx + rcx*4]); другие статические массивы затем можно адресовать относительно (mov [(array2-array1) + rbx + rcx*4], eax)
-
64‑битная абсолютная адресация
mov eax, dword [qword a]- применима только с
movи регистрамиal,ax,eaxилиrax(источник или приёмник) - не может содержать сегмент, базовый или индексный регистр
Позиционно‑независимый код (PIC)
- Проще и быстрее, чем 32‑битная техника GOT (Global Offset Table), поскольку RIP‑relative уже позиционно‑независим (заметьте, что описанная выше техника доступа к статическим массивам с индексным регистром также позиционно‑независима)
Регистры общего назначения
| bit 0 - 63 | bit 0 - 31 | bit 0 - 15 | bit 8 - 15 | bit 0 - 7 |
|---|---|---|---|---|
rax |
eax |
ax |
ah |
al |
rbx |
ebx |
bx |
bh |
bl |
rcx |
ecx |
cx |
ch |
cl |
rdx |
edx |
dx |
dh |
dl |
rsi |
esi |
si |
sil |
|
rdi |
edi |
di |
dil |
|
rbp |
ebp |
bp |
bpl |
|
rsp |
esp |
sp |
spl |
|
r8 |
r8d |
r8w |
r8b |
|
r9 |
r9d |
r9w |
r9b |
|
r10 |
r10d |
r10w |
r10b |
|
r11 |
r11d |
r11w |
r11b |
|
r12 |
r12d |
r12w |
r12b |
|
r13 |
r13d |
r13w |
r13b |
|
r14 |
r14d |
r14w |
r14b |
|
r15 |
r15d |
r15w |
r15b |
|
rflags |
flags |
|||
rip |
Регистр rflags
- CF (Carry Flag, бит 0) — устанавливается, если арифметическая операция генерирует перенос или заём из старшего бита результата; очищается иначе. Флаг показывает переполнение для беззнаковой арифметики. Также применяется в многоточечной (многословной) арифметике.
- PF (Parity Flag, бит 2) — устанавливается, если младший байт результата содержит чётное число единиц; очищается иначе.
- AF (Auxiliary carry Flag, бит 4) — устанавливается, если операция вызывает перенос или заём из бита 3 результата; очищается иначе. Используется в двоично‑десятичной (BCD) арифметике.
- ZF (Zero Flag, бит 6) — устанавливается, если результат равен нулю; очищается иначе.
- SF (Sign Flag, бит 7) — устанавливается равным старшему биту результата, то есть знаковому биту знакового целого (0 — положительное, 1 — отрицательное).
- OF (Overflow Flag, бит 11) — устанавливается, если целочисленный результат слишком велик (без учёта знакового бита), чтобы поместиться в операнд назначения: слишком большой положительный или слишком маленький отрицательный; очищается иначе. Показывает переполнение для знаковой (дополнительный код) арифметики.
Режимы насыщения и циклического переполнения (набора инструкций)
- Циклическая арифметика (wraparound) — истинный выход за диапазон усечётся (перенос/переполнение игнорируется, возвращаются только младшие биты результата). Подходит, когда диапазон операндов контролируется. Иначе возможны большие ошибки. Пример: сложение двух больших знаковых чисел может вызвать положительное переполнение и дать отрицательный результат.
- Арифметика со знаковым насыщением — выход за диапазон ограничивается представимым диапазоном знаковых целых для данного размера. Например, при положительном переполнении для знаковых слов результат насыщается до 7FFFH (наибольшее положительное 16‑битное); при отрицательном — до 8000H.
- Арифметика с беззнаковым насыщением — выход за диапазон ограничивается представимым диапазоном беззнаковых целых данного размера. Положительное переполнение для беззнаковых байтов даёт FFH, отрицательное — 00H.
Стековые кадры
Инструкции передачи данных
- MOV — Перемещение данных между регистрами общего назначения; между памятью и регистрами общего назначения или сегментными; загрузка непосредственных значений в регистры общего назначения.
- CMOVcc — Условное перемещение.
- XCHG — Обмен значениями.
- BSWAP — Перестановка байтов.
- XADD — Обмен с добавлением.
- CMPXCHG — Сравнить и обменять.
- CMPXCHG8B / CMPXCHG16B — Сравнить и обменять 8/16 байт.
- PUSH — Поместить на стек.
- POP — Снять со стека.
- PUSHA / PUSHAD — Поместить все регистры общего назначения на стек.
- POPA / POPAD — Снять все регистры общего назначения со стека.
- CWD / CDQ / CQO — Расширить слово до двойного слова / двойное слово до квадрослова.
- CBW / CWDE / CDQE — Расширить байт до слова / слово до двойного слова в регистре
rax. - MOVSX / MOVSXD — Перемещение с знаковым расширением.
- MOVZX — Перемещение с нулевым расширением.
Инструкции целочисленной арифметики
- ADCX — Беззнаковое сложение с переносом.
- ADOX — Беззнаковое сложение с переполнением.
- ADD — Сложение целых.
- ADC — Сложение с переносом.
- SUB — Вычитание.
- SBB — Вычитание с заёмом.
- IMUL — Умножение со знаком.
- MUL — Умножение без знака.
- IDIV — Деление со знаком.
- DIV — Деление без знака.
- INC — Инкремент.
- DEC — Декремент.
- NEG — Изменить знак (двойка‑дополнение).
- CMP — Сравнение.
Логические инструкции
Сдвиги и ротации
- SAL / SAR / SHL / SHR — Арифметический/логический сдвиг влево/вправо.
- SHLD — Двойной сдвиг влево.
- SHRD — Двойной сдвиг вправо.
- RCL / RCR / ROL / ROR — Ротация влево/вправо и через перенос.
Битовые и байтовые инструкции
- BT — Тест бита.
- BTS — Тест и установка бита.
- BTR — Тест и сброс бита.
- BTC — Тест и инверсия бита.
- BSF — Поиск первого (младшего) установленного бита.
- BSR — Поиск последнего (старшего) установленного бита.
- SETcc — Установить байт по условию.
- TEST — Логическое сравнение (AND, флаги).
- CRC32 — Аппаратное ускорение вычисления CRC для быстрого контроля целостности данных.
- POPCNT — Подсчёт количества единичных битов во втором операнде с возвратом счётчика в первый (регистр назначения).
Инструкции передачи управления
- JMP — Безусловный переход.
- Jcc — Переход при выполнении условия (операнд RIP‑relative).
- LOOP / LOOPcc — Цикл с счётчиком в
rcx. - CALL — Вызов процедуры.
- RET — Возврат из процедуры.
- IRET / IRETD / IRETQ — Возврат из прерывания.
- INT n / INTO / INT 3 — Вызов обработчика прерывания.
- ENTER — Высокоуровневый вход в процедуру.
- LEAVE — Высокоуровневый выход из процедуры.
Строковые инструкции
- MOVS / MOVSB / MOVSW / MOVSD / MOVSQ — Копирование данных из строки в строку.
- CMPS / CMPSB / CMPSW / CMPSD / CMPSQ — Сравнение строковых операндов.
- SCAS / SCASB / SCASW / SCASD — Сканирование строки.
- LODS / LODSB / LODSW / LODSD / LODSQ — Загрузка из строки.
- STOS / STOSB / STOSW / STOSD / STOSQ — Запись в строку.
- REP / REPE / REPZ / REPNE / REPNZ — Префиксы повторения строковых операций.
Инструкции управления rflags
- STC — Установить флаг переноса.
- CLC — Очистить флаг переноса.
- CMC — Инвертировать флаг переноса.
- CLD — Очистить флаг направления.
- STD — Установить флаг направления.
- LAHF — Загрузить флаги в регистр
ah. - SAHF — Сохранить регистр
ahв флаги. - PUSHF / PUSHFQ — Поместить
rflagsна стек. - POPF / POPFQ — Снять
rflagsсо стека. - STI — Установить флаг прерываний.
- CLI — Очистить флаг прерываний.
Прочие инструкции
- LEA — Загрузка эффективного адреса.
- NOP — Пустая операция.
- UD — Неопределённая инструкция.
- XLAT / XLATB — Табличное преобразование байта.
- CPUID — Идентификация процессора.
- MOVBE — Перемещение данных с перестановкой байтов.
- PREFETCHW — Предвыборка данных в кэш с ожиданием записи.
- CLFLUSH — Сброс и инвалидация операнда памяти и связанной линии кэша на всех уровнях иерархии кэшей процессора.
- CLFLUSHOPT — То же, с оптимизацией пропускной способности памяти.
- RDRAND — Получение случайного числа, сгенерированного аппаратно.
- RDSEED — Получение зерна (seed) для ГСЧ из аппаратного источника.
Сохранение/восстановление расширенных состояний в пользовательском режиме
- XSAVE — Сохранить расширенные состояния процессора в память.
- XSAVEC — Сохранить расширенные состояния с уплотнением.
- XSAVEOPT — Оптимизированное сохранение расширенных состояний.
- XRSTOR — Восстановить расширенные состояния из памяти.
- XGETBV — Прочитать состояние расширенного управляющего регистра.
Манипуляции битами (BMI1, BMI2)
- ANDN — Побитовое AND первого операнда с инвертированным вторым.
- BEXTR — Извлечение непрерывного диапазона битов.
- BLSI — Извлечь младший установленный бит.
- BLSMSK — Установить в 1 все младшие биты ниже первого установленного.
- BLSR — Сбросить младший установленный бит.
- BZHI — Обнулить старшие биты, начиная с указанной позиции.
- LZCNT — Подсчёт ведущих нулей.
- MULX — Беззнаковое умножение без изменения флагов.
- PDEP — Параллельная «загрузка» битов по маске.
- PEXT — Параллельное «извлечение» битов по маске.
- RORX — Ротация вправо без изменения флагов.
- SARX / SHLX / SHRX — Арифметический/логический сдвиг без изменения флагов.
- TZCNT — Подсчёт замыкающих нулей (с конца).
Обзор x87 FPU
- Состояние x87 FPU отображается на состояние MMX; при переходах к MMX‑инструкциям нужно соблюдать осторожность, чтобы избежать неконсистентности результатов.
Инструкции передачи данных x87 FPU
- FLD — Загрузка числа с плавающей точкой.
- FST / FSTP — Сохранить число с/без извлечения из стека FPU.
- FILD — Загрузка целого.
- FIST / FISTP — Сохранить целое с/без извлечения.
- FBLD — Загрузка BCD.
- FBSTP — Сохранение BCD и извлечение.
- FXCH — Обмен регистров.
- FCMOVcc — Условное перемещение (FPU).
Базовая арифметика x87 FPU
- FADD / FADDP / FIADD — Сложение с плавающей точкой.
- FSUB / FSUBP / FISUB — Вычитание с плавающей точкой.
- FSUBR / FSUBRP / FISUBR — Вычитание в обратном порядке.
- FMUL / FMULP / FIMUL — Умножение с плавающей точкой.
- FDIV / FDIVP / FIDIV — Деление с плавающей точкой.
- FDIVR / FDIVRP / FIDIVR — Деление в обратном порядке.
- FPREM — Частный остаток.
- FPREM1 — Частный остаток (IEEE).
- FABS — Модуль.
- FCHS — Смена знака.
- FRNDINT — Округление до целого.
- FSCALE — Масштабирование по степени двойки.
- FSQRT — Квадратный корень.
- FXTRACT — Извлечение показателя и мантиссы.
Сравнения x87 FPU
- FCOM / FCOMP / FCOMPP — Сравнение чисел с плавающей точкой.
- FUCOM / FUCOMP / FUCOMPP — Неупорядоченное сравнение чисел с плавающей точкой.
- FICOM / FICOMP — Сравнение целых.
- FCOMI / FCOMIP / FUCOMI / FUCOMIP — Сравнение чисел с плавающей точкой с установкой флагов
rflags. - FTST — Тест (сравнение с 0.0).
- FXAM — Анализ (exam) числа с плавающей точкой.
Трансцендентные функции x87 FPU
- FSIN — Синус.
- FCOS — Косинус.
- FSINCOS — Синус и косинус.
- FPTAN — Частичная тангенс‑функция.
- FPATAN — Частичная арктангенс‑функция.
- F2XM1 — 2^x − 1.
- FYL2X — y ∗ log2(x).
- FYL2XP1 — y ∗ log2(x + 1).
Загрузка констант x87 FPU
- FLD1 / FLDL2T / FLDL2E / FLDPI / FLDLG2 / FLDLN2 / FLDZ — Загрузка констант.
Управление x87 FPU
- FINCSTP — Инкремент указателя стека FPU.
- FDECSTP — Декремент указателя стека FPU.
- FFREE — Освободить регистр FPU.
- FINIT / FNINIT — Инициализация FPU.
- FCLEX / FNCLEX — Очистка флагов исключений FPU.
- FSTCW / FNSTCW — Сохранить управляющее слово FPU.
- FLDCW — Загрузить управляющее слово FPU.
- FSTENV / FNSTENV — Сохранить окружение FPU.
- FLDENV — Загрузить окружение FPU.
- FSAVE / FNSAVE — Сохранить состояние FPU.
- FRSTOR — Восстановить состояние FPU.
- FSTSW / FNSTSW — Сохранить статусное слово FPU.
- WAIT / FWAIT — Ожидание готовности FPU.
- FNOP — Пустая операция FPU.
Управление состоянием x87 FPU и SIMD
Обзор MMX
- SIMD‑модель вычислений для 64‑битных упакованных целых.
- Восемь 64‑битных регистров данных MMX.
- Три новых типа упакованных данных:
- 64‑битные упакованные байтовые целые (со знаком и без)
- 64‑битные упакованные словные целые (со знаком и без)
- 64‑битные упакованные двойные слова (со знаком и без)
- Состояние MMX отображается на состояние x87 FPU; при переходах к инструкциям x87 FPU требуется осторожность во избежание неконсистентности результатов.
Передача данных MMX
- MOVD / MOVQ — Перемещение двойного/квадрослова между MMX и памятью/регистрами.
Преобразования MMX
- PACKSSWB / PACKSSDW — Упаковка слов/двойных слов в байты со знаковым насыщением.
- PACKUSWB — Упаковка слов в байты с беззнаковым насыщением.
- PUNPCKHBW / PUNPCKHWD / PUNPCKHDQ — Распаковка старших байтов/слов/двойных слов.
- PUNPCKLBW / PUNPCKLWD / PUNPCKLDQ — Распаковка младших байтов/слов/двойных слов.
Упакованная арифметика MMX
- PADDB / PADDW / PADDD — Сложение упакованных байтов/слов/двойных слов.
- PADDSB / PADDSW — Сложение упакованных знаковых байтов/слов со знаковым насыщением.
- PADDUSB / PADDUSW — Сложение упакованных беззнаковых байтов/слов с беззнаковым насыщением.
- PSUBB / PSUBW / PSUBD — Вычитание упакованных байтов/слов/двойных слов.
- PSUBSB / PSUBSW — Вычитание упакованных знаковых байтов/слов со знаковым насыщением.
- PSUBUSB / PSUBUSW — Вычитание упакованных беззнаковых байтов/слов с беззнаковым насыщением.
- PMULHW — Умножение упакованных знаковых слов с сохранением старшей части результата.
- PMULLW — Умножение упакованных знаковых слов с сохранением младшей части.
- PMADDWD — Умножение и сложение упакованных слов.
Сравнения MMX
- PCMPEQB / PCMPEQW / PCMPEQD — Сравнение упакованных байтов/слов/двойных слов на равенство.
- PCMPGTB / PCMPGTW / PCMPGTD — Сравнение упакованных знаковых байтов/слов/двойных слов «больше чем».
Логика MMX
Сдвиги и ротации MMX
- PSLLW / PSLLD / PSLLQ — Логический сдвиг упакованных слов/двойных слов/квадрослов влево.
- PSRLW / PSRLD / PSRLQ — Логический сдвиг упакованных слов/двойных слов/квадрослов вправо.
- PSRAW / PSRAD — Арифметический сдвиг упакованных слов/двойных слов вправо.
Управление состоянием MMX
- EMMS — Очистить состояние MMX.
Обзор SSE
- Расширяет SIMD‑модель, добавляя операции над упакованными и скалярными числами одиночной точности в 128‑битных регистрах.
- Шестнадцать (в 32‑битном режиме — восемь) 128‑битных регистров XMM.
- 128‑битные инструкции для упакованных и скалярных чисел одиночной точности.
- Расширения MMX‑инструкций новыми операциями над упакованными целыми в регистрах MMX.
- Явная предвыборка данных, управление кэшируемостью данных и упорядочиванием операций записи.
Передача данных SSE
- MOVAPS — Перемещение четырёх выровненных упакованных чисел одиночной точности между XMM и памятью.
- MOVUPS — Перемещение четырёх невыровненных упакованных чисел одиночной точности между XMM и памятью.
- MOVHPS — Перемещение двух чисел одиночной точности из/в старшую квадрословную часть XMM и память.
- MOVHLPS — Перемещение двух чисел из старшей части одного XMM в младшую часть другого XMM.
- MOVLPS — Перемещение двух чисел одиночной точности из/в младшую квадрословную часть XMM и память.
- MOVLHPS — Перемещение двух чисел из младшей части одного XMM в старшую часть другого XMM.
- MOVMSKPS — Извлечь маску знаков из четырёх упакованных чисел одиночной точности.
- MOVSS — Перемещение скалярного числа одиночной точности между XMM и памятью.
Арифметика SSE (FP32)
- ADDPS — Сложение упакованных чисел одиночной точности.
- ADDSS — Сложение скалярных чисел одиночной точности.
- SUBPS — Вычитание упакованных чисел одиночной точности.
- SUBSS — Вычитание скалярных чисел одиночной точности.
- MULPS — Умножение упакованных чисел одиночной точности.
- MULSS — Умножение скалярных чисел одиночной точности.
- DIVPS — Деление упакованных чисел одиночной точности.
- DIVSS — Деление скалярных чисел одиночной точности.
- RCPPS — Обратные значения (1/x) для упакованных чисел.
- RCPSS — Обратное значение для скаляра.
- SQRTPS — Квадратные корни упакованных чисел.
- SQRTSS — Квадратный корень скалярного числа.
- RSQRTPS — Обратные квадратные корни упакованных чисел.
- RSQRTSS — Обратный квадратный корень скаляра.
- MAXPS — Максимумы упакованных чисел одиночной точности.
- MAXSS — Максимум скаляра одиночной точности.
- MINPS — Минимумы упакованных чисел одиночной точности.
- MINSS — Минимум скаляра одиночной точности.
Сравнения SSE
- CMPPS — Сравнение упакованных чисел одиночной точности.
- CMPSS — Сравнение скалярных чисел одиночной точности.
- COMISS — Упорядоченное сравнение скаляров и установка флагов
rflags. - UCOMISS — Неупорядоченное сравнение скаляров и установка флагов
rflags.
Логика SSE
- ANDPS — Побитовое И упакованных чисел одиночной точности.
- ANDNPS — Побитовое И‑НЕ упакованных чисел.
- ORPS — Побитовое ИЛИ упакованных чисел.
- XORPS — Побитовое XOR упакованных чисел.
Перестановки и распаковка SSE
- SHUFPS — Перестановка значений в упакованных операндах.
- UNPCKHPS — Распаковка и чередование двух старших значений из двух операндов.
- UNPCKLPS — Распаковка и чередование двух младших значений из двух операндов.
Преобразования SSE
- CVTPI2PS — Преобразование упакованных двойных слов в упакованные числа одиночной точности.
- CVTSI2SS — Преобразование двойного слова в скаляр одиночной точности.
- CVTPS2PI — Преобразование упакованных чисел одиночной точности в упакованные двойные слова.
- CVTTPS2PI — То же с усечением.
- CVTSS2SI — Преобразование скаляра одиночной точности в двойное слово.
- CVTTSS2SI — То же с усечением.
Управление MXCSR (SSE)
SSE: 64‑битные целые (расширения MMX)
- PAVGB / PAVGW — Среднее значение упакованных беззнаковых байтов.
- PEXTRW — Извлечь слово.
- PINSRW — Вставить слово.
- PMAXUB — Максимум упакованных беззнаковых байтов.
- PMAXSW — Максимум упакованных знаковых слов.
- PMINUB — Минимум упакованных беззнаковых байтов.
- PMINSW — Минимум упакованных знаковых слов.
- PMOVMSKB — Маска байтов (перенос знаков в маску).
- PMULHUW — Умножение упакованных беззнаковых слов, сохранение старшей части.
- PSADBW — Сумма абсолютных разностей.
- PSHUFW — Перестановка слов в регистре MMX.
SSE: кэшируемость, предвыборка и упорядочивание
- MASKMOVQ — Нетемпоральная запись выбранных байтов из MMX в память.
- MOVNTQ — Нетемпоральная запись квадрослова из MMX в память.
- MOVNTPS — Нетемпоральная запись четырёх упакованных чисел одиночной точности из XMM в память.
- PREFETCHh — Загрузка 32 и более байт из памяти в выбранный уровень кэша.
- SFENCE — Сериализация операций записи.
Обзор SSE2
- Упакованные и скалярные 128‑битные числа двойной точности.
- Дополнительные инструкции для 64‑ и 128‑битных упакованных байтов/слов/двойных слов/квадрослов.
- 128‑битные версии целочисленных инструкций из MMX и SSE.
- Дополнительные инструкции управления кэшируемостью и упорядочиванием инструкций.
SSE2: перемещение данных FP64
- MOVAPD — Перемещение двух выровненных упакованных чисел двойной точности между XMM и памятью.
- MOVUPD — Перемещение двух невыровненных упакованных чисел двойной точности между XMM и памятью.
- MOVHPD — Перемещение старшего элемента двойной точности из/в старшую часть XMM и память.
- MOVLPD — Перемещение младшего элемента двойной точности из/в младшую часть XMM и память.
- MOVMSKPD — Извлечь маску знаков из двух упакованных чисел двойной точности.
- MOVSD — Перемещение скалярного числа двойной точности между XMM и памятью.
SSE2: арифметика FP64
- ADDPD — Сложение упакованных чисел двойной точности.
- ADDSD — Сложение скалярных чисел двойной точности.
- SUBPD — Вычитание упакованных чисел двойной точности.
- SUBSD — Вычитание скалярных чисел двойной точности.
- MULPD — Умножение упакованных чисел двойной точности.
- MULSD — Умножение скалярных чисел двойной точности.
- DIVPD — Деление упакованных чисел двойной точности.
- DIVSD — Деление скалярных чисел двойной точности.
- SQRTPD — Квадратные корни упакованных чисел двойной точности.
- SQRTSD — Квадратный корень скалярного числа двойной точности.
- MAXPD — Максимумы упакованных чисел двойной точности.
- MAXSD — Максимум скаляра двойной точности.
- MINPD — Минимумы упакованных чисел двойной точности.
- MINSD — Минимум скаляра двойной точности.
SSE2: логические операции FP64
- ANDPD — Побитовое И упакованных чисел двойной точности.
- ANDNPD — Побитовое И‑НЕ упакованных чисел двойной точности.
- ORPD — Побитовое ИЛИ упакованных чисел двойной точности.
- XORPD — Побитовое XOR упакованных чисел двойной точности.
SSE2: сравнения FP64
- CMPPD — Сравнение упакованных чисел двойной точности.
- CMPSD — Сравнение скаляров двойной точности.
- COMISD — Упорядоченное сравнение скаляров двойной точности с установкой
rflags. - UCOMISD — Неупорядоченное сравнение скаляров двойной точности с установкой
rflags.
SSE2: перестановки и распаковка FP64
- SHUFPD — Перестановка значений в упакованных операндах двойной точности.
- UNPCKHPD — Распаковка и чередование старших значений из двух операндов.
- UNPCKLPD — Распаковка и чередование младших значений из двух операндов.
SSE2: преобразования
- CVTPD2PI — Преобразование упакованных чисел двойной точности в упакованные двойные слова.
- CVTTPD2PI — То же с усечением.
- CVTPI2PD — Преобразование упакованных двойных слов в упакованные числа двойной точности.
- CVTPD2DQ — Преобразование упакованных чисел двойной точности в упакованные двойные слова.
- CVTTPD2DQ — То же с усечением.
- CVTDQ2PD — Преобразование упакованных двойных слов в упакованные числа двойной точности.
- CVTPS2PD — Преобразование упакованных чисел одиночной в двойную точность.
- CVTPD2PS — Преобразование упакованных чисел двойной в одиночную точность.
- CVTSS2SD — Преобразование скаляра одиночной в двойную точность.
- CVTSD2SS — Преобразование скаляра двойной в одиночную точность.
- CVTSD2SI — Преобразование скаляра двойной точности в двойное слово.
- CVTTSD2SI — То же с усечением.
- CVTSI2SD — Преобразование двойного слова в скаляр двойной точности.
SSE2: FP32 (расширения SSE)
- CVTDQ2PS — Преобразование упакованных двойных слов в упакованные числа одиночной точности.
- CVTPS2DQ — Преобразование упакованных чисел одиночной точности в упакованные двойные слова.
- CVTTPS2DQ — То же с усечением.
SSE2: целочисленные инструкции
- MOVDQA — Перемещение выровненного двойного квадрослова.
- MOVDQU — Перемещение невыровненного двойного квадрослова.
- MOVQ2DQ — Перемещение квадрослова из MMX в XMM.
- MOVDQ2Q — Перемещение квадрослова из XMM в MMX.
- PMULUDQ — Умножение упакованных беззнаковых двойных слов.
- PADDQ — Сложение упакованных квадрослов.
- PSUBQ — Вычитание упакованных квадрослов.
- PSHUFLW — Перестановка младших слов.
- PSHUFHW — Перестановка старших слов.
- PSHUFD — Перестановка двойных слов.
- PSLLDQ — Логический сдвиг двойного квадрослова влево.
- PSRLDQ — Логический сдвиг двойного квадрослова вправо.
- PUNPCKHQDQ — Распаковка старших квадрослов.
- PUNPCKLQDQ — Распаковка младших квадрослов.
SSE2: кэшируемость и упорядочивание
- CLFLUSH — Сброс линии кэша.
- LFENCE — Сериализация операций чтения.
- MFENCE — Сериализация операций чтения и записи.
- PAUSE — Улучшает производительность «циклов активного ожидания» (spin‑wait).
- MASKMOVDQU — Нетемпоральная запись выбранных байтов из XMM в память.
- MOVNTPD — Нетемпоральная запись двух упакованных чисел двойной точности из XMM в память.
- MOVNTDQ — Нетемпоральная запись двойного квадрослова из XMM в память.
- MOVNTI — Нетемпоральная запись двойного слова из регистра общего назначения в память.
Ссылки
- https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
- http://www.agner.org/optimize/optimizing_assembly.pdf
- https://www.nasm.us/xdoc/2.13.03/nasmdoc.pdf
- https://godbolt.org/
- https://www.lri.fr/~filliatr/ens/compil/x86-64.pdf
- https://0xax.github.io/categories/assembler/
Таблицы инструкций
Примеры
- https://github.com/torvalds/linux/tree/master/arch/x86
- https://gist.github.com/rygorous/bf1659bf6cd1752ed114367d4b87b302
- https://www.csee.umbc.edu/portal/help/nasm/sample_64.shtml