Jump to content

списки инструкций x86

(Перенаправлено из MOV (инструкция x86) )

Набор x86 инструкций относится к набору инструкций, которые поддерживают x86 -совместимые микропроцессоры . Инструкции обычно являются частью исполняемой программы, часто хранятся в виде компьютерного файла и выполняются процессором.

Набор команд x86 несколько раз расширялся, вводя более широкие регистры и типы данных, а также новые функциональные возможности. [1]

целочисленные инструкции x86

[ редактировать ]

Ниже приведен полный . ( набор инструкций Intel 8086/8088 всего 81 инструкция) [2] Эти инструкции также доступны в 32-битном режиме, вместо этого они работают с 32-битными регистрами ( eax , ebx и т. д.) и значениями вместо своих 16-битных ( ax , bx аналогов и т. д.). Обновленный набор команд сгруппирован по архитектуре ( i186 , i286 , i386 , i486 , i586 / i686 ) и называется (32-битный) x86 и (64-битный) x86-64 (также известный как AMD64 ).

Оригинальные инструкции 8086/8088

[ редактировать ]

Это оригинальный набор инструкций. В столбце «Примечания» r означает регистр , m означает адрес памяти , а imm означает немедленное (т. е. значение).

Оригинальный набор команд 8086/8088.
В-
структура-
ция
Значение Примечания Код операции
ААА ASCII корректирует AL после добавления используется с распакованным двоично-десятичным числом 0x37
ААД ASCII корректирует AX перед делением В таблице данных 8086/8088 документирована только версия инструкции AAD по основанию 10 ( код операции 0xD5 0x0A ), но подойдет любая другая база. Более поздняя документация Intel также имеет общую форму. NEC V20 и V30 (и, возможно, другие процессоры NEC серии V) всегда используют десятичную систему счисления и игнорируют аргумент, что приводит к ряду несовместимостей. 0xD5
ААМ ASCII корректирует AX после умножения Документирована только версия с основанием 10 (операнд 0xA), см. примечания для AAD. 0xD4
ААС ASCII корректирует AL после вычитания 0x3F
АЦП Добавить с переносом destination = destination + source + carry_flag 0x10 ... 0x15 , 0х80 ... 0x81/2 , 0x82 ... 0x83/2 (186+)
ДОБАВЛЯТЬ Добавлять (1) r/m += r/imm; (2) r += r/imm; 0x00 ... 0x05 , 0x80/0 ... 0x81/0 , 0x82/0 ... 0x83/0 (186+)
И Логическое И (1) r/m &= r/imm; (2) r &= r/imm; 0x20 ... 0x25 , 0х80 ... 0x81/4 , 0x82 ... 0x83/4 (186+)
ВЫЗОВ Процедура вызова push eip; eip points to the instruction directly after the call 0x9А , 0xE8 , 0xFF/2 , 0xFF/3
ХБВ Преобразовать байт в слово 0x98
ЦЛК Очистить флаг переноса CF = 0; 0xF8
CLD Очистить флаг направления DF = 0; 0xFC
интерфейс командной строки Очистить флаг прерывания IF = 0; 0xFA
КМЦ Дополняющий флаг переноса 0xF5
КМП Сравнить операнды 0x38 ... 0x3D , 0х80 ... 0x81/7 , 0x82 ... 0x83/7 (186+)
CMPSB Сравнить байты в памяти. Может использоваться с РЕПЕ или Префикс REPNE для проверки и повторения инструкции СХ раз. 0xA6
CMPSW Сравните слова. Может использоваться с РЕПЕ или Префикс REPNE для проверки и повторения инструкции СХ раз. 0xA7
УВП Преобразовать слово в двойное слово 0x99
ДАА Десятичная настройка AL после сложения (используется с упакованным двоично-десятичным числом ) 0x27
ТО Десятичная настройка AL после вычитания 0x2F
Декабрь Уменьшить на 1 0x48 ... 0x4F , 0xFE/1 , 0xFF/1
ДИВ Беззнаковое деление (1) AX = DX:AX / r/m; в результате DX = remainder (2) AL = AX / r/m; в результате AH = remainder 0xF7/6 , 0xF6/6
ЭКУ Используется с модулем с плавающей запятой 0xD8 .. 0xDF
HLT Войти в состояние остановки 0xF4
ИДИВ Знаковое разделение (1) AX = DX:AX / r/m; в результате DX = remainder (2) AL = AX / r/m; в результате AH = remainder 0xF7/7 , 0xF6/7
ИМУЛ Знаковое умножение в форме с одним операндом (1) DX:AX = AX * r/m; (2) AX = AL * r/m 0x69 , 0x6B (оба 186+), 0xF7/5 , 0xF6/5 , 0x0FAF (386+)
В Ввод из порта (1) AL = port[imm]; (2) AL = port[DX]; (3) AX = port[imm]; (4) AX = port[DX]; 0xE4 , 0xE5 , 0xEC , 0xED
ИНК Увеличение на 1 0x40 ... 0x47 , 0xFE/0 , 0xFF/0
ИНТ. Позвоните, чтобы прервать 0xCC , 0xCD
В Вызов для прерывания в случае переполнения 0xCE
Он пойдет Возврат из прерывания 0xCF
JCC Перейти, если условие ( JA, JAE, JB, JBE, JC, JE, JG, JNB, JL, JN, JNA, JNAE, JNB, JNBE, JNC, JN, JNP, JNS, JNZ, JO, (JP, JPE, JPO, JS, JZ ) 0x70 ... 0x7F , 0x0F80 ... 0x0F8F (386+)
JCXZ Перейти, если CX равен нулю 0xE3
СПМ Прыжок 0xE9 ... 0xEB , 0xFF/4 , 0xFF/5
ЛАХФ Загрузить ФЛАГИ в регистр AH 0x9F
СПД Загрузить DS:r с дальним указателем 0xC5
ЧТО Загрузить эффективный адрес 0x8D
ТО Загрузите ES:r с дальним указателем 0xC4
ЗАМОК Подтверждение сигнала BUS LOCK# (для многопроцессорной обработки) 0xF0
ЛОДСБ Загрузить байт строки. Может использоваться с Префикс REP для повторения инструкции СХ раз. if (DF==0) AL = *SI++; else AL = *SI--; 0xAC
ЛОДШВ Загрузить строковое слово. Может использоваться с Префикс REP для повторения инструкции СХ раз. if (DF==0) AX = *SI++; else AX = *SI--; 0xAD
ПЕТЛЯ /
LOOPx
Контурное управление ( ПЕТЛЯ, ПЕТЛЯ, ПЛЮПНЗ, ПЕТЛЯ ) if (x && --CX) goto lbl; 0xE0 ... 0xE2
МОВ Двигаться копирует данные из одного места в другое, (1) r/m = r; (2) r = r/m; 0xA0 ... 0xA3
МОВСБ Переместить байт из строки в строку. Может использоваться с Префикс REP для повторения инструкции СХ раз.
if (DF==0) *(byte*)DI++ = *(byte*)SI++;
else       *(byte*)DI-- = *(byte*)SI--;
.
0xA4
МОВСВ Переместить слово из строки в строку. Может использоваться с Префикс REP для повторения инструкции СХ раз.
if (DF==0) *(word*)DI++ = *(word*)SI++;
else       *(word*)DI-- = *(word*)SI--;
0xA5
У меня есть Беззнаковое умножение (1) DX:AX = AX * r/m; (2) AX = AL * r/m; 0xF7/4 , 0xF6/4
НЕГ дополнения до двух Отрицание r/m = 0 r/m; 0xF6/3 ... 0xF7/3
НЕТ Нет операции код операции, эквивалентный XCHG EAX, EAX 0x90
НЕТ Отменить операнд, логическое НЕ r/m ^= -1; 0xF6/2 ... 0xF7/2
ИЛИ Логическое ИЛИ (1) r/m (2) r 0x08 ... 0x0D , 0х80 ... 0x81/1 , 0x82 ... 0x83/1 (186+)
ВНЕ Вывод в порт (1) port[imm] = AL; (2) port[DX] = AL; (3) port[imm] = AX; (4) port[DX] = AX; 0xE6 , 0xE7 , 0xEE , 0xEF
ПОП Извлечение данных из стека r/m = *SP++; POP CS (код операции 0x0F ) работает только на 8086/8088. Более поздние процессоры используют 0x0F в качестве префикса для новых инструкций. 0x07 , 0x0F (только 8086/8088), 0x17 , 0x1F , 0x58 ... 0x5F , 0x8F/0
ПОПФ Извлечь регистр FLAGS из стека FLAGS = *SP++; 0x9D
ТОЛКАТЬ Поместите данные в стек *--SP = r/m; 0x06 , 0x0E , 0x16 , 0x1E , 0x50 ... 0x57 , 0x68 , 0x6A (оба 186+), 0xFF/6
ПУШФ Поместить ФЛАГИ в стек *--SP = FLAGS; 0x9C
РКЛ Поворот влево (с переносом) 0xC0 ... 0xC1/2 (186+), 0xD0 ... 0xD3/2
РЦР Поворот вправо (с переносом) 0xC0 ... 0xC1/3 (186+), 0xD0 ... 0xD3/3
РЕПхх Повторите MOVS/STOS/CMPS/LODS/SCAS. ( РЭП, РЕПЕ, РЕПНЕ, РЕПНЗ, РЕПЗ ) 0xF2 , 0xF3
ВЕРНО Возврат из процедуры Не настоящая инструкция. Ассемблер преобразует их в RETN или RETF в зависимости от модели памяти целевой системы.
РЕТЕН Возврат с ближайшей процедуры 0xC2 , 0xC3
РЕТФ Процедура возврата издалека 0xCA , 0xCB
РОЛЬ Повернуть влево 0xC0 ... 0xC1/0 (186+), 0xD0 ... 0xD3/0
РОР Повернуть вправо 0xC0 ... 0xC1/1 (186+), 0xD0 ... 0xD3/1
САХФ Сохраните AH во ФЛАГАХ 0x9E
ДОЛЖЕН Сдвиг Арифметически влево (знаковый сдвиг влево) (1) r/m <<= 1; (2) r/m <<= CL; 0xC0 ... 0xC1/4 (186+), 0xD0 ... 0xD3/4
САР Сдвиг Арифметически вправо (знаковый сдвиг вправо) (1) (signed) r/m >>= 1; (2) (signed) r/m >>= CL; 0xC0 ... 0xC1/7 (186+), 0xD0 ... 0xD3/7
СББ Вычитание с заимствованием альтернативная 1-байтовая кодировка SBB AL, AL доступен через недокументированную инструкцию SALC 0x18 ... 0x1D , 0х80 ... 0x81/3 , 0x82 ... 0x83/3 (186+)
СКАСБ Сравните строку байтов. Может использоваться с РЕПЕ или Префикс REPNE для проверки и повторения инструкции СХ раз. 0xAE
СКАСВ Сравните строку слов. Может использоваться с РЕПЕ или Префикс REPNE для проверки и повторения инструкции СХ раз. 0xAF
ШЛ Сдвиг влево (беззнаковый сдвиг влево) 0xC0 ... 0xC1/4 (186+), 0xD0 ... 0xD3/4
ШР Сдвиг вправо (беззнаковый сдвиг вправо) 0xC0 ... 0xC1/5 (186+), 0xD0 ... 0xD3/5
СТЦ Установить флаг переноса CF = 1; 0xF9
СТД Установить флаг направления DF = 1; 0xFD
НТИ Установить флаг прерывания IF = 1; 0xFB
СТОСБ Сохраните байт в строке. Может использоваться с Префикс REP для повторения инструкции СХ раз. if (DF==0) *ES:DI++ = AL; else *ES:DI-- = AL; 0xAA
СТОСВ Сохраните слово в строке. Может использоваться с Префикс REP для повторения инструкции СХ раз. if (DF==0) *ES:DI++ = AX; else *ES:DI-- = AX; 0xAB
СУБ Вычитание (1) r/m -= r/imm; (2) r -= m/imm; 0x28 ... 0x2D , 0х80 ... 0x81/5 , 0x82 ... 0x83/5 (186+)
ТЕСТ Логическое сравнение (И) (1) r/m & r/imm; (2) r & m/imm; 0x84 , 0x85 , 0xA8 , 0xA9 , 0xF6/0 , 0xF7/0
ЖДАТЬ Подождите, пока не будет занято Ожидает, пока контакт BUSY# не станет неактивным (используется с модулем с плавающей запятой ) 0x9B
XCHG Обмен данными r :=: r/m; обычно Спин-блокировка использует xchg в качестве атомарной операции . ( ошибка комы ). 0x86 , 0x87 , 0x91 ... 0x97
XLAT Перевод таблицы поиска ведет себя как MOV AL, [BX+AL] 0xD7
БЕСПЛАТНО Эксклюзивное ИЛИ (1) r/m ^= r/imm; (2) r ^= m/imm; 0х30 ... 0x35 , 0х80 ... 0x81/6 , 0x82 ... 0x83/6 (186+)

Добавлено в определенные процессоры

[ редактировать ]
Инструкция Код операции Значение Примечания
ГРАНИЦА 62 Проверить индекс массива на соответствие границам вызывает программное прерывание 5, если тест не пройден
ВХОДИТЬ С8 один Введите кадр стека Изменяет стек для входа в процедуру для языка высокого уровня. Принимает два операнда: объем памяти, выделяемый в стеке, и уровень вложенности процедуры.
ИНСБ/ИНСВ Ввод из порта в строку. Может использоваться с префиксом REP для повторения инструкции CX раз. эквивалентно:
IN AL, DX
MOV ES:[DI], AL
INC DI ; adjust DI according to operand size and DF
ОСТАВЛЯТЬ С9 Выйти из стекового фрейма Освобождает локальное хранилище стека, созданное предыдущей инструкцией ENTER.
ОУТСБ/ОУТСВ Вывод строки в порт. Может использоваться с префиксом REP для повторения инструкции CX раз. эквивалентно:
MOV AL, DS:[SI]
OUT DX, AL
INC SI ; adjust SI according to operand size and DF
6F
ПОП 61 Извлечь все регистры общего назначения из стека эквивалентно:
POP DI
POP SI
POP BP
POP AX ; no POP SP here, all it does is ADD SP, 2 (since AX will be overwritten later)
POP BX
POP DX
POP CX
POP AX
ПУША 60 Поместите все регистры общего назначения в стек. эквивалентно:
PUSH AX
PUSH CX
PUSH DX
PUSH BX
PUSH SP ; The value stored is the initial SP value
PUSH BP
PUSH SI
PUSH DI
НАЖМИТЕ немедленно иб Поместите немедленное значение байта/слова в стек. пример:
PUSH 12h
PUSH 1200h
68 лет
ИМУЛ немедленно /р иб Знаковое и беззнаковое умножение непосредственного значения байта/слова пример:
IMUL BX,12h
IMUL DX,1200h
IMUL CX, DX, 12h
IMUL BX, SI, 1200h
IMUL DI, word ptr [BX+SI], 12h
IMUL SI, word ptr [BP-4], 1200h

Обратите внимание: поскольку нижняя половина одинакова для беззнакового и знакового умножения, эту версию инструкции можно использовать и для беззнакового умножения.

69 /р ив
SHL/SHR/SAL/SAR/ROL/ROR/RCL/RCR немедленно С0 Поворот/сдвиг битов с непосредственным значением больше 1 пример:
ROL AX,3
SHR BL,3
С1

Добавлено с 80286

[ редактировать ]

Новые инструкции, добавленные в 80286, добавляют поддержку защищенного режима x86 . Некоторые, но не все инструкции доступны в реальном режиме и .

Инструкция Код операции Описание инструкции Реальный режим Кольцо
LGDT m16&32[а] 0F 01 /2 Загрузите GDTR ( регистр глобальной таблицы дескрипторов ) из памяти. [б] Да 0
LIDT m16&32[а] 0F 01 /3 Загрузите IDTR (регистр таблицы дескрипторов прерываний) из памяти. [б]
IDTR контролирует не только адрес/размер IDT ( таблицы дескрипторов прерываний ) в защищенном режиме , но и IVT (таблицу векторов прерываний) в реальном режиме .
LMSW r/m16 0F 01 /6 Загрузите MSW (слово состояния машины) из 16-битного регистра или памяти. [б] [с]
CLTS 0F 06 Снимите флаг переключения задач в MSW.
LLDT r/m16 0F 00 /2 Загрузите LDTR (регистр таблицы локальных дескрипторов) из 16-битного регистра или памяти. [б] #ВНЕ
LTR r/m16 0F 00 /3 Загрузите TR (регистр задачи) из 16-битного регистра или памяти. [б]

TSS ( сегмент состояния задачи ), указанный 16-битным аргументом, помечен как занятой, но переключение задачи не выполняется.

SGDT m16&32[а] 0F 01 /0 Сохраните GDTR в памяти. Да Обычно 3 [д]
SIDT m16&32[а] 0F 01 /1 Сохраните IDTR в памяти.
SMSW r/m16 0F 01 /4 Храните MSW в регистре или в 16-битной памяти. [и]
SLDT r/m16 0F 00 /0 Храните LDTR в регистре или 16-битной памяти. [и] #ВНЕ
STR r/m16 0F 00 /1 Сохраните TR в регистр или 16-битную память. [и]
ARPL r/m16,r16 63 /r[ф] Отрегулируйте поле RPL (запрошенный уровень привилегий ) селектора. Выполняемая операция:
if (dst & 3) < (src & 3) then
   dst = (dst & 0xFFFC) | (src & 3)
   eflags.zf = 1
else
   eflags.zf = 0
#ВНЕ [г] 3
LAR r,r/m16 0F 02 /r Загрузить байт прав доступа из указанного дескриптора сегмента .
Считывает байты 4–7 дескриптора сегмента, выполняет побитовое И с 0x00FxFF00, [час] затем сохраняет нижние 16/32 бита результата в регистре назначения. Устанавливает EFLAGS .ZF=1, если дескриптор может быть загружен, в противном случае ZF=0.
#ВНЕ
LSL r,r/m16 0F 03 /r Загрузить ограничение сегмента из указанного дескриптора сегмента. Устанавливает ZF=1, если дескриптор может быть загружен, и ZF=0 в противном случае.
VERR r/m16 0F 00 /4 Проверьте сегмент на чтение. Устанавливает ZF=1, если сегмент можно прочитать, и ZF=0 в противном случае.
VERW r/m16 0F 00 /5 Проверьте сегмент на запись. Устанавливает ZF=1, если сегмент можно записать, и ZF=0 в противном случае. [я]
 ЗАГРУЗИТЬ [Дж] 0Ф 05 Загрузите все регистры ЦП из 102-байтовой структуры данных, начиная с физического адреса. 800h, включая «скрытую» часть регистров дескриптора сегмента. Да 0
МАГАЗИН [Дж] Ф1 0Ф 04 Сохраните все регистры ЦП в 102-байтовой структуре данных, начиная с физического адреса. 800h, затем выключите процессор.
  1. ^ Jump up to: а б с д Дескрипторы, используемые LGDT, LIDT, SGDT и SIDT инструкции состоят из структуры данных, состоящей из двух частей. Первая часть — это 16-битное значение, определяющее размер таблицы в байтах минус 1. Вторая часть — 32-битное значение (64-битное значение в 64-битном режиме), определяющее линейный начальный адрес таблицы.
    Для LGDT и LIDT при размере операнда 16 бит адрес объединяется с помощью AND с 00FFFFFFh. На процессорах Intel (но не AMD) SGDT и SIDT инструкции с 16-битным размером операнда (начиная с версии Intel SDM 079, март 2023 г. ) документированы для записи дескриптора в память, причем последний байт установлен в 0. Однако наблюдаемое поведение заключается в том, что биты 31:24 таблицы дескрипторов Вместо этого пишется адрес. [3]
  2. ^ Jump up to: а б с д и The LGDT, LIDT, LLDT, LMSW и LTR инструкции сериализуются на процессорах Pentium и более поздних версиях.
  3. ^ В версии 80386 и более поздних версиях «Слово состояния машины» совпадает с управляющим регистром CR0 , однако LMSW Инструкция может изменять только нижние 4 бита этого регистра и не может очистить бит 0. Невозможность очистить бит 0 означает, что LMSW может использоваться для входа в защищенный режим x86, но не выхода из него .
    На 80286 вообще невозможно выйти из Защищенного режима (ни с LMSW ни с LOADALL[4] ) без перезагрузки ЦП – на 80386 и новее можно выйти из защищенного режима, но для этого необходимо использовать версию 80386 и новее. MOV к CR0 инструкция.
  4. ^ Если CR4.UMIP=1 установлено, то SGDT, SIDT, SLDT, SMSW и STR инструкции могут выполняться только в кольце 0.
    Эти инструкции были непривилегированы на всех процессорах x86, начиная с 80286 и далее до появления UMIP в 2017 году. [5] Это было серьезной проблемой безопасности для программной виртуализации, поскольку она позволяет гостю виртуальной машины использовать эти инструкции для обнаружения того, что он работает внутри виртуальной машины. [6] [7]
  5. ^ Jump up to: а б с The SMSW, SLDT и STR инструкции всегда используют размер операнда 16 бит при использовании с аргументом памяти. При использовании аргумента регистра на процессорах 80386 или более поздних версий доступны более широкие размеры целевых операндов, которые ведут себя следующим образом:
    • SMSW: Сохраняет полный CR0 в длинном режиме x86-64 , в противном случае не определено.
    • SLDT: Нулевое расширение 16-битного аргумента на процессорах Pentium Pro и более поздних версиях, неопределенное на более ранних процессорах.
    • STR: Ноль расширяет 16-битный аргумент.
  6. ^ В 64-битном длинном режиме ARPL инструкция недоступна – 63 /r код операции был переназначен только для 64-битного режима MOVSXD инструкция.
  7. ^ ARPL Инструкция вызывает #UD в реальном режиме и виртуальном режиме 8086. Известно, что Windows 95 и OS/2 2.x широко используют этот #UD для использования 63 код операции в качестве однобайтовой точки останова для перехода из виртуального режима 8086 в режим ядра. [8] [9]
  8. ^ Биты 19:16 этой маски задокументированы как «неопределенные» на процессорах Intel. [10] На процессорах AMD маска документируется как 0x00FFFF00.
  9. ^ В некоторых комбинациях процессоров Intel и микрокода, начиная с 2019 г., VERW Инструкция также очищает буферы микроархитектурных данных. Это позволяет использовать его как часть обходных путей для уязвимостей безопасности микроархитектурной выборки данных . [11] [12]
  10. ^ Jump up to: а б Недокументировано, только 80286. [4] [13] [14] (Другой вариант LOADALL с другим кодом операции и расположением памяти существует на 80386.)

Добавлено с 80386

[ редактировать ]

В 80386 добавлена ​​поддержка 32-битных операций в набор инструкций x86. Это было достигнуто за счет расширения регистров общего назначения до 32 бит и введения концепций OperandSize и AddressSize – большинству форм команд, которые ранее принимали 16-битные аргументы данных, была предоставлена ​​возможность принимать 32-битные аргументы, установив для их OperandSize значение 32. бит, а инструкции, которые могли принимать 16-битные аргументы адреса, получили возможность принимать 32-битные аргументы адреса, установив для их AddressSize значение 32 бита. (Формы команд, которые работают с 8-битными данными, продолжают оставаться 8-битными независимо от OperandSize. Использование размера данных в 16 бит приведет к изменению только нижних 16 бит 32-битных регистров общего назначения – верхних 16. биты остаются неизменными.)

Значения OperandSize и AddressSize по умолчанию, используемые для каждой инструкции, задаются битом D дескриптора сегмента текущего сегмента кода — D=0 делает оба 16-битными, D=1 делает оба 32-битными. Кроме того, их можно переопределить для каждой инструкции с помощью двух новых префиксов инструкций, которые были представлены в 80386:

  • 66h: переопределение OperandSize. Изменит OperandSize с 16-битного на 32-битный, если CS.D=0или с 32-битной на 16-битную, если CS.D=1.
  • 67h: переопределение AddressSize. Изменит AddressSize с 16-битного на 32-битный, если CS.D=0или с 32-битной на 16-битную, если CS.D=1.

В 80386 также представлены два новых сегментных регистра. FS и GS а также регистры управления , отладки и тестирования x86 .

Новые инструкции, представленные в 80386, можно условно разделить на два класса:

  • Ранее существовавшие коды операций, которым требовалась новая мнемоника для их 32-битных вариантов OperandSize (например, CWDE, LODSD)
  • Новые коды операций, которые представили новую функциональность (например, SHLD, SETcc)

Для форм инструкций, в которых размер операнда можно определить по аргументам инструкции (например, ADD EAX,EBX можно предположить, что OperandSize имеет 32-битный размер из-за использования EAX в качестве аргумента), новая мнемоника инструкций не требуется и не предоставляется.

80386: новая мнемоника инструкций для 32-битных вариантов старых кодов операций.
Тип Мнемоника инструкций Код операции Описание Мнемоника для старого 16-битного варианта Кольцо
Строковые инструкции [а] [б] LODSD AD Загрузить двойное слово строки: EAX := DS:[rSI±±] LODSW 3
STOSD AB Сохраните двойное слово строки: ES:[rDI±±] := EAX STOSW
MOVSD A5 Переместить двойное слово строки: ES:[rDI±±] := DS:[rSI±±] MOVSW
CMPSD A7 Сравните двойное слово строки:
temp1 := DS:[rSI±±]
temp2 := ES:[rDI±±]
CMP temp1, temp2 /* 32-bit compare and set EFLAGS */
CMPSW
SCASD AF Сканировать двойное слово строки:
temp1 := ES:[rDI±±]
CMP EAX, temp1 /* 32-bit compare and set EFLAGS */
SCASW
INSD 6D Входная строка из порта ввода-вывода с двойным словом: ES:[rDI±±] := port[DX][с] INSW Обычно 0 [д]
OUTSD 6F Выходная строка в порт ввода-вывода с двойным словом: port[DX] := DS:[rSI±±] OUTSW
Другой CWDE 98 Расширение знака 16-битного значения в AX до 32-битного значения в EAX [и] CBW 3
CDQ 99 Подписать-расширить 32-битное значение в EAX до 64-битного значения в EDX:EAX.

В основном используется для подготовки дивидендов для 32-битной версии. IDIV (подписанное разделение) инструкция.

CWD
JECXZ rel8 E3 cb[ф] Перейти, если ECX равен нулю JCXZ
PUSHAD 60 Поместите все 32-битные регистры в стек. [г] PUSHA
POPAD 61 Извлечь из стека все 32-битные регистры общего назначения. [час] POPA
PUSHFD 9C Поместите 32-битный регистр E FLAGS в стек. PUSHF Обычно 3 [я]
POPFD 9D Извлечение 32-битного регистра EFLAGS из стека POPF
IRETD CF Возврат 32-битного прерывания. Отличается от старой 16-битной версии. IRET инструкция в том, что она извлекает элементы возврата прерывания (EIP,CS,EFLAGS; также ESP [Дж] и SS при изменении CPL ) из стека как 32-битные элементы вместо 16-битных. Должен использоваться для возврата из прерываний, когда обработчик прерывания был введен через 32-битный шлюз прерывания/ловушки IDT .

Инструкция сериализуется.

IRET
  1. ^ Для 32-битных строковых инструкций обозначение ±± используется для обозначения того, что указанный регистр пост-декрементируется на 4, если EFLAGS.DF=1 и в противном случае увеличивается на 4.
    Для операндов, в которых указан сегмент DS, сегмент DS может быть переопределен префиксом переопределения сегмента – если указан сегмент ES, сегмент всегда является ES и не может быть переопределен.
    Выбор использования в качестве адресных регистров 16-битных регистров SI/DI или 32-битных регистров ESI/EDI осуществляется параметром AddressSize, который можно переопределить с помощью параметра AddressSize. 67 префикс.
  2. ^ 32-битные строковые инструкции принимают префиксы повторения так же, как и старые 8/16-битные строковые инструкции.
    Для LODSD, STOSD, MOVSD, INSD и OUTSD, REP префикс ( F3) будет повторять инструкцию количество раз, указанное в rCX (CX или ECX, определяется AddressSize), уменьшая rCX для каждой итерации (при этом rCX=0 приводит к остановке операции и переходу к следующей инструкции).
    Для CMPSD и SCASD, REPE ( F3) и REPNE ( F2) доступны префиксы, которые будут повторять инструкцию, но только до тех пор, пока условие флага (ZF=1 для REPE, ZF=0 для REPNE) соответствует действительности.
  3. ^ Для INSB/W/D инструкции, права доступа к памяти для ES:[rDI] адрес памяти может не проверяться до тех пор, пока не будет выполнен доступ к порту – если эта проверка не удалась (например, ошибка страницы или другое исключение памяти), то элемент данных, считанный из порта, будет потерян. Таким образом, не рекомендуется использовать эту инструкцию для доступа к порту ввода-вывода, который при чтении выполняет какой-либо побочный эффект.
  4. ^ Доступ к порту ввода-вывода разрешен только в том случае, если CPL≤IOPL или биты битовой карты разрешения порта ввода-вывода для порта, к которому осуществляется доступ, установлены на 0.
  5. ^ CWDE инструкция отличается от старой CWD инструкция в этом CWD расширил бы 16-битное значение в AX до 32-битного значения в паре регистров DX:AX.
  6. ^ Для E3 код операции ( JCXZ/ JECXZ), выбор того, будет ли инструкция использовать CX или ECX для его сравнения (и, следовательно, какой мнемоники использовать) основано на AddressSize, а не OperandSize. (Вместо этого OperandSize определяет, следует ли усекать место назначения перехода до 16 бит или нет).
    Это также относится к инструкциям цикла. LOOP, LOOPE, LOOPNE (коды операций E0, E1, E2), однако, в отличие от JCXZ/ JECXZ, этим инструкциям не была присвоена новая мнемоника для их вариантов с использованием ECX.
  7. ^ Для PUSHA(D), значение SP/ESP, помещенное в стек, — это значение, которое оно имело непосредственно перед PUSHA(D) инструкция начала выполняться.
  8. ^ Для POPA/ POPAD, элемент стека, соответствующий SP/ESP, извлекается из стека (выполняется чтение памяти), но не помещается в SP/ESP.
  9. ^ PUSHFD и POPFD инструкции вызовут исключение #GP, если они выполняются в виртуальном режиме 8086 , если IOPL не равен 3.
    The PUSHF, POPF, IRET и IRETD инструкции вызовут исключение #GP при выполнении в режиме Virtual-8086, если IOPL не равен 3 и VME не включен.
  10. ^ Если IRETD используется для возврата из режима ядра в пользовательский режим (что повлечет за собой изменение CPL), а сегмент стека пользовательского режима , указанный SS, является 16-битным сегментом, тогда IRETD Инструкция восстановит только младшие 16 бит указателя стека (ESP/RSP), а остальные биты сохранят то значение, которое они имели в коде ядра до IRETD. Это потребовало сложных обходных решений как для Linux («ESPFIX»), так и для Linux. [15] и Windows. [16] Эта проблема также затрагивает более поздние 64-битные версии. IRETQ инструкция.
80386: представлены новые коды операций.
Мнемоника инструкций Код операции Описание Кольцо
BT r/m, r 0F A3 /r Битовый тест . [а]

Второй операнд указывает, какой бит первого операнда необходимо проверить. Бит для проверки копируется в EFLAGS . КФ .

3
BT r/m, imm8 0F BA /4 ib
BTS r/m, r 0F AB /r Бит Проверка и установка . [а] [б]

Второй операнд указывает, какой бит первого операнда необходимо проверить и установить.

BTS r/m, imm8 0F BA /5 ib
BTR r/m, r 0F B3 /r Проверка битов и сброс. [а] [б]

Второй операнд указывает, какой бит первого операнда необходимо проверить и очистить.

BTR r/m, imm8 0F BA /6 ib
BTC r/m, r 0F BB /r Битовая проверка и дополнение. [а] [б]

Второй операнд указывает, какой бит первого операнда необходимо проверить и переключить.

BTC r/m, imm8 0F BA /7 ib
BSF r, r/m NFx 0F BC /r[с] Битовое сканирование вперед. Возвращает битовый индекс самого младшего установленного бита во входных данных. [д] 3
BSR r, r/m NFx 0F BD /r[и] Побитовое сканирование в обратном направлении. Возвращает битовый индекс старшего установленного бита на входе. [д]
SHLD r/m, r, imm8 0F A4 /r ib Сдвиг влево, двойной.
Операция SHLD arg1,arg2,shamt является:
arg1 := (arg1<<shamt) | (arg2>>(operand_size - shamt))[ф]
SHLD r/m, r, CL 0F A5 /r
SHRD r/m, r, imm8 0F AC /r ib Сдвиг вправо, двойной.
Операция SHRD arg1,arg2,shamt является:
arg1 := (arg1>>shamt) | (arg2<<(operand_size - shamt))[ф]
SHRD r/m, r, CL 0F AD /r
MOVZX reg, r/m8 0F B6 /r Переход от 8/16-битного источника к 16/32-битному регистру с нулевым расширением. 3
MOVZX reg, r/m16 0F B7 /r
MOVSX reg, r/m8 0F BE /r Перейдите от 8/16-битного источника к 16/32/64-битному регистру с помощью знака-расширения .
MOVSX reg, r/m16 0F BF /r
SETcc r/m8 0F 9x /0[г] [час] Установите байт в 1, если условие выполнено, в противном случае — в 0.
Jcc rel16
Jcc rel32
0F 8x cw
0F 8x cd[г]
Условный прыжок рядом.

Отличается от старых вариантов условных переходов тем, что они принимают 16/32-битное смещение, а не только 8-битное смещение.

IMUL r, r/m 0F AF /r Целочисленное умножение без расширения с двумя операндами.
FS: 64 Префиксы переопределения сегментов для регистров сегментов FS и GS. 3
GS: 65
PUSH FS 0F A0 Push/pop регистры сегментов FS и GS.
POP FS 0F A1
PUSH GS 0F A8
POP GS 0F A9
LFS r16, m16&16
LFS r32, m32&16
0F B4 /r Загрузить дальний указатель из памяти.

Часть смещения сохраняется в аргументе регистра назначения, часть сегмента — в регистре сегмента FS/GS/SS, как указано в мнемонике инструкции. [я]

LGS r16, m16&16
LGS r32, m32&16
0F B5 /r
LSS r16, m16&16
LSS r32, m32&16
0F B2 /r
MOV reg,CRx 0F 20 /r[Дж] Переход из контрольного регистра в общий регистр. [к] 0
MOV CRx,reg 0F 22 /r[Дж] Переход из общего регистра в контрольный регистр. [к]

На процессорах Pentium и более поздних версиях переход к CR0, CR3 и CR4 Регистры управления сериализуются. [л]

MOV reg,DRx 0F 21 /r[Дж] Перейдите из регистра отладки x86 в общий регистр. [к]
MOV DRx,reg 0F 23 /r[Дж] Перейдите из общего регистра в регистр отладки x86. [к]

На процессорах Pentium и более поздних версиях переходы к регистрам отладки DR0-DR7 выполняются сериализацией.

MOV reg,TRx 0F 24 /r[Дж] Перейдите из тестового регистра x86 в общий регистр. [м]
MOV TRx,reg 0F 26 /r[Дж] Перейдите из общего регистра в тестовый регистр x86. [м]
ICEBP,
ИНТ01,
ЦЕЛОЕ1 [н]
Ф1 Точка останова внутрисхемной эмуляции .

Выполняет программное прерывание №1, если оно выполняется без использования внутрисхемной эмуляции. [the]

3
UMOV r/m, r8 0F 10 /р Пользовательское перемещение — выполнение перемещения данных, которое может получить доступ к пользовательской памяти в режиме HALT внутрисхемной эмуляции.

Выполняет ту же операцию, что и MOV если выполняется, когда не выполняется внутрисхемная эмуляция. [п]

UMOV r/m, r16/32 0F 11 /р
UMOV r8, r/m 0F 12 /р
UMOV r16/32, r/m 0F 13 /р
XBTS рег, об/м  0F A6 /r Извлечение битового поля. [д] [р]
ИБТС р/м,рег.  0F A7 /r Вставка битового поля. [д] [р]
 НАГРУЗКА Д,
ЗАГРУЗИТЬ386
[с]
0Ф 07 Загрузите все регистры ЦП из 296-байтовой структуры данных, начиная с ES:EDI, включая «скрытую» часть регистров дескриптора сегмента. 0
  1. ^ Jump up to: а б с д Для BT, BTS, BTR и BTC инструкции:
    • Если первый аргумент инструкции является операндом-регистром и/или второй аргумент является непосредственным, то битовый индекс во втором аргументе берется по модулю размера операнда (16/32/64, фактически используя только младшие 4, 5 или 6 бит индекса.)
    • Если первый аргумент является операндом памяти, а второй аргумент — операндом регистра, то битовый индекс во втором аргументе используется полностью — он интерпретируется как знаковый битовый индекс, который используется для смещения используемого адреса памяти. для битового теста.
  2. ^ Jump up to: а б с The BTS, BTC и BTR инструкции принять LOCK ( F0) префикс при использовании с аргументом памяти – это приводит к атомарному выполнению инструкции.
  3. ^ Если F3 префикс используется с 0F BC /r код операции, то инструкция будет выполнена как TZCNT в системах, поддерживающих расширение BMI1. TZCNT отличается от BSF в этом TZCNT но не BSR определено для возврата размера операнда, если исходный операнд равен нулю – для других значений исходного операнда они дают тот же результат.
  4. ^ Jump up to: а б BSF и BSR установите для флага EFLAGS.ZF значение 1, если исходный аргумент содержит все 0, и 0 в противном случае.
    Если в аргументе источника были все 0, то регистр назначения документируется как оставленный неизменным на процессорах AMD, но установленным в неопределенное значение на процессорах Intel.
  5. ^ Если F3 префикс используется с 0F BD /r код операции, то инструкция будет выполнена как LZCNT в системах, поддерживающих расширения ABM или LZCNT. LZCNT дает другой результат от BSR для большинства входных значений.
  6. ^ Jump up to: а б Для SHLD и SHRD, величина сдвига маскируется – нижние 5 бит используются для 16/32-битного размера операнда и 6 бит для 64-битного размера операнда.
    SHLD и SHRD с 16-битными аргументами и величиной сдвига больше 16 результаты неопределенны. (Фактические результаты различаются для разных процессоров Intel, при этом известно как минимум три различных варианта поведения. [17] )
  7. ^ Jump up to: а б Коды условий, поддерживаемые для SETcc и Jcc near инструкции (коды операций 0F 9x /0 и 0F 8x соответственно, с полубайтом x , определяющим условие):
    х копия Состояние ( ЭФЛАГС )
    0 ТО OF=1: «Переполнение»
    1 НЕТ OF=0: «Не переполнение»
    2 С, Б, НАЭ CF=1: «Перенос», «Ниже», «Не выше или равно»
    3 НК, НБ, АЕ CF=0: «Не переносить» , «Не ниже» , «Выше или равно»
    4 З,Э ZF=1: «Ноль», «Равно»
    5 Новая Зеландия, Невада ZF=0: «Не ноль» , «Не равно»
    6 Н.А., БЭ (CF=1 или ZF=1): «Не выше» , «Ниже или равно»
    7 А, НБЕ (CF=0 и ZF=0): «Выше», «Не ниже и равно»
    8 С SF=1: «Подписать»
    9 НС SF=0: «Не подписывать»
    А П, ЧП PF=1: «Четность», «Четность»
    Б NP,PO PF=0: «Нечетность» , «Нечетность»
    С Л, НЕТ SF≠OF: «Меньше», «Не больше и не равно».
    Д Нидерланды, GE SF=OF: «Не меньше» , «Больше или равно»
    И ЛЕ, Н.Г. (ZF=1 или SF≠OF): «Меньше или равно» , «Не больше».
    Ф НЛЭ, Г (ZF=0 и SF=OF): «Не меньше и не равно» , «Больше»
  8. ^ Для SETcc инструкции , хотя код операции обычно указывается как /0 – подразумевая, что биты 5:3 байта ModR/M должны быть равны 000 – современные процессоры x86 (Pentium и новее) игнорируют биты 5:3 и будут выполнять инструкцию как SETcc независимо от содержимого этих битов.
  9. ^ Для LFS, LGS и LSS, размер смещенной части дальнего указателя определяется размером операнда – размер сегментной части всегда равен 16 битам. В 64-битном режиме с помощью REX.W префикс с этими инструкциями приведет к загрузке дальнего указателя с 64-битным смещением на процессорах Intel, но не на процессорах AMD.
  10. ^ Jump up to: а б с д и ж Для MOV в/из CRx, DRx и TRx регистров, reg-часть байта ModR/M используется для указания CRx/DRx/TRx регистр и р/м часть общего регистра. Уникально для MOV CRx/DRx/TRx коды операций, два старших бита байта ModR/M игнорируются – эти коды операций декодируются и выполняются так, как если бы два старших бита байта ModR/M были 11b.
  11. ^ Jump up to: а б с д Для переездов в/из г. CRx и DRx регистров, размер операнда всегда составляет 64 бита в 64-битном режиме и 32 бита в противном случае.
  12. ^ На процессорах до Pentium переход на CR0 не будет сериализовать поток команд – отчасти по этой причине обычно требуется выполнить дальний переход сразу после MOV к CR0 если такой MOV используется для включения/отключения защищенного режима и/или подкачки памяти .
    MOV к CR2 архитектурно указан как сериализуемый, но сообщается, что он не сериализуется по крайней мере на некоторых процессорах Intel Core-i7. [18]
    MOV к CR8 (представлено в x86-64) не сериализуется.
  13. ^ Jump up to: а б The MOV TRx инструкции были прекращены, начиная с Pentium.
  14. ^ INT1/ ICEBP ( F1) инструкция присутствует на всех известных процессорах Intel x86, начиная с 80386, [19] но полностью документировано только для процессоров Intel, начиная с выпуска Intel SDM (версия 067) за май 2018 года. [20] До этого выпуска упоминание инструкции в материалах Intel было спорадическим, например, AP-526 rev 001. [21]
    Для процессоров AMD инструкция документируется с 2002 года. [22]
  15. ^ Работа F1( ICEBP) код операции отличается от работы обычного кода операции программного прерывания CD 01 несколькими способами:
      В защищенном режиме CD 01 проверит CPL по полю DPL дескриптора прерывания в качестве проверки прав доступа, в то время как F1 не будет.
    • В режиме виртуального-8086 CD 01 также проверит CPL по IOPL в качестве проверки прав доступа, в то время как F1 не будет.
    • В режиме virtual-8086 с включенным VME перенаправление прерываний поддерживается для CD 01 но не F1.
  16. ^ Инструкция UMOV присутствует только на процессорах 386 и 486. [19]
  17. ^ Jump up to: а б The XBTS и IBTS инструкции были прекращены с использованием степпинга B1 80386.
    Они использовались программным обеспечением в основном для обнаружения ошибок. [23] Степ B0 80386. Microsoft Windows (v2.01 и новее) попытается запустить XBTS инструкция как часть обнаружения ЦП, если CPUID отсутствует и откажется загружаться, если XBTS оказывается работающим. [24]
  18. ^ Jump up to: а б Для XBTS и IBTSаргумент r/m представляет данные для извлечения/вставки битового поля из/в, аргумент reg — битовое поле, которое нужно вставить/извлечь, AX/EAX — смещение битов, а CL — длину битового поля. [25]
  19. ^ Недокументировано, только 80386. [26]

Добавлено с 80486

[ редактировать ]
Инструкция Код операции Описание Кольцо
BSWAP r32 0F C8+r Обмен порядка байтов. Обычно используется для преобразования между представлениями данных с прямым порядком байтов. Для 32-битных регистров выполняется следующая операция:
r =   (r << 24)
    | ((r << 8) & 0x00FF0000)
    | ((r >> 8) & 0x0000FF00)
    | (r >> 24);

С использованием BSWAP с 16-битным аргументом регистра дает неопределенный результат. [а]

3
CMPXCHG r/m8,r8 0F B0 /r[б] Сравнить и обменять . Если аккумулятор (AL/AX/EAX/RAX) сравнивается с первым операндом, [с] затем EFLAGS.ZF устанавливается в 1, и первый операнд заменяется вторым операндом. В противном случае, EFLAGS.ZF устанавливается в 0, и первый операнд копируется в аккумулятор.

Инструкция атомарна, только если используется с LOCK префикс.

CMPXCHG r/m,r16
CMPXCHG r/m,r32
0F B1 /r[б]
XADD r/m,r8 0F C0 /r обмен и добавление . Заменяет первый операнд вторым операндом, затем сохраняет сумму двух значений в операнде назначения.

Инструкция атомарна, только если используется с LOCK префикс.

XADD r/m,r16
XADD r/m,r32
0F C1 /r
INVLPG m8 0F 01 /7 Сделайте недействительными записи TLB , которые будут использоваться для 1-байтового операнда памяти. [д]

Инструкция сериализуется.

0
INVD 0F 08 Недействительные внутренние кэши. [и] Измененные данные в кэше не записываются обратно в память, что может привести к потере данных. [ф]
WBINVD NFx 0F 09[г] Записать обратно и сделать недействительным кэш. [и] Записывает все измененные строки кэша во внутреннем кэше процессора в основную память и делает внутренние кэши недействительными.
  1. ^ Использование BSWAP с 16-битными регистрами не запрещено как таковое (оно будет выполняться без #UD или других исключений), но задокументировано, что оно дает неопределенные результаты - сообщается, что оно дает различные результаты на 486, [27] 586 и Бохс / QEMU . [28]
  2. ^ Jump up to: а б На Intel 80486, шаг A, [29] тот CMPXCHG инструкция использует другую кодировку - 0F A6 /r для 8-битного варианта, 0F A7 /r для 16/32-битного варианта. 0F B0/B1 кодировки используются на степпинге B 80486 и позже. [30] [31]
  3. ^ CMPXCHG наборы команд EFLAGS точно так же, как CMP инструкция, которая использует аккумулятор (AL/AX/EAX/RAX) в качестве первого аргумента.
  4. ^ INVLPG выполняется как недействующая операция, если аргумент m8 недействителен (например, несопоставленная страница или неканонический адрес).
    INVLPG может использоваться для аннулирования записей TLB для отдельных глобальных страниц.
  5. ^ Jump up to: а б The INVD и WBINVD инструкции сделают недействительными все строки кэша в кэшах L1 процессора. Реализация определяет, будут ли они также аннулировать кэши L2/L3.
    Эти инструкции сериализуются — на некоторых процессорах они также могут блокировать прерывания до завершения.
  6. ^ Если PRM (зарезервированная память процессора) была настроена с использованием PRMRR (регистры диапазона PRM), то INVD инструкция не разрешена и вызовет исключение #GP(0). (PRM необходим для Intel SGX.) [32]
  7. ^ Если F3 префикс используется с 0F 09 код операции, то инструкция будет выполнена как WBNOINVD на процессорах, поддерживающих расширение WBNOINVD – это не приведет к аннулированию кэша.

Добавлены P5 / P6. процессоры класса

[ редактировать ]

Целочисленные/системные инструкции, которых не было в базовом наборе инструкций 80486, но которые были добавлены в различные процессоры x86 до появления SSE. ( Снятые с производства инструкции не включены.)

Инструкция Код операции Описание Кольцо Добавлено в
RDMSR 0F 32 Прочтите регистр конкретной модели . MSR для чтения указан в ECX. Затем значение MSR возвращается как 64-битное значение в EDX:EAX. 0 IBM 386SLC , [33]
Интел Пентиум ,
АМД К5 ,
Сайрикс 6x86MX , МедиаГХм ,
ИДТ WinChip C6,
Трансмутационный Крузо
WRMSR 0F 30 Запись регистра конкретной модели . MSR для записи указывается в ECX, а данные для записи — в EDX:EAX. [а]

Инструкция, за некоторыми исключениями, сериализуется. [б]

RSM[36] 0F AA Выход из режима управления системой .

Инструкция сериализуется.

-2
(СММ)
Интел 386SL, [37] [38] 486СЛ , [с]
Интел Пентиум ,
АМД 5х86 ,
Cyrix 486SLC /е, [39]
ИДТ WinChip C6,
Передача Крузо ,
Подъем МП6
CPUID 0F A2 Идентификация процессора и информация о функциях. Принимает в качестве входных данных листовой индекс CPUID в EAX и, в зависимости от конечного узла, субиндекс в ECX. Результат возвращается в форматах EAX,EBX,ECX,EDX. [д]

Инструкция сериализуется и вызывает обязательный #VMEXIT при виртуализации.

Поддержка CPUID можно проверить переключением бита 21 EFLAGS (EFLAGS.ID) – если этот бит можно переключить, CPUID присутствует.

Обычно 3 [и] Интел Пентиум , [ф]
АМД 5х86 , [ф]
Сайрикс 5x86 , [г]
ИДТ WinChip C6,
Передача Крузо ,
Подъем МП6 ,
НексГен Nx586 , [час]
UMC Зеленый процессор
CMPXCHG8B m64 0F C7 /1 Сравнить и обменяться 8 байтами. Сравнивает EDX:EAX с m64. Если равно, установите ZF [я] и сохраните ECX:EBX в m64. В противном случае очистите ZF и загрузите m64 в EDX:EAX.
Инструкция атомарна, только если используется с LOCK префикс. [Дж]
3 Интел Пентиум ,
АМД К5 ,
Сайрикс 6х86Л , МедиаГХм ,
ИДТ WinChip C6, [к]
Передача Крузо , [к]
Подъем МП6 [к]
RDTSC 0F 31 Считайте 64-битный счетчик меток времени (TSC) в EDX:EAX. [л]

В ранних процессорах TSC представлял собой счетчик циклов, увеличивающийся на 1 за каждый такт (что могло привести к изменению его скорости на процессорах, которые могли изменять тактовую частоту во время выполнения) - в более поздних процессорах он увеличивался с фиксированной скоростью, которая не t обязательно соответствует тактовой частоте процессора. [м]

Обычно 3 [н] Интел Пентиум ,
АМД К5 ,
Сайрикс 6x86MX , МедиаГХм ,
ИДТ WinChip C6,
Передача Крузо ,
Подъем МП6
RDPMC 0F 33 Чтение счетчика мониторинга производительности . Счетчик для чтения указывается ECX, и его значение возвращается в EDX:EAX. [л] Обычно 3 [the] Intel Пентиум ММХ ,
Интел Пентиум Про
АМД К7 ,
Сайрикс 6x86MX ,
ИДТ WinChip C6,
ВИА Нано [п]
CMOVcc reg,r/m 0F 4x /r[д] Условный переход на регистрацию. Исходным операндом может быть регистр или память. [р] 3 Интел Пентиум Про
АМД К7 ,
Сайрикс 6x86MX , МедиаГХм ,
Передача Крузо ,
ВИА С3 «Неемия»
NOP r/m,
NOPL r/m
NFx 0F 1F /0 Официальный длинный NOP .

За исключением AMD K7/K8, практически не поддерживается в процессорах сторонних производителей, выпущенных до 2005 года. [с] [52]

3 Интел Пентиум Про [т]
АМД К7 , х86-64 , [в]
ВИА С7 [56]
UD2, [v]
UD2A[В]
0F 0B Неопределенные инструкции – будут генерировать исключение недопустимого кода операции (#UD) во всех режимах работы.

Эти инструкции предназначены для тестирования программного обеспечения, позволяющего явно генерировать недопустимые коды операций. Для этой цели зарезервированы коды операций для этих инструкций.

(3) ( 80186 ), [х]
Интел Пентиум [60]
UD1 reg,r/m, [и]
UD2B reg,r/m[В]
0F B9 /r[С]
OIO,
UD0,
UD0 reg,r/m[аа]
0F FF,
0F FF /r[С]
( 80186 ), [х]
Сайрикс 6x86 , [65]
АМД К5 [67]
SYSCALL 0F 05 Быстрый системный вызов . 3 АМД К6 , [аб]
х86-64 [и] [объявление]
SYSRET 0F 07[но] Быстрый возврат из системного вызова. Предназначен для использования вместе с SYSCALL. 0 [из]
SYSENTER 0F 34 Быстрый системный вызов . 3 [из] Интел Пентиум II [в]
АМД К7 , [72] [ах]
Передача Крузо , [есть]
NatSemi Geode GX2 ,
ВИА С3 «Неемия» [также]
SYSEXIT 0F 35[но] Быстрый возврат из системного вызова. Предназначен для использования вместе с SYSENTER. 0 [из]
  1. ^ На процессорах Intel и AMD WRMSR Инструкция также используется для обновления микрокода процессора . Это делается путем записи виртуального адреса нового микрокода для загрузки в MSR. 79h на процессорах Intel и MSR C001_0020h[34] на процессорах AMD.
  2. ^ Запись в следующие MSR не сериализуется: [35]
    Число Имя
    48h SPEC_CTRL
    49h PRED_CMD
    122h TSX_CTRL
    6E0h TSC_DEADLINE
    6E1h ПКРС
    774h HWP_REQUEST
    (несериализуется, только если установлен бит FAST_IA32_HWP_REQUEST)
    802h к 83Fh (x2APIC MSR)
    C001_011Bh Регистр дверных звонков (AMD)
  3. ^ Режим управления системой и RSM инструкции были доступны для вариантов Intel 486 без SL только после первого выпуска Intel Pentium в 1993 году.
  4. ^ На некоторых старых 32-битных процессорах выполнение CPUID с конечным индексом (EAX) больше 0 может оставить EBX и ECX неизмененными, сохранив свои старые значения. По этой причине рекомендуется обнулить EBX и ECX перед выполнением. CPUID.
    К процессорам, демонстрирующим такое поведение, относятся Cyrix MII. [40] и IDT WinChip 2. [41]

    В 64-битном режиме CPUID установит старшие 32 бита RAX, RBX, RCX и RDX в ноль.
  5. ^ На некоторых процессорах Intel, начиная с Ivy Bridge , существуют MSR, которые можно использовать для ограничения CPUID до звонка 0. Такие MSR задокументированы как минимум для Ivy Bridge. [42] и Денвертон. [43]
    Возможность ограничить CPUID to Ring 0 также существует на процессорах AMD, поддерживающих функцию «CpuidUserDis» ( Zen 4 «Raphael» и более поздние версии). [44]
  6. ^ Jump up to: а б CPUID также доступен на некоторых вариантах процессоров Intel и AMD 486, выпущенных после первого выпуска Intel Pentium.
  7. ^ На процессорах Cyrix 5x86 и 6x86 CPUID по умолчанию не включен и должен быть включен через регистр конфигурации Cyrix.
  8. ^ На процессорах NexGen, CPUID поддерживается только некоторыми системными BIOS. На некоторых процессорах NexGen, которые поддерживают CPUID, EFLAGS.ID не поддерживается, но EFLAGS.AC поддерживается, что усложняет обнаружение ЦП. [45]
  9. ^ В отличие от старого CMPXCHG инструкция, CMPXCHG8B Инструкция не изменяет никакие биты EFLAGS, кроме ZF.
  10. ^ LOCK CMPXCHG8B с операндом-регистром (который является недопустимой кодировкой) может привести к зависанию некоторых процессоров Intel Pentium ( ошибка Pentium F00F ).
  11. ^ Jump up to: а б с На процессорах IDT WinChip, Transmeta Crusoe и Rise mP6 CMPXCHG8B Инструкция всегда поддерживается, однако ее бит CPUID может отсутствовать. Это обходной путь ошибки в Windows NT. [46]
  12. ^ Jump up to: а б The RDTSC и RDPMC инструкции не упорядочиваются по отношению к другим инструкциям и могут производить выборку своих соответствующих счетчиков до выполнения более ранних инструкций или после выполнения более поздних инструкций. Вызовы RDPMC (но не RDTSC) могут быть переупорядочены друг относительно друга даже при чтении одного и того же счетчика.
    Чтобы наложить порядок по отношению к другим инструкциям, LFENCE или инструкции сериализации (например, CPUID) нужны. [47]
  13. ^ TSC с фиксированной ставкой вводился в два этапа:
    Постоянный TSC
    TSC работает с фиксированной скоростью, пока ядро ​​процессора не находится в режиме глубокого сна ( C2 или более глубокий), но не синхронизировано между ядрами ЦП. Представлен в Intel Prescott , Yonah и Bonnell . Также присутствует во всех Transmeta и VIA Nano. [48] процессоры. Не имеет бита CPUID.
    Инвариантный TSC
    TSC работает с фиксированной скоростью и остается синхронизированным между ядрами ЦП во всех P-, C- и T-состояниях (но не обязательно S-состояниях).
    Присутствует в AMD K10 и более поздних версиях; Интел Нехалем / Солтвелл [49] и позже Чжаосинь УДаокоу ; [50] и позже. Обозначается битом CPUID (листовой 8000_0007:EDX[8]).
  14. ^ RDTSC может быть запущен за пределами кольца 0, только если CR4.TSD=0.
    На Intel Pentium и AMD K5 RDTSC невозможно запустить в режиме Virtual-8086. [51] Более поздние процессоры сняли это ограничение.
  15. ^ RDPMC может быть запущен за пределами кольца 0, только если CR4.PCE=1.
  16. ^ RDPMC Инструкция не присутствует в процессорах VIA до Nano.
  17. ^ Коды условий, поддерживаемые для CMOVcc инструкция (код операции 0F 4x /r, где полубайт x определяет условие):
    х копия Состояние ( ЭФЛАГС )
    0 ТО OF=1: «Переполнение»
    1 НЕТ OF=0: «Не переполнение»
    2 С, Б, НАЭ CF=1: «Перенос», «Ниже», «Не выше или равно»
    3 НК, НБ, АЕ CF=0: «Не переносить» , «Не ниже» , «Выше или равно»
    4 З,Э ZF=1: «Ноль», «Равно»
    5 Новая Зеландия, Невада ZF=0: «Не ноль» , «Не равно»
    6 Н.А., БЭ (CF=1 или ZF=1): «Не выше» , «Ниже или равно»
    7 А, НБЕ (CF=0 и ZF=0): «Выше», «Не ниже и равно»
    8 С SF=1: «Подписать»
    9 НС SF=0: «Не подписывать»
    А П, ЧП PF=1: «Четность», «Четность»
    Б NP,PO PF=0: «Нечетность» , «Нечетность»
    С Л, НЕТ SF≠OF: «Меньше», «Не больше и не равно».
    Д Нидерланды, GE SF=OF: «Не меньше» , «Больше или равно»
    И ЛЕ, Н.Г. (ZF=1 или SF≠OF): «Меньше или равно» , «Не больше».
    Ф НЛЭ, Г (ZF=0 и SF=OF): «Не меньше и не равно» , «Больше»
  18. ^ В 64-битном режиме CMOVcc с 32-битным размером операнда очистит старшие 32 бита регистра назначения, даже если условие ложно.
    Для CMOVcc с операндом-источником памяти ЦП всегда будет считывать операнд из памяти, что потенциально может вызвать исключения в памяти и заполнение строк кэша, даже если условие для перемещения не удовлетворено. Расширение Intel APX определяет вариант ( CMOVcc это будет подавлять исключения памяти, если условие ложно.)
  19. ^ В отличие от других инструкций, добавленных в Pentium Pro , длинный NOP не имеет бита функции CPUID .
  20. ^ 0F 1F /0 поскольку long-NOP был представлен в Pentium Pro, но оставался недокументированным до 2006 года. [53] Весь 0F 18..1F диапазон опкодов был NOP в Пентиум Про. Однако, кроме 0F 1F /0, Intel не гарантирует, что эти коды операций останутся NOP в будущих процессорах и действительно назначили некоторые из этих кодов операций другим инструкциям, по крайней мере, в некоторых процессорах. [54]
  21. ^ Документировано для AMD x86-64 с 2002 года. [55]
  22. ^ В то время как 0F 0B код операции был официально зарезервирован как недопустимый код операции, начиная с Pentium, ему была присвоена только мнемоника UD2 начиная с Pentium Pro . [57]
  23. ^ Jump up to: а б GNU Binutils использовал UD2A и UD2B мнемоника для 0F 0B и 0F B9 коды операций начиная с версии 2.7. [58]
    Ни один UD2A ни UD2B изначально принимал любые аргументы - UD2B позже был изменен для приема байта ModR/M в Binutils версии 2.30. [59]
  24. ^ Jump up to: а б Коды операций UD0/1/2 — 0F 0B, 0F B9 и 0F FF - вызовет исключение #UD на всех процессорах x86, начиная с 80186 (кроме процессоров NEC серии V ), но оно не было явно зарезервировано для этой цели до процессоров класса P5.
  25. ^ В то время как 0F B9 код операции был официально зарезервирован как недопустимый код операции, начиная с Pentium, ему была присвоена только мнемоника UD1 намного позже – AMD APM начала листинг UD1 в картах кодов операций, начиная с версии 3.17, [61] в то время как Intel SDM начала перечислять его начиная с версии 061. [62]
  26. ^ Jump up to: а б Для обоих 0F B9 и 0F FF Известно, что разные реализации x86 различаются в зависимости от того, принимают ли коды операций байт ModR/M . [63] [64]
  27. ^ Для 0F FF код операции, OIO мнемоника была введена Cyrix, [65] в то время как UD0 menmonic (без аргументов) был представлен AMD и Intel одновременно с UD1 мнемоника для 0F B9. [61] [62] Позже в документации Intel (но не AMD) было изменено описание UD0 чтобы добавить байт ModR/M и принять два аргумента. [66]
  28. ^ На K6 SYSCALL/ SYSRET инструкции были доступны для модели 7 (250 нм «Little Foot») и более поздних версий, но не для более ранней модели 6. [68]
  29. ^ SYSCALL и SYSRET были сделаны неотъемлемой частью x86-64 – в результате инструкции доступны в 64-битном режиме на всех процессорах x86-64 от AMD, Intel, VIA и Zhaoxin.
    За пределами 64-битного режима инструкции доступны только на процессорах AMD.
  30. ^ Точная семантика SYSRET немного различается между процессорами AMD и Intel: неканонические адреса возврата вызывают исключение #GP в Ring 3 на процессорах AMD и в Ring 0 на процессорах Intel. Известно, что это вызывает проблемы с безопасностью. [69]
  31. ^ Jump up to: а б Для SYSRET и SYSEXIT инструкции под x86-64, необходимо добавить REX.W префикс для вариантов, которые вернутся к 64-битному коду пользовательского режима.
    Кодировки этих инструкций без REX.W префикс используются для возврата к 32-битному коду пользовательского режима. (Ни одна из этих инструкций не может использоваться для возврата к 16-битному коду пользовательского режима.)
  32. ^ Jump up to: а б с The SYSRET, SYSENTER и SYSEXIT инструкции недоступны в реальном режиме . ( SYSENTER однако доступен в режиме Virtual 8086. )
  33. ^ CPUID флаги, указывающие на поддержку SYSENTER/ SYSEXIT установлены на Pentium Pro, хотя процессор официально не поддерживает эти инструкции. [70]
    Стороннее тестирование показало, что коды операций присутствуют в Pentium Pro, но слишком содержат ошибки, чтобы их можно было использовать. [71]
  34. ^ На процессорах AMD SYSENTER и SYSEXIT инструкции недоступны в длинном режиме x86-64 (#UD).
  35. ^ На процессорах Transmeta SYSENTER и SYSEXIT инструкции доступны только в версии 4.2 или выше программного обеспечения Transmeta Code Morphing. [73]
  36. ^ О Неемии, SYSENTER и SYSEXIT доступны только на шаге 8 и позже. [74]

Добавлено как расширение набора команд.

[ редактировать ]

Добавлено с x86-64

[ редактировать ]

Эти инструкции могут быть закодированы только в 64-битном режиме. Они делятся на четыре группы:

  • оригинальные инструкции, которые повторно используют существующие коды операций для других целей ( MOVSXD замена ARPL)
  • оригинальные инструкции с новыми кодами операций ( SWAPGS)
  • существующие инструкции расширены до 64-битного размера адреса ( JRCXZ)
  • существующие инструкции расширены до размера операнда 64 бита (оставшиеся инструкции)

Большинство инструкций с 64-битным размером операнда кодируют это с помощью REX.W префикс; в отсутствие REX.W префикс, кодируется соответствующая инструкция с 32-битным размером операнда. Этот механизм также применим к большинству других инструкций с 32-битным операндом. размер. Они не перечислены здесь, поскольку не получают новой мнемоники в синтаксисе Intel при использовании с 64-битным размером операнда.

Инструкция Кодирование Значение Кольцо
CDQE REX.W 98 Подписать расширение EAX в RAX 3
CQO REX.W 99 Подпишите расширение RAX в RDX:RAX
CMPSQ REX.W A7 Сравнить строковое четверное слово
CMPXCHG16B m128[а] [б] REX.W 0F C7 /1 СРАВНЕНИЕ И ОБМЕН 16 байт.
Атомный, только если используется с префиксом LOCK.
IRETQ REX.W CF 64-битный возврат из прерывания
JRCXZ rel8 E3 cb Перейти, если RCX равен нулю
LODSQ REX.W AD Загрузить четырехсловную строку
MOVSXD r64,r/m32 REX.W 63 /r[с] MOV с расширением Sign с 32-битной до 64-битной версии
MOVSQ REX.W A5 Переместить четырехсловное слово строки
POPFQ 9D Регистрация POP RFLAGS
PUSHFQ 9C НАЖМИТЕ RFLAGS Зарегистрируйтесь
SCASQ REX.W AF SCAn Строковое четверное слово
STOSQ REX.W AB Строковое четырехсловное слово STOre
SWAPGS 0F 01 F8 Обмен базы GS с помощью KernelGSBase MSR 0
  1. ^ Операнд памяти для CMPXCHG16B должно быть выровнено по 16 байтам.
  2. ^ CMPXCHG16B Инструкция отсутствовала в некоторых из самых ранних процессоров Intel/AMD x86-64. На процессорах Intel инструкция отсутствовала у Xeon «Nocona» степпинга D, [75] но добавлено в шаге E. [76] На процессорах семейства AMD K8 он был добавлен в шаге F одновременно с введением поддержки DDR2. [77]
    По этой причине, CMPXCHG16B имеет свой собственный флаг CPUID, отдельный от остальной части x86-64.
  3. ^ Кодировки MOVSXD без префикса REX.W разрешены, но не приветствуются. [78] – такие кодировки ведут себя идентично 16/32-битным MOV ( 8B /r).

Расширения для манипуляций с битами

[ редактировать ]

Инструкции по битовым манипуляциям. Для всех инструкций , закодированных VEX, определенных BMI1 и BMI2, размер операнда может быть 32 или 64 бита, управляемый битом VEX.W — ни одна из этих инструкций не доступна в 16-битных вариантах.

Расширение битовых манипуляций Инструкция
мнемоника
Код операции Описание инструкции Добавлено в
ПРО (ЛЗЦНТ) [а]
Расширенные манипуляции с битами
POPCNT r16,r/m16
POPCNT r32,r/m32
F3 0F B8 /r Подсчет населения . Подсчитывает количество битов, которым в исходном аргументе присвоено значение 1. К10 ,
Бобкэт ,
Хасуэлл ,
ЧжанЦзян ,
Грейсмонт
POPCNT r64,r/m64 F3 REX.W 0F B8 /r
LZCNT r16,r/m16
LZCNT r32,r/m32
F3 0F BD /r Подсчитайте ведущие нули. [б]
Если исходный операнд состоит из всех 0, то LZCNT вернет размер операнда в битах (16/32/64) и установит CF=1.
LZCNT r64,r/m64 F3 REX.W 0F BD /r
ИМТ1
Набор инструкций битового манипулирования 1
TZCNT r16,r/m16
TZCNT r32,r/m32
F3 0F BC /r Подсчитайте конечные нули. [с]
Если исходный операнд состоит из всех 0, то TZCNT вернет размер операнда в битах (16/32/64) и установит CF=1.
Хасуэлл ,
Пиледрайвер ,
Ягуар ,
ЧжанЦзян ,
Грейсмонт
TZCNT r64,r/m64 F3 REX.W 0F BC /r
ANDN ra,rb,r/m VEX.LZ.0F38 F2 /r Побитовое И-НЕ: ra = r/m AND NOT(rb)
BEXTR ra,r/m,rb VEX.LZ.0F38 F7 /r Извлечение битового поля. Начальная позиция битового поля указывается в битах [7:0] rb, длина в битах[15:8] rb. Затем битовое поле извлекается из r/m значение с нулевым расширением, затем сохраняется в ra. Эквивалентно [д]
mask = (1 << rb[15:8]) - 1
ra = (r/m >> rb[7:0]) AND mask
BLSI reg,r/m VEX.LZ.0F38 F3 /3 Извлечь младший установленный бит в исходном аргументе. Возвращает 0, если исходный аргумент равен 0. Эквивалентно
dst = (-src) AND src
BLSMSK reg,r/m VEX.LZ.0F38 F3 /2 Сгенерируйте битовую маску из битов, состоящих из всех единиц, до самой младшей позиции бита с 1 в исходном аргументе. Возвращает все единицы, если исходный аргумент равен 0. Эквивалентно
dst = (src-1) XOR src
BLSR reg,r/m VEX.LZ.0F38 F3 /1 Скопируйте все биты исходного аргумента, затем очистите младший установленный бит. Эквивалентно
dst = (src-1) AND src
ИМТ2
Набор инструкций битового манипулирования 2
BZHI ra,r/m,rb VEX.LZ.0F38 F5 /r Обнулить старшие биты в r/m начиная с позиции бита, указанной в rb, затем запишите результат в rd. Эквивалентно
ra = r/m AND NOT(-1 << rb[7:0])
Хасуэлл ,
Экскаватор , [и]
ЧжанЦзян ,
Грейсмонт
MULX ra,rb,r/m VEX.LZ.F2.0F38 F6 /r Расширение беззнакового целого числа без установки флагов. Умножает EDX/RDX на r/m, затем сохраняет младшую половину результата умножения в ra и высокая половина в rb. Если ra и rb укажите тот же регистр, сохраняется только старшая половина результата.
PDEP ra,rb,r/m VEX.LZ.F2.0F38 F5 /r Параллельный битовый депозит. Разбрасывает смежные биты из rb к битовым позициям, установленным в r/m, затем сохраняет результат в ra. Выполненная операция:
ra=0; k=0; mask=r/m
for i=0 to opsize-1 do
   if (mask[i] == 1) then
       ra[i]=rb[k]; k=k+1
PEXT ra,rb,r/m VEX.LZ.F3.0F38 F5 /r Параллельное извлечение битов. Использование r/m аргумент как битовая маска для выбора битов в rb, затем уплотняет выбранные биты в непрерывный битовый вектор. Выполненная операция:
ra=0; k=0; mask=r/m
for i=0 to opsize-1 do
   if (mask[i] == 1) then
       ra[k]=rb[i]; k=k+1
RORX reg,r/m,imm8 VEX.LZ.F2.0F3A F0 /r ib Немедленно поверните вправо, не затрагивая флаги.
SARX ra,r/m,rb VEX.LZ.F3.0F38 F7 /r Арифметический сдвиг вправо без обновления флагов.
Для SARX, SHRX и SHLX, сумма смены, указанная в rb маскируется до 5 бит для 32-битного размера операнда и 6 бит для 64-битного размера операнда.
SHRX ra,r/m,rb VEX.LZ.F2.0F38 F7 /r Логический сдвиг вправо без обновления флагов.
SHLX ra,r/m,rb VEX.LZ.66.0F38 F7 /r Сдвиг влево без обновления флагов.
  1. ^ На процессорах AMD расширение «ABM» обеспечивает как POPCNT и LZCNT. Однако в процессорах Intel бит CPUID для «ABM» документируется только для указания на наличие LZCNT инструкции и указан как «LZCNT», тогда как POPCNT имеет свой собственный отдельный бит функции CPUID.
    Однако все известные процессоры, реализующие расширения «ABM»/«LZCNT», также реализуют POPCNT и установите бит функции CPUID для POPCNT, поэтому различие является только теоретическим.
    (Обратное неверно – существуют процессоры, поддерживающие POPCNT но не ПРО, такие как Intel Nehalem и VIA Nano 3000.)
  2. ^ LZCNT инструкция будет выполнена как BSR в системах, которые не поддерживают расширения LZCNT или ABM. BSR вычисляет индекс старшего установленного бита в исходном операнде, получая результат, отличный от LZCNT для большинства входных значений.
  3. ^ TZCNT инструкция будет выполнена как BSF в системах, которые не поддерживают расширение BMI1. BSF дает тот же результат, что и TZCNT для всех значений входных операндов, кроме нуля – для которых TZCNT возвращает размер входного операнда, но BSF приводит к неопределенному поведению (на большинстве современных процессоров пункт назначения остается неизменным).
  4. ^ Для BEXTR, начальная позиция и длина не маскируются и могут принимать значения от 0 до 255. Если выбранные биты выходят за пределы конца r/m аргумента (который имеет обычный размер операнда 32/64 бита), то лишние биты считываются как 0.
  5. ^ На процессорах AMD до Zen 3 PEXT и PDEP инструкции довольно медленные [79] и демонстрируют зависимость времени от данных благодаря использованию микрокодированной реализации (около 18–300 циклов, в зависимости от количества бит, установленных в аргументе маски). В результате на этих процессорах зачастую быстрее использовать другие последовательности команд. [80] [81]

Добавлено с Intel TSX

[ редактировать ]
Подмножество TSX Инструкция Код операции Описание Добавлено в
РТМ
Ограниченная транзакционная память
XBEGIN rel16
XBEGIN rel32
C7 F8 cw
C7 F8 cd
Начать транзакцию. Если транзакция не удалась, выполните переход к заданному относительному смещению. Хасуэлл
(Устарело на процессорах настольных компьютеров/ноутбуков начиная с 10-го поколения ( Ice Lake , Comet Lake ), но по-прежнему доступно на Xeon серверных компонентах под маркой (например, Ice Lake-SP , Sapphire Rapids ))
XABORT imm8 C6 F8 ib Прервать транзакцию с 8-битным кодом ошибки.
XEND NP 0F 01 D5 Завершить транзакцию.
XTEST NP 0F 01 D6 Проверьте, выполняется ли транзакция. Наборы EFLAGS.ZF до 0, если выполняется внутри транзакции (RTM или HLE), в противном случае — до 1.
ПОЖАЛУЙСТА
Аппаратная блокировка
XACQUIRE F2 Префикс инструкции, обозначающий начало устранения аппаратной блокировки, используется только с атомарными инструкциями памяти (для других инструкций F2 префикс может иметь и другие значения). При использовании с такими инструкциями может начать транзакцию вместо выполнения атомарной операции с памятью. Хасуэлл
(Снято с производства — последними процессорами, поддерживавшими HLE, были Coffee Lake и Cascade Lake )
XRELEASE F3 Префикс инструкции, обозначающий окончание устранения аппаратной блокировки, используется только с инструкциями атомарной памяти/сохранения (для других инструкций F3 префикс может иметь и другие значения). При использовании с такими инструкциями во время устранения аппаратной блокировки соответствующая транзакция будет завершена вместо выполнения сохранения/атомарного выполнения.
ТСХЛДТРК
Приостановить/возобновить отслеживание адреса загрузки
XSUSLDTRK F2 0F 01 E8 Приостановить отслеживание адресов загрузки Сапфировые пороги
XRESLDTRK F2 0F 01 E9 Возобновить отслеживание адресов загрузки

Intel CET (технология контроля потока управления) добавляет две отдельные функции, которые помогают защититься от эксплойтов безопасности, таких как возвратно-ориентированное программирование : теневой стек (CET_SS) и косвенное отслеживание ветвей (CET_IBT).

Подмножество CET Инструкция Код операции Описание Кольцо Добавлено в
CET_SS
Теневой стек .
Когда теневые стеки включены, адреса возврата помещаются как в обычный стек, так и в теневой стек при вызове функции. Затем они оба извлекаются при возврате из вызова функции — если они не совпадают, то предполагается, что стек поврежден, и выдается исключение #CP.
Кроме того, теневой стек должен храниться в специально отмеченных страницах памяти, которые не могут быть изменены обычными инструкциями сохранения в памяти.
INCSSPD r32 F3 0F AE /5 Увеличить указатель стека теней 3 Тигровое озеро ,
Это было 3
INCSSPQ r64 F3 REX.W 0F AE /5
RDSSPD r32 F3 0F 1E /1 Считать указатель теневого стека в регистр (младшие 32 бита) [а]
RDSSPQ r64 F3 REX.W 0F 1E /1 Считать указатель теневого стека в регистр (полные 64 бита) [а]
SAVEPREVSSP F3 0F 01 EA Сохранить предыдущий указатель стека теней
RSTORSSP m64 F3 0F 01 /5 Восстановить сохраненный указатель теневого стека
WRSSD m32,r32 NP 0F 38 F6 /r Записать 4 байта в теневой стек
WRSSQ m64,r64 NP REX.W 0F 38 F6 /r Записать 8 байт в теневой стек
WRUSSD m32,r32 66 0F 38 F5 /r Записать 4 байта в теневой стек пользователя. 0
WRUSSQ m64,r64 66 REX.W 0F 38 F5 /r Записать 8 байт в теневой стек пользователя.
SETSSBSY F3 0F 01 E8 Отметить теневой стек занятым
CLRSSBSY m64 F3 0F AE /6 Очистить флаг занятости теневого стека
CET_IBT
Косвенное отслеживание ветвей .
Когда IBT включен, непрямой переход (переход, вызов, возврат) к любой инструкции, не являющейся ENDBR32/64 инструкция вызовет исключение #CP.
ENDBR32 F3 0F 1E FB Завершить непрямую ветвь в 32-битном режиме [б] 3 Тигровое озеро
ENDBR64 F3 0F 1E FA Завершить непрямую ветвь в 64-битном режиме [б]
NOTRACK 3E[с] Префикс, используемый с косвенным CALL/ JMP рядом с инструкциями (коды операций FF /2 и FF /4), чтобы указать, что цель ветвления не обязательно должна начинаться с ENDBR32/64 инструкция. Префикс учитывается только тогда, когда установлен флаг NO_TRACK_EN.
  1. ^ Jump up to: а б The RDSSPD и RDSSPQ инструкции действуют как NOP на процессорах, где теневые стеки отключены или CET не поддерживается.
  2. ^ Jump up to: а б ENDBR32 и ENDBR64 действовать как NOP на процессорах, которые не поддерживают CET_IBT или где IBT отключен.
  3. ^ Этот префикс имеет ту же кодировку, что и префикс DS: префикс переопределения сегмента - по состоянию на апрель 2022 г. в документации Intel не указывается, сохраняет ли этот префикс свою старую функцию переопределения сегмента при использовании в качестве префикса без отслеживания, и при этом он не предоставьте официальную мнемонику для этого префикса. [82] [83] (GNU binutils использует «notrack» [84] )

Добавлено вместе с другими расширениями разных поставщиков.

[ редактировать ]
Расширение набора команд Инструкция
мнемоника
Код операции Описание инструкции Кольцо Добавлено в
СШЭ [а]
(без SIMD)
PREFETCHNTA m8 0F 18 /0 Предварительная выборка с нетемпоральным доступом.
Предварительная выборка данных в предположении, что данные будут использоваться только один раз, и попытка минимизировать загрязнение кэша этими данными. Методы, используемые для минимизации загрязнения кэша, зависят от реализации. [б]
3 Пентиум III
( К7 ), [а]
( Жеода GX2 ), [а]
Неемия ,
Эффисон
PREFETCHT0 m8 0F 18 /1 Предварительная выборка данных на все уровни иерархии кэша. [б]
PREFETCHT1 m8 0F 18 /2 Предварительная выборка данных на все уровни иерархии кэша, кроме кэша L1. [б]
PREFETCHT2 m8 0F 18 /3 Предварительная выборка данных на все уровни иерархии кэша, кроме кэшей L1 и L2. [б]
SFENCE NP 0F AE F8+x[c] Магазинный забор. [д]
SSE2
(без SIMD)
LFENCE NP 0F AE E8+x[c] Ограждение загрузки и сериализация отправки. [и] 3 Пентиум 4
К8 ,
Эффисон ,
C7 Эстер
MFENCE NP 0F AE F0+x[c] Забор памяти. [ф]
MOVNTI m32,r32
MOVNTI m64,r64
NP 0F C3 /r
NP REX.W 0F C3 /r
Хранилище вневременной памяти.
PAUSE F3 90[г] Приостанавливает поток ЦП на короткий период времени. [час]
Предназначен для использования в спин-блокировках. [я]
КЛФШ [Дж]
Очистка строки кэша.
CLFLUSH m8 NP 0F AE /7 Сбросить одну строку кэша в память.
В системе с несколькими уровнями иерархии кэша и/или несколькими процессорами, каждый из которых имеет собственный кэш, строка очищается из всех них.
3 (ССЕ2),
Жеода LX
МОНИТОР [к]
Отслеживайте область памяти на предмет записи в память.
MONITOR[л]
MONITOR EAX,ECX,EDX
NP 0F 01 C8 Начните отслеживать область памяти на предмет записи в память. Адрес памяти для мониторинга задается как DS:AX/EAX/RAX. [м]
ECX и EDX зарезервированы для дополнительных флагов расширения и подсказки соответственно. [н]
Обычно 0 [the] Прескотт ,
Иона ,
Боннелл ,
К10 ,
Нано
MWAIT[л]
MWAIT EAX,ECX
NP 0F 01 C9 Дождитесь записи в отслеживаемую ячейку памяти, ранее указанную с помощью MONITOR. [п]
ECX и EAX используются для обеспечения дополнительного расширения. [д] и намекнуть [р] флаги соответственно. MWAIT подсказки обычно используются для управления питанием процессора.
SMX
Расширения безопасного режима.
Загрузите, аутентифицируйте и выполните «Модуль аутентифицированного кода» с цифровой подписью в рамках технологии Intel Trusted Execution .
GETSEC NP 0F 37[с] Выполните функцию SMX. Выполняемая конечная функция указана в EAX. [т]
В зависимости от конечной функции инструкция может принимать дополнительные аргументы в RBX, ECX и EDX.
Обычно 0 [в] Conroe / Merom ,
УДаокоу , [96]
Тремонт
СОХРАНИТЬ
Сохранение/восстановление расширенного состояния процессора.
XSAVE mem
XSAVE64 mem
NP 0F AE /4
NP REX.W 0F AE /4
Сохраните компоненты состояния, указанные EDX:EAX, в памяти. 3 Пенрин , [v]
Бульдозер ,
Ягуар ,
Гольдмонт ,
ЧжанЦзян
XRSTOR mem
XRSTOR64 mem
NP 0F AE /5
NP REX.W 0F AE /5
Восстановить компоненты состояния, указанные EDX:EAX, из памяти.
XGETBV NP 0F 01 D0 Получите значение расширенного регистра управления.
Считывает XCR, указанный ECX, в EDX:EAX. [В]
XSETBV NP 0F 01 D1 Установите расширенный регистр управления.
Запишите значение в EDX:EAX в XCR, указанный ECX.
0
РДЦКП
Чтение счетчика отметок времени и идентификатора процессора.
RDTSCP 0F 01 F9 Чтение счетчика меток времени и идентификатора ядра процессора. [х]
Значение TSC помещается в EDX:EAX, а идентификатор ядра в ECX. [и]
Обычно 3 [С] К8 , [аа]
Нехалем ,
Сильвермонт ,
Нано
ПОПКНТ [аб]
Подсчет населения .
POPCNT r16,r/m16
POPCNT r32,r/m32
F3 0F B8 /r Подсчитайте количество битов, которым присвоено значение 1 в исходном аргументе. 3 К10 ,
Нехалем ,
Нано 3000
POPCNT r64,r/m64 F3 REX.W 0F B8 /r
ССЕ4.2
(без SIMD)
CRC32 r32,r/m8 F2 0F 38 F0 /r Накопите значение CRC, используя полином CRC-32C (Кастаньоли) 0x11EDC6F41 (нормальная форма 0x1EDC6F41). Это полином, используемый в iSCSI. В отличие от более популярного, используемого в Ethernet, его четность четна, и поэтому он может обнаружить любую ошибку с нечетным числом измененных битов. 3 Нехалем ,
Бульдозер ,
ЧжанЦзян
CRC32 r32,r/m16
CRC32 r32,r/m32
F2 0F 38 F1 /r
CRC32 r64,r/m64 F2 REX.W 0F 38 F1 /r
ХСОХРАНИТЬОПТ
Оптимизировано сохранение/восстановление расширенного состояния процессора
XSAVEOPT mem
XSAVEOPT64 mem
NP 0F AE /6
NP REX.W 0F AE /6
Сохраните компоненты состояния, указанные EDX:EAX, в памяти.
В отличие от старшего XSAVE инструкция, XSAVEOPT может воздерживаться от записи элементов состояния процессора в память, когда ЦП может определить, что они не были изменены с момента последнего соответствующего события. XRSTOR.
3 Сэнди Бридж ,
Паровой каток ,
Пума ,
Гольдмонт ,
ЧжанЦзян
ФСГСБАЗЕ
Чтение/запись базового адреса сегментов FS и GS из пользовательского режима.
Доступно только в 64-битном режиме.
RDFSBASE r32
RDFSBASE r64
F3 0F AE /0
F3 REX.W 0F AE /0
Чтение базового адреса FS: сегмента. 3 Айви Бридж ,
Паровой каток ,
Гольдмонт ,
ЧжанЦзян
RDGSBASE r32
RDGSBASE r64
F3 0F AE /1
F3 REX.W 0F AE /1
Чтение базового адреса сегмента GS:.
WRFSBASE r32
WRFSBASE r64
F3 0F AE /2
F3 REX.W 0F AE /2
Запишите базовый адрес ФС: сегмент.
WRGSBASE r32
WRGSBASE r64
F3 0F AE /3
F3 REX.W 0F AE /3
Запишите базовый адрес сегмента GS:.
МОВБЕ
Перемещение в/из памяти с перестановкой порядка байтов .
MOVBE r16,m16
MOVBE r32,m32
NFx 0F 38 F0 /r Загрузка из памяти для регистрации с помощью замены порядка байтов. 3 Боннелл ,
Хасуэлл ,
Ягуар ,
Паровой каток ,
ЧжанЦзян
MOVBE r64,m64 NFx REX.W 0F 38 F0 /r
MOVBE m16,r16
MOVBE m32,r32
NFx 0F 38 F1 /r Сохранение в памяти из регистра с перестановкой порядка байтов.
MOVBE m64,r64 NFx REX.W 0F 38 F1 /r
ИНВПКИД
Недействительные TLB записи по идентификатору контекста процесса .
INVPCID reg,m128 66 0F 38 82 /r Недействительные записи в TLB и кэшах структуры подкачки на основе типа недействительности в регистре. [и] и дескриптор в m128. Дескриптор содержит адрес памяти и PCID. [объявление]

Инструкция сериализуется на процессорах AMD, но не на процессорах Intel.

0 Хасуэлл ,
ЧжанЦзян ,
Было 3 ,
Грейсмонт
ПРЕДВАРИТЕЛЬНАЯ ЗАГРУЗКА [но]
Предварительная выборка строки кэша с намерением записать.
PREFETCHW m8 0F 0D /1 Предварительная выборка строки кэша с намерением записать. [б] 3 К6-2 ,
( Кедровая Мельница ), [из]
Сильвермонт ,
Бродвелл ,
ЧжанЦзян
PREFETCH m8[в] 0F 0D /0 Предварительная выборка строки кэша. [б]
ADX
Расширенные варианты добавления с переносом.
ADCX r32,r/m32
ADCX r64,r/m64
66 0F 38 F6 /r
66 REX.W 0F 38 F6 /r
Добавить с переносом. Отличается от старшего ADC инструкция в том, что она оставляет флаги, отличные от EFLAGS.CF без изменений. 3 Бродвелл ,
было 1 ,
ЧжанЦзян ,
Грейсмонт
ADOX r32,r/m32
ADOX r64,r/m64
F3 0F 38 F6 /r
F3 REX.W 0F 38 F6 /r
Добавить с переносом, с флагом переполнения EFLAGS.OF служит входом и выходом переноса, при этом другие флаги остаются неизменными.
СМАП
Предотвращение доступа в режиме супервизора .
Перепрофилирует EFLAGS.AC (проверка выравнивания) на флаг, который запрещает доступ к памяти пользовательского режима в кольце 0, 1 или 2.
CLAC NP 0F 01 CA Прозрачный EFLAGS.AC. 0 Бродвелл ,
Гольдмонт ,
было 1 ,
ЛуЦзяЗуй [ах]
STAC NP 0F 01 CB Набор EFLAGS.AC.
CLFLUSHOPT
Оптимизированная очистка строки кэша.
CLFLUSHOPT m8 NFx 66 0F AE /7 Очистить строку кэша.
Отличается от старшего CLFLUSH инструкция, поскольку она имеет более мягкие правила упорядочивания в отношении хранилищ памяти и других операций очистки строк кэша, что позволяет повысить производительность.
3 Скайлейк ,
Гольдмонт ,
Это был 1
XSAVEC
Сохранение/восстановление расширенного состояния процессора со сжатием.
XSAVEC mem
XSAVEC64 mem
NP 0F C7 /4
NP REX.W 0F C7 /4
Сохраните компоненты расширенного состояния процессора, указанные EDX:EAX, в памяти с уплотнением. 3 Скайлейк ,
Гольдмонт ,
Это был 1
XSS
Сохранение/восстановление расширенного состояния процессора, включая состояние супервизора.
XSAVES mem
XSAVES64 mem
NP 0F C7 /5
NP REX.W 0F C7 /5
Сохраните компоненты расширенного состояния процессора, указанные в EDX:EAX, в памяти с уплотнением и оптимизацией, если это возможно. 0 Скайлейк ,
Гольдмонт ,
Это был 1
XRSTORS mem
XRSTORS64 mem
NP 0F C7 /3
NP REX.W 0F C7 /3
Восстановить компоненты состояния, указанные EDX:EAX, из памяти.
ПРЕДВАРИТЕЛЬНАЯ ВЫГРУЗКАWT1
Предварительная выборка строки кэша в кеш L2 с намерением записать.
PREFETCHWT1 m8 0F 0D /2 Предварительная выборка данных с подсказкой о местонахождении T1 (извлечение в кеш L2, но не в кеш L1) и подсказка о намерении записи. [б] 3 Рыцарский десант ,
Юн Фэн
ФКУ
Ключи защиты для страниц пользователей.
RDPKRU NP 0F 01 EE Считайте регистр ключа страницы пользователя в EAX. 3 Скайлейк-Х ,
Кометное озеро ,
Грейсмонт ,
Было 3 ,
ЛуЦзяЗуй [ах]
WRPKRU NP 0F 01 EF Запишите данные из EAX в регистр ключей пользовательской страницы и выполните ограничение памяти.
КЛУБ
Обратная запись строки кэша в память.
CLWB m8 NFx 66 0F AE /6 Запишите одну строку кэша обратно в память, не делая ее недействительной. 3 Скайлейк-Х ,
было 2 ,
Тигровое озеро ,
Тремонт
РДПИД
Чтение идентификатора ядра процессора.
RDPID r32 F3 0F C7 /7 Считайте идентификатор ядра процессора в регистр. [х] 3 [есть] Голдмонт Плюс ,
было 2 ,
Ледяное озеро ,
ЛуЦзяЗуй [ах]
ВБНОИНВД
Обратная запись всего кэша без аннулирования.
WBNOINVD F3 0F 09 Запишите обратно все «грязные» строки кэша в память без аннулирования. [также] Инструкция сериализуется. 0 было 2 ,
Ледяное озеро-СП
  1. ^ Jump up to: а б с Процессоры AMD Athlon до Athlon XP не поддерживали полный SSE, но ввели инструкции SSE, отличные от SIMD, как часть «Расширений MMX» . [85] Эти расширения (без полного SSE) также присутствуют в процессорах Geode GX2 и более поздних версиях.
  2. ^ Jump up to: а б с д и ж г Все PREFETCH* Инструкции представляют собой инструкции-подсказки, влияющие только на производительность, а не на семантику программы. Предоставление неверного адреса (например, адреса несопоставленной страницы или неканонического адреса) приведет к тому, что инструкция будет действовать как NOP без каких-либо исключений.
  3. ^ Jump up to: а б с Для SFENCE, LFENCE и MFENCE инструкции, нижние 3 бита байта ModR/M игнорируются, и любое значение x в диапазоне 0..7 приведет к правильной инструкции.
  4. ^ SFENCE Инструкция гарантирует, что вся память сохранится после SFENCE инструкции становятся глобально наблюдаемыми после того, как все сохранения в памяти перед SFENCE. Это накладывает упорядочивание на хранилища, которые в противном случае можно переупорядочить, например, нетемпоральные хранилища и хранилища в областях памяти WC (объединение записи). [86]
    На процессорах Intel, а также процессорах AMD, начиная с Zen1 (но не на более старых процессорах AMD), SFENCE также действует как барьер переупорядочения при очистке/обратной записи кэша, выполняемой с помощью CLFLUSH, CLFLUSHOPT и CLWB инструкции. (Старые процессоры AMD требуют MFENCE заказать CLFLUSH.)
    SFENCE не упорядочен по отношению к LFENCEи SFENCE+LFENCE последовательность недостаточна для предотвращения повторного заказа загрузки после предыдущего хранилища. [87] Чтобы предотвратить такое переупорядочение, необходимо выполнить команду MFENCE, LOCK или инструкцию сериализации.
  5. ^ LFENCE Инструкция гарантирует, что вся память загрузится после LFENCE инструкции становятся глобально наблюдаемыми после загрузки всей памяти перед LFENCE.
    На всех процессорах Intel, поддерживающих SSE2, LFENCE Инструкция обеспечивает более надежную гарантию заказа: [88] это сериализация отправки , что означает, что инструкции после LFENCE инструкции разрешено начать выполнение только после того, как все инструкции до ее завершения (что гарантирует, что все предыдущие загрузки, но не обязательно сохранения, завершены). Эффект сериализации отправки заключается в том, что LFENCE также действует как барьер спекуляций и барьер переупорядочения для доступа к ресурсам, не связанным с памятью, таким как счетчики производительности (доступ к которым осуществляется, например, через RDTSC или RDPMC) и x2apic MSR.
    На процессорах AMD LFENCE по умолчанию не обязательно выполняет сериализацию с отправкой, однако на всех процессорах AMD, которые поддерживают любую форму сериализации без отправки LFENCE, его можно сделать сериализацией отправки, установив бит 1 в MSR. C001_1029. [89]
  6. ^ MFENCE Инструкция гарантирует, что вся память загружается, сохраняется и очищается в кэше после MFENCE инструкции становятся глобально наблюдаемыми после всех загрузок, сохранений и сбросов кэша перед выполнением всех операций памяти. MFENCE.
    На процессорах Intel MFENCE является не сериализацией отправки и, следовательно, не может использоваться для принудительного упорядочения доступа к ресурсам, не связанным с памятью, таким как счетчики производительности и x2apic MSR. MFENCE все еще упорядочен по отношению к LFENCE, поэтому, если необходим барьер памяти с сериализацией отправки, его можно получить, выдав MFENCE за которым следует LFENCE. [47]
    На процессорах AMD MFENCE сериализуется.
  7. ^ Работа PAUSE инструкция в 64-битном режиме, в отличие от NOP, не зависящий от присутствия REX.R префикс. Ни один NOP ни PAUSE на них влияют другие биты REX префикс. Несколько примеров опкода 90 с различными префиксами в 64-битном режиме:
    • 90 является NOP
    • 41 90 является XCHG R8D,EAX
    • 4E 90 является NOP
    • 49 90 является XCHG R8,RAX
    • F3 90 является PAUSE
    • F3 41 90 является PAUSE
    • F3 4F 90 является PAUSE
  8. ^ Фактическая длительность паузы, выполняемой PAUSE инструкция зависит от реализации.
    В системах без SSE2 PAUSE будет выполняться как NOP.
  9. ^ При виртуализации VT-x или AMD-V выполнение PAUSE много раз за короткий промежуток времени может вызвать ошибку #VMEXIT. Количество PAUSE количество выполнений и длина интервала, которые могут вызвать #VMEXIT, зависят от платформы.
  10. ^ В то время как CLFLUSH Инструкция была введена вместе с SSE2, она имеет свой собственный флаг CPUID и может присутствовать на процессорах, которые иначе не реализуют SSE2, и/или отсутствовать в процессорах, которые иначе реализуют SSE2. (Например, AMD Geode LX поддерживает CLFLUSH но не SSE2.)
  11. ^ В то время как MONITOR и MWAIT инструкции были представлены одновременно с SSE3, у них есть собственный флаг CPUID, который необходимо проверять отдельно от флага CPUID SSE3 (например, Athlon 64 X2 и VIA C7 поддерживают SSE3, но не MONITOR).
  12. ^ Jump up to: а б Для MONITOR и MWAIT инструкции, старая документация Intel [90] перечисляет мнемонику инструкций с явными операндами ( MONITOR EAX,ECX,EDX и MWAIT EAX,ECX), хотя в новой документации эти операнды опущены. Ассемблер/дизассемблер может поддерживать один или оба этих варианта. [91]
  13. ^ Для MONITOR, сегмент DS: можно переопределить с помощью префикса сегмента.
    Область памяти, которая будет отслеживаться, будет представлять собой не просто один байт, указанный DS:rAX, а линейную область памяти, содержащую этот байт — размер и выравнивание этой области памяти зависят от реализации и могут быть запрошены через CPUID.
    Ячейка памяти, которую необходимо отслеживать, должна иметь тип памяти WB (кэшируемая с обратной записью), иначе мониторинг может завершиться неудачно.
  14. ^ По состоянию на апрель 2024 г. для MONITOR инструкция. Таким образом, инструкция требует ECX=0 и игнорирует EDX.
  15. ^ На некоторых процессорах, например Intel Xeon Phi x200. [92] и АМД К10 [93] и позже существуют документированные MSR, которые можно использовать для включения MONITOR и MWAIT бежать в ринге 3.
  16. ^ Ожидание в исполнении MWAITможет быть завершено системными событиями, отличными от записи в память (например, вытеснением кэша, прерываниями) – точный набор событий, которые могут привести к завершению ожидания, зависит от реализации.
    Независимо от того, завершилось ли ожидание записью в память или каким-либо другим событием, мониторинг завершится и необходимо будет заново настроить мониторинг с помощью MONITOR перед использованием MWAIT дождаться повторной записи памяти.
  17. ^ Флаги расширения, доступные для MWAIT в регистре ECX находятся:
    Биты Расширение MWAIT
    0 Считайте прерывания как события прерывания, даже если они замаскированы ( EFLAGS.IF =0). (Доступно во всех не поддерживающих NetBurst . реализациях, MWAIT.)
    1 Timed MWAIT: завершить ожидание, когда TSC достигнет или превысит значение в EDX:EBX. (Недокументировано, как сообщается, присутствует в процессорах Intel Skylake и более поздних версиях) [94]
    2 Безмониторный MWAIT [95]
    31:3 Не используется, должен быть установлен на ноль.
  18. ^ Флаги подсказок, доступные для MWAIT в регистре EAX находятся:
    Биты MWAIT Подсказка
    3:0 Подсостояние внутри C-состояния (см. биты 7:4) (только процессоры Intel)
    7:4 C-состояние целевой мощности ЦП во время ожидания, минус 1. (Например, 0000b для C1, 0001b для C2, 1111b для C0)
    31:8 Не используется.

    C-состояния — это состояния питания, специфичные для процессора, которые не обязательно соответствуют 1:1 C-состояниям ACPI .

  19. ^ Для GETSEC инструкция, REX.W Префикс включает 64-битные адреса только для конечной функции EXITAC. В противном случае префиксы REX разрешены, но игнорируются для инструкции.
  20. ^ Листовые функции, определенные для GETSEC (выбранные EAX):
    ЕАХ Функция
    0 (ВОЗМОЖНОСТИ) Сообщить о возможностях SMX
    2 (ВХОДЫ) Введите выполнение модуля аутентифицированного кода
    3 (ЭКЗИТАК) Завершить выполнение модуля аутентифицированного кода
    4 (ЦЕНТР) Введите измеряемую среду
    5 (СЕКС) Выход из измеряемой среды
    6 (ПАРАМЕТРЫ) Сообщить о параметрах SMX
    7 (СМКТРЛ) Управление режимом SMX
    8 (ПРОБУЖДЕНИЕ) Пробуждение спящих процессоров в измеряемой среде

    Любое неподдерживаемое значение в EAX вызывает исключение #UD.

  21. ^ Для GETSEC, большинство конечных функций ограничены кольцом 0, но конечные функции ВОЗМОЖНОСТИ (EAX=0) и ПАРАМЕТРЫ (EAX=6) доступны в кольце 3.
  22. ^ XSAVE был добавлен в этапы E0/R0 Penryn и недоступен в более ранних версиях.
  23. ^ На некоторых процессорах (начиная со Skylake , Goldmont и Zen 1 ) выполнение XGETBV с ECX=1 разрешено – это не вернет XCR1 (такого регистра не существует), но вместо этого возвращаем XCR0 побитовое И с текущим значением битовой карты компонента состояния «XINUSE» (битовая карта компонентов состояния XSAVE, о которых неизвестно, что они находятся в своем исходном состоянии).
    Наличие данного функционала XGETBV указывается CPUID .(EAX=0Dh,ECX=1):EAX[бит 2].
  24. ^ Jump up to: а б Значение «идентификатора ядра», считываемое RDTSCP и RDPID на самом деле это TSC_AUX МСР (МСР C000_0103h). Соответствует ли это значение идентификатору процессора на самом деле, зависит от соглашения операционной системы.
  25. ^ В отличие от старого RDTSC инструкция, RDTSCP задержит чтение TSC до тех пор, пока все предыдущие инструкции не будут удалены, гарантируя упорядочивание относительно предыдущих загрузок памяти (но не сохранений). RDTSCP однако он не упорядочен относительно последующих инструкций.
  26. ^ RDTSCP может быть запущен за пределами кольца 0, только если CR4.TSD=0.
  27. ^ Поддержка RDTSCP был добавлен в шаге F AMD K8 и недоступен в более ранних степенях.
  28. ^ В то время как POPCNT Инструкция была представлена ​​одновременно с SSE4.2, она не считается частью SSE4.2, а представляет собой отдельное расширение со своим собственным флагом CPUID.
    На процессорах AMD он считается частью расширения ABM, но по-прежнему имеет собственный флаг CPUID.
  29. ^ Типы аннулирования, определенные для INVPCID (выбранные аргументом регистра):
    Ценить Функция
    0 Недействительные записи TLB, соответствующие PCID и адресу виртуальной памяти в дескрипторе, за исключением глобальных записей.
    1 Недействительные записи TLB, соответствующие PCID в дескрипторе, за исключением глобальных записей.
    2 Аннулировать все записи TLB, включая глобальные записи.
    3 Аннулировать все записи TLB, за исключением глобальных записей.

    Любое неподдерживаемое значение в аргументе регистра вызывает исключение #GP.

  30. ^ В отличие от старого INVLPG инструкция, INVPCID вызовет исключение #GP, если предоставленный адрес памяти неканонический. Известно, что это несоответствие вызывает проблемы с безопасностью. [97]
  31. ^ PREFETCH и PREFETCHW инструкции являются обязательной частью 3DNow! Расширение набора команд, но также доступны как отдельное расширение в системах, которые не поддерживают 3DNow!
  32. ^ Коды операций для PREFETCH и PREFETCHW ( 0F 0D /r) выполняются как NOP на процессорах Intel, начиная с Cedar Mill (65-нм Pentium 4 ), с PREFETCHW получение функции предварительной выборки начиная с Broadwell.
  33. ^ PREFETCH ( 0F 0D /0) инструкция — 3DNow! инструкция, присутствующая на всех процессорах с 3DNow! но не обязательно на процессорах с расширением PREFETCHW.
    На процессорах AMD с PREFETCHW код операции 0F 0D /0 а также коды операций 0F 0D /2../7 все они задокументированы для выполнения предварительной выборки.
    На процессорах Intel с PREFETCHW эти коды операций задокументированы как выполняющие зарезервированные NOP. [98] (кроме 0F 0D /2 существование PREFETCHWT1 m8 только на Xeon Phi ) – стороннее тестирование [99] указывает, что некоторые или все эти коды операций могут выполнять предварительную выборку по крайней мере на некоторых процессорах Intel Core.
  34. ^ Jump up to: а б с Расширения набора команд SMAP, PKU и RDPID поддерживаются на шаге 2. [100] и позже Чжаосинь ЛуЦзяЦуй, но не на более ранних этапах.
  35. ^ В отличие от старого RDTSCP инструкция, которую также можно использовать для чтения идентификатора процессора, в пользовательском режиме RDPID не отключен CR4.TSD=1.
  36. ^ WBNOINVD инструкция будет выполнена как WBINVD при запуске в системе, которая не поддерживает расширение WBNOINVD.
    WBINVD отличается от WBNOINVD в этом WBINVD сделает недействительными все строки кэша после обратной записи.

Добавлено вместе с другими расширениями, специфичными для Intel.

[ редактировать ]
Расширение набора команд Инструкция
мнемоника
Код операции Описание инструкции Кольцо Добавлено в
SSE2 Подсказки ветвей
Префиксы инструкций, которые можно использовать с Jcc инструкции по предоставлению подсказок о принятом/непринятом переходе.
( HWNT) [а] 2E[б] Префикс инструкции: подсказка ветки слабо не принята. 3 Пентиум 4 [с]
Метеорное озеро [103]
( HST) [а] 3E[б] Префикс инструкции: подсказка ветки строго принята.
СГХ
Расширения защиты программного обеспечения .
Создайте зашифрованный анклав, в котором гость может выполнять код, который скомпрометированный или вредоносный хост не сможет проверить или изменить.
ENCLS NP 0F 01 CF Выполните функцию супервизора SGX. Функция для выполнения указана в EAX. [д] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.

В зависимости от функции инструкция может возвращать данные в RBX и/или код ошибки в EAX.

0
SGX1
Скайлейк , [и]
Голдмонт Плюс
SGX2
Голдмонт Плюс ,
Ледяное озеро-СП [107]
ОВЕРСУБ [104]
Ледовое озеро-СП ,
Тремонт
ENCLU NP 0F 01 D7 Выполните функцию пользователя SGX. Функция для выполнения указана в EAX. [ф] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.

В зависимости от функции инструкция может возвращать данные/информацию о состоянии в EAX и/или RCX.

3 [г]
ENCLV NP 0F 01 C0 Выполните функцию виртуализации SGX. Функция для выполнения указана в EAX. [час] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.

Инструкция возвращает информацию о состоянии в EAX.

0 [я]
PTWRITE
Запишите данные в пакет трассировки процессора.
PTWRITE r/m32
PTWRITE r/m64
F3 0F AE /4
F3 REX.W 0F AE /4
Считайте данные из регистра или памяти для кодирования в пакет PTW. [Дж] 3 Каби Лейк ,
Голдмонт Плюс
МОВДИРИ
Переместить в память как Direct Store.
MOVDIRI m32,r32
MOVDIRI m64,r64
NP 0F 38 F9 /r
NP REX.W 0F 38 F9 /r
Сохранение в памяти с использованием Direct Store (хранилище памяти, которое не кэшируется и не объединяется с другими хранилищами для записи). 3 Тигровое озеро ,
Тремонт
МОВДИР64Б
Переместите 64 байта как прямое хранилище.
MOVDIR64B reg,m512 66 0F 38 F8 /r Переместите 64 байта данных из m512 по адресу, указанному в ES:reg. Запись 64-байта выполняется атомарно с помощью Direct Store. [к] 3 Тигровое озеро ,
Тремонт
ПКОНФИГ
Конфигурация платформы, включая TME-MK («Полное шифрование памяти – многоключевое») и TSE («Полное шифрование хранилища»).
PCONFIG NP 0F 01 C5 Выполните функцию настройки функций платформы. Выполняемая функция указана в EAX. [л] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.

Если инструкция завершится неудачно, она установит EFLAGS.ZF=1 и вернет код ошибки в EAX. В случае успеха устанавливаются EFLAGS.ZF=0 и EAX=0.

0 Ледяное озеро-СП
CLDEMOTE
Подсказка по понижению строки кэша.
CLDEMOTE m8 NP 0F 1C /0 Переместите строку кэша, содержащую m8, из кэша L1 процессора на более отдаленный уровень иерархии кэша. [м] 3 ( Тремонт ),
( Ольховое озеро ),
Сапфировые пороги [н]
ПОДОЖДИТЕ
Мониторинг и ожидание памяти в пользовательском режиме.
UMONITOR r16/32/64 F3 0F AE /6 Начните отслеживать область памяти на предмет записи в память. Адрес памяти для мониторинга задается аргументом регистра. [the] 3 Тремонт ,
Ольховое озеро
UMWAIT r32
UMWAIT r32,EDX,EAX
F2 0F AE /6 Ожидание по времени записи в отслеживаемую ячейку памяти, ранее указанную с помощью UMONITOR. При отсутствии записи в память ожидание закончится, когда либо TSC достигнет значения, указанного в EDX:EAX, либо ожидание продолжается в течение максимального периода времени, контролируемого ОС. [п] Обычно 3 [д]
TPAUSE r32
TPAUSE r32,EDX,EAX
66 0F AE /6 Подождите, пока счетчик отметок времени не достигнет значения, указанного в EDX:EAX. [п]

Аргумент регистра для UMWAIT и TPAUSE инструкции указывают дополнительные флаги для управления работой инструкции. [р]

СЕРИАЛИЗОВАТЬ
Сериализация выполнения инструкций.
SERIALIZE NP 0F 01 E8 Сериализация выборки и выполнения инструкций. [с] 3 Ольховое озеро
ХРЕСЕТ
Сброс истории процессора.
HRESET imm8 F3 0F 3A F0 C0 ib Запросите, чтобы процессор сбросил выбранные компоненты аппаратно поддерживаемой истории прогнозов. Битовая карта того, какие компоненты истории прогнозирования ЦП подлежат сбросу, задается в EAX (аргумент imm8 игнорируется). [т] 0 Ольховое озеро
ИНТР
Пользовательское межпроцессорное прерывание.
Доступно только в 64-битном режиме.
SENDUIPI reg F3 0F C7 /6 Отправить межпроцессорное пользовательское прерывание. [в] 3 Сапфировые пороги
UIRET F3 0F 01 EC Возврат пользовательского прерывания.

Извлекает RIP , RFLAGS и RSP из стека в указанном порядке. [v]

TESTUI F3 0F 01 ED Флаг прерывания тестового пользователя.
Копирует UIF в EFLAGS .CF.
CLUI F3 0F 01 EE Очистить флаг пользовательского прерывания.
STUI F3 0F 01 EF Установите флаг пользовательского прерывания.
ENQCMD
Магазин в очереди.
ENQCMD r32/64,m512 F2 0F 38 F8 /r Команда постановки в очередь. Считывает 64-байтовую структуру «командных данных» из памяти (аргумент m512) и атомарно записывает в отображенное в памяти устройство Enqueue Store (аргумент регистр предоставляет адрес памяти этого устройства, используя сегмент ES и требуя выравнивания по 64 байтам). Устанавливает ZF=0, чтобы указать, что устройство приняло команду, или ZF=1, чтобы указать, что команда не была принята (например, очередь заполнена или ячейка памяти не была устройством Enqueue Store). 3 Сапфировые пороги
ENQCMDS r32/64,m512 F3 0F 38 F8 /r Супервайзер команды постановки в очередь. Отличается от ENQCMD тем, что он может поместить произвольный PASID (идентификатор адресного пространства процесса) и бит привилегии в «командные данные» для постановки в очередь. 0
  1. ^ Jump up to: а б Мнемоника подсказок ветвей HWNT и HST перечислены Willamette . только в ранней документации [101] - в более поздней документации Intel перечислены префиксы подсказок ветвей без присвоения им мнемоники. [102]
  2. ^ Jump up to: а б The 2E и 3E префиксы интерпретируются как подсказки ветвления только при использовании с Jcc инструкции условного перехода (коды операций 70..7F и 0F 80..8F) - при использовании с другими кодами операций они могут иметь другое значение (например, для инструкций с операндами памяти вне 64-битного режима они будут работать как префиксы переопределения сегмента). CS: и DS:, соответственно). На процессорах, которые не поддерживают подсказки ветвей, эти префиксы принимаются, но игнорируются при использовании с Jcc.
  3. ^ Подсказки ветвей поддерживаются на всех процессорах NetBurst (семейство Pentium 4), но не поддерживаются ни на одном другом известном процессоре до их повторного внедрения в процессорах Redwood Cove, начиная с Meteor Lake в 2023 году.
  4. ^ Листовые функции, определенные для ENCLS (выбранные EAX):
    ЕАХ Функция
    0 (ЭКРЕАТ) Создать анклав
    1 (ЕАДД) Добавить страницу
    2 (БОЛЬШИНСТВО) Инициализация анклава
    3 (УДАЛИТЬ) Удаление страницы из EPC (кеша страниц анклава)
    4 (ЕДБГРД) Чтение данных отладчиком
    5 (ЭДБГВР) Запись данных отладчиком
    6 (ПРОДЛИТЬ) Расширение измерения страницы EPC
    7 (ЕЛДБ) Загрузить страницу EPC как заблокированную
    8 (ЭЛДУ) Загрузить страницу EPC как разблокированную
    9 (ЭБЛОК) Заблокировать страницу EPC
    А (EPA) Добавить массив версий
    Б (ЭББ) Обратная запись/аннулирование страницы EPC
    С (ЭТРАК) Активировать проверки EBLOCK
    Добавлено с SGX2
    Д (ЕАУГ) Добавить страницу в инициализированный анклав
    Е (ЭМОДПТР) Ограничить разрешения страницы EPC
    Ф (ПРИНЯТО) Изменить тип страницы EPC
    Добавлено с помощью OVERSUB [104]
    10 (ЭРДИНФО) Чтение информации о типе/статусе страницы EPC
    11 (ЭТРАКК) Активировать проверки EBLOCK
    12 (ЭЛДБК) Загрузить страницу EPC как заблокированную с расширенными отчетами об ошибках
    13 (ЭЛДУК) Загрузить страницу EPC как разблокированную с расширенными отчетами об ошибках
    Другой
    18 (ЕУПДАТЕСВН) Обновите SVN (номер версии безопасности) после обновления микрокода в реальном времени. [105]

    Любое неподдерживаемое значение в EAX вызывает исключение #GP.

  5. ^ SGX устарел для процессоров настольных компьютеров/ноутбуков, начиная с 11-го поколения ( Rocket Lake , Tiger Lake ) и далее, но по-прежнему доступен на Xeon . серверных компонентах под маркой [106]
  6. ^ Листовые функции, определенные для ENCLU (выбранные EAX):
    ЕАХ Функция
    0 (ЭРЕПОРТ) Создать криптографический отчет
    1 (ЕГЕТКЕЙ) Создать криптографический ключ
    2 (ВВОД) Войдите в анклав
    3 (ЭРЕСУМЕ) Повторно войти в анклав
    4 (ВЫХОД) Выход из анклава
    Добавлено с SGX2
    5 (ЕАКЦЕПТ) Принять изменения на странице EPC
    6 (ЭМОДПЕ) Расширить разрешения страницы EPC
    7 (ЕАКЦЕПТКОПИЯ) Инициализировать ожидающую страницу
    Добавлено с помощью TDX [108]
    8 (ЕВЕРИФИРЕПОРТ2) Проверка криптографического отчета доверенного домена
    Добавлено с помощью AEX-Notify
    9 (ЭДЕКССА) Уменьшить TCS.CSSA

    Любое неподдерживаемое значение в EAX вызывает исключение #GP.
    Функции EENTER и ERESUME не могут выполняться внутри анклава SGX — другие функции могут выполняться только внутри анклава.

  7. ^ ENCLU может быть выполнено только в кольце 3, а не в кольцах 0/1/2.
  8. ^ Листовые функции, определенные для ENCLV (выбранные EAX):
    ЕАХ Функция
    Добавлено с помощью OVERSUB [104]
    0 (ЭДЕКВИРЧИЛД) Уменьшить VIRTCHILDCNT в SECS
    1 (ЭИНКВИРЧИЛД) Приращение VIRTCHILDCNT в сек.
    2 (ЕСЕТКОНТЕКСТ) Установить поле ENCLAVECONTEXT в SECS

    Любое неподдерживаемое значение в EAX вызывает исключение #GP.
    The ENCLV Инструкция присутствует только в системах, которые поддерживают расширения EPC Oversubscription Extensions для SGX («OVERSUB»).

  9. ^ ENCLV доступен только в том случае, если работа Intel VMX включена с помощью VMXONи в противном случае выдаст #UD.
  10. ^ Для PTWRITE, запись в пакет трассировки процессора произойдет только в том случае, если набор битов разрешения (биты «TriggerEn», «ContextEn», «FilterEn» RTIT_STATUS MSR и бит «PTWEn» RTIT_CTL MSR) все установлены на 1.
    The PTWRITE Инструкция указывается в SDM, чтобы вызвать исключение #UD, если используется префикс инструкции 66h, независимо от других префиксов.
  11. ^ Для MOVDIR64, адрес назначения, заданный ES:reg, должен быть выровнен по 64 байта.
    Размер операнда для аргумента регистра определяется размером адреса, который может быть переопределен 67h префикс.
    Аргумент источника памяти размером 64 байта не обязательно должен быть выровнен по 64 байтам, и его атомарное чтение не гарантируется.
  12. ^ Листовые функции, определенные для PCONFIG (selected by EAX) are:
    EAX Function
    0 MKTME_KEY_PROGRAM:
    Program key and encryption mode to use with an TME-MK Key ID.
    Added with TSE
    1 TSE_KEY_PROGRAM:
    Direct key programming for TSE.
    2 TSE_KEY_PROGRAM_WRAPPED:
    Wrapped key programming for TSE.

    Any unsupported value in EAX causes a #GP(0) exception.

  13. ^ For CLDEMOTE, the cache level that it will demote a cache line to is implementation-dependent.
    Since the instruction is considered a hint, it will execute as a NOP without any exceptions if the provided memory address is invalid or not in the L1 cache. It may also execute as a NOP under other implementation-dependent circumstances as well.
    On systems that do not support the CLDEMOTE extension, it executes as a NOP.
  14. ^ Intel documentation lists Tremont and Alder Lake as the processors in which CLDEMOTE was introduced. However, as of May 2022, no Tremont or Alder Lake models have been observed to have the CPUID feature bit for CLDEMOTE set, while several of them have the CPUID bit cleared.[109]
    As of April 2023, the CPUID feature bit for CLDEMOTE has been observed to be set for Sapphire Rapids.[110]
  15. ^ For UMONITOR, the operand size of the address argument is given by the address size, which may be overridden by the 67h prefix. The default segment used is DS:, which can be overridden with a segment prefix.
  16. ^ Jump up to: a b For the UMWAIT and TPAUSE instructions, the operating system can use the IA32_UMWAIT_CONTROL MSR to limit the maximum amount of time that a single UMWAIT/TPAUSE invocation is permitted to wait. The UMWAIT and TPAUSE instructions will set RFLAGS.CF to 1 if they reached the IA32_UMWAIT_CONTROL-defined time limit and 0 otherwise.
  17. ^ TPAUSE and UMWAIT can be run outside Ring 0 only if CR4.TSD=0.
  18. ^ Для аргумента регистра UMWAIT и TPAUSE инструкции, поддерживаются следующие биты флагов:
    Биты Использование
    0 Предпочтительное состояние оптимизации.
    • 0 = C0.2 (более медленное пробуждение, улучшает производительность других потоков SMT на том же ядре)
    • 1 = C0.1 (более быстрое пробуждение)
    31:1 (Сдержанный)
  19. ^ Хотя сериализацию можно выполнить с помощью более старых инструкций, таких как, например, CPUID и IRET, эти инструкции выполняют дополнительные функции, вызывая побочные эффекты и снижение производительности, когда требуется сериализация автономных инструкций. ( CPUID кроме того, существует проблема, заключающаяся в том, что при выполнении в условиях виртуализации он вызывает обязательный #VMEXIT, что приводит к очень большим накладным расходам.) SERIALIZE инструкция выполняет только сериализацию, избегая этих дополнительных затрат.
  20. ^ Растровое изображение компонентов истории ЦП, которые можно сбросить через HRESET предоставляется CPUID.(EAX=20h,ECX=0):EBX.
    По состоянию на июль 2023 г. определены следующие биты:
    Кусочек Использование
    0 История Intel Thread Director
    31:1 (Сдержанный)
  21. ^ Аргумент регистра SENDUIPI — это индекс для выбора записи из UITT (таблицы целей пользовательских прерываний, таблицы, указанной в новом UINTR_TT и UINT_MISC МСР. )
  22. ^ На Sapphire Rapids процессорах UIRET Инструкция всегда устанавливает UIF (флаг пользовательского прерывания) в 1. На Emerald Rapids и более поздних версиях процессорах UIRET установит UIF в значение бита 1 значения, извлеченного из стека для RFLAGS - эта функциональность обозначается CPUID.(EAX=7,ECX=1):EDX[17].

Добавлено вместе с другими расширениями, специфичными для AMD.

[ редактировать ]
Расширение набора команд Инструкция
мнемоника
Код операции Описание инструкции Кольцо Добавлено в
АльтМовКр8
Альтернативный механизм доступа к регистру управления CR8 . [а]
MOV reg,CR8 F0 0F 20 /0[б] Прочитайте регистр CR8. 0 К8 [с]
MOV CR8,reg F0 0F 22 /0[б] Запись в регистр CR8.
МОНИТОРКС
Отслеживайте область памяти на предмет записи в пользовательском режиме.
MONITORX NP 0F 01 FA Начните отслеживать область памяти на предмет записи в память. Похож на старшего MONITOR, кроме доступных в пользовательском режиме. 3 Экскаватор
MWAITX NP 0F 01 FB Дождитесь записи в отслеживаемую ячейку памяти, ранее указанную с помощью MONITORX.
MWAITX отличается от старшего MWAIT главным образом тем, что она выполняется в пользовательском режиме и может принимать необязательный аргумент тайм-аута (задаваемый в единицах времени TSC) в EBX (включается установкой бита [1] ECX в 1.)
КЛЗЕРО
Обнулить полную строку кэша.
CLZERO rAX NP 0F 01 FC Запишите нули во все байты в области памяти, размер и выравнивание которой соответствуют строке кэша ЦП и которая содержит байт, адресованный DS:rAX. [д] 3 Это был 1
РДПРУ
Чтение регистра процессора в пользовательском режиме.
RDPRU NP 0F 01 FD Чтение выбранных MSR (в основном счетчиков производительности) в пользовательском режиме. ECX указывает, какой регистр читать. [и]

Значение MSR возвращается в EDX:EAX.

Обычно 3 [ф] Это было 2
МКОММИТ
Зафиксировать хранилища в памяти.
MCOMMIT F3 0F 01 FA Убедитесь, что все предыдущие хранилища в потоке были зафиксированы в памяти и что о любых ошибках, обнаруженных этими хранилищами, сообщалось на все связанные ресурсы регистрации ошибок. Набор ошибок, о которых можно сообщить, и механизм журналирования зависят от платформы.
Наборы EFLAGS.CF в 0, если произошли какие-либо ошибки, в 1 в противном случае.
3 Это было 2
ИНВЛПГБ
Недействительные записи TLB с трансляцией.
INVLPGB NP 0F 01 FE Недействительные записи TLB для диапазона страниц с трансляцией. Аннулирование выполняется на процессоре, выполняющем инструкцию, а также передается всем остальным процессорам в системе.
rAX принимает виртуальный адрес для аннулирования и некоторые дополнительные флаги, ECX берет количество страниц, которые необходимо аннулировать, а EDX указывает ASID и PCID для аннулирования TLB.
0 Это было 3
TLBSYNC NP 0F 01 FF Синхронизировать аннулирование TLB.
Подождите, пока все аннулирования TLB не будут отмечены предыдущими вызовами INVLPGB На команду одного и того же логического процессора ответили все процессоры системы. Инструкция сериализуется.
  1. ^ Стандартный способ доступа к регистру CR8 — использовать кодировку, использующую REX.R префикс, например 44 0F 20 07 ( MOV RDI,CR8). Однако REX.R префикс доступен только в 64-битном режиме.
    Расширение AltMovCr8 добавляет дополнительный метод доступа к CR8, используя F0 ( LOCK) префикс вместо REX.R – это обеспечивает доступ к CR8 вне 64-битного режима.
  2. ^ Jump up to: а б Как и другие варианты MOV в/из регистров CRx, кодировки AltMovCr8 игнорируют два старших бита байта ModR/M инструкции и всегда выполняются так, как если бы эти два бита были установлены в значение 11b.
    Кодировки AltMovCr8 доступны в 64-битном режиме. Однако, объединив LOCK префикс с REX.R префикс не разрешен и вызовет исключение #UD.
  3. ^ Поддержка AltMovCR8 была добавлена ​​на этапе F AMD K8 и недоступна на более ранних стадиях.
  4. ^ Для CLZERO, размер адреса и префикс 67h определяют, будет ли использоваться AX, EAX или RAX в качестве адреса. Сегмент DS: по умолчанию может быть переопределен префиксом переопределения сегмента. Предоставленный адрес не требует выравнивания — при необходимости его выровняет аппаратное обеспечение.
    The CLZERO Инструкция предназначена для восстановления после фатальных ошибок Machine Check. Он некэшируемый, не может использоваться для выделения строки кэша без доступа к памяти и не должен использоваться для быстрой очистки памяти. [111]
  5. ^ Нумерация регистров, используемая RDPRU не обязательно совпадает с RDMSR/ WRMSR.
    Регистры, поддерживаемые RDPRU по состоянию на декабрь 2022 г. являются:
    ЭКХ Зарегистрироваться
    0 MPERF (MSR 0E7h: счетчик тактовой частоты максимальной производительности)
    1 APERF (MSR 0E8h: счетчик тактовой частоты фактической производительности)

    Неподдерживаемые значения в ECX возвращают 0.

  6. ^ Если CR4.TSD=1, тогда RDPRU инструкция может выполняться только в кольце 0.

инструкции x87 с плавающей запятой

[ редактировать ]

Сопроцессор x87 , если он имеется, обеспечивает поддержку арифметики с плавающей запятой. Сопроцессор предоставляет восемь регистров данных, каждый из которых содержит одно 80-битное значение с плавающей запятой (1 бит знака, 15 бит экспоненты, 64 бита мантиссы). Эти регистры организованы в виде стека, причем регистр вершины стека называется «st» или «st(0)», а остальные регистры называются st(1),st(2),...st(7). Он дополнительно предоставляет ряд регистров управления и состояния, включая «PC» (управление точностью, чтобы контролировать, следует ли округлять операции с плавающей запятой до 24, 53 или 64 бит мантиссы) и «RC» (управление округлением, чтобы выбрать округление). режим: округление до нуля, округление до положительной бесконечности, округление до отрицательной бесконечности, округление до ближайшего четного) и 4-битный регистр кода состояния «CC», четыре бита которого обозначаются индивидуально. как C0, C1, C2 и C3). Не все арифметические инструкции, предоставляемые x87, подчиняются PC и RC.

Оригинальные 8087 инструкции

[ редактировать ]
Описание инструкции Мнемоника Код операции Дополнительные элементы
x87 без ожидания [а] Инструкции по управлению FPU Ожидающий
мнемонический [б]
Инициализировать x87 FPU FNINIT DB E3 FINIT
Загрузить управляющее слово x87 FLDCW m16 D9 /5 (никто)
Сохранить управляющее слово x87 FNSTCW m16 D9 /7 FSTCW
Сохранение слова состояния x87 FNSTSW m16 DD /7 FSTSW
Очистить флаги исключений x87 FNCLEX DB E2 FCLEX
Загрузка среды x87 FPU FLDENV m112/m224[с] D9 /4 (никто)
Сохраните среду x87 FPU FNSTENV m112/m224[с] D9 /6 FSTENV
Сохраните состояние x87 FPU, затем инициализируйте x87 FPU. FNSAVE m752/m864[с] DD /6 FSAVE
Восстановить состояние FPU x87 FRSTOR m752/m864[с] DD /4 (никто)
Включить прерывания (только 8087) [д] FNENI DB E0 FENI
Отключить прерывания (только 8087) [д] FNDISI DB E1 FDISI
x87 Инструкции загрузки/сохранения/перемещения с плавающей запятой точность
контроль
округление
контроль
Загрузить значение с плавающей запятой в стек FLD m32 D9 /0 Нет
FLD m64 DD /0
FLD m80 DB /5
FLD st(i) D9 C0+i
Сохранение значения с плавающей запятой вершины стека в памяти или регистре стека. FST m32 D9 /2 Нет Да
FST m64 DD /2
FST st(i)[и] DD D0+i Нет
Сохраните значение с плавающей запятой вершины стека в памяти или регистре стека, а затем извлеките его. FSTP m32 D9 /3 Нет Да
FSTP m64 DD /3
FSTP m80[и] DB /7 Нет
FSTP st(i)[и] [ф] DD D8+i
ДФ D0+я [г]
ДФ D8+я [г]
Поместить +0.0 в стек FLDZ D9 EE Нет
Поместить +1.0 в стек FLD1 D9 E8
Поместите число π (приблизительно 3,14159) в стек. FLDPI D9 EB Нет 387 [час]
Толкать (приблизительно 3,32193) в стек FLDL2T D9 E9
Толкать (приблизительно 1,44269) в стек FLDL2E D9 EA
Толкать (приблизительно 0,30103) в стек FLDLG2 D9 EC
Толкать (приблизительно 0,69315) в стек FLDLN2 D9 ED
Обменять регистр вершины стека на другой регистр стека. FXCH st(i)[я] [Дж] D9 C8+i Нет
ДД C8+я [г]
ДФ C8+я [г]
Инструкции по загрузке/сохранению целых чисел x87 точность
контроль
округление
контроль
Загрузка целочисленного значения со знаком в стек из памяти с преобразованием в число с плавающей запятой. FILD m16 DF /0 Нет
FILD m32 DB /0
FILD m64 DF /5
Сохранение значения вершины стека в памяти с преобразованием в целое число со знаком FIST m16 DF /2 Нет Да
FIST m32 DB /2
Сохраните значение вершины стека в памяти с преобразованием в целое число со знаком, а затем извлеките стек. FISTP m16 DF /3 Нет Да
FISTP m32 DB /3
FISTP m64 DF /7
Загрузка 18-значного целого числа в двоично-десятичном формате в стек из памяти с преобразованием в число с плавающей запятой. FBLD m80[к] DF /4 Нет
Сохранение значения вершины стека в памяти с преобразованием в 18-значное целое двоично-десятичное число, а затем удаление стека. FBSTP m80 DF /6 Нет 387 [час]
Основные арифметические инструкции x87 точность
контроль
округление
контроль
Добавление с плавающей запятой
dst <- dst + src
FADD m32 D8 /0 Да Да
FADD m64 DC /0
FADD st,st(i) D8 C0+i
FADD st(i),st DC C0+i
Умножение с плавающей запятой
dst <- dst * src
FMUL m32 D8 /1 Да Да
FMUL m64 DC /1
FMUL st,st(i) D8 C8+i
FMUL st(i),st DC C8+i
Вычитание с плавающей запятой
dst <- dst – src
FSUB m32 D8 /4 Да Да
FSUB m64 DC /4
FSUB st,st(i) D8 E0+i
FSUB st(i),st DC E8+i
Обратное вычитание с плавающей запятой
dst <- src – dst
FSUBR m32 D8 /5 Да Да
FSUBR m64 DC /5
FSUBR st,st(i) D8 E8+i
FSUBR st(i),st DC E0+i
Деление с плавающей запятой [л]
dst <- dst / src
FDIV m32 D8 /6 Да Да
FDIV m64 DC /6
FDIV st,st(i) D8 F0+i
FDIV st(i),st DC F8+i
Обратное деление с плавающей запятой
dst <- src / dst
FDIVR m32 D8 /7 Да Да
FDIVR m64 DC /7
FDIVR st,st(i) D8 F8+i
FDIVR st(i),st DC F0+i
Сравнение с плавающей запятой
CC <- result_of( st(0) – src )
Та же операция, что и вычитание, за исключением того, что она обновляет регистр состояния x87 CC вместо любого из регистров стека FPU.
FCOM m32 D8 /2 Нет
FCOM m64 DC /2
FCOM st(i)[я] D8 D0+i
ДК Д0+я [г]
Базовые арифметические инструкции x87 со стеком Pop точность
контроль
округление
контроль
Добавление и извлечение чисел с плавающей запятой FADDP st(i),st[я] DE C0+i Да Да
Умножение и извлечение чисел с плавающей запятой FMULP st(i),st[я] DE C8+i Да Да
Вычитание и удаление чисел с плавающей запятой FSUBP st(i),st[я] DE E8+i Да Да
Обратное вычитание и удаление чисел с плавающей запятой FSUBRP st(i),st[я] DE E0+i Да Да
Разделение и извлечение чисел с плавающей запятой FDIVP st(i),st[я] DE F8+i Да Да
Обратное деление и удаление чисел с плавающей запятой FDIVRP st(i),st[я] DE F0+i Да Да
Сравнение и извлечение чисел с плавающей запятой FCOMP m32 D8 /3 Нет
FCOMP m64 DC /3
FCOMP st(i)[я] D8 D8+i
ДК Д8+я [г]
ДЕ D0+я [г]
Сравнение с плавающей запятой со st(1), затем выталкивание дважды FCOMPP DE D9 Нет
Базовые арифметические инструкции x87 с целочисленным исходным аргументом точность
контроль
округление
контроль
Добавление числа с плавающей запятой целым числом FIADD m16 DA /0 Да Да
FIADD m32 DE /0
Умножение числа с плавающей запятой на целое число FIMUL m16 DA /1 Да Да
FIMUL m32 DE /1
Вычитание числа с плавающей запятой целым числом FISUB m16 DA /4 Да Да
FISUB m32 DE /4
Обратное вычитание с плавающей запятой по целому числу FISUBR m16 DA /5 Да Да
FISUBR m32 DE /5
Деление с плавающей запятой на целое число FIDIV m16 DA /6 Да Да
FIDIV m32 DE /6
Обратное деление с плавающей запятой на целое число FIDIVR m16 DA /7 Да Да
FIDIVR m32 DE /7
Сравнение чисел с плавающей запятой и целых чисел FICOM m16 DA /2 Нет
FICOM m32 DE /2
Сравнение чисел с плавающей запятой и целыми числами и извлечение стека FICOMP m16 DA /3 Нет
FICOMP m32 DE /3
Дополнительные арифметические инструкции x87 точность
контроль
округление
контроль
Знак изменения с плавающей запятой FCHS D9 E0 Нет
Абсолютное значение с плавающей запятой FABS D9 E1 Нет
Сравнение значения вершины стека с плавающей запятой с 0 FTST D9 E4 Нет
Классифицируйте значение регистра вершины стека st(0).
Результат классификации сохраняется в регистре CC x87. [м]
FXAM D9 E5 Нет
Разделите значение st(0) на два значения E и M, представляющие показатель степени и мантиссу st(0).
Разбиение производится так, что , где E — целое число, а M — число, абсолютное значение которого находится в диапазоне .   [н]
st(0) затем заменяется на E , после чего M помещается в стек.
FXTRACT D9 F4 Нет
Частичный с плавающей запятой [the] остаток (не соответствует IEEE 754 ): FPREM D9 F8 Нет [п]
с плавающей запятой Квадратный корень FSQRT D9 FA Да Да
Округление с плавающей запятой до целого числа FRNDINT D9 FC Нет Да
Масштабирование с плавающей запятой в степени двойки. Округляет значение st(1) до целого числа с округлением до нуля, а затем использует его в качестве масштабного коэффициента для st(0): [д] FSCALE D9 FD Нет Да [р]
Трансцендентные инструкции x87 [с] Исходный операнд
ограничение диапазона
Экспонента по основанию 2 минус 1, с дополнительной точностью для st(0), близкой к 0: F2XM1 D9 F0 8087: 
80387: 
по основанию 2 Логарифм : за которым следует выталкивание стека FYL2X[т] D9 F1 никаких ограничений
Частичный тангенс: вычисляет из st(0) пару значений X и Y , такую, что Значение Y заменяет значение вершины стека, а затем X помещается в стек.
В 80387 и более поздних версиях x87, но не в оригинальной 8087, X всегда равен 1.0.
FPTAN D9 F2 8087: 
80387: 
Арктангенс с двумя аргументами и корректировкой квадранта: [в] за которым следует выталкивание стека FPATAN D9 F3 8087: 
80387: нет ограничений
Логарифм по основанию 2 плюс 1, с дополнительной точностью для st(0), близкого к 0: за которым следует выталкивание стека FYL2XP1[т] D9 F9 Интел:
АМД:
Другие инструкции для x87
Нет операции [v] FNOP D9 D0
Уменьшить указатель стека регистров FPU x87 FDECSTP D9 F6
Увеличение указателя стека регистров x87 FPU FINCSTP D9 F7
Бесплатная регистрация x87 FPU FFREE st(i) DD C0+i
Проверка и обработка ожидающих немаскированных исключений x87 FPU WAIT,
FWAIT
9B
Сохранение и извлечение данных с плавающей запятой, без исключения опустошения стека FSTPNCE ст(я) Д9 Д8+я [г]
Бесплатная регистрация x87, а затем удаление стека FFREEP ст(я) ДФ C0+i [г]
  1. ^ Сопроцессоры x87 (кроме 8087) обрабатывают исключения довольно необычным способом. Когда инструкция x87 генерирует немаскированное арифметическое исключение, она по-прежнему завершается, не вызывая сбоя ЦП – вместо того, чтобы вызывать сбой, она записывает в сопроцессор информацию, необходимую для обработки исключения (указатель инструкции, код операции, указатель данных, если инструкция имела операнд памяти) и установите флаг слова состояния FPU, чтобы указать, что присутствует ожидающее исключение. Это ожидающее исключение затем вызовет сбой ЦП при следующем x87, MMX или WAIT инструкция выполняется.
    Исключением являются инструкции x87 «Не ожидающие», которые будут выполняться, не вызывая такой ошибки, даже если присутствует ожидающее исключение (с некоторыми оговорками, см. примечание по применению AP-578). [112] ). Эти инструкции в основном представляют собой инструкции управления, которые могут проверять и/или изменять состояние ожидающего исключения FPU x87.
  2. ^ Для каждой неожидающей инструкции x87, мнемоника которой начинается с FN, существует псевдоинструкция, имеющая ту же самую мнемонику, но без N. Эти псевдоинструкции состоят из WAIT инструкция (код операции 9B), за которым следует соответствующая неожидающая инструкция x87. Например:
    • FNCLEX это инструкция с опкодом DB E2. Соответствующая псевдоинструкция FCLEX затем кодируется как 9B DB E2.
    • FNSAVE ES:[BX+6] это инструкция с опкодом 26 DD 77 06. Соответствующая псевдоинструкция FSAVE ES:[BX+6] затем кодируется как 9B 26 DD 77 06
    Эти псевдоинструкции обычно распознаются ассемблерами и дизассемблерами x86 и обрабатываются как отдельные инструкции, хотя все процессоры x86 с сопроцессорами x87 выполняют их как последовательность двух инструкций.
  3. ^ Jump up to: а б с д На процессорах x87 FPU 80387 и более поздних версий: FLDENV, F(N)STENV, FRSTOR и F(N)SAVE существуют в 16-битном и 32-битном вариантах. 16-битные варианты загружают/сохраняют 14-байтовую структуру данных среды с плавающей запятой в/из памяти, а 32-битные варианты вместо этого загружают/сохраняют 28-байтовую структуру данных. ( F(N)SAVE/ FRSTOR дополнительно загрузит/сохранит дополнительные 80 байтов содержимого регистра данных FPU после среды FPU, всего 94 или 108 байт). Выбор между 16-битным и 32-битным вариантами основан на CS.D бит и наличие 66h префикс инструкции. На 8087 и 80287 доступны только 16-битные варианты.
    64-битных вариантов этих инструкций не существует – используя REX.W под x86-64 будут использоваться 32-битные варианты. Поскольку они могут загружать/сохранять только нижние 32 бита FIP и FDP, рекомендуется использовать FXSAVE64/ FXRSTOR64 вместо этого, если требуется 64-битная работа.
  4. ^ Jump up to: а б В случае, если инструкция x87 вызывает немаскированное исключение FPU, FPU 8087 подаст сигнал IRQ через некоторое неопределенное время после выдачи инструкции. С этим не всегда можно справиться, [113] и поэтому FPU предлагает F(N)DISI и F(N)ENI инструкции по установке/очистке бита маски прерывания (бит 7) управляющего слова x87, [114] для управления прерыванием.
    Более поздние FPU x87, начиная с 80287, изменили механизм исключений FPU, чтобы вместо этого создавать исключение CPU при следующей инструкции x87. Это сделало бит маски прерывания ненужным, поэтому он был удален. [115] В более поздних FPU Intel x87 F(N)ENI и F(N)DISI инструкции были сохранены для обратной совместимости и выполняются как NOP, которые не изменяют состояние x87.
  5. ^ Jump up to: а б с FST/ FSTP с 80-битным назначением (m80 или st(i)) и исходным значением sNaN будут создавать исключения для AMD, но не для FPU Intel.
  6. ^ FSTP ST(0) — это часто используемая идиома для извлечения одного регистра из стека регистров x87.
  7. ^ Jump up to: а б с д и ж г час я Псевдоним опкода Intel x87. Использование этого кода операции не рекомендуется.
    В сопроцессоре Intel 8087 несколько зарезервированных кодов операций будут выполнять операции, аналогичные существующим определенным инструкциям x87. Эти коды операций были задокументированы для 8087. [116] и 80287, [117] но затем не упоминался в более поздних руководствах до обновления Intel SDM в октябре 2017 года. [118]
    Они присутствуют на всех известных FPU Intel x87, но недоступны на некоторых старых FPU сторонних производителей, таких как AMD Geode GX/LX, DM&P Vortex86. [119] и NexGen 586PF. [120]
  8. ^ Jump up to: а б На 8087 и 80287, FBSTP а инструкции постоянной нагрузки всегда используют режим округления до ближайшего. На процессорах FPU x87 80387 и более поздних версиях эти инструкции будут использовать режим округления, указанный в регистре RC x87.
  9. ^ Jump up to: а б с д и ж г час я Для FADDP, FSUBP, FSUBRP, FMULP, FDIVP, FDIVRP, FCOM, FCOMP и FXCH инструкции, ассемблеры/дизассемблеры x86 могут распознавать варианты инструкций без аргументов. Такие варианты эквивалентны вариантам, использующим st(1) в качестве первого аргумента.
  10. ^ На процессорах Intel Pentium и более поздних версиях: FXCH реализуется как переименование регистра, а не как настоящее перемещение данных. Это не имеет никакого семантического эффекта, но обеспечивает работу с нулевой задержкой цикла. Это также позволяет инструкции разрывать зависимости данных для значения вершины стека x87, улучшая достижимую производительность кода, оптимизированного для этих процессоров.
  11. ^ Результат выполнения FBLD инструкция для данных, отличных от BCD, не определена.
  12. ^ На ранних процессорах Intel Pentium деление с плавающей запятой подвергалось ошибке Pentium FDIV . Это также повлияло на инструкции, выполняющие деление в рамках своих операций, например FPREM и FPATAN. [121]
  13. ^ FXAM Инструкция установит C0, C2 и C3 в зависимости от типа значения в st(0) следующим образом:
    С3 С2 С0 Классификация
    0 0 0 Не поддерживается (ненормальный или псевдо-NaN)
    0 0 1 НЭН
    0 1 0 Нормальное конечное число
    0 1 1 Бесконечность
    1 0 0 Ноль
    1 0 1 Пустой
    1 1 0 Денормальное число
    1 1 1 Пусто (может возникнуть только на 8087/80287)

    C1 устанавливается на знаковый бит st(0), независимо от того, является ли st(0) пустым или нет.

  14. ^ Для FXTRACT, если st(0) равно нулю или ±∞, то M полагается равным st(0). Если st(0) равен нулю, E устанавливается в 0 в 8087/80287, но -∞ в 80387 и более поздних версиях. Если st(0) равен ±∞, то E устанавливается равным +∞.
  15. ^ Для FPREM, если частное Q больше, чем , то вычисление остатка могло быть выполнено лишь частично – в этом случае FPREM инструкцию необходимо будет запустить еще раз, чтобы завершить вычисление остатка. На это указывает настройка инструкции C2 до 1.
    Если инструкция завершила вычисление остатка, она установит C2 в 0 и установите три бита {C0,C3,C1} частного Q. к нижним трем битам
    В версии 80387 и более поздних версиях, если инструкция не завершила вычисление остатка, то вычисленный остаток Q, используемый для уменьшения аргумента, будет округлен до числа, кратного 8 (или большей степени 2), так что нижние 3 бита часть частного все еще можно правильно получить на более позднем проходе, который завершает вычисление остатка.
  16. ^ Вычисление остатка, выполненное FPREM инструкция всегда точна, без ошибок округления.
  17. ^ Для FSCALE инструкции для 8087 и 80287, st(1) должен находиться в диапазоне . Кроме того, его абсолютное значение должно быть либо 0, либо хотя бы 1. Если эти требования не выполняются, результат не определен.
    Эти ограничения были сняты в версии 80387.
  18. ^ Для FSCALE, округление применяется только в случае переполнения, недостаточности или ненормального результата.
  19. ^ Трансцендентные инструкции x87 не подчиняются PC или RC, а вместо этого вычисляют полные 80-битные результаты. Эти результаты не обязательно округлены правильно (см. «Дилемма составителя таблиц ») — они могут иметь погрешность до ±1 ulp на Pentium или более поздних версиях или до ±1,5 ulp на более ранних сопроцессорах x87.
  20. ^ Jump up to: а б Для FYL2X и FYL2XP1 инструкций максимальная граница ошибки ±1 ulp справедлива только для st(1)=1,0 – для других значений st(1) граница ошибки увеличивается до ±1,35 ulp.
  21. ^ Для FPATAN, выполняются следующие корректировки по сравнению с простым вычислением арктангенса отношения с одним аргументом :
    • Если и st(0), и st(1) равны ±∞, то арктангенс вычисляется так, как если бы каждый из st(0) и st(1) был заменен на ±1 того же знака. Это дает результат, который является нечетным кратным .
    • Если и st(0), и st(1) равны ±0, то арктангенс вычисляется так, как если бы st(0), а не st(1), был заменен на ±1 того же знака, что дает результат ±0 или .
    • Если st(0) отрицательно (имеет установленный знаковый бит), то сложение к результату добавляется тот же знак, что и st(1).
  22. ^ Пока FNOP является бездействующим в том смысле, что стек регистров x87 FPU остается неизмененным, он все равно может изменять FIP и CC и может привести к сбою, если присутствует ожидающее исключение x87 FPU.

Инструкции x87 добавлены в более поздние процессоры

[ редактировать ]
Описание инструкции Мнемоника Код операции Дополнительные элементы
Инструкции управления без ожидания x87 добавлены в 80287. Ожидающий
мнемонический
Уведомить FPU о переходе в защищенный режим [а] FNSETPM DB E4 FSETPM
Сохранение слова состояния x87 в AX FNSTSW AX DF E0 FSTSW AX
Инструкции x87 добавлены в 80387. [б] Исходный операнд
ограничение диапазона
Неупорядоченное сравнение с плавающей запятой.
Аналогично обычной инструкции сравнения чисел с плавающей запятой. FCOM, кроме не будет создавать исключение в ответ на любые qNaN . операнды
FUCOM st(i)[с] DD E0+i никаких ограничений
Неупорядоченное сравнение и извлечение чисел с плавающей запятой FUCOMP st(i)[с] DD E8+i
Неупорядоченное число с плавающей запятой, сравнение с st(1), затем выталкивание дважды FUCOMPP DA E9
IEEE 754 . Частичный остаток с плавающей запятой, соответствующий стандарту [д] FPREM1 D9 F5
Синус и косинус с плавающей запятой.
Вычисляет два значения и  [и]
Вершина стека st(0) заменяется на S , после чего C помещается в стек.
FSINCOS D9 FB
Синус с плавающей запятой. [и] FSIN D9 FE
Косинус с плавающей запятой. [и] FCOS D9 FF
Инструкции x87 добавлены в Pentium Pro Условие для
условные ходы
Условный переход с плавающей запятой на st(0) на основе EFLAGS FCMOVB st(0),st(i) DA C0+i ниже (CF=1)
FCMOVE st(0),st(i) DA C8+i равно (ZF=1)
FCMOVBE st(0),st(i) DA D0+i ниже или равно
(CF=1 или ZF=1)
FCMOVU st(0),st(i) DA D8+i неупорядоченный (PF=1)
FCMOVNB st(0),st(i) DB C0+i не ниже (CF=0)
FCMOVNE st(0),st(i) DB C8+i не равно (ZF=0)
FCMOVNBE st(0),st(i) DB D0+i не ниже и не равен
(CF=0 и ZF=0)
FCMOVNU st(0),st(i) DB D8+i не упорядочен (PF=0)
Сравнение и установка чисел с плавающей запятой EFLAGS.
Отличается от старшего FCOM инструкция сравнения с плавающей запятой, поскольку она помещает свой результат в целое число EFLAGS регистр, а не регистр x87 CC. [ф]
FCOMI st(0),st(i) DB F0+i
Сравнение и установка чисел с плавающей запятой EFLAGS, затем поп FCOMIP st(0),st(i) DF F0+i
Неупорядоченное сравнение и установка с плавающей запятой EFLAGS FUCOMI st(0),st(i) DB E8+i
Неупорядоченное сравнение и установка с плавающей запятой EFLAGS, затем поп FUCOMIP st(0),st(i) DF E8+i
Инструкции без ожидания x87 добавлены в Pentium II , AMD K7 и SSE [г] 64-битная мнемоника
( REX.W префикс)
Сохранение состояния x87, MMX и SSE в 512-байтовую структуру данных. [час] [я] [Дж] FXSAVE m512byte NP 0F AE /0 FXSAVE64 m512byte
Восстановление состояния x87, MMX и SSE из 512-байтовой структуры данных. [час] [я] FXRSTOR m512byte NP 0F AE /1 FXRSTOR64 m512byte
Инструкции x87 добавлены как часть SSE3
Сохранение целых чисел с плавающей запятой и всплывающих окон с округлением до нуля. FISTTP m16 DF /1
FISTTP m32 DB /1
FISTTP m64 DD /1
  1. ^ FPU x87 должен знать, работает ли он в реальном режиме или в защищенном режиме, поскольку среда с плавающей запятой, к которой обращается F(N)SAVE, FRSTOR, FLDENV и F(N)STENV инструкции имеют разные форматы в реальном режиме и защищенном режиме. На 80287 F(N)SETPM Инструкция необходима для сообщения FPU о переходе из реального режима в защищенный. В 80387 и более поздних версиях FPU x87 переходы между реальным и защищенным режимами автоматически передаются в FPU без необходимости каких-либо специальных инструкций – поэтому на этих FPU FNSETPM выполняется как NOP, который не изменяет состояние FPU.
  2. ^ Не включая снятые с производства инструкции для конкретных моделей FPU, совместимых с 80387.
  3. ^ Jump up to: а б Для FUCOM и FUCOMP инструкции, ассемблеры/дизассемблеры x86 могут распознавать варианты инструкций без аргументов. Такие варианты эквивалентны вариантам, использующим st(1) в качестве первого аргумента.
  4. ^ 80387 FPREM1 инструкция отличается от старой FPREM ( D9 F8) инструкция, заключающаяся в том, что частное Q округляется до целого числа с округлением до ближайшего четного, а не с округлением до нуля, используемым FPREM. Нравиться FPREM, FPREM1 всегда вычисляет точный результат без ошибок округления. Нравиться FPREM, он также может выполнить частичное вычисление, если частное слишком велико, и в этом случае его необходимо запустить снова.
  5. ^ Jump up to: а б с Поскольку FPU x87 выполняет сокращение аргументов для sin/cos с точностью всего около 68 бит, значение k , используемое при вычислении FSIN, FCOS и FSINCOS не совсем 1,0, а определяется выражением [122] [123] Эта неточность приведения аргумента также влияет на FPTAN инструкция.
  6. ^ FCOMI, FCOMIP, FUCOMI и FUCOMIP инструкции записывают свои результаты в ZF, CF и PF кусочки EFLAGS зарегистрироваться. На процессорах Intel, но не на процессорах AMD, SF, AF и OF кусочки EFLAGS также обнуляются этими инструкциями.
  7. ^ FXSAVE и FXRSTOR инструкции были добавлены в версию Pentium II «Deschutes» и отсутствуют в более ранней версии «Klamath».
    Они также присутствуют в AMD K7.
    Они также считаются неотъемлемой частью SSE и поэтому присутствуют во всех процессорах с SSE.
  8. ^ Jump up to: а б The FXSAVE и FXRSTOR инструкции сохранят/восстановят состояние SSE только на процессорах, поддерживающих SSE. В противном случае они сохранят/восстановят только состояние x87 и MMX.
    Раздел x87 состояния, сохраненного/восстановленного FXSAVE/ FXRSTOR имеет совершенно другую структуру, чем структура данных более старого F(N)SAVE/ FRSTOR инструкции, что позволяет быстрее сохранять/восстанавливать данные, избегая несогласованных загрузок и сохранений.
  9. ^ Jump up to: а б Когда эмуляция с плавающей запятой включена с помощью CR0.EM=1, FXSAVE(64) и FXRSTOR(64) считаются инструкциями x87 и соответственно создают Исключение #NM (устройство недоступно). Кроме WAIT, это единственные коды операций за пределами D8..DF Пространство кода операции ESC, которое демонстрирует такое поведение. (Все коды операций в D8..DF будет производить #НМ, если CR0.EM=1, даже для неопределенных кодов операций, которые могут привести к #UD иначе.)
  10. ^ В отличие от старого F(N)SAVE инструкция, FXSAVE не будет инициализировать FPU после сохранения его состояния в памяти, а вместо этого оставит состояние сопроцессора x87 неизмененным.

SIMD- инструкции

[ редактировать ]

Криптографические инструкции

[ редактировать ]

Инструкции по виртуализации

[ редактировать ]

Прочие инструкции

[ редактировать ]

x86 также включает в себя наборы инструкций, выпуск которых прекращен, которые больше не поддерживаются Intel и AMD, а также недокументированные инструкции, которые выполняются, но официально не задокументированы.

См. также

[ редактировать ]
  1. ^ «Re: Идентификация процессора Intel и инструкция CPUID» . Проверено 21 апреля 2013 г.
  2. ^ https://eecs.wsu.edu/~ee314/handouts/x86ref.pdf
  3. Михал Некасек, SGDT/SIDT Fiction and Reality , 4 мая 2017 г. Архивировано 29 ноября 2023 г.
  4. ^ Jump up to: а б Intel, Недокументированная инструкция по тестированию iAPX 286 . Архивировано 20 декабря 2023 г.
  5. ^ WikiChip, UMIP — x86 . Архивировано 16 марта 2023 г.
  6. ^ Oracle Corp, Руководство администратора Oracle® VM VirtualBox для версии 6.0, раздел 3.5: Подробности о виртуализации программного обеспечения . Архивировано 8 декабря 2023 года.
  7. ^ Проект MBC, Обнаружение виртуальных машин (постоянная ссылка) или Обнаружение виртуальных машин (постоянная ссылка)
  8. ^ Эндрю Шульман, «Несанкционированная Windows 95» ( ISBN   1-56884-169-8 ), глава 8, стр. 249 257.
  9. ^ В патенте США 4974159 «Способ передачи управления в многозадачной компьютерной системе» упоминается 63h/ARPL.
  10. ^ Intel, Руководство разработчика семейства процессоров Pentium®, том 3 , 1995 г., номер заказа. 241430-004, раздел 12.7, стр. 323
  11. ^ Intel, Как работает микроархитектурная выборка данных , см. раздел «Средства снижения риска». Архивировано 22 апреля 2022 г.
  12. ^ Документация по ядру Linux, смягчение последствий микроархитектурной выборки данных (MDS). Архивировано 21 октября 2020 г. на Wayback Machine.
  13. ^ Форумы VCF, я нашел код операции SAVEALL , 21 июня 2019 г. Архивировано 13 апреля 2023 г.
  14. ^ представитель lodsb, Секреты Intel 286: режим ICE и F1 0F 04 , 12 августа 2022 г. Архивировано 8 декабря 2023 г.
  15. ^ LKML, (ИСПРАВЛЕНИЕ) x86-64, espfix: не допускайте утечки битов 31:16 %esp, возвращающихся в 16-битный стек , 29 апреля 2014 г. Архивировано 4 января 2018 г.
  16. Рэймонд Чен, Запуск игр MS-DOS в Windows 95: решение проблемы iretd , 4 апреля 2016 г. Архивировано 15 марта 2019 г.
  17. ^ sandpile.org, регистр rFLAGS для архитектуры x86 , см. примечание № 7.
  18. ^ Джан Белюк, Рассмотрение всего набора инструкций x86-64 за считанные секунды с помощью этого странного трюка , 22 марта 2021 г. Архивировано 23 марта 2021 г.
  19. ^ Jump up to: а б Роберт Коллинз, Недокументированные коды операций , 29 июля 1995 г. Архивировано 21 февраля 2001 г.
  20. Михал Некасек, ICEBP наконец задокументирован , Музей OS/2 , 25 мая 2018 г. Архивировано 6 июня 2018 г.
  21. ^ Intel, AP-526: Оптимизация для 32-битных процессоров Intel , номер заказа. 242816-001, октябрь 1995 г. – списки. INT1 на странице 86.
  22. ^ AMD, 64-битная технология AMD, том 2: Системное программирование , номер заказа. 24593, ред. 3.06, август 2002 г., стр. 248
  23. ^ «Информация о процессоре Intel 80386 | Машины PCJS» .
  24. ^ Джефф Чаппелл, Идентификация ЦП перед CPUID
  25. ^ Джефф Парсонс, Устаревшие 80386 Инструкции: IBTS и XBTS , машины PCjs . Архивировано 19 сентября 2020 г.
  26. ^ Роберт Коллинз, Инструкция LOADALL . Архивировано из оригинала 5 июня 1997 года.
  27. ^ Тот, Эрвин (16 марта 1998 г.). «BSWAP с 16-битными регистрами» . Архивировано из оригинала 3 ноября 1999 г. Команда записывает старшее слово регистра двойного слова, не затрагивая его старшие 16 бит.
  28. ^ Колдвин, Гинваэль (29 декабря 2009 г.). «BSWAP + префикс 66h» . Проверено 3 октября 2018 г. внутреннее (нулевое) расширение значения меньшего (16-битного) регистра… применение bswap к 32-битному значению «00 00 AH AL»,… усеченному до младших 16 бит, которые равны «00 00». … Bochs … bswap reg16 действует так же, как bswap reg32 … QEMU … игнорирует префикс 66h
  29. ^ Intel «Микропроцессор i486» (апрель 1989 г., номер заказа 240440-001), списки стр. 142. CMPXCHG с 0F A6/A7 кодировки.
  30. ^ Intel «Микропроцессор i486» (ноябрь 1989 г., номер заказа 240440-002), списки стр. 135. CMPXCHG с 0F B0/B1 кодировки.
  31. ^ «Intel 486 и 486 POD CPUID, S-spec и степпинги» .
  32. ^ Intel, Справочник по программированию расширений Software Guard , номер заказа. 329298-002, октябрь 2014 г., разделы 3.5 и 3.6.5.
  33. ^ Франк ван Гиллуве, «Недокументированный ПК, второе издание», 1997, ISBN   0-201-47950-8 , стр. 55.
  34. ^ AMD, Руководство по версиям процессоров AMD Athlon 64 и AMD Opteron, pub.no. 25759, ред. 3.79, июль 2009 г., стр. 34. Архивировано 20 декабря 2023 г.
  35. ^ Intel, Руководство разработчика программного обеспечения, том 3A , номер заказа. 253668-078, декабрь 2022 г., раздел 9.3, стр. 299
  36. ^ «RSM — выход из режима управления системой» . Архивировано из оригинала 12 марта 2012 г.
  37. ^ Отчет о микропроцессоре, Объяснение режима управления системой (том 6, № 8, 17 июня 1992 г.). Архивировано 29 июня 2022 г.
  38. ^ Эллис, Симсон К., «Микропроцессор 386 SL в ноутбуках», Intel Corporation, Microcomputer Solutions, март/апрель 1991 г., стр. 20
  39. ^ Лист данных Cyrix 486SLC/e (1992) , раздел 2.6.4
  40. ^ Исходники ядра Linux 6.3, /arch/x86/include/asm/cpuid.h , строка 69.
  41. ^ Список рассылки gcc-patches, CPUID Patch для IDT Winchip , 21 мая 2019 г. Архивировано 27 апреля 2023 г.
  42. ^ Intel, Примечание по применению технологии виртуализации Intel® FlexMigration , номер заказа. 323850-004, октябрь 2012 г., раздел 2.3.2 на стр. 12. Архивировано 13 октября 2014 г.
  43. ^ Intel, Техническое описание семейства процессоров Atom C3000, номер заказа. 337018-002, февраль 2018 г., страницы 133, 3808 и 3814. Архивировано 9 февраля 2022 г.
  44. ^ AMD, Руководство программиста по архитектуре AMD64, том 3, pub.no. 24594, ред. 3.34, октябрь 2022 г., с. 165 (запись на CPUID инструкция)
  45. Роберт Коллинз, CPUID Algorithm Wars , ноябрь 1996 г. Архивировано из оригинала 18 декабря 2000 г.
  46. ^ Джефф Чаппелл, Поддержка CMPXCHG8B в 32-битном ядре Windows , 23 января 2008 г. Архивировано 5 ноября 2023 г.
  47. ^ Jump up to: а б Intel, Руководство разработчика программного обеспечения , номер заказа. 325426-077, ноябрь 2022 г. – запись на RDTSC Инструкция на стр. 1739 описывает последовательность инструкций, необходимую для заказа RDTSC инструкции по отношению к предыдущим и последующим инструкциям.
  48. ^ Ядро Linux 5.4.12, /arch/x86/kernel/cpu/centaur.c
  49. ^ Переполнение стека. Может ли постоянный неинвариантный tsc изменять частоту в зависимости от состояния процессора? Доступ 24 января 2023 г. Архивировано 24 января 2023 г.
  50. ^ CPU-World, CPUID для Zhaoxin KaiXian KX-5000 KX-5650 (от timw4mail) , 24 апреля 2024 г. Архивировано 26 апреля 2024 г.
  51. Михал Некасек, «Недокументированный RDTSC» , 27 апреля 2018 г. Архивировано 16 декабря 2023 г.
  52. ^ JookWiki, "nopl" , 24 сентября 2022 г. - содержит подробный отчет об истории длинного NOP и проблемах, связанных с ним. Архивировано 28 октября 2022 г.
  53. ^ Сообщество Intel: многобайтовый NOP стал официальным . Архивировано 7 апреля 2022 г.
  54. ^ Руководство разработчика программного обеспечения Intel , том 3B (номер заказа 253669-076us, декабрь 2021 г.), раздел 22.15 «Зарезервированный NOP»
  55. ^ AMD, 64-битная технология AMD – Руководство программиста по архитектуре AMD x86-64, том 3 , публикация №. 24594, ред. 3.02, август 2002 г., стр. 379.
  56. ^ Журналы отчетов об ошибках Debian, сборка -686 использует длинные noops, которые не поддерживаются Transmeta Crusoe, немедленный сбой при загрузке , см. сообщения 148 и 158 для NOPL на VIA C7. Архивировано 1 августа 2019 г.
  57. ^ Intel, Руководство разработчика программного обеспечения для архитектуры Intel, том 2 , 1997 г., номер заказа. 243191-001, стр. 3-9 и А-7.
  58. ^ Джон Хэсси, Изменения в Pentium Pro , список рассылки GAS2 , 28 декабря 1995 г. - патч, добавляющий UD2A и UD2B мнемоника инструкций для GNU Binutils. Архивировано 25 июля 2023 г.
  59. ^ Ян Бейлих, x86: правильный UDn , список рассылки binutils-gdb , 23 ноября 2017 г. — патч Binutils, добавляющий байт ModR/M в UD1/ UD2B и добавил UD0. Архивировано 25 июля 2023 г.
  60. ^ Intel, Руководство разработчика семейства процессоров Pentium®, том 3 , 1995. Номер заказа. 241430-004, приложение А, стр. 943 – резервирует коды операций 0F 0B и 0F B9.
  61. ^ Jump up to: а б AMD, Руководство программиста по архитектуре AMD64, том 3 , номер публикации. 24594, ред. 3.17, декабрь 2011 г. – см. стр. 416. UD0 и страницы 415 и 419 для UD1.
  62. ^ Jump up to: а б Intel, Руководство разработчика программного обеспечения, том 2B , номер заказа. 253667-061, декабрь 2016 г. – списки UD1 ModR/M ) и байтом UD0 (без байта ModR/M) на стр. 4-687.
  63. ^ Стеклина, Юлиан (08 февраля 2019 г.). «Отпечатки пальцев процессоров x86 с использованием недопустимых кодов операций» . x86.лол . Архивировано из оригинала 15 декабря 2023 года . Проверено 15 декабря 2023 г.
  64. ^ «исправление длины ud0 · intelxed/xed@7561f54» . Гитхаб . Архивировано из оригинала 1 июня 2023 года . Проверено 15 декабря 2023 г.
  65. ^ Jump up to: а б Cyrix, паспорт процессора 6x86 , 1996 г., номер заказа. 94175-01, таблица 6-20, стр. 209 – используется мнемосхема OIO («Официальный недопустимый код операции») для 0F FF код операции.
  66. ^ Intel, Руководство разработчика программного обеспечения, том 2B , номер заказа. 253667-064, октябрь 2017 г. – списки UD0 (с байтом ModR/M) на стр. 4-683.
  67. ^ AMD, Техническое справочное руководство по процессору AMD-K5 , ноябрь 1996 г., номер заказа. 18524C/0, раздел 3.3.7, стр. 90 – резервирует 0F FF код операции без присвоения ему мнемоники.
  68. ^ AMD, Техническое описание процессора AMD-K6 , номер заказа. 20695H/0, март 1998 г., раздел 24.2, стр. 283.
  69. ^ Джордж Данлэп, Повышение привилегий Intel SYSRET , Проект Xen. , 13 июня 2012 г. Архивировано 15 марта 2019 г.
  70. ^ Intel, AP-485: Идентификация процессора Intel® и инструкция CPUID , номер заказа. 241618-039, май 2012 г., раздел 5.1.2.5, стр. 32
  71. ^ Михал Некасек, «SYSENTER, где ты?» , 20 июля 2017 г. Архивировано 29 ноября 2023 г.
  72. ^ AMD, Руководство по оптимизации кода процессора Athlon x86 , публикация №. 22007, ред. K, февраль 2002 г., приложение F, стр. 284. Архивировано 13 апреля 2017 г.
  73. ^ Transmeta, Распознавание процессора , 7 мая 2002 г.
  74. ^ VIA, Техническое описание процессора VIA C3 Nehemiah , версия 1.13, 29 сентября 2004 г., страница 17
  75. ^ CPU-World, CPUID для Intel Xeon 3,40 ГГц — Nocona Stepping D CPUID без CMPXCHG16B
  76. ^ CPU-World, CPUID для Intel Xeon 3,60 ГГц — Nocona степпинг E CPUID с CMPXCHG16B
  77. ^ SuperUser StackExchange, Насколько распространены старые процессоры x64, в которых отсутствует инструкция cmpxchg16b?
  78. ^ Intel Номер заказа SDM. 325462-077 , апрель 2022 г., том 2B, стр. 4-130 «MOVSX/MOVSXD-Move with Sign-Extension» указывает, что MOVSXD без REX.W «не рекомендуется».
  79. ^ Anandtech, Обзор AMD Zen 3 Ryzen Deep Dive , 5 ноября 2020 г., стр. 6
  80. ^ @ instlatx64 (31 октября 2020 г.). «Сохранение частного Ryzen: функции замены PEXT/PDEP 32/64b для процессоров #AMD (BR/#Zen/Zen+/#Zen2) на основе zp7 @zwegner» ( твит ) . Проверено 20 января 2023 г. - через Twitter .
  81. ^ Вегнер, Зак (4 ноября 2020 г.). "цвегнер/zp7" . Гитхаб .
  82. ^ Intel, Спецификация технологии обеспечения контроля потока управления (v3.0, номер заказа 334525-003, март 2019 г.)
  83. ^ Intel SDM, версия 076, декабрь 2021 г. , том 1, раздел 18.3.1
  84. ^ Список рассылки Binutils: x86: CET v2.0: Обновление префикса NOTRACK.
  85. ^ AMD, Расширения 3DNow! и наборы инструкций MMX , арт. 22466Д/0, март 2000 г., стр.11
  86. ^ Хади Брейс, Значение инструкции x86 SFENCE , 26 февраля 2019 г.
  87. ^ Intel, Руководство разработчика программного обеспечения , номер заказа. 325426-077, ноябрь 2022 г., том 1, раздел 11.4.4.3, стр. 276.
  88. ^ Хади Брайс, Значение инструкции LFENCE , 14 мая 2018 г.
  89. ^ AMD, Программные методы управления спекуляциями на процессорах AMD , версия 3.8.22, 8 марта 2022 г., стр. 4. Архивировано 13 марта 2022 г.
  90. ^ Intel, Руководство разработчика программного обеспечения Prescott New Instructions , номер заказа. 252490-003, июнь 2003 г., список стр. 3–26 и 3–38. MONITOR и MWAIT с явными операндами. Архивировано 9 мая 2005 г.
  91. ^ Доска объявлений Flat Assembler, «Синтаксис BLENDVPS/BLENDVPD/PBLENDVB» , также охватывает MONITOR/ MWAIT мнемоника. Архивировано 6 ноября 2022 г.
  92. ^ Intel, семейство продуктов Intel® Xeon Phi™ x200 (KNL) Пользовательский режим (кольцо 3) MONITOR и MWAIT (архивировано 5 марта 2017 г.)
  93. ^ AMD, Руководство разработчика BIOS и ядра (BKDG) Для процессоров семейства AMD 10h , номер заказа. 31116, ред. 3.62, стр. 419. Архивировано 8 апреля 2024 г.
  94. ^ Р. Чжан и др., (M)WAIT for It: Преодоление разрыва между микроархитектурными и архитектурными побочными каналами , 3 января 2023 г., стр. 5. Архивировано из оригинала 5 января 2023 г.
  95. ^ Intel, Справочник по программированию расширений набора команд архитектуры , номер заказа. 319433-052, март 2024 г., глава 17. Архивировано 7 апреля 2024 г.
  96. ^ Guru3D, выпуск 4- и 8-ядерных процессоров SoC VIA Zhaoxin x86 , 22 января 2018 г.
  97. ^ Уязвимости, x86: DoS из-за попытки использовать INVPCID с неканоническими адресами , 20 ноября 2018 г.
  98. ^ Intel, Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 , том 3, номер заказа. 325384-078, декабрь 2022 г., глава 23.15
  99. ^ Кэтрин Исдон, Недокументированное поведение ЦП на микроархитектурах x86 и RISC-V: взгляд на безопасность , 10 мая 2019 г., стр. 39
  100. ^ Instlatx64, Дамп CPUID Zhaoxin Kaixian KX-6000G , 15 мая 2023 г.
  101. ^ Intel, Руководство разработчика программного обеспечения процессоров Willamette , номер заказа. 245355-001, фев 2000 г., раздел 3.5.3, стр. 294 - списки HWNT/ HST мнемоника для префиксов подсказок ветвей. Архивировано из оригинала 5 февраля 2005 года.
  102. ^ Intel, Руководство разработчика программного обеспечения , номер заказа. 325462-083, март 2024 г. - том 1, глава 11.4.5, стр. 281 и том 2А, глава 2.1.1, стр. 525.
  103. ^ Intel, Справочное руководство по оптимизации архитектур Intel 64 и IA-32: Том 1 , номер заказа. 248966-050US, апрель 2024 г., глава 2.1.1.1, стр. 46.
  104. ^ Jump up to: а б с Intel, Архитектура Intel® Software Guard Extensions (Intel® SGX) для превышения подписки на безопасную память в виртуализированной среде , 25 июня 2017 г.
  105. ^ Intel, Обновления микрокода среды выполнения с расширениями Intel® Software Guard Extensions , сентябрь 2021 г., номер заказа. 648682 ред. 1.0. Архивировано из оригинала 31 марта 2023 года.
  106. ^ Intel, Техническое описание процессора Intel® Core™ 11-го поколения для настольных ПК, том 1 , май 2022 г., номер заказа. 634648-004, раздел 3.5, стр. 65
  107. ^ Intel, Какие платформы поддерживают расширения Intel® Software Guard Extensions (Intel® SGX) SGX2? Архивировано 5 мая 2022 года.
  108. ^ Intel, Архитектурные расширения ЦП Trust Domain , номер заказа. 343754-002, май 2021 г.
  109. ^ @InstLatX64 (3 мая 2022 г.). «История CLDEMOTE» ( твит ) . Проверено 23 января 2023 г. - через Twitter .
  110. ^ @Instlatx64 (17 апреля 2023 г.). «20-ядерный процессор Intel Xeon w7-2475X (SapphireRapids-64L) 806F8, дамп CPUID» ( твит ) . Проверено 20 апреля 2023 г. - через Twitter .
  111. ^ Викичип, CLZERO – x86
  112. ^ Intel, Примечание по применению AP-578: Рекомендации по программному и аппаратному обеспечению для обработчиков исключений FPU для процессоров с архитектурой Intel , номер заказа. 243291-002, февраль 1997 г.
  113. ^ Intel, Примечание по применению AP-113: Начало работы с процессором числовых данных , февраль 1981 г., страницы 24-25
  114. ^ Intel, математический сопроцессор 8087 , октябрь 1989 г., номер заказа. 285385-007, стр. 3-100, рис. 9
  115. ^ Intel, 80-битное расширение числового процессора HMOS 80287 , февраль 1983 г., номер заказа. 201920-001, стр. 14
  116. ^ Intel, iAPX86, 88 Руководство пользователя , 1981 г. (номер заказа 210201-001), стр. 797
  117. ^ Intel Справочное руководство для программистов 80286 и 80287 , 1987 г. (номер заказа 210498-005), с. 485
  118. ^ Intel Руководство разработчика программного обеспечения , том 3B, редакция 064, раздел 22.18.9
  119. ^ «GCC Bugzilla – 37179 – GCC выдает неверный код операции 'ffreep' » .
  120. ^ Майкл Стейл, FFREEP - инструкция по сборке, которой никогда не существовало
  121. ^ Душко Конкалиев, Ошибка Pentium FDIV
  122. ^ Брюс Доусон, Intel занижает границу ошибок на 1,3 квинтиллиона
  123. ^ Intel SDM, версия 053 и более поздние, описывает точную процедуру сокращения аргументов, используемую для FSIN, FCOS, FSINCOS и FPTAN в томе 1, раздел 8.3.8
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 076fecdfe729dfd78609669e932ffdb2__1722216720
URL1:https://arc.ask3.ru/arc/aa/07/b2/076fecdfe729dfd78609669e932ffdb2.html
Заголовок, (Title) документа по адресу, URL1:
x86 instruction listings - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)