Система команд x64

Тема в разделе "WASM.X64", создана пользователем Mikl___, 20 сен 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
     
    Последнее редактирование: 21 сен 2025
    Research нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Команды перемещения

    MOV

    Команда MOV копирует второй операнд (операнд-источник) в первый операнд (операнд-назначение). Оба операнда могут быть регистрами общего назначения или ячейкой памяти (r/m8, r/m16, r/m32, r/m64), второй оператор может быть регистром, ячейкой памяти или непосредственным значением (imm8/imm16/imm32). Оба операнда должны иметь одинаковую размерность — байт, слово, двойное, учетверенноное или увосьмеренное слово. Оба операнда не могут быть одновременно содержимым ячейки в памяти

    XCHG

    Команда XCHG осуществляет обмен значений двух операндов. Операнды могут быть двумя регистрами общего назначения (r8/r16/r32/r64) или регистром общего назначения и ячейкой памяти (r/m8, r/m16, r/m32, r/m64). Если используется операнд в памяти, то на время выполнения команды автоматически выставляется сигнал блокировки шины LOCK#, причем это делается независимо от наличия префикса блокировки и текущего значения IOPL.

    LEA

    Команда LEA вычисляет эффективный адрес (смещение) операнда-источника команды (который должен быть операндом в памяти) и сохраняет его в регистре — операнде-назначении команды. Атрибут размера операнда команды определяется выбранным регистром (16-, 32- или 64-битным). Атрибут размера адреса определяется атрибутом текущего кодового сегмента. Атрибуты размера адреса и размера операнда воздействуют на операцию, выполняемую командой LEA так, как это показано в таблице
    РазмерВыполняемая операция
    операндаадреса
    1616Вычисляется 16-битный эффективный адрес и сохраняется в 16-битном регистре-назначении
    1632Вычисляется 32-битный эффективный адрес его младшие 16 бит сохраняются в 16-битном регистре-назначении
    3216Вычисляется 16-битный эффективный адрес, затем расширяется с учетом знака и сохраняется в 32-битном регистре-назначении
    3232Вычисляется 32-битный эффективный адрес и сохраняется в 32-битном регистре-назначении
    1632Вычисляется 32-битный эффективный адрес (используется префикс 67h) его младшие 16 бит сохраняются в 16-битном регистре-назначении (используется префикс 66h)
    1664Вычисляется 64-битный эффективный адрес и его младшие 16 бит сохраняются в 16-битном регистре-назначении (используется префикс 66h)
    3232Вычисляется 32-битный эффективный адрес (используется префикс 67h) и сохраняется в 32-битном регистре-назначении
    3264Вычисляется 64-битный эффективный адрес и его младшая часть сохраняется в 32-битном регистре-назначении
    6432Вычисляется 32-битный эффективный адрес (используется префикс 67h) и сохраняется в 64-битном регистре-назначении
    6464Вычисляется 64-битный эффективный адрес и сохраняется в 64-битном регистре-назначении
    Команда lea reg1,[reg2] эквивалентна команде mov reg1,reg2

    BSWAP

    Команда BSWAP меняет порядок следования байтов 32-/64-битного регистра на противоположный. В случае использования команды BSWAP с атрибутом 16-битного размера операнда, результат, помещаемый в регистр назначения, не определен
     
    Последнее редактирование: 21 сен 2025
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Команды расширения

    CBW

    Команда CBW копирует знак (бит 7) регистра AL во все биты регистра AH

    CWD

    Команда CWD удваивает размер операнда источника. Команда CWD копирует знак (бит 15) регистра AX в каждый бит регистра DX.

    CWDE

    Команда CWDE преобразует знаковое слово в регистре AX в знаковое двойное слово в регистре EAX копированием знака (бит 15) регистра AX в два старших байта (биты с 16 по 31) регистра EAX.

    CDQ

    Команда CDQ копирует знак (бит 31) регистра EAX в каждый бит регистра EDX.

    CDQE

    Команда CDQE преобразует знаковое слово в регистре EAX в знаковое учетверенное слово в регистре RAX копированием знака (бит 31) регистра EAX в четыре байта (биты с 32 по 63) регистра RAX.

    CQO

    Команда CQO копирует знак (бит 63) регистра RAX в каждый бит регистра RDX.

    MOVSX

    Команда MOVSX считывает содержимое операнда-источника (второй операнд — регистр или ячейка памяти) как байт или слово, затем расширяет с учетом знака это значение до атрибута размера операнда (16, 32 или 64 бита) и сохраняет результат в регистре-назначении.

    MOVSXD

    Команда MOVSXD считывает содержимое 32 разрядного операнда-источника (регистр или ячейка памяти) и расширяет с учетом знака это значение до атрибута размера операнда (64 бита) и сохраняет результат в регистре-назначении.

    MOVZX

    Команда MOVZX считывает содержимое операнда-источника (второй операнд — регистр или ячейка памяти) как байт или слово, затем расширяет это значение нулями до атрибута размера операнда (16 или 32 бита) и сохраняет результат в регистре-назначении.
     
    Последнее редактирование: 21 сен 2025
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Арифметические команды

    ADD

    Команда ADD (Addition) производит целочисленное сложение двух знаковых или беззнаковых операндов (DEST и SRC). Первый операнд (операнд-назначение, DEST) переменная в регистре или в памяти (r/m8, r/m16, r/m32, r/m64). Второй операнд (операнд-источник, SRC) — переменная в регистре или в памяти или непосредственным значением (imm8, imm16, imm32). Оба операнда одновременно не могут быть переменными в памяти.
    Результат сложения командой ADD помещается на место первого операнда (DEST). Флаги в регистре RFLAGS/EFLAGS/FLAGS устанавливаются в соответствии с полученным результатом.
    При сложении непосредственного значения imm8, imm16 или imm32 с двухбайтным или четырехбайтным или восьмибайтным операндом непосредственная величина расширяется с учетом знака до размера первого операнда, и после этого выполняется сложение.
    Команда ADD позволяет манипулировать целочисленными операндами как в беззнаковом формате, так и в формате со знаком. При сложении данных со знаком флаг знака RFLAGS.SF/EFLAGS.SF/FLAGS.SF будет отражать знак полученного результата. Флаг переполнения RFLAGS.OF/EFLAGS.OF/FLAGS.OF установится в 1, если при сложении целочисленных значений со знаком, представленных в обратном коде или в дополнительном коде, произошло переполнение (перенос из старшего значащего разряда, которому соответствует бит, предшествующий разряду знака), то есть полученный результат превышает доступный размер операнда-назначения (DEST). Это аналогично тому, как флаг RFLAGS.CF/EFLAGS.CF/FLAGS.CF отражает переполнение (перенос) при сложении беззнаковых операндов.

    ADC

    Команда ADC (Add with Carry) производит целочисленное сложение двух знаковых или беззнаковых операндов (DEST и SRC) и флага переноса RFLAGS.CF/EFLAGS.CF/FLAGS.CF. Первый операнд (операнд-назначение, DEST) переменная в регистре или в памяти (r/m8, r/m16, r/m32, r/m64). Второй операнд (операнд-источник, SRC) — переменная в регистре или в памяти (r/m8, r/m16, r/m32, r/m64) или непосредственное значением (imm8, imm16, imm32). Оба операнда одновременно не могут быть переменными в памяти.
    Результат сложения командой ADC помещается на место первого операнда (DEST). Флаги в регистре RFLAGS/EFLAGS/FLAGS устанавливаются в соответствии с полученным результатом.
    При сложении непосредственного значения imm8/imm16/imm32 с двухбайтным или четырехбайтным или восьмибайтным операндом непосредственная величина расширяется с учетом знака до размера первого операнда, после этого выполняется сложение.
    Команда ADC используется в многобайтных или многословных (multi-word) операциях сложения. В этаком случае она идет вслед за командой ADD, которая возвращает сумму младших разрядов многобайтных (многословных) операндов, позволяя при сложении старших разрядов учитывать перенос.
    Команда ADC позволяет манипулировать целочисленными операндами как в беззнаковом формате, так и в формате со знаком. При сложении данных со знаком флаг знака RFLAGS.SF/EFLAGS.SF/FLAGS.SF будет отражать знак полученного результата. Флаг переполнения RFLAGS.OF/EFLAGS.OF/FLAGS.OF установится в 1, если при сложении целочисленных значений со знаком, представленных в обратном коде или в дополнительном коде, произошло переполнение (перенос из старшего значащего разряда, которому соответствует бит, предшествующий разряду знака), то есть полученный результат превышает доступный размер операнда-назначения (DEST).

    SUB

    a

    SBB

    a

    IMUL

    a

    MUL

    a

    DIV

    a

    IDIV

    a

    CMP

    a

    NEG

    a

    INC

    a

    DEC

    a

    XADD

    a

    LEA

    a
     
    Последнее редактирование: 20 сен 2025
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Перекодирование

    XLAT

    Команда XLAT, использует индекс из регистра AL, выбирает элемент из таблицы, расположенной в памяти по адресу RBX/EBX/BX, и помещает его в AL. Регистр AL должен содержать беззнаковый индекс элемента в таблице. Таблица адресуется регистром RBX/EBX/BX
     
    Последнее редактирование: 20 сен 2025
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Работа со стеком

    PUSH/POP

    основные команды для работы со стеком. Позволяют заносить значения регистров и ячеек памяти в стек и извлекать их оттуда.
    Команда PUSH Синтаксис: PUSH op
    Операнды: r/m16, r/m32, r/m64, sr, i8, i16, i32
    Назначение: Помещение операнда в стек
    Команда PUSH уменьшает значение регистра стека на размер операнда (2, 4 или 8) и копирует содержимое операнда в память по адресу SS:RSP/ESP/SP. Если в стек заносится байт, то он расширяется до слова/удвоенного слова/учетверенного слова с сохранением знака.
    Команда PUSH RSP/ESP/SP помещает в стек значение RSP/ESP/SP до того, как эта же команда его уменьшит на восемь/четыре/два.
    Команда POP Синтаксис: POP op
    Операнды: r/m16, r/m32, r/m64, sr
    Назначение: Извлечение операнда из стека
    Команда POP копирует содержимое ячейки памяти по адресу SS:RSP/ESP/SP в операнд и увеличивает значение регистра стека на размер операнда (2, 4 или 8). Если операнд использует регистр RSP/ESP/SP для косвенной адресации, команда POP вычисляет адрес уже после того, как она увеличивает RSP/ESP/SP.
    Ограничения: С помощью команды POP нельзя загрузить из стека сегментный регистр CS

    PUHF/POPF

    PUSHF и POPF — команды микропроцессора, которые относятся к группе команд работы с флагами. PUSHF (push flags) сохраняет регистр флагов в стеке. Работа этой команды зависит от атрибута размера сегмента:
    • use16 — в стек записывается регистр FLAGS размером 2 байта;
    • use32 — в стек записывается регистр EFLAGS размером 4 байта;
    • use64 — в стек записывается регистр RFLAGS размером 8 байт.
    POPF (восстановление из стека регистра флагов) пересылает содержимое верхушки стека (на которое указывает регистр RSP/ESP/SP) в регистр флагов RFLAGS/EFLAGS/ FLAGS. После этого содержимое RSP/ESP/SP увеличивается на 8, 4, 2, и RSP/ESP/SP указывает на предыдущее значение стека, которое теперь является его новой вершиной.
    Команда POPF не имеет параметров; она воздействует на все флаги процессора, кроме флагов VM и RF.

    LAHF/SAHF

    a
     
    Последнее редактирование: 21 сен 2025
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Строковые команды

    LODS

    a

    STOS

    a

    MOVS

    a

    SCAS

    a

    CMPS

    a

    REP/REPZ/REPNZ

    a

    INS

    a

    OUTS

    a
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Логические команды

    AND

    a

    OR

    a

    NOT

    a

    XOR

    a

    TEST

    a
     
    Последнее редактирование: 20 сен 2025
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Сдвиговые команды

    SHL/SHR

    a

    SHLD/SHRD

    a

    RCL/RCR

    a

    ROL/ROR

    a

    SAL/SAR

    a

    SHLX/SHRX

    SARX/SHLX/SHRX — сдвиг без изменения флагов. Если значение, указанное в операнде источнике, превышает OperandSize -1, значение COUNT маскируется. Инструкции SARX, SHRX и SHLX не обновляют флаги.
     
    Последнее редактирование: 21 сен 2025
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Работа с портами

    OUT

    a

    IN

    a

    OUTS

    a

    INS

    a
     
    Последнее редактирование: 20 сен 2025
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Работа с битами

    BT

    a

    BTC

    a

    BTR/BTS

    a

    BSF/BSR

     
    Последнее редактирование: 20 сен 2025
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Передача управления

    JMP

     
    Последнее редактирование: 20 сен 2025
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Условные команды

    JCC

    a

    CMOVCC

    a


    SETCC

    a

    JRCXZ/JECXZ/JCXZ

    a

    LOOP/LOOPE/LOOPE

     
    Последнее редактирование: 20 сен 2025
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Команды для работы с процедурами

    CALL

    a

    RET

    a

    ENTER

    a

    LEAVE

    a

    SYSENTER/SYSEXIT

    a

    INT/IRET

    a
     
    Последнее редактирование: 21 сен 2025
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Системные команды

    ARPL

    a

    LOCK

    a

    HLT

    a

    NOP

    a


    LAR

    a

    INVLPG

    a

    LGDT/SGDT

    a

    LLDT/SLDT

    a

    LIDT

    a

    LMSW/SMSW

    a

    LSL

    LTR/STR

    RDMSR/WRMSR

    RDPMC

    a

    RDTSC

    a

    RSM

    a

    UD2

    a

    VERR

    VERW

    a

    WBINVD

    a

    CPUID

     
    Последнее редактирование: 21 сен 2025
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Команды сравнения

    CMPXCHG

    a

    CMPXCHG8B

    a

    CMPXCHG16B

     
    Последнее редактирование: 20 сен 2025
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Набор команд MMX

    EMMS

    Очистить контекст MMX

    MOVD

    Переслать 32 бита

    MOVQ

    Переслать 64 бита

    PACKSSDW

    Упаковать с насыщением двойные слова со знаком

    PACKSSWB

    Упаковать с насыщением слова со знаком

    PACKUSWB

    Упаковать с насыщением слова без знака

    PADDB

    Сложение упакованных байтов

    PADDD

    Сложение упакованных двойных слов

    PADDSB

    Сложение с насыщением знаковых упакованных байтов

    PADDSW

    Сложение с насыщением знаковых упакованных слов

    PADDUSB

    Сложение с насыщением беззнаковых упакованных байтов

    PADDUSW

    Сложение с насыщением беззнаковых упакованных слов

    PADDW

    Сложение упакованных слов

    PAND

    Логическое И

    PANDN

    Логическое НЕ-И

    PCMPEQB

    Сравнить упакованные байты (равны/не равны)

    PCMPEQD

    Сравнить упакованные двойные слова (равны/не равны)

    PCMPEQW

    Сравнить упакованные слова (равны/не равны)

    PCMPGTB

    Сравнить упакованные байты (больше/не больше)

    PCMPGTD

    Сравнить упакованные двойные слова (больше/не больше)

    PCMPGTW

    Сравнить упакованные слова (больше/не больше)

    PMADDWD

    Умножить и сложить знаковые упакованные слова

    PMULHW

    Умножить знаковые упакованные слова и выбрать старшие биты результата

    PMULLW

    Умножить знаковые упакованные слова и выбрать младшие биты результата

    POR

    Логическое ИЛИ

    PSLLD

    Логический сдвиг влево упакованных двойных слов

    PSLLQ

    Логический сдвиг влево учетверенного слова

    PSLLW

    Логический сдвиг влево упакованных слов

    PSRAD

    Арифметический сдвиг вправо упакованных двойных слов

    PSRAW

    Арифметический сдвиг вправо упакованных слов

    PSRLD

    Логический сдвиг вправо упакованных двойных слов

    PSRLQ

    Логический сдвиг вправо учетверенного слова

    PSRLW

    Логический сдвиг вправо упакованных слов

    PSUBB

    Вычитание упакованных байтов

    PSUBD

    Вычитание упакованных двойных слов

    PSUBSB

    Вычитание с насыщением упакованных знаковых байтов

    PSUBSW

    Вычитание с насыщением упакованных знаковых слов

    PSUBUSB

    Вычитание с насыщением упакованных беззнаковых байтов

    PSUBUSW

    Вычитание с насыщением упакованных беззнаковых слов

    PSUBW

    Вычитание упакованных слов

    PUNPCKHBW

    Распаковать старшие упакованные байты

    PUNPCKHDQ

    Распаковать старшие упакованные двойные слова

    PUNPCKHWD

    Распаковать старшие упакованные слова

    PUNPCKLBW

    Распаковать младшие упакованные байты

    PUNPCKLDQ

    Распаковать младшие упакованные двойные слова

    PUNPCKLWD

    Распаковать младшие упакованные слова

    PXOR

    Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
     
    Последнее редактирование: 20 сен 2025
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Набор команд 3DNow!

    FEMMS

    Очистить контекст MMX/3DNow!

    PAVGUSB

    Вычислить средние для упакованных беззнаковых байтов

    PF2ID

    Преобразовать упакованные короткие вещественные значения в упакованные целые двойные слова

    PFACC

    Упаковать с насыщением короткие вещественные значения

    PFADD

    Сложение с насыщением упакованных коротких вещественных значений

    PFCMPEQ

    Сравнить упакованные короткие вещественные значения (равны/не равны)

    PFCMPGE

    Сравнить упакованные короткие вещественные значения (больше либо равно/меньше)

    PFCMPGT

    Сравнить упакованные короткие вещественные значения (больше/не больше)

    PFMAX

    Выбрать наибольшие из упакованных коротких вещественных значений

    PFMIN

    Выбрать наименьшие из упакованных коротких вещественных значений

    PFMUL

    Умножение с насыщением коротких вещественных значений

    PFRCP

    Вычислить приблизительное значение обратной величины от короткого вещественного значения

    PFRCPIT1

    Произвести первый шаг итерации по вычислению точного значения обратной величины для короткого вещественного значения

    PFRCPIT2

    Произвести заключительный шаг итерации по вычислению точного значения обратной величины для короткого вещественного значения
     
    Последнее редактирование: 20 сен 2025
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Набор команд SIMD

    ADDPS

    Сложить упакованные короткие вещественные значения

    ADDSS

    Сложить одиночные короткие вещественные значения

    ANDNPS

    Логическое НЕ-И над 128-битными операндами

    ANDPS

    Логическое И над 128-битными операндами

    CMPPS

    Сравнить упакованные короткие вещественные значения

    CMPSS

    Сравнить одиночные короткие вещественные значения

    COMISS

    Сравнить упорядоченно одиночные короткие вещественные значения и установить EFLAGS по результатам сравнения

    CVTPI2PS

    Преобразовать упакованные знаковые целые двойные слова в упакованные короткие вещественные значения

    CVTPS2PI

    Преобразовать упакованные короткие вещественные значения в упакованные знаковые целые двойные слова

    CVTSI2SS

    Преобразовать одиночное знаковое двойное целое слово в одиночное короткое вещественное значение

    CVTSS2SI

    Преобразовать одиночное короткое вещественное значение в одиночное знаковое целое двойное слово

    CVTTPS2PI

    Преобразовать упакованные короткие вещественные значения в упакованные знаковые целые двойные слова без точного округления

    CVTTSS2SI

    Преобразовать одиночное короткое вещественное значение в одиночное знаковое целое двойное слово без точного округления

    DIVPS

    Делить упакованные короткие вещественные значения

    DIVSS

    Делить одиночные короткие вещественные значения

    LDMXCSR

    Загрузить регистр управления/статуса SIMD

    MASKMOVQ

    Переслать 64-битные данные из MMX-регистра с маскированием

    MAXPS

    Найти наибольшее для упакованных вещественных значений

    MAXSS

    Найти наибольшее для одиночных вещественных значений

    MINPS

    Найти наименьшее для упакованных вещественных значений

    MINSS

    Найти наименьшее для одиночных коротких вещественных значений

    MOVAPS

    Переслать выровненные упакованные короткие вещественные значения

    MOVHLPS

    Переслать два старших упакованных коротких вещественных значения в младшие

    MOVHPS

    Переслать два старших упакованных коротких вещественных значения в/из памяти

    MOVLHPS

    Пересылать два младших упакованных коротких вещественных значения в старшие

    MOVLPS

    Переслать два младших упакованных коротких вещественных значения в/из памяти

    MOVMSKPS

    Переслать маску состояния упакованных коротких вещественных значений в целочисленный регистр

    MOVNTPS

    Переслать выровненные упакованные короткие вещественные значения без использования
     
    Последнее редактирование: 20 сен 2025
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111

    Работа с флагами

    CLC/STC/CMC

    Очистить/установить/инвертировать флаг переноса (RFLAGS.CF/EFLAGS.CF/FLAGS.CF)

    CLI/STI

    Запретить внешние прерывания/разрешить внешние прерывания. Сброс/установка флага RFLAGS.IF/EFLAGS.IF/FLAGS.IF

    CLD/STD

    Очистить/установить флаг направления (RFLAGS.DF/EFLAGS.DF/FLAGS.DF)

    CLTS

    Очистить флаг переключения задач в регистре CR0
     
    Последнее редактирование: 20 сен 2025