Команды перемещения MOV XCHG LEA BSWAP Команды расширения CBW CWD CWDE CDQ CDQE CQO MOVSX MOVZX MOVSXD Арифметические команды ADD/ADC/XADD/LEA SUB/SBB/NEG/CMP IMUL/MUL/LEA DIV/IDIV INC/DEC Перекодирование XLAT Работа со стеком PUSH/POP PUHF/POPF LAHF/SAHF Строковые команды LODS STOS MOVS SCAS CMPS REP/REPZ/REPNZ CLD/STD INS/OUTS Логические команды AND OR NOT XOR TEST Сдвиговые команды SHL/SHR SHLD/SHRD RCL/RCR ROL/ROR SAL/SAR Работа с портами OUT/IN OUTS/INS Работа с битами BT BTC BTR BTS BSF Работа с флагами CLC/STC/CMC CLI/STI CLD/STD Передача управления JMP Условные команды JCC CMOVCC SETCC JRCXZ/JECXZ/JCXZ LOOP/LOOPE/LOOPE Команды для работы с процедурами CALL/RET INT/IRET SYSENTER/SYSEXIT ENTER/LEAVE Системные команды ARPL LOCK HLT NOP LAR INVLPG LGDT/SGDT LLDT/SLDT LIDT LMSW/SMSW LSL LTR/STR RDMSR/WRMSR RDPMC RDTSC RSM UD2 VERR VERW WBINVD CPUID Команды сравнения CMPXCHG CMPXCHG8B CMPXCHG16B CMP TEST Набор команд MMX EMMS MOVD MOVQ PACKSSDW PACKSSWB PACKUSWB PADDB PADDD PADDSB PADDSB PADDSW PADDUSB PADDUSW PADDW PAND PANDN PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW PMADDWD PMULHWPMULLW POR PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW PSUBB PSUBD PSUBSB PSUBSW PSUBUSB PSUBUSW PSUBW PUNPCKHBW PUNPCKHDQ PUNPCKHWD PUNPCKLBW PUNPCKLDQ PUNPCKLWD PXOR Набор команд 3DNow! FEMMS PAVGUSB PF2ID PFACC PFADD PFCMPEQ PFCMPGE PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1 PFRCPIT2 Набор команд SIMD ADDPS ADDSS ANDNPS ANDPS CMPPS CMPSS COMISS CVTPI2PS CVTPS2PI CVTSI2SS CVTSS2SI CVTTPS2PI CVTTSS2SI DIVPS
Команды перемещения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,reg2BSWAPКоманда BSWAP меняет порядок следования байтов 32-/64-битного регистра на противоположный. В случае использования команды BSWAP с атрибутом 16-битного размера операнда, результат, помещаемый в регистр назначения, не определен
Команды расширенияCBWКоманда CBW копирует знак (бит 7) регистра AL во все биты регистра AHCWDКоманда 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 бита) и сохраняет результат в регистре-назначении.
Арифметические команды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). SUBaSBBaIMULaMULaDIVaIDIVaCMPaNEGaINCaDECaXADDaLEAa
ПерекодированиеXLATКоманда XLAT, использует индекс из регистра AL, выбирает элемент из таблицы, расположенной в памяти по адресу RBX/EBX/BX, и помещает его в AL. Регистр AL должен содержать беззнаковый индекс элемента в таблице. Таблица адресуется регистром RBX/EBX/BX
Работа со стеком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 нельзя загрузить из стека сегментный регистр CSPUHF/POPFPUSHF и 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/SAHFa
Сдвиговые командыSHL/SHRaSHLD/SHRDaRCL/RCRaROL/RORaSAL/SARaSHLX/SHRXSARX/SHLX/SHRX — сдвиг без изменения флагов. Если значение, указанное в операнде источнике, превышает OperandSize -1, значение COUNT маскируется. Инструкции SARX, SHRX и SHLX не обновляют флаги.
Системные командыARPLaLOCKaHLTaNOPa LARaINVLPGaLGDT/SGDTaLLDT/SLDTaLIDTaLMSW/SMSWaLSLLTR/STRRDMSR/WRMSRRDPMCaRDTSCaRSMaUD2aVERRVERWaWBINVDaCPUID
Набор команд MMXEMMSОчистить контекст MMXMOVDПереслать 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Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ
Набор команд 3DNow!FEMMSОчистить контекст MMX/3DNow!PAVGUSBВычислить средние для упакованных беззнаковых байтовPF2IDПреобразовать упакованные короткие вещественные значения в упакованные целые двойные словаPFACCУпаковать с насыщением короткие вещественные значенияPFADDСложение с насыщением упакованных коротких вещественных значенийPFCMPEQСравнить упакованные короткие вещественные значения (равны/не равны)PFCMPGEСравнить упакованные короткие вещественные значения (больше либо равно/меньше)PFCMPGTСравнить упакованные короткие вещественные значения (больше/не больше)PFMAXВыбрать наибольшие из упакованных коротких вещественных значенийPFMINВыбрать наименьшие из упакованных коротких вещественных значенийPFMULУмножение с насыщением коротких вещественных значенийPFRCPВычислить приблизительное значение обратной величины от короткого вещественного значенияPFRCPIT1Произвести первый шаг итерации по вычислению точного значения обратной величины для короткого вещественного значенияPFRCPIT2Произвести заключительный шаг итерации по вычислению точного значения обратной величины для короткого вещественного значения
Набор команд SIMDADDPSСложить упакованные короткие вещественные значенияADDSSСложить одиночные короткие вещественные значенияANDNPSЛогическое НЕ-И над 128-битными операндамиANDPSЛогическое И над 128-битными операндамиCMPPSСравнить упакованные короткие вещественные значенияCMPSSСравнить одиночные короткие вещественные значенияCOMISSСравнить упорядоченно одиночные короткие вещественные значения и установить EFLAGS по результатам сравненияCVTPI2PSПреобразовать упакованные знаковые целые двойные слова в упакованные короткие вещественные значенияCVTPS2PIПреобразовать упакованные короткие вещественные значения в упакованные знаковые целые двойные словаCVTSI2SSПреобразовать одиночное знаковое двойное целое слово в одиночное короткое вещественное значениеCVTSS2SIПреобразовать одиночное короткое вещественное значение в одиночное знаковое целое двойное словоCVTTPS2PIПреобразовать упакованные короткие вещественные значения в упакованные знаковые целые двойные слова без точного округленияCVTTSS2SIПреобразовать одиночное короткое вещественное значение в одиночное знаковое целое двойное слово без точного округленияDIVPSДелить упакованные короткие вещественные значенияDIVSSДелить одиночные короткие вещественные значенияLDMXCSRЗагрузить регистр управления/статуса SIMDMASKMOVQПереслать 64-битные данные из MMX-регистра с маскированиемMAXPSНайти наибольшее для упакованных вещественных значенийMAXSSНайти наибольшее для одиночных вещественных значенийMINPSНайти наименьшее для упакованных вещественных значенийMINSSНайти наименьшее для одиночных коротких вещественных значенийMOVAPSПереслать выровненные упакованные короткие вещественные значенияMOVHLPSПереслать два старших упакованных коротких вещественных значения в младшиеMOVHPSПереслать два старших упакованных коротких вещественных значения в/из памятиMOVLHPSПересылать два младших упакованных коротких вещественных значения в старшиеMOVLPSПереслать два младших упакованных коротких вещественных значения в/из памятиMOVMSKPSПереслать маску состояния упакованных коротких вещественных значений в целочисленный регистрMOVNTPSПереслать выровненные упакованные короткие вещественные значения без использования
Работа с флагамиCLC/STC/CMCОчистить/установить/инвертировать флаг переноса (RFLAGS.CF/EFLAGS.CF/FLAGS.CF)CLI/STIЗапретить внешние прерывания/разрешить внешние прерывания. Сброс/установка флага RFLAGS.IF/EFLAGS.IF/FLAGS.IFCLD/STDОчистить/установить флаг направления (RFLAGS.DF/EFLAGS.DF/FLAGS.DF)CLTSОчистить флаг переключения задач в регистре CR0