списки инструкций x86
Часть серии о |
списки инструкций 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 означает немедленное (т. е. значение).
В- структура- ция |
Значение | Примечания | Код операции |
---|---|---|---|
ААА | 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+) |
Добавлено в определенные процессоры
[ редактировать ]с 80186/80188 Добавлено
[ редактировать ]Инструкция | Код операции | Значение | Примечания |
---|---|---|---|
ГРАНИЦА | 62 /р | Проверить индекс массива на соответствие границам | вызывает программное прерывание 5, если тест не пройден |
ВХОДИТЬ | С8 один | Введите кадр стека | Изменяет стек для входа в процедуру для языка высокого уровня. Принимает два операнда: объем памяти, выделяемый в стеке, и уровень вложенности процедуры. |
ИНСБ/ИНСВ | 6С | Ввод из порта в строку. Может использоваться с префиксом REP для повторения инструкции CX раз. | эквивалентно:
IN AL, DX
MOV ES:[DI], AL
INC DI ; adjust DI according to operand size and DF
|
6Д | |||
ОСТАВЛЯТЬ | С9 | Выйти из стекового фрейма | Освобождает локальное хранилище стека, созданное предыдущей инструкцией ENTER. |
ОУТСБ/ОУТСВ | 6Е | Вывод строки в порт. Может использоваться с префиксом 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
|
НАЖМИТЕ немедленно | 6А иб | Поместите немедленное значение байта/слова в стек. | пример:
PUSH 12h
PUSH 1200h
|
68 лет | |||
ИМУЛ немедленно | 6Б /р иб | Знаковое и беззнаковое умножение непосредственного значения байта/слова | пример:
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 , затем выключите процессор.
|
- ^ 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] - ^ Jump up to: а б с д и The
LGDT
,LIDT
,LLDT
,LMSW
иLTR
инструкции сериализуются на процессорах Pentium и более поздних версиях. - ^ В версии 80386 и более поздних версиях «Слово состояния машины» совпадает с управляющим регистром CR0 , однако
LMSW
Инструкция может изменять только нижние 4 бита этого регистра и не может очистить бит 0. Невозможность очистить бит 0 означает, чтоLMSW
может использоваться для входа в защищенный режим x86, но не выхода из него .
На 80286 вообще невозможно выйти из Защищенного режима (ни сLMSW
ни сLOADALL
[4] ) без перезагрузки ЦП – на 80386 и новее можно выйти из защищенного режима, но для этого необходимо использовать версию 80386 и новее.MOV
кCR0
инструкция. - ^ Если
CR4.UMIP=1
установлено, тоSGDT
,SIDT
,SLDT
,SMSW
иSTR
инструкции могут выполняться только в кольце 0.
Эти инструкции были непривилегированы на всех процессорах x86, начиная с 80286 и далее до появления UMIP в 2017 году. [5] Это было серьезной проблемой безопасности для программной виртуализации, поскольку она позволяет гостю виртуальной машины использовать эти инструкции для обнаружения того, что он работает внутри виртуальной машины. [6] [7] - ^ Jump up to: а б с The
SMSW
,SLDT
иSTR
инструкции всегда используют размер операнда 16 бит при использовании с аргументом памяти. При использовании аргумента регистра на процессорах 80386 или более поздних версий доступны более широкие размеры целевых операндов, которые ведут себя следующим образом:SMSW
: Сохраняет полный CR0 в длинном режиме x86-64 , в противном случае не определено.SLDT
: Нулевое расширение 16-битного аргумента на процессорах Pentium Pro и более поздних версиях, неопределенное на более ранних процессорах.STR
: Ноль расширяет 16-битный аргумент.
- ^ В 64-битном длинном режиме
ARPL
инструкция недоступна –63 /r
код операции был переназначен только для 64-битного режимаMOVSXD
инструкция. - ^
ARPL
Инструкция вызывает #UD в реальном режиме и виртуальном режиме 8086. Известно, что Windows 95 и OS/2 2.x широко используют этот #UD для использования63
код операции в качестве однобайтовой точки останова для перехода из виртуального режима 8086 в режим ядра. [8] [9] - ^ Биты 19:16 этой маски задокументированы как «неопределенные» на процессорах Intel. [10] На процессорах AMD маска документируется как
0x00FFFF00
. - ^ В некоторых комбинациях процессоров Intel и микрокода, начиная с 2019 г.,
VERW
Инструкция также очищает буферы микроархитектурных данных. Это позволяет использовать его как часть обходных путей для уязвимостей безопасности микроархитектурной выборки данных . [11] [12] - ^ 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 в качестве аргумента), новая мнемоника инструкций не требуется и не предоставляется.
Тип | Мнемоника инструкций | Код операции | Описание | Мнемоника для старого 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-битной версии. |
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
|
- ^ Для 32-битных строковых инструкций обозначение ±± используется для обозначения того, что указанный регистр пост-декрементируется на 4, если
EFLAGS.DF=1
и в противном случае увеличивается на 4.
Для операндов, в которых указан сегмент DS, сегмент DS может быть переопределен префиксом переопределения сегмента – если указан сегмент ES, сегмент всегда является ES и не может быть переопределен.
Выбор использования в качестве адресных регистров 16-битных регистров SI/DI или 32-битных регистров ESI/EDI осуществляется параметром AddressSize, который можно переопределить с помощью параметра AddressSize.67
префикс. - ^ 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
) соответствует действительности. - ^ Для
INSB/W/D
инструкции, права доступа к памяти дляES:[rDI]
адрес памяти может не проверяться до тех пор, пока не будет выполнен доступ к порту – если эта проверка не удалась (например, ошибка страницы или другое исключение памяти), то элемент данных, считанный из порта, будет потерян. Таким образом, не рекомендуется использовать эту инструкцию для доступа к порту ввода-вывода, который при чтении выполняет какой-либо побочный эффект. - ^ Доступ к порту ввода-вывода разрешен только в том случае, если CPL≤IOPL или биты битовой карты разрешения порта ввода-вывода для порта, к которому осуществляется доступ, установлены на 0.
- ^
CWDE
инструкция отличается от старойCWD
инструкция в этомCWD
расширил бы 16-битное значение в AX до 32-битного значения в паре регистров DX:AX. - ^ Для
E3
код операции (JCXZ
/JECXZ
), выбор того, будет ли инструкция использоватьCX
илиECX
для его сравнения (и, следовательно, какой мнемоники использовать) основано на AddressSize, а не OperandSize. (Вместо этого OperandSize определяет, следует ли усекать место назначения перехода до 16 бит или нет).
Это также относится к инструкциям цикла.LOOP
,LOOPE
,LOOPNE
(коды операцийE0
,E1
,E2
), однако, в отличие отJCXZ
/JECXZ
, этим инструкциям не была присвоена новая мнемоника для их вариантов с использованием ECX. - ^ Для
PUSHA(D)
, значение SP/ESP, помещенное в стек, — это значение, которое оно имело непосредственно передPUSHA(D)
инструкция начала выполняться. - ^ Для
POPA
/POPAD
, элемент стека, соответствующий SP/ESP, извлекается из стека (выполняется чтение памяти), но не помещается в SP/ESP. - ^
PUSHFD
иPOPFD
инструкции вызовут исключение #GP, если они выполняются в виртуальном режиме 8086 , если IOPL не равен 3.
ThePUSHF
,POPF
,IRET
иIRETD
инструкции вызовут исключение #GP при выполнении в режиме Virtual-8086, если IOPL не равен 3 и VME не включен. - ^ Если
IRETD
используется для возврата из режима ядра в пользовательский режим (что повлечет за собой изменение CPL), а сегмент стека пользовательского режима , указанный SS, является 16-битным сегментом, тогдаIRETD
Инструкция восстановит только младшие 16 бит указателя стека (ESP/RSP), а остальные биты сохранят то значение, которое они имели в коде ядра доIRETD
. Это потребовало сложных обходных решений как для Linux («ESPFIX»), так и для Linux. [15] и Windows. [16] Эта проблема также затрагивает более поздние 64-битные версии.IRETQ
инструкция.
Мнемоника инструкций | Код операции | Описание | Кольцо |
---|---|---|---|
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 и более поздних версиях переход к | |
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 внутрисхемной эмуляции.
Выполняет ту же операцию, что и | |
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 |
- ^ Jump up to: а б с д Для
BT
,BTS
,BTR
иBTC
инструкции:- Если первый аргумент инструкции является операндом-регистром и/или второй аргумент является непосредственным, то битовый индекс во втором аргументе берется по модулю размера операнда (16/32/64, фактически используя только младшие 4, 5 или 6 бит индекса.)
- Если первый аргумент является операндом памяти, а второй аргумент — операндом регистра, то битовый индекс во втором аргументе используется полностью — он интерпретируется как знаковый битовый индекс, который используется для смещения используемого адреса памяти. для битового теста.
- ^ Jump up to: а б с The
BTS
,BTC
иBTR
инструкции принятьLOCK
(F0
) префикс при использовании с аргументом памяти – это приводит к атомарному выполнению инструкции. - ^ Если
F3
префикс используется с0F BC /r
код операции, то инструкция будет выполнена какTZCNT
в системах, поддерживающих расширение BMI1.TZCNT
отличается отBSF
в этомTZCNT
но неBSR
определено для возврата размера операнда, если исходный операнд равен нулю – для других значений исходного операнда они дают тот же результат. - ^ Jump up to: а б
BSF
иBSR
установите для флага EFLAGS.ZF значение 1, если исходный аргумент содержит все 0, и 0 в противном случае.
Если в аргументе источника были все 0, то регистр назначения документируется как оставленный неизменным на процессорах AMD, но установленным в неопределенное значение на процессорах Intel. - ^ Если
F3
префикс используется с0F BD /r
код операции, то инструкция будет выполнена какLZCNT
в системах, поддерживающих расширения ABM или LZCNT.LZCNT
дает другой результат отBSR
для большинства входных значений. - ^ Jump up to: а б Для
SHLD
иSHRD
, величина сдвига маскируется – нижние 5 бит используются для 16/32-битного размера операнда и 6 бит для 64-битного размера операнда.SHLD
иSHRD
с 16-битными аргументами и величиной сдвига больше 16 результаты неопределенны. (Фактические результаты различаются для разных процессоров Intel, при этом известно как минимум три различных варианта поведения. [17] ) - ^ 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): «Не меньше и не равно» , «Больше» - ^ Для
SETcc
инструкции , хотя код операции обычно указывается как /0 – подразумевая, что биты 5:3 байта ModR/M должны быть равны 000 – современные процессоры x86 (Pentium и новее) игнорируют биты 5:3 и будут выполнять инструкцию какSETcc
независимо от содержимого этих битов. - ^ Для
LFS
,LGS
иLSS
, размер смещенной части дальнего указателя определяется размером операнда – размер сегментной части всегда равен 16 битам. В 64-битном режиме с помощьюREX.W
префикс с этими инструкциями приведет к загрузке дальнего указателя с 64-битным смещением на процессорах Intel, но не на процессорах AMD. - ^ Jump up to: а б с д и ж Для
MOV
в/изCRx
,DRx
иTRx
регистров, reg-часть байта ModR/M используется для указанияCRx/DRx/TRx
регистр и р/м часть общего регистра. Уникально дляMOV CRx/DRx/TRx
коды операций, два старших бита байта ModR/M игнорируются – эти коды операций декодируются и выполняются так, как если бы два старших бита байта ModR/M были11b
. - ^ Jump up to: а б с д Для переездов в/из г.
CRx
иDRx
регистров, размер операнда всегда составляет 64 бита в 64-битном режиме и 32 бита в противном случае. - ^ На процессорах до Pentium переход на
CR0
не будет сериализовать поток команд – отчасти по этой причине обычно требуется выполнить дальний переход сразу послеMOV
кCR0
если такойMOV
используется для включения/отключения защищенного режима и/или подкачки памяти .MOV
кCR2
архитектурно указан как сериализуемый, но сообщается, что он не сериализуется по крайней мере на некоторых процессорах Intel Core-i7. [18]MOV
кCR8
(представлено в x86-64) не сериализуется. - ^ Jump up to: а б The
MOV TRx
инструкции были прекращены, начиная с Pentium. - ^
INT1
/ICEBP
(F1
) инструкция присутствует на всех известных процессорах Intel x86, начиная с 80386, [19] но полностью документировано только для процессоров Intel, начиная с выпуска Intel SDM (версия 067) за май 2018 года. [20] До этого выпуска упоминание инструкции в материалах Intel было спорадическим, например, AP-526 rev 001. [21]
Для процессоров AMD инструкция документируется с 2002 года. [22] - ^ Работа
F1
(ICEBP
) код операции отличается от работы обычного кода операции программного прерыванияCD 01
несколькими способами:- В защищенном режиме
- В режиме виртуального-8086
CD 01
также проверит CPL по IOPL в качестве проверки прав доступа, в то время какF1
не будет. - В режиме virtual-8086 с включенным VME перенаправление прерываний поддерживается для
CD 01
но неF1
.
CD 01
проверит CPL по полю DPL дескриптора прерывания в качестве проверки прав доступа, в то время какF1
не будет. - В режиме виртуального-8086
- ^ Инструкция UMOV присутствует только на процессорах 386 и 486. [19]
- ^ Jump up to: а б The
XBTS
иIBTS
инструкции были прекращены с использованием степпинга B1 80386.
Они использовались программным обеспечением в основном для обнаружения ошибок. [23] Степ B0 80386. Microsoft Windows (v2.01 и новее) попытается запуститьXBTS
инструкция как часть обнаружения ЦП, еслиCPUID
отсутствует и откажется загружаться, еслиXBTS
оказывается работающим. [24] - ^ Jump up to: а б Для
XBTS
иIBTS
аргумент r/m представляет данные для извлечения/вставки битового поля из/в, аргумент reg — битовое поле, которое нужно вставить/извлечь, AX/EAX — смещение битов, а CL — длину битового поля. [25] - ^ Недокументировано, только 80386. [26]
Добавлено с 80486
[ редактировать ]Инструкция | Код операции | Описание | Кольцо |
---|---|---|---|
BSWAP r32
|
0F C8+r
|
Обмен порядка байтов. Обычно используется для преобразования между представлениями данных с прямым порядком байтов. Для 32-битных регистров выполняется следующая операция: r = (r << 24) | ((r << 8) & 0x00FF0000) | ((r >> 8) & 0x0000FF00) | (r >> 24); С использованием |
3 |
CMPXCHG r/m8,r8
|
0F B0 /r [б]
|
Сравнить и обменять . Если аккумулятор (AL/AX/EAX/RAX) сравнивается с первым операндом, [с] затем EFLAGS.ZF устанавливается в 1, и первый операнд заменяется вторым операндом. В противном случае, EFLAGS.ZF устанавливается в 0, и первый операнд копируется в аккумулятор.
Инструкция атомарна, только если используется с | |
CMPXCHG r/m,r16 CMPXCHG r/m,r32
|
0F B1 /r [б]
| ||
XADD r/m,r8
|
0F C0 /r
|
обмен и добавление . Заменяет первый операнд вторым операндом, затем сохраняет сумму двух значений в операнде назначения.
Инструкция атомарна, только если используется с | |
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 [г]
|
Записать обратно и сделать недействительным кэш. [и] Записывает все измененные строки кэша во внутреннем кэше процессора в основную память и делает внутренние кэши недействительными. |
- ^ Использование
BSWAP
с 16-битными регистрами не запрещено как таковое (оно будет выполняться без #UD или других исключений), но задокументировано, что оно дает неопределенные результаты - сообщается, что оно дает различные результаты на 486, [27] 586 и Бохс / QEMU . [28] - ^ Jump up to: а б На Intel 80486, шаг A, [29] тот
CMPXCHG
инструкция использует другую кодировку -0F A6 /r
для 8-битного варианта,0F A7 /r
для 16/32-битного варианта.0F B0/B1
кодировки используются на степпинге B 80486 и позже. [30] [31] - ^
CMPXCHG
наборы командEFLAGS
точно так же, какCMP
инструкция, которая использует аккумулятор (AL/AX/EAX/RAX) в качестве первого аргумента. - ^
INVLPG
выполняется как недействующая операция, если аргумент m8 недействителен (например, несопоставленная страница или неканонический адрес).INVLPG
может использоваться для аннулирования записей TLB для отдельных глобальных страниц. - ^ Jump up to: а б The
INVD
иWBINVD
инструкции сделают недействительными все строки кэша в кэшах L1 процессора. Реализация определяет, будут ли они также аннулировать кэши L2/L3.
Эти инструкции сериализуются — на некоторых процессорах они также могут блокировать прерывания до завершения. - ^ Если PRM (зарезервированная память процессора) была настроена с использованием PRMRR (регистры диапазона PRM), то
INVD
инструкция не разрешена и вызовет исключение #GP(0). (PRM необходим для Intel SGX.) [32] - ^ Если
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 при виртуализации. Поддержка |
Обычно 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 [из] |
- ^ На процессорах Intel и AMD
WRMSR
Инструкция также используется для обновления микрокода процессора . Это делается путем записи виртуального адреса нового микрокода для загрузки в MSR.79h
на процессорах Intel и MSRC001_0020h
[34] на процессорах AMD. - ^ Запись в следующие 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) - ^ Режим управления системой и
RSM
инструкции были доступны для вариантов Intel 486 без SL только после первого выпуска Intel Pentium в 1993 году. - ^ На некоторых старых 32-битных процессорах выполнение
CPUID
с конечным индексом (EAX) больше 0 может оставить EBX и ECX неизмененными, сохранив свои старые значения. По этой причине рекомендуется обнулить EBX и ECX перед выполнением.CPUID
.
К процессорам, демонстрирующим такое поведение, относятся Cyrix MII. [40] и IDT WinChip 2. [41]
В 64-битном режимеCPUID
установит старшие 32 бита RAX, RBX, RCX и RDX в ноль. - ^ На некоторых процессорах Intel, начиная с Ivy Bridge , существуют MSR, которые можно использовать для ограничения
CPUID
до звонка 0. Такие MSR задокументированы как минимум для Ivy Bridge. [42] и Денвертон. [43]
Возможность ограничитьCPUID
to Ring 0 также существует на процессорах AMD, поддерживающих функцию «CpuidUserDis» ( Zen 4 «Raphael» и более поздние версии). [44] - ^ Jump up to: а б
CPUID
также доступен на некоторых вариантах процессоров Intel и AMD 486, выпущенных после первого выпуска Intel Pentium. - ^ На процессорах Cyrix 5x86 и 6x86
CPUID
по умолчанию не включен и должен быть включен через регистр конфигурации Cyrix. - ^ На процессорах NexGen,
CPUID
поддерживается только некоторыми системными BIOS. На некоторых процессорах NexGen, которые поддерживаютCPUID
, EFLAGS.ID не поддерживается, но EFLAGS.AC поддерживается, что усложняет обнаружение ЦП. [45] - ^ В отличие от старого
CMPXCHG
инструкция,CMPXCHG8B
Инструкция не изменяет никакие биты EFLAGS, кроме ZF. - ^
LOCK CMPXCHG8B
с операндом-регистром (который является недопустимой кодировкой) может привести к зависанию некоторых процессоров Intel Pentium ( ошибка Pentium F00F ). - ^ Jump up to: а б с На процессорах IDT WinChip, Transmeta Crusoe и Rise mP6
CMPXCHG8B
Инструкция всегда поддерживается, однако ее бит CPUID может отсутствовать. Это обходной путь ошибки в Windows NT. [46] - ^ Jump up to: а б The
RDTSC
иRDPMC
инструкции не упорядочиваются по отношению к другим инструкциям и могут производить выборку своих соответствующих счетчиков до выполнения более ранних инструкций или после выполнения более поздних инструкций. ВызовыRDPMC
(но неRDTSC
) могут быть переупорядочены друг относительно друга даже при чтении одного и того же счетчика.
Чтобы наложить порядок по отношению к другим инструкциям,LFENCE
или инструкции сериализации (например,CPUID
) нужны. [47] - ^ 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]
).
- ^
RDTSC
может быть запущен за пределами кольца 0, только еслиCR4.TSD=0
.
На Intel Pentium и AMD K5RDTSC
невозможно запустить в режиме Virtual-8086. [51] Более поздние процессоры сняли это ограничение. - ^
RDPMC
может быть запущен за пределами кольца 0, только еслиCR4.PCE=1
. - ^
RDPMC
Инструкция не присутствует в процессорах VIA до Nano. - ^ Коды условий, поддерживаемые для
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): «Не меньше и не равно» , «Больше» - ^ В 64-битном режиме
CMOVcc
с 32-битным размером операнда очистит старшие 32 бита регистра назначения, даже если условие ложно.
ДляCMOVcc
с операндом-источником памяти ЦП всегда будет считывать операнд из памяти, что потенциально может вызвать исключения в памяти и заполнение строк кэша, даже если условие для перемещения не удовлетворено. Расширение Intel APX определяет вариант (CMOVcc
это будет подавлять исключения памяти, если условие ложно.) - ^ В отличие от других инструкций, добавленных в Pentium Pro , длинный NOP не имеет бита функции CPUID .
- ^
0F 1F /0
поскольку long-NOP был представлен в Pentium Pro, но оставался недокументированным до 2006 года. [53] Весь0F 18..1F
диапазон опкодов былNOP
в Пентиум Про. Однако, кроме0F 1F /0
, Intel не гарантирует, что эти коды операций останутсяNOP
в будущих процессорах и действительно назначили некоторые из этих кодов операций другим инструкциям, по крайней мере, в некоторых процессорах. [54] - ^ Документировано для AMD x86-64 с 2002 года. [55]
- ^ В то время как
0F 0B
код операции был официально зарезервирован как недопустимый код операции, начиная с Pentium, ему была присвоена только мнемоникаUD2
начиная с Pentium Pro . [57] - ^ Jump up to: а б GNU Binutils использовал
UD2A
иUD2B
мнемоника для0F 0B
и0F B9
коды операций начиная с версии 2.7. [58]
Ни одинUD2A
ниUD2B
изначально принимал любые аргументы -UD2B
позже был изменен для приема байта ModR/M в Binutils версии 2.30. [59] - ^ Jump up to: а б Коды операций UD0/1/2 —
0F 0B
,0F B9
и0F FF
- вызовет исключение #UD на всех процессорах x86, начиная с 80186 (кроме процессоров NEC серии V ), но оно не было явно зарезервировано для этой цели до процессоров класса P5. - ^ В то время как
0F B9
код операции был официально зарезервирован как недопустимый код операции, начиная с Pentium, ему была присвоена только мнемоникаUD1
намного позже – AMD APM начала листингUD1
в картах кодов операций, начиная с версии 3.17, [61] в то время как Intel SDM начала перечислять его начиная с версии 061. [62] - ^ Jump up to: а б Для обоих
0F B9
и0F FF
Известно, что разные реализации x86 различаются в зависимости от того, принимают ли коды операций байт ModR/M . [63] [64] - ^ Для
0F FF
код операции,OIO
мнемоника была введена Cyrix, [65] в то время какUD0
menmonic (без аргументов) был представлен AMD и Intel одновременно сUD1
мнемоника для0F B9
. [61] [62] Позже в документации Intel (но не AMD) было изменено описаниеUD0
чтобы добавить байт ModR/M и принять два аргумента. [66] - ^ На K6
SYSCALL
/SYSRET
инструкции были доступны для модели 7 (250 нм «Little Foot») и более поздних версий, но не для более ранней модели 6. [68] - ^
SYSCALL
иSYSRET
были сделаны неотъемлемой частью x86-64 – в результате инструкции доступны в 64-битном режиме на всех процессорах x86-64 от AMD, Intel, VIA и Zhaoxin.
За пределами 64-битного режима инструкции доступны только на процессорах AMD. - ^ Точная семантика
SYSRET
немного различается между процессорами AMD и Intel: неканонические адреса возврата вызывают исключение #GP в Ring 3 на процессорах AMD и в Ring 0 на процессорах Intel. Известно, что это вызывает проблемы с безопасностью. [69] - ^ Jump up to: а б Для
SYSRET
иSYSEXIT
инструкции под x86-64, необходимо добавитьREX.W
префикс для вариантов, которые вернутся к 64-битному коду пользовательского режима.
Кодировки этих инструкций безREX.W
префикс используются для возврата к 32-битному коду пользовательского режима. (Ни одна из этих инструкций не может использоваться для возврата к 16-битному коду пользовательского режима.) - ^ Jump up to: а б с The
SYSRET
,SYSENTER
иSYSEXIT
инструкции недоступны в реальном режиме . (SYSENTER
однако доступен в режиме Virtual 8086. ) - ^
CPUID
флаги, указывающие на поддержкуSYSENTER
/SYSEXIT
установлены на Pentium Pro, хотя процессор официально не поддерживает эти инструкции. [70]
Стороннее тестирование показало, что коды операций присутствуют в Pentium Pro, но слишком содержат ошибки, чтобы их можно было использовать. [71] - ^ На процессорах AMD
SYSENTER
иSYSEXIT
инструкции недоступны в длинном режиме x86-64 (#UD). - ^ На процессорах Transmeta
SYSENTER
иSYSEXIT
инструкции доступны только в версии 4.2 или выше программного обеспечения Transmeta Code Morphing. [73] - ^ О Неемии,
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 |
- ^ Операнд памяти для
CMPXCHG16B
должно быть выровнено по 16 байтам. - ^
CMPXCHG16B
Инструкция отсутствовала в некоторых из самых ранних процессоров Intel/AMD x86-64. На процессорах Intel инструкция отсутствовала у Xeon «Nocona» степпинга D, [75] но добавлено в шаге E. [76] На процессорах семейства AMD K8 он был добавлен в шаге F одновременно с введением поддержки DDR2. [77]
По этой причине,CMPXCHG16B
имеет свой собственный флаг CPUID, отдельный от остальной части x86-64. - ^ Кодировки
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
| |||
|
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
| ||
|
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
|
Сдвиг влево без обновления флагов. |
- ^ На процессорах AMD расширение «ABM» обеспечивает как
POPCNT
иLZCNT
. Однако в процессорах Intel бит CPUID для «ABM» документируется только для указания на наличиеLZCNT
инструкции и указан как «LZCNT», тогда какPOPCNT
имеет свой собственный отдельный бит функции CPUID.
Однако все известные процессоры, реализующие расширения «ABM»/«LZCNT», также реализуютPOPCNT
и установите бит функции CPUID для POPCNT, поэтому различие является только теоретическим.
(Обратное неверно – существуют процессоры, поддерживающиеPOPCNT
но не ПРО, такие как Intel Nehalem и VIA Nano 3000.) - ^
LZCNT
инструкция будет выполнена какBSR
в системах, которые не поддерживают расширения LZCNT или ABM.BSR
вычисляет индекс старшего установленного бита в исходном операнде, получая результат, отличный отLZCNT
для большинства входных значений. - ^
TZCNT
инструкция будет выполнена какBSF
в системах, которые не поддерживают расширение BMI1.BSF
дает тот же результат, что иTZCNT
для всех значений входных операндов, кроме нуля – для которыхTZCNT
возвращает размер входного операнда, ноBSF
приводит к неопределенному поведению (на большинстве современных процессоров пункт назначения остается неизменным). - ^ Для
BEXTR
, начальная позиция и длина не маскируются и могут принимать значения от 0 до 255. Если выбранные биты выходят за пределы концаr/m
аргумента (который имеет обычный размер операнда 32/64 бита), то лишние биты считываются как 0. - ^ На процессорах 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
[ редактировать ]Intel CET (технология контроля потока управления) добавляет две отдельные функции, которые помогают защититься от эксплойтов безопасности, таких как возвратно-ориентированное программирование : теневой стек (CET_SS) и косвенное отслеживание ветвей (CET_IBT).
Подмножество CET | Инструкция | Код операции | Описание | Кольцо | Добавлено в |
---|---|---|---|---|---|
|
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
|
Очистить флаг занятости теневого стека | |||
|
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.
|
- ^ Jump up to: а б The
RDSSPD
иRDSSPQ
инструкции действуют как NOP на процессорах, где теневые стеки отключены или CET не поддерживается. - ^ Jump up to: а б
ENDBR32
иENDBR64
действовать как NOP на процессорах, которые не поддерживают CET_IBT или где IBT отключен. - ^ Этот префикс имеет ту же кодировку, что и префикс DS: префикс переопределения сегмента - по состоянию на апрель 2022 г. в документации Intel не указывается, сохраняет ли этот префикс свою старую функцию переопределения сегмента при использовании в качестве префикса без отслеживания, и при этом он не предоставьте официальную мнемонику для этого префикса. [82] [83] (GNU binutils использует «notrack» [84] )
Добавлено вместе с другими расширениями разных поставщиков.
[ редактировать ]Расширение набора команд | Инструкция мнемоника |
Код операции | Описание инструкции | Кольцо | Добавлено в |
---|---|---|---|---|---|
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]
|
Магазинный забор. [д] | |||
|
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 подсказки обычно используются для управления питанием процессора.
| |||
|
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
| ||||
|
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 | Сэнди Бридж , Паровой каток , Пума , Гольдмонт , ЧжанЦзян |
|
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
| ||||
|
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
|
Предварительная выборка строки кэша. [б] | |||
|
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 служит входом и выходом переноса, при этом другие флаги остаются неизменными.
| |||
|
CLAC
|
NP 0F 01 CA
|
Прозрачный EFLAGS.AC .
|
0 | Бродвелл , Гольдмонт , было 1 , ЛуЦзяЗуй [ах] |
STAC
|
NP 0F 01 CB
|
Набор EFLAGS.AC .
| |||
|
CLFLUSHOPT m8
|
NFx 66 0F AE /7
|
Очистить строку кэша. Отличается от старшего CLFLUSH инструкция, поскольку она имеет более мягкие правила упорядочивания в отношении хранилищ памяти и других операций очистки строк кэша, что позволяет повысить производительность.
|
3 | Скайлейк , Гольдмонт , Это был 1 |
|
XSAVEC mem XSAVEC64 mem
|
NP 0F C7 /4 NP REX.W 0F C7 /4
|
Сохраните компоненты расширенного состояния процессора, указанные EDX:EAX, в памяти с уплотнением. | 3 | Скайлейк , Гольдмонт , Это был 1 |
|
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, из памяти. | |||
|
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 , Ледяное озеро-СП |
- ^ Jump up to: а б с Процессоры AMD Athlon до Athlon XP не поддерживали полный SSE, но ввели инструкции SSE, отличные от SIMD, как часть «Расширений MMX» . [85] Эти расширения (без полного SSE) также присутствуют в процессорах Geode GX2 и более поздних версиях.
- ^ Jump up to: а б с д и ж г Все
PREFETCH*
Инструкции представляют собой инструкции-подсказки, влияющие только на производительность, а не на семантику программы. Предоставление неверного адреса (например, адреса несопоставленной страницы или неканонического адреса) приведет к тому, что инструкция будет действовать как NOP без каких-либо исключений. - ^ Jump up to: а б с Для
SFENCE
,LFENCE
иMFENCE
инструкции, нижние 3 бита байта ModR/M игнорируются, и любое значение x в диапазоне 0..7 приведет к правильной инструкции. - ^
SFENCE
Инструкция гарантирует, что вся память сохранится послеSFENCE
инструкции становятся глобально наблюдаемыми после того, как все сохранения в памяти передSFENCE
. Это накладывает упорядочивание на хранилища, которые в противном случае можно переупорядочить, например, нетемпоральные хранилища и хранилища в областях памяти WC (объединение записи). [86]
На процессорах Intel, а также процессорах AMD, начиная с Zen1 (но не на более старых процессорах AMD),SFENCE
также действует как барьер переупорядочения при очистке/обратной записи кэша, выполняемой с помощьюCLFLUSH
,CLFLUSHOPT
иCLWB
инструкции. (Старые процессоры AMD требуютMFENCE
заказатьCLFLUSH
.)SFENCE
не упорядочен по отношению кLFENCE
иSFENCE+LFENCE
последовательность недостаточна для предотвращения повторного заказа загрузки после предыдущего хранилища. [87] Чтобы предотвратить такое переупорядочение, необходимо выполнить командуMFENCE
,LOCK
или инструкцию сериализации. - ^
LFENCE
Инструкция гарантирует, что вся память загрузится послеLFENCE
инструкции становятся глобально наблюдаемыми после загрузки всей памяти передLFENCE
.
На всех процессорах Intel, поддерживающих SSE2,LFENCE
Инструкция обеспечивает более надежную гарантию заказа: [88] это сериализация отправки , что означает, что инструкции послеLFENCE
инструкции разрешено начать выполнение только после того, как все инструкции до ее завершения (что гарантирует, что все предыдущие загрузки, но не обязательно сохранения, завершены). Эффект сериализации отправки заключается в том, чтоLFENCE
также действует как барьер спекуляций и барьер переупорядочения для доступа к ресурсам, не связанным с памятью, таким как счетчики производительности (доступ к которым осуществляется, например, черезRDTSC
илиRDPMC
) и x2apic MSR.
На процессорах AMDLFENCE
по умолчанию не обязательно выполняет сериализацию с отправкой, однако на всех процессорах AMD, которые поддерживают любую форму сериализации без отправкиLFENCE
, его можно сделать сериализацией отправки, установив бит 1 в MSR.C001_1029
. [89] - ^
MFENCE
Инструкция гарантирует, что вся память загружается, сохраняется и очищается в кэше послеMFENCE
инструкции становятся глобально наблюдаемыми после всех загрузок, сохранений и сбросов кэша перед выполнением всех операций памяти.MFENCE
.
На процессорах IntelMFENCE
является не сериализацией отправки и, следовательно, не может использоваться для принудительного упорядочения доступа к ресурсам, не связанным с памятью, таким как счетчики производительности и x2apic MSR.MFENCE
все еще упорядочен по отношению кLFENCE
, поэтому, если необходим барьер памяти с сериализацией отправки, его можно получить, выдавMFENCE
за которым следуетLFENCE
. [47]
На процессорах AMDMFENCE
сериализуется. - ^ Работа
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
- ^ Фактическая длительность паузы, выполняемой
PAUSE
инструкция зависит от реализации.
В системах без SSE2PAUSE
будет выполняться как NOP. - ^ При виртуализации VT-x или AMD-V выполнение
PAUSE
много раз за короткий промежуток времени может вызвать ошибку #VMEXIT. КоличествоPAUSE
количество выполнений и длина интервала, которые могут вызвать #VMEXIT, зависят от платформы. - ^ В то время как
CLFLUSH
Инструкция была введена вместе с SSE2, она имеет свой собственный флаг CPUID и может присутствовать на процессорах, которые иначе не реализуют SSE2, и/или отсутствовать в процессорах, которые иначе реализуют SSE2. (Например, AMD Geode LX поддерживаетCLFLUSH
но не SSE2.) - ^ В то время как
MONITOR
иMWAIT
инструкции были представлены одновременно с SSE3, у них есть собственный флаг CPUID, который необходимо проверять отдельно от флага CPUID SSE3 (например, Athlon 64 X2 и VIA C7 поддерживают SSE3, но не MONITOR). - ^ Jump up to: а б Для
MONITOR
иMWAIT
инструкции, старая документация Intel [90] перечисляет мнемонику инструкций с явными операндами (MONITOR EAX,ECX,EDX
иMWAIT EAX,ECX
), хотя в новой документации эти операнды опущены. Ассемблер/дизассемблер может поддерживать один или оба этих варианта. [91] - ^ Для
MONITOR
, сегмент DS: можно переопределить с помощью префикса сегмента.
Область памяти, которая будет отслеживаться, будет представлять собой не просто один байт, указанный DS:rAX, а линейную область памяти, содержащую этот байт — размер и выравнивание этой области памяти зависят от реализации и могут быть запрошены через CPUID.
Ячейка памяти, которую необходимо отслеживать, должна иметь тип памяти WB (кэшируемая с обратной записью), иначе мониторинг может завершиться неудачно. - ^ По состоянию на апрель 2024 г. для
MONITOR
инструкция. Таким образом, инструкция требует ECX=0 и игнорирует EDX. - ^ На некоторых процессорах, например Intel Xeon Phi x200. [92] и АМД К10 [93] и позже существуют документированные MSR, которые можно использовать для включения
MONITOR
иMWAIT
бежать в ринге 3. - ^ Ожидание в исполнении
MWAIT
может быть завершено системными событиями, отличными от записи в память (например, вытеснением кэша, прерываниями) – точный набор событий, которые могут привести к завершению ожидания, зависит от реализации.
Независимо от того, завершилось ли ожидание записью в память или каким-либо другим событием, мониторинг завершится и необходимо будет заново настроить мониторинг с помощьюMONITOR
перед использованиемMWAIT
дождаться повторной записи памяти. - ^ Флаги расширения, доступные для
MWAIT
в регистре ECX находятся:Биты Расширение MWAIT 0 Считайте прерывания как события прерывания, даже если они замаскированы ( EFLAGS.IF =0). (Доступно во всех не поддерживающих NetBurst . реализациях, MWAIT
.)1 Timed MWAIT: завершить ожидание, когда TSC достигнет или превысит значение в EDX:EBX. (Недокументировано, как сообщается, присутствует в процессорах Intel Skylake и более поздних версиях) [94] 2 Безмониторный MWAIT [95] 31:3 Не используется, должен быть установлен на ноль. - ^ Флаги подсказок, доступные для
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 .
- ^ Для
GETSEC
инструкция,REX.W
Префикс включает 64-битные адреса только для конечной функции EXITAC. В противном случае префиксы REX разрешены, но игнорируются для инструкции. - ^ Листовые функции, определенные для
GETSEC
(выбранные EAX):ЕАХ Функция 0 (ВОЗМОЖНОСТИ) Сообщить о возможностях SMX 2 (ВХОДЫ) Введите выполнение модуля аутентифицированного кода 3 (ЭКЗИТАК) Завершить выполнение модуля аутентифицированного кода 4 (ЦЕНТР) Введите измеряемую среду 5 (СЕКС) Выход из измеряемой среды 6 (ПАРАМЕТРЫ) Сообщить о параметрах SMX 7 (СМКТРЛ) Управление режимом SMX 8 (ПРОБУЖДЕНИЕ) Пробуждение спящих процессоров в измеряемой среде Любое неподдерживаемое значение в EAX вызывает исключение #UD.
- ^ Для
GETSEC
, большинство конечных функций ограничены кольцом 0, но конечные функции ВОЗМОЖНОСТИ (EAX=0) и ПАРАМЕТРЫ (EAX=6) доступны в кольце 3. - ^ XSAVE был добавлен в этапы E0/R0 Penryn и недоступен в более ранних версиях.
- ^ На некоторых процессорах (начиная со Skylake , Goldmont и Zen 1 ) выполнение
XGETBV
с ECX=1 разрешено – это не вернетXCR1
(такого регистра не существует), но вместо этого возвращаемXCR0
побитовое И с текущим значением битовой карты компонента состояния «XINUSE» (битовая карта компонентов состояния XSAVE, о которых неизвестно, что они находятся в своем исходном состоянии).
Наличие данного функционалаXGETBV
указывается CPUID .(EAX=0Dh,ECX=1):EAX[бит 2]. - ^ Jump up to: а б Значение «идентификатора ядра», считываемое
RDTSCP
иRDPID
на самом деле этоTSC_AUX
МСР (МСРC000_0103h
). Соответствует ли это значение идентификатору процессора на самом деле, зависит от соглашения операционной системы. - ^ В отличие от старого
RDTSC
инструкция,RDTSCP
задержит чтение TSC до тех пор, пока все предыдущие инструкции не будут удалены, гарантируя упорядочивание относительно предыдущих загрузок памяти (но не сохранений).RDTSCP
однако он не упорядочен относительно последующих инструкций. - ^
RDTSCP
может быть запущен за пределами кольца 0, только еслиCR4.TSD=0
. - ^ Поддержка
RDTSCP
был добавлен в шаге F AMD K8 и недоступен в более ранних степенях. - ^ В то время как
POPCNT
Инструкция была представлена одновременно с SSE4.2, она не считается частью SSE4.2, а представляет собой отдельное расширение со своим собственным флагом CPUID.
На процессорах AMD он считается частью расширения ABM, но по-прежнему имеет собственный флаг CPUID. - ^ Типы аннулирования, определенные для
INVPCID
(выбранные аргументом регистра):Ценить Функция 0 Недействительные записи TLB, соответствующие PCID и адресу виртуальной памяти в дескрипторе, за исключением глобальных записей. 1 Недействительные записи TLB, соответствующие PCID в дескрипторе, за исключением глобальных записей. 2 Аннулировать все записи TLB, включая глобальные записи. 3 Аннулировать все записи TLB, за исключением глобальных записей. Любое неподдерживаемое значение в аргументе регистра вызывает исключение #GP.
- ^ В отличие от старого
INVLPG
инструкция,INVPCID
вызовет исключение #GP, если предоставленный адрес памяти неканонический. Известно, что это несоответствие вызывает проблемы с безопасностью. [97] - ^
PREFETCH
иPREFETCHW
инструкции являются обязательной частью 3DNow! Расширение набора команд, но также доступны как отдельное расширение в системах, которые не поддерживают 3DNow! - ^ Коды операций для
PREFETCH
иPREFETCHW
(0F 0D /r
) выполняются как NOP на процессорах Intel, начиная с Cedar Mill (65-нм Pentium 4 ), сPREFETCHW
получение функции предварительной выборки начиная с Broadwell. - ^
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. - ^ Jump up to: а б с Расширения набора команд SMAP, PKU и RDPID поддерживаются на шаге 2. [100] и позже Чжаосинь ЛуЦзяЦуй, но не на более ранних этапах.
- ^ В отличие от старого
RDTSCP
инструкция, которую также можно использовать для чтения идентификатора процессора, в пользовательском режимеRDPID
не отключенCR4.TSD=1
. - ^
WBNOINVD
инструкция будет выполнена какWBINVD
при запуске в системе, которая не поддерживает расширение WBNOINVD.WBINVD
отличается отWBNOINVD
в этомWBINVD
сделает недействительными все строки кэша после обратной записи.
Добавлено вместе с другими расширениями, специфичными для Intel.
[ редактировать ]Расширение набора команд | Инструкция мнемоника |
Код операции | Описание инструкции | Кольцо | Добавлено в |
---|---|---|---|---|---|
|
( HWNT ) [а]
|
2E [б]
|
Префикс инструкции: подсказка ветки слабо не принята. | 3 | Пентиум 4 [с] Метеорное озеро [103] |
( HST ) [а]
|
3E [б]
|
Префикс инструкции: подсказка ветки строго принята. | |||
|
ENCLS
|
NP 0F 01 CF
|
Выполните функцию супервизора SGX. Функция для выполнения указана в EAX. [д] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.
В зависимости от функции инструкция может возвращать данные в RBX и/или код ошибки в EAX. |
0 |
|
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 r/m32 PTWRITE r/m64
|
F3 0F AE /4 F3 REX.W 0F AE /4
|
Считайте данные из регистра или памяти для кодирования в пакет PTW. [Дж] | 3 | Каби Лейк , Голдмонт Плюс |
|
MOVDIRI m32,r32 MOVDIRI m64,r64
|
NP 0F 38 F9 /r NP REX.W 0F 38 F9 /r
|
Сохранение в памяти с использованием Direct Store (хранилище памяти, которое не кэшируется и не объединяется с другими хранилищами для записи). | 3 | Тигровое озеро , Тремонт |
|
MOVDIR64B reg,m512
|
66 0F 38 F8 /r
|
Переместите 64 байта данных из m512 по адресу, указанному в ES:reg. Запись 64-байта выполняется атомарно с помощью Direct Store. [к] | 3 | Тигровое озеро , Тремонт |
|
PCONFIG
|
NP 0F 01 C5
|
Выполните функцию настройки функций платформы. Выполняемая функция указана в EAX. [л] - в зависимости от функции инструкция может принимать дополнительные входные операнды в RBX, RCX и RDX.
Если инструкция завершится неудачно, она установит EFLAGS.ZF=1 и вернет код ошибки в EAX. В случае успеха устанавливаются EFLAGS.ZF=0 и EAX=0. |
0 | Ледяное озеро-СП |
|
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. [п]
Аргумент регистра для | |||
|
SERIALIZE
|
NP 0F 01 E8
|
Сериализация выборки и выполнения инструкций. [с] | 3 | Ольховое озеро |
|
HRESET imm8
|
F3 0F 3A F0 C0 ib
|
Запросите, чтобы процессор сбросил выбранные компоненты аппаратно поддерживаемой истории прогнозов. Битовая карта того, какие компоненты истории прогнозирования ЦП подлежат сбросу, задается в EAX (аргумент imm8 игнорируется). [т] | 0 | Ольховое озеро |
|
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 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 |
- ^ Jump up to: а б Мнемоника подсказок ветвей
HWNT
иHST
перечислены Willamette . только в ранней документации [101] - в более поздней документации Intel перечислены префиксы подсказок ветвей без присвоения им мнемоники. [102] - ^ Jump up to: а б The
2E
и3E
префиксы интерпретируются как подсказки ветвления только при использовании сJcc
инструкции условного перехода (коды операций70..7F
и0F 80..8F
) - при использовании с другими кодами операций они могут иметь другое значение (например, для инструкций с операндами памяти вне 64-битного режима они будут работать как префиксы переопределения сегмента).CS:
иDS:
, соответственно). На процессорах, которые не поддерживают подсказки ветвей, эти префиксы принимаются, но игнорируются при использовании сJcc
. - ^ Подсказки ветвей поддерживаются на всех процессорах NetBurst (семейство Pentium 4), но не поддерживаются ни на одном другом известном процессоре до их повторного внедрения в процессорах Redwood Cove, начиная с Meteor Lake в 2023 году.
- ^ Листовые функции, определенные для
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.
- ^ SGX устарел для процессоров настольных компьютеров/ноутбуков, начиная с 11-го поколения ( Rocket Lake , Tiger Lake ) и далее, но по-прежнему доступен на Xeon . серверных компонентах под маркой [106]
- ^ Листовые функции, определенные для
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 — другие функции могут выполняться только внутри анклава. - ^
ENCLU
может быть выполнено только в кольце 3, а не в кольцах 0/1/2. - ^ Листовые функции, определенные для
ENCLV
(выбранные EAX):ЕАХ Функция Добавлено с помощью OVERSUB [104] 0 (ЭДЕКВИРЧИЛД) Уменьшить VIRTCHILDCNT в SECS 1 (ЭИНКВИРЧИЛД) Приращение VIRTCHILDCNT в сек. 2 (ЕСЕТКОНТЕКСТ) Установить поле ENCLAVECONTEXT в SECS Любое неподдерживаемое значение в EAX вызывает исключение #GP.
TheENCLV
Инструкция присутствует только в системах, которые поддерживают расширения EPC Oversubscription Extensions для SGX («OVERSUB»). - ^
ENCLV
доступен только в том случае, если работа Intel VMX включена с помощьюVMXON
и в противном случае выдаст #UD. - ^ Для
PTWRITE
, запись в пакет трассировки процессора произойдет только в том случае, если набор битов разрешения (биты «TriggerEn», «ContextEn», «FilterEn»RTIT_STATUS
MSR и бит «PTWEn»RTIT_CTL
MSR) все установлены на 1.
ThePTWRITE
Инструкция указывается в SDM, чтобы вызвать исключение #UD, если используется префикс инструкции 66h, независимо от других префиксов. - ^ Для
MOVDIR64
, адрес назначения, заданный ES:reg, должен быть выровнен по 64 байта.
Размер операнда для аргумента регистра определяется размером адреса, который может быть переопределен67h
префикс.
Аргумент источника памяти размером 64 байта не обязательно должен быть выровнен по 64 байтам, и его атомарное чтение не гарантируется. - ^ Листовые функции, определенные для
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.
- ^ 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. - ^ 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] - ^ For
UMONITOR
, the operand size of the address argument is given by the address size, which may be overridden by the67h
prefix. The default segment used is DS:, which can be overridden with a segment prefix. - ^ Jump up to: a b For the
UMWAIT
andTPAUSE
instructions, the operating system can use theIA32_UMWAIT_CONTROL
MSR to limit the maximum amount of time that a singleUMWAIT
/TPAUSE
invocation is permitted to wait. TheUMWAIT
andTPAUSE
instructions will setRFLAGS.CF
to 1 if they reached theIA32_UMWAIT_CONTROL
-defined time limit and 0 otherwise. - ^
TPAUSE
andUMWAIT
can be run outside Ring 0 only ifCR4.TSD=0
. - ^ Для аргумента регистра
UMWAIT
иTPAUSE
инструкции, поддерживаются следующие биты флагов:Биты Использование 0 Предпочтительное состояние оптимизации. - 0 = C0.2 (более медленное пробуждение, улучшает производительность других потоков SMT на том же ядре)
- 1 = C0.1 (более быстрое пробуждение)
31:1 (Сдержанный) - ^ Хотя сериализацию можно выполнить с помощью более старых инструкций, таких как, например,
CPUID
иIRET
, эти инструкции выполняют дополнительные функции, вызывая побочные эффекты и снижение производительности, когда требуется сериализация автономных инструкций. (CPUID
кроме того, существует проблема, заключающаяся в том, что при выполнении в условиях виртуализации он вызывает обязательный #VMEXIT, что приводит к очень большим накладным расходам.)SERIALIZE
инструкция выполняет только сериализацию, избегая этих дополнительных затрат. - ^ Растровое изображение компонентов истории ЦП, которые можно сбросить через
HRESET
предоставляется CPUID.(EAX=20h,ECX=0):EBX.
По состоянию на июль 2023 г. определены следующие биты:Кусочек Использование 0 История Intel Thread Director 31:1 (Сдержанный) - ^ Аргумент регистра
SENDUIPI
— это индекс для выбора записи из UITT (таблицы целей пользовательских прерываний, таблицы, указанной в новомUINTR_TT
иUINT_MISC
МСР. ) - ^ На Sapphire Rapids процессорах
UIRET
Инструкция всегда устанавливает UIF (флаг пользовательского прерывания) в 1. На Emerald Rapids и более поздних версиях процессорахUIRET
установит UIF в значение бита 1 значения, извлеченного из стека для RFLAGS - эта функциональность обозначаетсяCPUID.(EAX=7,ECX=1):EDX[17]
.
Добавлено вместе с другими расширениями, специфичными для AMD.
[ редактировать ]Расширение набора команд | Инструкция мнемоника |
Код операции | Описание инструкции | Кольцо | Добавлено в |
---|---|---|---|---|---|
|
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 |
|
INVLPGB
|
NP 0F 01 FE
|
Недействительные записи TLB для диапазона страниц с трансляцией. Аннулирование выполняется на процессоре, выполняющем инструкцию, а также передается всем остальным процессорам в системе. rAX принимает виртуальный адрес для аннулирования и некоторые дополнительные флаги, ECX берет количество страниц, которые необходимо аннулировать, а EDX указывает ASID и PCID для аннулирования TLB. |
0 | Это было 3 |
TLBSYNC
|
NP 0F 01 FF
|
Синхронизировать аннулирование TLB. Подождите, пока все аннулирования TLB не будут отмечены предыдущими вызовами INVLPGB На команду одного и того же логического процессора ответили все процессоры системы. Инструкция сериализуется.
|
- ^ Стандартный способ доступа к регистру CR8 — использовать кодировку, использующую
REX.R
префикс, например44 0F 20 07
(MOV RDI,CR8
). ОднакоREX.R
префикс доступен только в 64-битном режиме.
Расширение AltMovCr8 добавляет дополнительный метод доступа к CR8, используяF0
(LOCK
) префикс вместоREX.R
– это обеспечивает доступ к CR8 вне 64-битного режима. - ^ Jump up to: а б Как и другие варианты MOV в/из регистров CRx, кодировки AltMovCr8 игнорируют два старших бита байта ModR/M инструкции и всегда выполняются так, как если бы эти два бита были установлены в значение
11b
.
Кодировки AltMovCr8 доступны в 64-битном режиме. Однако, объединивLOCK
префикс сREX.R
префикс не разрешен и вызовет исключение #UD. - ^ Поддержка AltMovCR8 была добавлена на этапе F AMD K8 и недоступна на более ранних стадиях.
- ^ Для
CLZERO
, размер адреса и префикс 67h определяют, будет ли использоваться AX, EAX или RAX в качестве адреса. Сегмент DS: по умолчанию может быть переопределен префиксом переопределения сегмента. Предоставленный адрес не требует выравнивания — при необходимости его выровняет аппаратное обеспечение.
TheCLZERO
Инструкция предназначена для восстановления после фатальных ошибок Machine Check. Он некэшируемый, не может использоваться для выделения строки кэша без доступа к памяти и не должен использоваться для быстрой очистки памяти. [111] - ^ Нумерация регистров, используемая
RDPRU
не обязательно совпадает сRDMSR
/WRMSR
.
Регистры, поддерживаемыеRDPRU
по состоянию на декабрь 2022 г. являются:ЭКХ Зарегистрироваться 0 MPERF (MSR 0E7h: счетчик тактовой частоты максимальной производительности) 1 APERF (MSR 0E8h: счетчик тактовой частоты фактической производительности) Неподдерживаемые значения в ECX возвращают 0.
- ^ Если
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 | точность контроль |
округление контроль | ||
Добавление с плавающей запятой
|
FADD m32 |
D8 /0 |
Да | Да |
FADD m64 |
DC /0
| |||
FADD st,st(i) |
D8 C0+i
| |||
FADD st(i),st |
DC C0+i
| |||
Умножение с плавающей запятой
|
FMUL m32 |
D8 /1 |
Да | Да |
FMUL m64 |
DC /1
| |||
FMUL st,st(i) |
D8 C8+i
| |||
FMUL st(i),st |
DC C8+i
| |||
Вычитание с плавающей запятой
|
FSUB m32 |
D8 /4 |
Да | Да |
FSUB m64 |
DC /4
| |||
FSUB st,st(i) |
D8 E0+i
| |||
FSUB st(i),st |
DC E8+i
| |||
Обратное вычитание с плавающей запятой
|
FSUBR m32 |
D8 /5 |
Да | Да |
FSUBR m64 |
DC /5
| |||
FSUBR st,st(i) |
D8 E8+i
| |||
FSUBR st(i),st |
DC E0+i
| |||
Деление с плавающей запятой [л]
|
FDIV m32 |
D8 /6 |
Да | Да |
FDIV m64 |
DC /6
| |||
FDIV st,st(i) |
D8 F0+i
| |||
FDIV st(i),st |
DC F8+i
| |||
Обратное деление с плавающей запятой
|
FDIVR m32 |
D8 /7 |
Да | Да |
FDIVR m64 |
DC /7
| |||
FDIVR st,st(i) |
D8 F8+i
| |||
FDIVR st(i),st |
DC F0+i
| |||
Сравнение с плавающей запятой
|
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 [г] |
- ^ Сопроцессоры x87 (кроме 8087) обрабатывают исключения довольно необычным способом. Когда инструкция x87 генерирует немаскированное арифметическое исключение, она по-прежнему завершается, не вызывая сбоя ЦП – вместо того, чтобы вызывать сбой, она записывает в сопроцессор информацию, необходимую для обработки исключения (указатель инструкции, код операции, указатель данных, если инструкция имела операнд памяти) и установите флаг слова состояния FPU, чтобы указать, что присутствует ожидающее исключение. Это ожидающее исключение затем вызовет сбой ЦП при следующем x87, MMX или
WAIT
инструкция выполняется.
Исключением являются инструкции x87 «Не ожидающие», которые будут выполняться, не вызывая такой ошибки, даже если присутствует ожидающее исключение (с некоторыми оговорками, см. примечание по применению AP-578). [112] ). Эти инструкции в основном представляют собой инструкции управления, которые могут проверять и/или изменять состояние ожидающего исключения FPU x87. - ^ Для каждой неожидающей инструкции 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
- ^ 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-битная работа. - ^ 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 x87F(N)ENI
иF(N)DISI
инструкции были сохранены для обратной совместимости и выполняются как NOP, которые не изменяют состояние x87. - ^ Jump up to: а б с
FST
/FSTP
с 80-битным назначением (m80 или st(i)) и исходным значением sNaN будут создавать исключения для AMD, но не для FPU Intel. - ^
FSTP ST(0)
— это часто используемая идиома для извлечения одного регистра из стека регистров x87. - ^ 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] - ^ Jump up to: а б На 8087 и 80287,
FBSTP
а инструкции постоянной нагрузки всегда используют режим округления до ближайшего. На процессорах FPU x87 80387 и более поздних версиях эти инструкции будут использовать режим округления, указанный в регистре RC x87. - ^ Jump up to: а б с д и ж г час я Для
FADDP
,FSUBP
,FSUBRP
,FMULP
,FDIVP
,FDIVRP
,FCOM
,FCOMP
иFXCH
инструкции, ассемблеры/дизассемблеры x86 могут распознавать варианты инструкций без аргументов. Такие варианты эквивалентны вариантам, использующим st(1) в качестве первого аргумента. - ^ На процессорах Intel Pentium и более поздних версиях:
FXCH
реализуется как переименование регистра, а не как настоящее перемещение данных. Это не имеет никакого семантического эффекта, но обеспечивает работу с нулевой задержкой цикла. Это также позволяет инструкции разрывать зависимости данных для значения вершины стека x87, улучшая достижимую производительность кода, оптимизированного для этих процессоров. - ^ Результат выполнения
FBLD
инструкция для данных, отличных от BCD, не определена. - ^ На ранних процессорах Intel Pentium деление с плавающей запятой подвергалось ошибке Pentium FDIV . Это также повлияло на инструкции, выполняющие деление в рамках своих операций, например
FPREM
иFPATAN
. [121] - ^
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) пустым или нет.
- ^ Для
FXTRACT
, если st(0) равно нулю или ±∞, то M полагается равным st(0). Если st(0) равен нулю, E устанавливается в 0 в 8087/80287, но -∞ в 80387 и более поздних версиях. Если st(0) равен ±∞, то E устанавливается равным +∞. - ^ Для
FPREM
, если частное Q больше, чем , то вычисление остатка могло быть выполнено лишь частично – в этом случаеFPREM
инструкцию необходимо будет запустить еще раз, чтобы завершить вычисление остатка. На это указывает настройка инструкцииC2
до 1.
Если инструкция завершила вычисление остатка, она установитC2
в 0 и установите три бита{C0,C3,C1}
частного Q. к нижним трем битам
В версии 80387 и более поздних версиях, если инструкция не завершила вычисление остатка, то вычисленный остаток Q, используемый для уменьшения аргумента, будет округлен до числа, кратного 8 (или большей степени 2), так что нижние 3 бита часть частного все еще можно правильно получить на более позднем проходе, который завершает вычисление остатка. - ^ Вычисление остатка, выполненное
FPREM
инструкция всегда точна, без ошибок округления. - ^ Для
FSCALE
инструкции для 8087 и 80287, st(1) должен находиться в диапазоне . Кроме того, его абсолютное значение должно быть либо 0, либо хотя бы 1. Если эти требования не выполняются, результат не определен.
Эти ограничения были сняты в версии 80387. - ^ Для
FSCALE
, округление применяется только в случае переполнения, недостаточности или ненормального результата. - ^ Трансцендентные инструкции x87 не подчиняются PC или RC, а вместо этого вычисляют полные 80-битные результаты. Эти результаты не обязательно округлены правильно (см. «Дилемма составителя таблиц ») — они могут иметь погрешность до ±1 ulp на Pentium или более поздних версиях или до ±1,5 ulp на более ранних сопроцессорах x87.
- ^ Jump up to: а б Для
FYL2X
иFYL2XP1
инструкций максимальная граница ошибки ±1 ulp справедлива только для st(1)=1,0 – для других значений st(1) граница ошибки увеличивается до ±1,35 ulp. - ^ Для
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).
- ^ Пока
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
|
- ^ FPU x87 должен знать, работает ли он в реальном режиме или в защищенном режиме, поскольку среда с плавающей запятой, к которой обращается
F(N)SAVE
,FRSTOR
,FLDENV
иF(N)STENV
инструкции имеют разные форматы в реальном режиме и защищенном режиме. На 80287F(N)SETPM
Инструкция необходима для сообщения FPU о переходе из реального режима в защищенный. В 80387 и более поздних версиях FPU x87 переходы между реальным и защищенным режимами автоматически передаются в FPU без необходимости каких-либо специальных инструкций – поэтому на этих FPUFNSETPM
выполняется как NOP, который не изменяет состояние FPU. - ^ Не включая снятые с производства инструкции для конкретных моделей FPU, совместимых с 80387.
- ^ Jump up to: а б Для
FUCOM
иFUCOMP
инструкции, ассемблеры/дизассемблеры x86 могут распознавать варианты инструкций без аргументов. Такие варианты эквивалентны вариантам, использующим st(1) в качестве первого аргумента. - ^ 80387
FPREM1
инструкция отличается от старойFPREM
(D9 F8
) инструкция, заключающаяся в том, что частное Q округляется до целого числа с округлением до ближайшего четного, а не с округлением до нуля, используемымFPREM
. НравитьсяFPREM
,FPREM1
всегда вычисляет точный результат без ошибок округления. НравитьсяFPREM
, он также может выполнить частичное вычисление, если частное слишком велико, и в этом случае его необходимо запустить снова. - ^ Jump up to: а б с Поскольку FPU x87 выполняет сокращение аргументов для sin/cos с точностью всего около 68 бит, значение k , используемое при вычислении
FSIN
,FCOS
иFSINCOS
не совсем 1,0, а определяется выражением [122] [123] Эта неточность приведения аргумента также влияет наFPTAN
инструкция. - ^
FCOMI
,FCOMIP
,FUCOMI
иFUCOMIP
инструкции записывают свои результаты вZF
,CF
иPF
кусочкиEFLAGS
зарегистрироваться. На процессорах Intel, но не на процессорах AMD,SF
,AF
иOF
кусочкиEFLAGS
также обнуляются этими инструкциями. - ^
FXSAVE
иFXRSTOR
инструкции были добавлены в версию Pentium II «Deschutes» и отсутствуют в более ранней версии «Klamath».
Они также присутствуют в AMD K7.
Они также считаются неотъемлемой частью SSE и поэтому присутствуют во всех процессорах с SSE. - ^ Jump up to: а б The
FXSAVE
иFXRSTOR
инструкции сохранят/восстановят состояние SSE только на процессорах, поддерживающих SSE. В противном случае они сохранят/восстановят только состояние x87 и MMX.
Раздел x87 состояния, сохраненного/восстановленногоFXSAVE
/FXRSTOR
имеет совершенно другую структуру, чем структура данных более старогоF(N)SAVE
/FRSTOR
инструкции, что позволяет быстрее сохранять/восстанавливать данные, избегая несогласованных загрузок и сохранений. - ^ Jump up to: а б Когда эмуляция с плавающей запятой включена с помощью
CR0.EM=1
,FXSAVE(64)
иFXRSTOR(64)
считаются инструкциями x87 и соответственно создают Исключение #NM (устройство недоступно). КромеWAIT
, это единственные коды операций за пределамиD8..DF
Пространство кода операции ESC, которое демонстрирует такое поведение. (Все коды операций вD8..DF
будет производить #НМ, еслиCR0.EM=1
, даже для неопределенных кодов операций, которые могут привести к #UD иначе.) - ^ В отличие от старого
F(N)SAVE
инструкция,FXSAVE
не будет инициализировать FPU после сохранения его состояния в памяти, а вместо этого оставит состояние сопроцессора x87 неизмененным.
SIMD- инструкции
[ редактировать ]Криптографические инструкции
[ редактировать ]Инструкции по виртуализации
[ редактировать ]Прочие инструкции
[ редактировать ]x86 также включает в себя наборы инструкций, выпуск которых прекращен, которые больше не поддерживаются Intel и AMD, а также недокументированные инструкции, которые выполняются, но официально не задокументированы.
См. также
[ редактировать ]- КЛМУЛ
- РДРАНД
- Расширенные векторные расширения 2
- AVX-512
- Набор инструкций для манипуляций с битами x86
- идентификатор процессора
- Список инструкций x86, выпуск которых прекращен
Ссылки
[ редактировать ]- ^ «Re: Идентификация процессора Intel и инструкция CPUID» . Проверено 21 апреля 2013 г.
- ^ https://eecs.wsu.edu/~ee314/handouts/x86ref.pdf
- ↑ Михал Некасек, SGDT/SIDT Fiction and Reality , 4 мая 2017 г. Архивировано 29 ноября 2023 г.
- ^ Jump up to: а б Intel, Недокументированная инструкция по тестированию iAPX 286 . Архивировано 20 декабря 2023 г.
- ^ WikiChip, UMIP — x86 . Архивировано 16 марта 2023 г.
- ^ Oracle Corp, Руководство администратора Oracle® VM VirtualBox для версии 6.0, раздел 3.5: Подробности о виртуализации программного обеспечения . Архивировано 8 декабря 2023 года.
- ^ Проект MBC, Обнаружение виртуальных машин (постоянная ссылка) или Обнаружение виртуальных машин (постоянная ссылка)
- ^ Эндрю Шульман, «Несанкционированная Windows 95» ( ISBN 1-56884-169-8 ), глава 8, стр. 249 257.
- ^ В патенте США 4974159 «Способ передачи управления в многозадачной компьютерной системе» упоминается 63h/ARPL.
- ^ Intel, Руководство разработчика семейства процессоров Pentium®, том 3 , 1995 г., номер заказа. 241430-004, раздел 12.7, стр. 323
- ^ Intel, Как работает микроархитектурная выборка данных , см. раздел «Средства снижения риска». Архивировано 22 апреля 2022 г.
- ^ Документация по ядру Linux, смягчение последствий микроархитектурной выборки данных (MDS). Архивировано 21 октября 2020 г. на Wayback Machine.
- ^ Форумы VCF, я нашел код операции SAVEALL , 21 июня 2019 г. Архивировано 13 апреля 2023 г.
- ^ представитель lodsb, Секреты Intel 286: режим ICE и F1 0F 04 , 12 августа 2022 г. Архивировано 8 декабря 2023 г.
- ^ LKML, (ИСПРАВЛЕНИЕ) x86-64, espfix: не допускайте утечки битов 31:16 %esp, возвращающихся в 16-битный стек , 29 апреля 2014 г. Архивировано 4 января 2018 г.
- ↑ Рэймонд Чен, Запуск игр MS-DOS в Windows 95: решение проблемы iretd , 4 апреля 2016 г. Архивировано 15 марта 2019 г.
- ^ sandpile.org, регистр rFLAGS для архитектуры x86 , см. примечание № 7.
- ^ Джан Белюк, Рассмотрение всего набора инструкций x86-64 за считанные секунды с помощью этого странного трюка , 22 марта 2021 г. Архивировано 23 марта 2021 г.
- ^ Jump up to: а б Роберт Коллинз, Недокументированные коды операций , 29 июля 1995 г. Архивировано 21 февраля 2001 г.
- ↑ Михал Некасек, ICEBP наконец задокументирован , Музей OS/2 , 25 мая 2018 г. Архивировано 6 июня 2018 г.
- ^ Intel, AP-526: Оптимизация для 32-битных процессоров Intel , номер заказа. 242816-001, октябрь 1995 г. – списки.
INT1
на странице 86. - ^ AMD, 64-битная технология AMD, том 2: Системное программирование , номер заказа. 24593, ред. 3.06, август 2002 г., стр. 248
- ^ «Информация о процессоре Intel 80386 | Машины PCJS» .
- ^ Джефф Чаппелл, Идентификация ЦП перед CPUID
- ^ Джефф Парсонс, Устаревшие 80386 Инструкции: IBTS и XBTS , машины PCjs . Архивировано 19 сентября 2020 г.
- ^ Роберт Коллинз, Инструкция LOADALL . Архивировано из оригинала 5 июня 1997 года.
- ^ Тот, Эрвин (16 марта 1998 г.). «BSWAP с 16-битными регистрами» . Архивировано из оригинала 3 ноября 1999 г.
Команда записывает старшее слово регистра двойного слова, не затрагивая его старшие 16 бит.
- ^ Колдвин, Гинваэль (29 декабря 2009 г.). «BSWAP + префикс 66h» . Проверено 3 октября 2018 г.
внутреннее (нулевое) расширение значения меньшего (16-битного) регистра… применение bswap к 32-битному значению «00 00 AH AL»,… усеченному до младших 16 бит, которые равны «00 00». … Bochs … bswap reg16 действует так же, как bswap reg32 … QEMU … игнорирует префикс 66h
- ^ Intel «Микропроцессор i486» (апрель 1989 г., номер заказа 240440-001), списки стр. 142.
CMPXCHG
с0F A6/A7
кодировки. - ^ Intel «Микропроцессор i486» (ноябрь 1989 г., номер заказа 240440-002), списки стр. 135.
CMPXCHG
с0F B0/B1
кодировки. - ^ «Intel 486 и 486 POD CPUID, S-spec и степпинги» .
- ^ Intel, Справочник по программированию расширений Software Guard , номер заказа. 329298-002, октябрь 2014 г., разделы 3.5 и 3.6.5.
- ^ Франк ван Гиллуве, «Недокументированный ПК, второе издание», 1997, ISBN 0-201-47950-8 , стр. 55.
- ^ AMD, Руководство по версиям процессоров AMD Athlon 64 и AMD Opteron, pub.no. 25759, ред. 3.79, июль 2009 г., стр. 34. Архивировано 20 декабря 2023 г.
- ^ Intel, Руководство разработчика программного обеспечения, том 3A , номер заказа. 253668-078, декабрь 2022 г., раздел 9.3, стр. 299
- ^ «RSM — выход из режима управления системой» . Архивировано из оригинала 12 марта 2012 г.
- ^ Отчет о микропроцессоре, Объяснение режима управления системой (том 6, № 8, 17 июня 1992 г.). Архивировано 29 июня 2022 г.
- ^ Эллис, Симсон К., «Микропроцессор 386 SL в ноутбуках», Intel Corporation, Microcomputer Solutions, март/апрель 1991 г., стр. 20
- ^ Лист данных Cyrix 486SLC/e (1992) , раздел 2.6.4
- ^ Исходники ядра Linux 6.3, /arch/x86/include/asm/cpuid.h , строка 69.
- ^ Список рассылки gcc-patches, CPUID Patch для IDT Winchip , 21 мая 2019 г. Архивировано 27 апреля 2023 г.
- ^ Intel, Примечание по применению технологии виртуализации Intel® FlexMigration , номер заказа. 323850-004, октябрь 2012 г., раздел 2.3.2 на стр. 12. Архивировано 13 октября 2014 г.
- ^ Intel, Техническое описание семейства процессоров Atom C3000, номер заказа. 337018-002, февраль 2018 г., страницы 133, 3808 и 3814. Архивировано 9 февраля 2022 г.
- ^ AMD, Руководство программиста по архитектуре AMD64, том 3, pub.no. 24594, ред. 3.34, октябрь 2022 г., с. 165 (запись на
CPUID
инструкция) - ↑ Роберт Коллинз, CPUID Algorithm Wars , ноябрь 1996 г. Архивировано из оригинала 18 декабря 2000 г.
- ^ Джефф Чаппелл, Поддержка CMPXCHG8B в 32-битном ядре Windows , 23 января 2008 г. Архивировано 5 ноября 2023 г.
- ^ Jump up to: а б Intel, Руководство разработчика программного обеспечения , номер заказа. 325426-077, ноябрь 2022 г. – запись на
RDTSC
Инструкция на стр. 1739 описывает последовательность инструкций, необходимую для заказаRDTSC
инструкции по отношению к предыдущим и последующим инструкциям. - ^ Ядро Linux 5.4.12, /arch/x86/kernel/cpu/centaur.c
- ^ Переполнение стека. Может ли постоянный неинвариантный tsc изменять частоту в зависимости от состояния процессора? Доступ 24 января 2023 г. Архивировано 24 января 2023 г.
- ^ CPU-World, CPUID для Zhaoxin KaiXian KX-5000 KX-5650 (от timw4mail) , 24 апреля 2024 г. Архивировано 26 апреля 2024 г.
- ↑ Михал Некасек, «Недокументированный RDTSC» , 27 апреля 2018 г. Архивировано 16 декабря 2023 г.
- ^ JookWiki, "nopl" , 24 сентября 2022 г. - содержит подробный отчет об истории длинного NOP и проблемах, связанных с ним. Архивировано 28 октября 2022 г.
- ^ Сообщество Intel: многобайтовый NOP стал официальным . Архивировано 7 апреля 2022 г.
- ^ Руководство разработчика программного обеспечения Intel , том 3B (номер заказа 253669-076us, декабрь 2021 г.), раздел 22.15 «Зарезервированный NOP»
- ^ AMD, 64-битная технология AMD – Руководство программиста по архитектуре AMD x86-64, том 3 , публикация №. 24594, ред. 3.02, август 2002 г., стр. 379.
- ^ Журналы отчетов об ошибках Debian, сборка -686 использует длинные noops, которые не поддерживаются Transmeta Crusoe, немедленный сбой при загрузке , см. сообщения 148 и 158 для NOPL на VIA C7. Архивировано 1 августа 2019 г.
- ^ Intel, Руководство разработчика программного обеспечения для архитектуры Intel, том 2 , 1997 г., номер заказа. 243191-001, стр. 3-9 и А-7.
- ^ Джон Хэсси, Изменения в Pentium Pro , список рассылки GAS2 , 28 декабря 1995 г. - патч, добавляющий
UD2A
иUD2B
мнемоника инструкций для GNU Binutils. Архивировано 25 июля 2023 г. - ^ Ян Бейлих, x86: правильный UDn , список рассылки binutils-gdb , 23 ноября 2017 г. — патч Binutils, добавляющий байт ModR/M в
UD1
/UD2B
и добавилUD0
. Архивировано 25 июля 2023 г. - ^ Intel, Руководство разработчика семейства процессоров Pentium®, том 3 , 1995. Номер заказа. 241430-004, приложение А, стр. 943 – резервирует коды операций
0F 0B
и0F B9
. - ^ Jump up to: а б AMD, Руководство программиста по архитектуре AMD64, том 3 , номер публикации. 24594, ред. 3.17, декабрь 2011 г. – см. стр. 416.
UD0
и страницы 415 и 419 дляUD1
. - ^ Jump up to: а б Intel, Руководство разработчика программного обеспечения, том 2B , номер заказа. 253667-061, декабрь 2016 г. – списки
UD1
(с ModR/M ) и байтомUD0
(без байта ModR/M) на стр. 4-687. - ^ Стеклина, Юлиан (08 февраля 2019 г.). «Отпечатки пальцев процессоров x86 с использованием недопустимых кодов операций» . x86.лол . Архивировано из оригинала 15 декабря 2023 года . Проверено 15 декабря 2023 г.
- ^ «исправление длины ud0 · intelxed/xed@7561f54» . Гитхаб . Архивировано из оригинала 1 июня 2023 года . Проверено 15 декабря 2023 г.
- ^ Jump up to: а б Cyrix, паспорт процессора 6x86 , 1996 г., номер заказа. 94175-01, таблица 6-20, стр. 209 – используется мнемосхема
OIO
(«Официальный недопустимый код операции») для0F FF
код операции. - ^ Intel, Руководство разработчика программного обеспечения, том 2B , номер заказа. 253667-064, октябрь 2017 г. – списки
UD0
(с байтом ModR/M) на стр. 4-683. - ^ AMD, Техническое справочное руководство по процессору AMD-K5 , ноябрь 1996 г., номер заказа. 18524C/0, раздел 3.3.7, стр. 90 – резервирует
0F FF
код операции без присвоения ему мнемоники. - ^ AMD, Техническое описание процессора AMD-K6 , номер заказа. 20695H/0, март 1998 г., раздел 24.2, стр. 283.
- ^ Джордж Данлэп, Повышение привилегий Intel SYSRET , Проект Xen. , 13 июня 2012 г. Архивировано 15 марта 2019 г.
- ^ Intel, AP-485: Идентификация процессора Intel® и инструкция CPUID , номер заказа. 241618-039, май 2012 г., раздел 5.1.2.5, стр. 32
- ^ Михал Некасек, «SYSENTER, где ты?» , 20 июля 2017 г. Архивировано 29 ноября 2023 г.
- ^ AMD, Руководство по оптимизации кода процессора Athlon x86 , публикация №. 22007, ред. K, февраль 2002 г., приложение F, стр. 284. Архивировано 13 апреля 2017 г.
- ^ Transmeta, Распознавание процессора , 7 мая 2002 г.
- ^ VIA, Техническое описание процессора VIA C3 Nehemiah , версия 1.13, 29 сентября 2004 г., страница 17
- ^ CPU-World, CPUID для Intel Xeon 3,40 ГГц — Nocona Stepping D CPUID без CMPXCHG16B
- ^ CPU-World, CPUID для Intel Xeon 3,60 ГГц — Nocona степпинг E CPUID с CMPXCHG16B
- ^ SuperUser StackExchange, Насколько распространены старые процессоры x64, в которых отсутствует инструкция cmpxchg16b?
- ^ Intel Номер заказа SDM. 325462-077 , апрель 2022 г., том 2B, стр. 4-130 «MOVSX/MOVSXD-Move with Sign-Extension» указывает, что MOVSXD без REX.W «не рекомендуется».
- ^ Anandtech, Обзор AMD Zen 3 Ryzen Deep Dive , 5 ноября 2020 г., стр. 6
- ^ @ instlatx64 (31 октября 2020 г.). «Сохранение частного Ryzen: функции замены PEXT/PDEP 32/64b для процессоров #AMD (BR/#Zen/Zen+/#Zen2) на основе zp7 @zwegner» ( твит ) . Проверено 20 января 2023 г. - через Twitter .
- ^ Вегнер, Зак (4 ноября 2020 г.). "цвегнер/zp7" . Гитхаб .
- ^ Intel, Спецификация технологии обеспечения контроля потока управления (v3.0, номер заказа 334525-003, март 2019 г.)
- ^ Intel SDM, версия 076, декабрь 2021 г. , том 1, раздел 18.3.1
- ^ Список рассылки Binutils: x86: CET v2.0: Обновление префикса NOTRACK.
- ^ AMD, Расширения 3DNow! и наборы инструкций MMX , арт. 22466Д/0, март 2000 г., стр.11
- ^ Хади Брейс, Значение инструкции x86 SFENCE , 26 февраля 2019 г.
- ^ Intel, Руководство разработчика программного обеспечения , номер заказа. 325426-077, ноябрь 2022 г., том 1, раздел 11.4.4.3, стр. 276.
- ^ Хади Брайс, Значение инструкции LFENCE , 14 мая 2018 г.
- ^ AMD, Программные методы управления спекуляциями на процессорах AMD , версия 3.8.22, 8 марта 2022 г., стр. 4. Архивировано 13 марта 2022 г.
- ^ Intel, Руководство разработчика программного обеспечения Prescott New Instructions , номер заказа. 252490-003, июнь 2003 г., список стр. 3–26 и 3–38.
MONITOR
иMWAIT
с явными операндами. Архивировано 9 мая 2005 г. - ^ Доска объявлений Flat Assembler, «Синтаксис BLENDVPS/BLENDVPD/PBLENDVB» , также охватывает
MONITOR
/MWAIT
мнемоника. Архивировано 6 ноября 2022 г. - ^ Intel, семейство продуктов Intel® Xeon Phi™ x200 (KNL) Пользовательский режим (кольцо 3) MONITOR и MWAIT (архивировано 5 марта 2017 г.)
- ^ AMD, Руководство разработчика BIOS и ядра (BKDG) Для процессоров семейства AMD 10h , номер заказа. 31116, ред. 3.62, стр. 419. Архивировано 8 апреля 2024 г.
- ^ Р. Чжан и др., (M)WAIT for It: Преодоление разрыва между микроархитектурными и архитектурными побочными каналами , 3 января 2023 г., стр. 5. Архивировано из оригинала 5 января 2023 г.
- ^ Intel, Справочник по программированию расширений набора команд архитектуры , номер заказа. 319433-052, март 2024 г., глава 17. Архивировано 7 апреля 2024 г.
- ^ Guru3D, выпуск 4- и 8-ядерных процессоров SoC VIA Zhaoxin x86 , 22 января 2018 г.
- ^ Уязвимости, x86: DoS из-за попытки использовать INVPCID с неканоническими адресами , 20 ноября 2018 г.
- ^ Intel, Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 , том 3, номер заказа. 325384-078, декабрь 2022 г., глава 23.15
- ^ Кэтрин Исдон, Недокументированное поведение ЦП на микроархитектурах x86 и RISC-V: взгляд на безопасность , 10 мая 2019 г., стр. 39
- ^ Instlatx64, Дамп CPUID Zhaoxin Kaixian KX-6000G , 15 мая 2023 г.
- ^ Intel, Руководство разработчика программного обеспечения процессоров Willamette , номер заказа. 245355-001, фев 2000 г., раздел 3.5.3, стр. 294 - списки
HWNT
/HST
мнемоника для префиксов подсказок ветвей. Архивировано из оригинала 5 февраля 2005 года. - ^ Intel, Руководство разработчика программного обеспечения , номер заказа. 325462-083, март 2024 г. - том 1, глава 11.4.5, стр. 281 и том 2А, глава 2.1.1, стр. 525.
- ^ Intel, Справочное руководство по оптимизации архитектур Intel 64 и IA-32: Том 1 , номер заказа. 248966-050US, апрель 2024 г., глава 2.1.1.1, стр. 46.
- ^ Jump up to: а б с Intel, Архитектура Intel® Software Guard Extensions (Intel® SGX) для превышения подписки на безопасную память в виртуализированной среде , 25 июня 2017 г.
- ^ Intel, Обновления микрокода среды выполнения с расширениями Intel® Software Guard Extensions , сентябрь 2021 г., номер заказа. 648682 ред. 1.0. Архивировано из оригинала 31 марта 2023 года.
- ^ Intel, Техническое описание процессора Intel® Core™ 11-го поколения для настольных ПК, том 1 , май 2022 г., номер заказа. 634648-004, раздел 3.5, стр. 65
- ^ Intel, Какие платформы поддерживают расширения Intel® Software Guard Extensions (Intel® SGX) SGX2? Архивировано 5 мая 2022 года.
- ^ Intel, Архитектурные расширения ЦП Trust Domain , номер заказа. 343754-002, май 2021 г.
- ^ @InstLatX64 (3 мая 2022 г.). «История CLDEMOTE» ( твит ) . Проверено 23 января 2023 г. - через Twitter .
- ^ @Instlatx64 (17 апреля 2023 г.). «20-ядерный процессор Intel Xeon w7-2475X (SapphireRapids-64L) 806F8, дамп CPUID» ( твит ) . Проверено 20 апреля 2023 г. - через Twitter .
- ^ Викичип, CLZERO – x86
- ^ Intel, Примечание по применению AP-578: Рекомендации по программному и аппаратному обеспечению для обработчиков исключений FPU для процессоров с архитектурой Intel , номер заказа. 243291-002, февраль 1997 г.
- ^ Intel, Примечание по применению AP-113: Начало работы с процессором числовых данных , февраль 1981 г., страницы 24-25
- ^ Intel, математический сопроцессор 8087 , октябрь 1989 г., номер заказа. 285385-007, стр. 3-100, рис. 9
- ^ Intel, 80-битное расширение числового процессора HMOS 80287 , февраль 1983 г., номер заказа. 201920-001, стр. 14
- ^ Intel, iAPX86, 88 Руководство пользователя , 1981 г. (номер заказа 210201-001), стр. 797
- ^ Intel Справочное руководство для программистов 80286 и 80287 , 1987 г. (номер заказа 210498-005), с. 485
- ^ Intel Руководство разработчика программного обеспечения , том 3B, редакция 064, раздел 22.18.9
- ^ «GCC Bugzilla – 37179 – GCC выдает неверный код операции 'ffreep' » .
- ^ Майкл Стейл, FFREEP - инструкция по сборке, которой никогда не существовало
- ^ Душко Конкалиев, Ошибка Pentium FDIV
- ^ Брюс Доусон, Intel занижает границу ошибок на 1,3 квинтиллиона
- ^ Intel SDM, версия 053 и более поздние, описывает точную процедуру сокращения аргументов, используемую для
FSIN
,FCOS
,FSINCOS
иFPTAN
в томе 1, раздел 8.3.8
- Корпорация Intel (апрель 2022 г.). «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, объединенные тома: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D и 4» . Интел . Проверено 21 июня 2022 г.
Внешние ссылки
[ редактировать ]- Бесплатная документация по IA-32 и x86-64 , предоставленная Intel.
- Руководство программиста по архитектуре AMD64, тома 1–5 , предоставлено AMD
- Справочник по коду операции x86 и инструкциям
- Справочник по инструкциям x86 и amd64
- Таблицы инструкций: списки задержек инструкций, пропускной способности и нарушений микроопераций для процессоров Intel, AMD и VIA.
- Список инструкций Netwide Assembler (из Netwide Assembler )