El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Las instrucciones suelen ser parte de un programa ejecutable , que a menudo se almacena como un archivo de computadora y se ejecuta en el procesador.
El conjunto de instrucciones x86 se ha ampliado varias veces, introduciendo registros y tipos de datos más amplios, así como nuevas funcionalidades. [1]
A continuación se muestra el conjunto completo de instrucciones 8086 / 8088 de Intel (81 instrucciones en total). [2] Estas instrucciones también están disponibles en modo de 32 bits, operan en cambio en registros de 32 bits ( eax , ebx , etc.) y valores en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado está agrupado según la arquitectura ( i186 , i286 , i386 , i486 , i586 / i686 ) y se conoce como (32 bits) x86 y (64 bits) x86-64 (también conocido como AMD64 ).
Este es el conjunto de instrucciones original. En la columna "Notas", r significa registro , m significa dirección de memoria e imm significa inmediato (es decir, un valor).
Las nuevas instrucciones agregadas en 80286 agregan compatibilidad con el modo protegido x86 . Algunas de las instrucciones, pero no todas, también están disponibles en modo real .
LGDT
, LIDT
y constan de una estructura de datos de 2 partes. La primera parte es un valor de 16 bits, que especifica el tamaño de la tabla en bytes menos 1. La segunda parte es un valor de 32 bits (valor de 64 bits en modo de 64 bits), que especifica la dirección de inicio lineal de la tabla. SGDT
Para y con un tamaño de operando de 16 bits, la dirección se combina con 00FFFFFFh. En las CPU Intel (pero no AMD), las instrucciones y con un tamaño de operando de 16 bits están documentadas (a partir de la revisión 079 de Intel SDM, marzo de 2023) para escribir un descriptor en la memoria con el último byte establecido en 0. Sin embargo, el comportamiento observado es que se escriben los bits 31:24 de la dirección de la tabla de descriptores en su lugar. [3]SIDT
LGDT
LIDT
SGDT
SIDT
LGDT
, LIDT
, LLDT
y LTR
se serializan en procesadores Pentium y posteriores.LMSW
instrucción se serializa en los procesadores Intel desde Pentium en adelante, pero no en los procesadores AMD.LMSW
instrucción solo puede modificar los 4 bits inferiores de este registro y no puede borrar el bit 0. La incapacidad de borrar el bit 0 significa que LMSW
se puede usar para ingresar pero no para salir del modo protegido x86 . LMSW
ni con LOADALL
[4] ) sin un reinicio de la CPUMOV
; en 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de la instrucción 80386 y posteriores CR0
.CR4.UMIP=1
está configurado, entonces las instrucciones SGDT
, SIDT
, SLDT
, SMSW
y STR
solo pueden ejecutarse en el anillo 0. SMSW
, SLDT
y STR
siempre utilizan un tamaño de operando de 16 bits cuando se utilizan con un argumento de memoria. Con un argumento de registro en procesadores 80386 o posteriores, hay tamaños de operando de destino más amplios disponibles y se comportan de la siguiente manera:SMSW
:Almacena CR0 completo en modo largo x86-64 , no definido en caso contrario.SLDT
:El argumento de 16 bits se extiende a cero en procesadores Pentium Pro y posteriores, no está definido en procesadores anteriores.STR
:Argumento de 16 bits que se extiende a cero.ARPL
63 /r
MOVSXD
ARPL
instrucción provoca #UD en modo real y modo virtual 8086 : se sabe que Windows 95 y OS/2 2.x hacen un uso extensivo de esta #UD para usar el 63
código de operación como un punto de interrupción de un byte para realizar la transición del modo virtual 8086 al modo kernel. [8] [9]0x00FFFF00
.VERW
instrucción también vacía los búferes de datos de microarquitectura. Esto permite que se la utilice como parte de soluciones alternativas para vulnerabilidades de seguridad de muestreo de datos de microarquitectura . [11] [12]LOADALL
con un código de operación y un diseño de memoria diferentes en 80386).El 80386 agregó soporte para operaciones de 32 bits al conjunto de instrucciones x86. Esto se hizo ampliando los registros de propósito general a 32 bits e introduciendo los conceptos de OperandSize y AddressSize : a la mayoría de las formas de instrucción que anteriormente aceptaban argumentos de datos de 16 bits se les dio la capacidad de aceptar argumentos de 32 bits al establecer su OperandSize en 32 bits, y a las instrucciones que podían aceptar argumentos de dirección de 16 bits se les dio la capacidad de aceptar argumentos de dirección de 32 bits al establecer su AddressSize en 32 bits. (Las formas de instrucción que funcionan con datos de 8 bits continúan siendo de 8 bits independientemente de OperandSize. El uso de un tamaño de datos de 16 bits hará que solo se modifiquen los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 bits superiores se dejan sin cambios).
El tamaño de operando y el tamaño de dirección predeterminados que se utilizan para cada instrucción se determinan mediante el bit D del descriptor de segmento del segmento de código actual; D=0
ambos son de 16 bits y D=1
ambos de 32 bits. Además, se pueden anular en cada instrucción con dos nuevos prefijos de instrucción que se introdujeron en el 80386:
66h
: Anulación de OperandSize. Cambiará OperandSize de 16 bits a 32 bits si CS.D=0
, o de 32 bits a 16 bits si CS.D=1
.67h
: Anulación de AddressSize. Cambiará AddressSize de 16 bits a 32 bits si CS.D=0
, o de 32 bits a 16 bits si CS.D=1
.El 80386 también introdujo dos nuevos registros de segmento FS
, GS
así como los registros de control , depuración y prueba x86 .
Las nuevas instrucciones introducidas en el 80386 se pueden subdividir en dos clases:
CWDE
, , LODSD
)SHLD
, SETcc
)Para los formularios de instrucciones donde el tamaño del operando se puede inferir a partir de los argumentos de la instrucción (por ejemplo, ADD EAX,EBX
se puede inferir que tiene un OperandSize de 32 bits debido a su uso de EAX como argumento), no se necesitan nuevos mnemónicos de instrucción y no se proporcionan.
EFLAGS.DF=1
y se incrementa posteriormente en 4 en caso contrario. 67
prefijo.LODSD
, STOSD
, y , el prefijo ( ) repetirá la instrucción la cantidad de veces especificada en rCX (CX o ECX, decidido por AddressSize), decrementando rCX para cada iteración (con rCX=0 resultando en no-op y procediendo a la siguiente instrucción). Para y , los prefijos ( ) y ( ) están disponibles, lo que repetirá la instrucción pero solo mientras la condición de bandera (ZF=1 para , ZF=0 para ) sea verdadera.MOVSD
INSD
OUTSD
REP
F3
CMPSD
SCASD
REPE
F3
REPNE
F2
REPE
REPNE
INSB/W/D
instrucciones, es posible que los derechos de acceso a la memoria para la ES:[rDI]
dirección de memoria no se verifiquen hasta que se haya realizado el acceso al puerto; si esta verificación falla (por ejemplo, por un error de página u otra excepción de memoria), se perderá el elemento de datos leído desde el puerto. Por lo tanto, no se recomienda utilizar esta instrucción para acceder a un puerto de E/S que realice algún tipo de efecto secundario al leer.CWDE
instrucción se diferencia de la CWD
instrucción anterior en que CWD
extendería el signo del valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX.E3
código de operación ( JCXZ
/ JECXZ
), la elección de si la instrucción utilizará CX
o ECX
para su comparación (y en consecuencia qué mnemónico utilizar) se basa en AddressSize, no en OperandSize. (En cambio, OperandSize controla si el destino del salto debe truncarse a 16 bits o no). LOOP
, LOOPE
, LOOPNE
(códigos de operación E0
, E1
, E2
), sin embargo, a diferencia de JCXZ
/ JECXZ
, a estas instrucciones no se les han dado nuevos mnemónicos para sus variantes que utilizan ECX.PUSHA(D)
, el valor de SP/ESP introducido en la pila es el valor que tenía justo antes de que la PUSHA(D)
instrucción comenzara a ejecutarse.POPA
/ POPAD
, el elemento de la pila correspondiente a SP/ESP se extrae de la pila (realizando una lectura de memoria), pero no se coloca en SP/ESP.PUSHFD
y POPFD
provocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3. PUSHF
, POPF
, IRET
y IRETD
provocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3 y VME no está habilitado.IRETD
se utiliza para volver del modo kernel al modo usuario (lo que implicará un cambio de CPL) y el segmento de pila del modo usuario indicado por SS es un segmento de 16 bits, entonces la IRETD
instrucción solo restaurará los 16 bits más bajos del puntero de pila (ESP/RSP), y los bits restantes mantendrán el valor que tenían en el código kernel antes de IRETD
. Esto ha requerido soluciones alternativas complejas tanto en Linux ("ESPFIX") [15] como en Windows. [16] Este problema también afecta a la instrucción de 64 bits posterior IRETQ
.BT
, BTS
, BTR
y BTC
:BTS
, BTC
y BTR
aceptan el prefijo LOCK
( F0
) cuando se utilizan con un argumento de memoria; esto da como resultado que la instrucción se ejecute de forma atómica.F3
0F BC /r
TZCNT
TZCNT
BSF
TZCNT
BSR
BSF
y BSR
establezca el indicador EFLAGS.ZF en 1 si el argumento de origen era todo 0 y en 0 en caso contrario. F3
0F BD /r
LZCNT
LZCNT
BSR
SHLD
y SHRD
, la cantidad de desplazamiento está enmascarada: los 5 bits inferiores se utilizan para un tamaño de operando de 16/32 bits y 6 bits para un tamaño de operando de 64 bits. SHLD
y SHRD
con argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 producen resultados indefinidos. (Los resultados reales difieren entre las diferentes CPU Intel, con al menos tres comportamientos diferentes conocidos. [17] )SETcc
Jcc near
0F 9x /0
0F 8x
SETcc
, aunque el código de operación se especifica comúnmente como /0 (lo que implica que los bits 5:3 del byte ModR/M de la instrucción deben ser 000), los procesadores x86 modernos (Pentium y posteriores) ignoran los bits 5:3 y ejecutarán la instrucción independientemente SETcc
del contenido de estos bits.LFS
, LGS
y LSS
, el tamaño de la parte de desplazamiento del puntero lejano está dado por el tamaño del operando; el tamaño de la parte del segmento siempre es de 16 bits. En el modo de 64 bits, el uso del REX.W
prefijo con estas instrucciones hará que carguen un puntero lejano con un desplazamiento de 64 bits en procesadores Intel pero no en procesadores AMD.MOV
los registros CRx
, DRx
y TRx
, la parte reg del byte ModR/M se utiliza para indicar CRx/DRx/TRx
el registro y la parte r/m el registro general. Únicamente para los MOV CRx/DRx/TRx
códigos de operación, se ignoran los dos primeros bits del byte ModR/M ; estos códigos de operación se decodifican y ejecutan como si los dos primeros bits del byte ModR/M fueran 11b
.CRx
y DRx
, el tamaño del operando siempre es de 64 bits en modo de 64 bits y de 32 bits en caso contrario.CR0
no serializarían el flujo de instrucciones; en parte por este motivo, generalmente se requiere realizar un salto lejano inmediatamente después de un MOV
a CR0
si dicho a MOV
se usa para habilitar/deshabilitar el modo protegido y/o la paginación de memoria . MOV
El a CR2
está catalogado arquitectónicamente como serializador, pero se ha informado que no es serializador en al menos algunos procesadores Intel Core-i7. [18]MOV
El a CR8
(introducido con x86-64) es serializador en procesadores AMD pero no en procesadores Intel.MOV TRx
instrucciones se suspendieron a partir de Pentium.INT1
/ ICEBP
( F1
) está presente en todos los procesadores Intel x86 conocidos desde el 80386 en adelante, [19] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 del Intel SDM (rev 067) en adelante. [20] Antes de esta versión, la mención de la instrucción en el material de Intel era esporádica, por ejemplo, AP-526 rev 001. [21]F1
( ICEBP
) difiere del funcionamiento del código de operación de interrupción de software normal CD 01
de varias maneras:CD 01
verificará CPL contra el campo DPL del descriptor de interrupción como una verificación de derechos de acceso, mientras que F1
no lo hará.CD 01
también comprobará CPL contra IOPL como una verificación de derechos de acceso, mientras que F1
no lo hará.CD 01
pero no con F1
.XBTS
y IBTS
se discontinuaron con el paso B1 del 80386. XBTS
instrucción como parte de su detección de CPU si CPUID
no está presente, y se negará a iniciar si XBTS
se encuentra que está funcionando. [24]XBTS
y IBTS
, el argumento r/m representa los datos desde/hacia los cuales extraer/insertar un campo de bits, el argumento reg el campo de bits que se insertará/extraerá, AX/EAX un desplazamiento de bits y CL una longitud del campo de bits. [25]BSWAP
de registros de 16 bits no está prohibido per se (se ejecutará sin producir un #UD u otras excepciones) pero está documentado que produce resultados indefinidos: se informa que produce varios resultados diferentes en 486, [27] 586 y Bochs / QEMU . [28]CMPXCHG
instrucción utiliza una codificación diferente: 0F A6 /r
para la variante de 8 bits, 0F A7 /r
para la variante de 16/32 bits. Las 0F B0/B1
codificaciones se utilizan en el 80486 stepping B y posteriores. [30] [31]CMPXCHG
instrucción se establece EFLAGS
de la misma manera que una CMP
instrucción que utiliza el acumulador (AL/AX/EAX/RAX) como su primer argumento.INVLPG
se ejecuta como ninguna operación si el argumento m8 no es válido (por ejemplo, una página no asignada o una dirección no canónica). INVLPG
se puede utilizar para invalidar entradas TLB para páginas globales individuales.INVD
and WBINVD
invalidarán todas las líneas de caché en las cachés L1 de la CPU. La implementación define si invalidarán también las cachés L2/L3. INVD
, la instrucción provocará un #VMEXIT obligatorio. Además, en procesadores que admiten Intel SGX , si la PRM (memoria reservada del procesador) se ha configurado mediante los PRMRR (registros de rango PRM), la INVD
instrucción no está permitida y provocará una excepción #GP(0). [32]F3
0F 09
WBNOINVD
Instrucciones de sistema o de enteros que no estaban presentes en el conjunto de instrucciones básicas del 80486, pero que se agregaron en varios procesadores x86 antes de la introducción de SSE. ( Las instrucciones discontinuadas no están incluidas).
WRMSR
instrucción también se utiliza para actualizar el microcódigo de la CPU . Esto se hace escribiendo la dirección virtual del nuevo microcódigo para cargarlo en el MSR 79h
en las CPU Intel y en el MSR C001_0020h
[34] en las CPU AMD.RSM
instrucciones estuvieron disponibles en las variantes no SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993.CPUID
con un índice de hoja (EAX) mayor que 0 puede dejar a EBX y ECX sin modificar, manteniendo sus valores anteriores. Por este motivo, se recomienda poner a cero EBX y ECX antes de ejecutar CPUID
. CPUID
establecerá los 32 bits superiores de RAX, RBX, RCX y RDX en cero.CPUID
al anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [43] y Denverton. [44]CPUID
al anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [45]CPUID
también está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium.CPUID
no está habilitado de forma predeterminada y debe habilitarse a través de un registro de configuración de Cyrix.CPUID
solo es compatible con algunos BIOS del sistema. En algunas CPU NexGen que sí lo son CPUID
, EFLAGS.ID no es compatible, pero EFLAGS.AC sí, lo que complica la detección de la CPU. [46]CMPXCHG
, la CMPXCHG8B
instrucción no modifica ningún bit EFLAGS que no sea ZF.LOCK CMPXCHG8B
con un operando de registro (que es una codificación no válida) puede provocar bloqueos en algunas CPU Intel Pentium ( error Pentium F00F ).CMPXCHG8B
instrucción siempre es compatible, sin embargo, puede faltar el bit CPUID. Esta es una solución temporal para un error en Windows NT. [47]RDTSC
y RDPMC
no están ordenadas con respecto a otras instrucciones, y pueden muestrear sus respectivos contadores antes de que se ejecuten las instrucciones anteriores o después de que se hayan ejecutado las instrucciones posteriores. Las invocaciones de RDPMC
(pero no de RDTSC
) pueden reordenarse entre sí incluso para lecturas del mismo contador. LFENCE
instrucciones de serialización (por ejemplo, CPUID
). [48]8000_0007:EDX[8]
).RDTSC
se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0
. RDTSC
no se puede ejecutar en modo Virtual-8086. [52] Los procesadores posteriores eliminaron esta restricción.RDPMC
se puede ejecutar fuera del anillo 0 solo si CR4.PCE=1
.RDPMC
instrucción no está presente en los procesadores VIA anteriores al Nano.CMOVcc
0F 4x /r
CMOVcc
con un tamaño de operando de 32 bits se borrarán los 32 bits superiores del registro de destino incluso si la condición es falsa. CMOVcc
de un operando de origen de memoria, la CPU siempre leerá el operando de la memoria (lo que puede provocar excepciones de memoria y rellenos de línea de caché) incluso si no se cumple la condición para el movimiento. (La extensión Intel APX define un conjunto de nuevas variantes codificadas con EVEXCMOVcc
que suprimirán las excepciones de memoria si la condición es falsa).reg,reg
pero no reg,[mem]
de las CMOVcc
instrucciones están presentes como instrucciones no documentadas. [53]Para los casos en los que es necesario utilizar más de 9 bytes de relleno NOP, se recomienda utilizar varios NOP.
0F 1F /0
El NOP largo se introdujo en Pentium Pro, pero permaneció sin documentar hasta 2006. [56]
Todo el 0F 18..1F
rango de códigos de operación estaba NOP
en Pentium Pro. Sin embargo, a excepción de 0F 1F /0
, Intel no garantiza que estos códigos de operación permanecerán NOP
en procesadores futuros, y de hecho ha asignado algunos de estos códigos de operación a otras instrucciones en al menos algunos procesadores. [57]0F 0B
código de operación se reservó oficialmente como un código de operación no válido desde Pentium en adelante, solo se le asignó el mnemónico UD2
desde Pentium Pro en adelante. [60]UD2A
y UD2B
para los códigos 0F 0B
de 0F B9
operación y desde la versión 2.7. [61]UD2A
ni UD2B
originalmente tomaban ningún argumento; UD2B
luego se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [62]UD2
( 0F 0B
) también impedirá que los bytes subsiguientes se decodifiquen como instrucciones, incluso de manera especulativa. Por este motivo, si una instrucción de bifurcación indirecta va seguida de algo que no es código, se recomienda colocar una UD2
instrucción después de la bifurcación indirecta. [63]0F 0B
, 0F B9
y 0F FF
- provocarán una excepción #UD en todos los procesadores x86 desde el 80186 en adelante (excepto los procesadores NEC de la serie V ), pero no se reservaron explícitamente para este propósito hasta los procesadores de clase P5.0F B9
código de operación se reservó oficialmente como un código de operación no válido desde Pentium en adelante, recién se le asignó su mnemónico UD1
mucho más tarde: AMD APM comenzó a incluirse UD1
en sus mapas de códigos de operación desde la rev 3.17 en adelante, [65] mientras que Intel SDM comenzó a incluirlo desde la rev 061 en adelante. [66]0F B9
operación como para 0F FF
los códigos de operación, las diferentes implementaciones x86 difieren en cuanto a si los códigos de operación aceptan un byte ModR/M . [67] [68]0F FF
código de operación, el OIO
mnemónico fue introducido por Cyrix, [69] mientras que el UD0
menmonic (sin argumentos) fue introducido por AMD e Intel al mismo tiempo que el UD1
mnemónico para 0F B9
. [65] [66] La documentación posterior de Intel (pero no AMD) modificó su descripción de UD0
para agregar un byte ModR/M y tomar dos argumentos. [70]SYSCALL
/ SYSRET
estaban disponibles en el Modelo 7 ("Little Foot" de 250 nm) y posteriores, pero no en el anterior Modelo 6. [72]SYSCALL
y SYSRET
se convirtieron en parte integral de x86-64; como resultado, las instrucciones están disponibles en modo de 64 bits en todos los procesadores x86-64 de AMD, Intel, VIA y Zhaoxin. SYSRET
difiere levemente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas hacen que se lance una excepción #GP en el anillo 3 en las CPU AMD, pero en el anillo 0 en las CPU Intel. Se sabe que esto causa problemas de seguridad. [73]SYSRET
y SYSEXIT
en x86-64, es necesario agregar el REX.W
prefijo para las variantes que volverán al código de modo de usuario de 64 bits. REX.W
prefijo se utilizan para volver al código de modo de usuario de 32 bits. (Ninguna de estas instrucciones se puede utilizar para volver al código de modo de usuario de 16 bits).SYSRET
, SYSENTER
y SYSEXIT
no están disponibles en el modo Real . ( SYSENTER
Sin embargo, están disponibles en el modo Virtual 8086 .)CPUID
banderas que indican soporte para SYSENTER
/ SYSEXIT
están establecidas en el Pentium Pro, aunque el procesador no admita oficialmente estas instrucciones. [74]SYSENTER
y SYSEXIT
no están disponibles en el modo largo x86-64 (#UD).SYSENTER
y SYSEXIT
solo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [77]SYSENTER
y SYSEXIT
están disponibles sólo en el paso 8 y posteriores. [78]Estas instrucciones sólo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:
MOVSXD
reemplazo ARPL
)SWAPGS
)JRCXZ
)La mayoría de las instrucciones con un tamaño de operando de 64 bits lo codifican mediante un REX.W
prefijo; en ausencia del REX.W
prefijo, se codifica la instrucción correspondiente con un tamaño de operando de 32 bits. Este mecanismo también se aplica a la mayoría de las demás instrucciones con un tamaño de operando de 32 bits. Estas no se incluyen aquí porque no obtienen un nuevo mnemónico en la sintaxis de Intel cuando se utilizan con un tamaño de operando de 64 bits.
CMPXCHG16B
debe estar alineado con 16 bytes.CMPXCHG16B
instrucción no estaba presente en algunos de los primeros procesadores Intel/AMD x86-64. En los procesadores Intel, la instrucción no estaba presente en el paso D de Xeon "Nocona" , [79] pero se agregó en el paso E. [80] En los procesadores de la familia AMD K8 , se agregó en el paso F, al mismo tiempo que se introdujo el soporte para DDR2. [81]CMPXCHG16B
tiene su propio indicador CPUID, separado del resto de x86-64.MOVSXD
MOV
8B /r
Instrucciones de manipulación de bits. Para todas las instrucciones codificadas en VEX definidas por BMI1 y BMI2, el tamaño del operando puede ser de 32 o 64 bits, controlados por el bit VEX.W; ninguna de estas instrucciones está disponible en variantes de 16 bits.
POPCNT
y LZCNT
. Sin embargo, en las CPU Intel, el bit CPUID para "ABM" solo está documentado para indicar la presencia de la LZCNT
instrucción y aparece como "LZCNT", mientras que POPCNT
tiene su propio bit de función CPUID independiente. POPCNT
y configuran el bit de función CPUID para POPCNT, por lo que la distinción es solo teórica. POPCNT
ABM pero no lo admiten, como Intel Nehalem y VIA Nano 3000).LZCNT
instrucción se ejecutará como BSR
en los sistemas que no admiten las extensiones LZCNT o ABM. BSR
Calcula el índice del bit establecido más alto en el operando de origen, lo que produce un resultado diferente LZCNT
para la mayoría de los valores de entrada.TZCNT
instrucción se ejecutará como BSF
en los sistemas que no admiten la extensión BMI1. BSF
produce el mismo resultado que TZCNT
para todos los valores de operandos de entrada excepto cero, para el cual TZCNT
devuelve el tamaño del operando de entrada, pero BSF
produce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas).BEXTR
, la posición inicial y la longitud no están enmascaradas y pueden tomar valores de 0 a 255. Si los bits seleccionados se extienden más allá del final del r/m
argumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits en exceso se leen como 0.PEXT
y PDEP
son bastante lentas [83] y presentan una temporización dependiente de los datos debido al uso de una implementación microcodificada (alrededor de 18 a 300 ciclos, dependiendo de la cantidad de bits establecidos en el argumento de máscara). Como resultado, a menudo es más rápido usar otras secuencias de instrucciones en estos procesadores. [84] [85]Intel CET (Control-Flow Enforcement Technology) agrega dos características distintivas para ayudar a proteger contra vulnerabilidades de seguridad como la programación orientada al retorno : una pila de sombra (CET_SS) y seguimiento de rama indirecta (CET_IBT).
RDSSPD
y RDSSPQ
actúan como NOP en procesadores donde las pilas de sombra están deshabilitadas o no se admite CET.ENDBR32
y ENDBR64
actúan como NOP en procesadores que no admiten CET_IBT o donde IBT está deshabilitado.Las extensiones del conjunto de instrucciones XSAVE están diseñadas para guardar o restaurar el estado extendido de la CPU (normalmente con el fin de cambiar de contexto ) de una manera que se pueda ampliar para cubrir nuevas extensiones del conjunto de instrucciones sin que el código de cambio de contexto del SO necesite comprender los detalles de las nuevas extensiones. Esto se hace definiendo una serie de componentes de estado , cada uno con un tamaño y un desplazamiento dentro de un área de almacenamiento determinada, y cada uno correspondiente a un subconjunto del estado necesario para una extensión de la CPU u otra. La hoja EAX=0Dh
CPUID se utiliza para proporcionar información sobre qué componentes de estado admite la CPU y cuáles son sus tamaños/desplazamientos, de modo que el SO pueda reservar la cantidad adecuada de espacio y establecer los bits de habilitación asociados.
XSAVE*
y XRSTOR*
no se pueden codificar con el prefijo REX2.XGETBV
se permite ejecutar con ECX=1; esto no retornará XCR1
(no existe dicho registro), sino que retornará XCR0
con AND bit a bit el valor actual del mapa de bits del componente de estado "XINUSE" (un mapa de bits de los componentes de estado XSAVE que no se sabe que estén en su estado inicial). XGETBV
se indica mediante CPUID .(EAX=0Dh,ECX=1):EAX[bit 2].XSETBV
instrucción provocará un #VMEXIT obligatorio si se ejecuta bajo la virtualización Intel VT-x .PREFETCH*
instrucciones son instrucciones de sugerencia que solo afectan al rendimiento, no a la semántica del programa. Si se proporciona una dirección no válida (por ejemplo, la dirección de una página no asignada o una dirección no canónica), la instrucción actuará como una NOP sin generar excepciones.SFENCE
, LFENCE
y MFENCE
, se ignoran los 3 bits inferiores del byte ModR/M, y cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida.SFENCE
instrucción garantiza que todos los almacenamientos de memoria después de la SFENCE
instrucción se hagan observables globalmente después de todos los almacenamientos de memoria antes de SFENCE
. Esto impone un ordenamiento en los almacenamientos que de otro modo se pueden reordenar, como los almacenamientos no temporales y los almacenamientos en regiones de memoria WC (Write-Combining). [90]SFENCE
también actúa como una barrera de reordenamiento en los vaciados/escrituras de caché realizados con las instrucciones CLFLUSH
, CLFLUSHOPT
y CLWB
. (Las CPU AMD más antiguas requieren MFENCE
ordenar CLFLUSH
.) SFENCE
no está ordenado con respecto a LFENCE
, y una SFENCE+LFENCE
secuencia no es suficiente para evitar que una carga se reordene más allá de un almacenamiento anterior. [91] Para evitar dicho reordenamiento, es necesario ejecutar una MFENCE
, LOCK
o una instrucción de serialización.LFENCE
instrucción asegura que todas las cargas de memoria después de la LFENCE
instrucción se hagan observables globalmente después de todas las cargas de memoria antes de la LFENCE
. LFENCE
instrucción proporciona una garantía de ordenación más fuerte: [92] es dispatch-serializing , lo que significa que las instrucciones después de la LFENCE
instrucción pueden comenzar a ejecutarse solo después de que todas las instrucciones anteriores se hayan retirado (lo que garantizará que todas las cargas anteriores, pero no necesariamente los almacenamientos, se hayan completado). El efecto de la dispatch-serializing es que LFENCE
también actúa como una barrera de especulación y una barrera de reordenamiento para los accesos a recursos que no son de memoria, como los contadores de rendimiento (a los que se accede mediante eg RDTSC
o RDPMC
) y los MSR x2apic . LFENCE
no es necesariamente dispatch-serializing de forma predeterminada; sin embargo, en todas las CPU AMD que admiten cualquier forma de no-dispatch-serializing LFENCE
, se puede hacer que dispatch-serializing configure el bit 1 de MSR C001_1029
. [93]MFENCE
instrucción garantiza que todas las cargas de memoria, los almacenamientos y los vaciados de la línea de caché después de la MFENCE
instrucción se hagan observables globalmente después de todas las cargas de memoria, los almacenamientos y los vaciados de la línea de caché antes de MFENCE
. MFENCE
se serializa mediante despacho y, por lo tanto, no se puede usar por sí solo para hacer cumplir el orden en los accesos a recursos que no son de memoria, como los contadores de rendimiento y los MSR x2apic. todavía se ordena con respecto a , por lo que si es necesario hacer cumplir el orden entre los almacenamientos de memoria y los accesos posteriores que no son de memoria, dicho orden se puede obtener emitiendo un seguido de un . [48] [94] En las CPU AMD, se serializa.MFENCE
LFENCE
MFENCE
LFENCE
MFENCE
PAUSE
instrucción en modo de 64 bits, a diferencia de NOP
, no se ve afectado por la presencia del REX.R
prefijo. Ni , NOP
ni , PAUSE
se ven afectados por los otros bits del REX
prefijo. Algunos ejemplos de códigos de operación 90
con varios prefijos en modo de 64 bits son:90
esNOP
41 90
esXCHG R8D,EAX
4E 90
esNOP
49 90
esXCHG R8,RAX
F3 90
esPAUSE
F3 41 90
esPAUSE
F3 4F 90
esPAUSE
PAUSE
instrucción depende de la implementación. PAUSE
se ejecutará como NOP.PAUSE
repetida en un intervalo de tiempo breve puede provocar un error #VMEXIT. La cantidad de PAUSE
ejecuciones y la duración del intervalo que pueden provocar un error #VMEXIT dependen de cada plataforma.CLFLUSH
instrucción se introdujo junto con SSE2, tiene su propio indicador CPUID y puede estar presente en procesadores que no implementan SSE2 o estar ausente en procesadores que sí implementan SSE2. (Por ejemplo, AMD Geode LX admite CLFLUSH
SSE2 pero no lo hace).MONITOR
y MWAIT
se introdujeron al mismo tiempo que SSE3, tienen su propio indicador CPUID que debe verificarse por separado del indicador CPUID de SSE3 (por ejemplo, Athlon 64 X2 y VIA C7 admitían SSE3 pero no MONITOR).MONITOR
y MWAIT
, la documentación antigua de Intel [95] enumera mnemónicos de instrucciones con operandos explícitos ( MONITOR EAX,ECX,EDX
y MWAIT EAX,ECX
), mientras que la documentación más reciente omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas de estas variantes. [96] MONITOR
, el segmento DS: se puede reemplazar con un prefijo de segmento. MONITOR
instrucción. Por lo tanto, la instrucción requiere ECX=0 e ignora EDX.MONITOR
y MWAIT
ejecutar en Ring 3.MWAIT
puede finalizar por eventos del sistema distintos a una escritura en la memoria (por ejemplo, desalojos de la línea de caché, interrupciones); el conjunto exacto de eventos que pueden hacer que finalice la espera es específico de la implementación. MONITOR
antes de volver a usarla MWAIT
para esperar a que se realicen escrituras en la memoria.MWAIT
el registro ECX son:MWAIT
el registro EAX son:Los estados C son estados de energía específicos del procesador, que no necesariamente corresponden 1:1 a los estados C de ACPI .
GETSEC
instrucción, el REX.W
prefijo habilita direcciones de 64 bits solo para la función de hoja EXITAC; de lo contrario, los prefijos REX están permitidos, pero se ignoran para la instrucción.GETSEC
(seleccionadas por EAX) son:Cualquier valor no admitido en EAX provoca una excepción #UD.
GETSEC
, la mayoría de las funciones de hoja están restringidas al Anillo 0, pero las funciones de hoja CAPACIDADES (EAX=0) y PARÁMETROS (EAX=6) están disponibles en el Anillo 3.RDTSCP
y RDPID
es en realidad el TSC_AUX
MSR (MSR C000_0103h
). Si este valor corresponde realmente a una identificación de procesador es una cuestión de convención del sistema operativo.RDTSC
instrucción anterior, RDTSCP
retrasará la lectura de TSC hasta que todas las instrucciones anteriores se hayan retirado, lo que garantiza el orden con respecto a las cargas de memoria anteriores (pero no a los almacenamientos). RDTSCP
Sin embargo, no está ordenado con respecto a las instrucciones posteriores.RDTSCP
se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0
.RDTSCP
en el paso F del AMD K8, y no está disponible en pasos anteriores.POPCNT
instrucción se introdujo al mismo tiempo que SSE4.2, no se considera parte de SSE4.2, sino una extensión independiente con su propio indicador CPUID. INVPCID
(seleccionados por el argumento de registro) son:Cualquier valor no admitido en el argumento de registro provoca una excepción #GP.
INVLPG
instrucción anterior, INVPCID
provocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [102]PREFETCH
y PREFETCHW
son partes obligatorias de la extensión del conjunto de instrucciones 3DNow!, pero también están disponibles como una extensión independiente en sistemas que no admiten 3DNow!PREFETCH
y PREFETCHW
( 0F 0D /r
) se ejecutan como NOP en las CPU Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante, con PREFETCHW
funcionalidad de precarga desde Broadwell en adelante.PREFETCH
( 0F 0D /0
) es una instrucción 3DNow!,0F 0D /0
como los códigos de operación 0F 0D /2../7
realizan prefetch. 0F 0D /2
Xeon Phi únicamente); pruebas de terceros [104] indican que algunos o todos estos códigos de operación pueden realizar prefetch en al menos algunas CPU Intel Core.PREFETCHWT1 m8
RDTSCP
, que también se puede utilizar para leer el ID del procesador, el modo de usuario RDPID
no se deshabilita mediante CR4.TSD=1
.MOVDIR64
, la dirección de destino dada por ES:reg debe estar alineada a 64 bytes. 67h
prefijo. WBNOINVD
instrucción se ejecutará como WBINVD
si se ejecutara en un sistema que no admite la extensión WBNOINVD. WBINVD
Se diferencia de WBNOINVD
en que WBINVD
invalidará todas las líneas de caché después de la escritura diferida.HWNT
and HST
are listed in early Willamette documentation only[106] - later Intel documentation lists the branch hint prefixes without assigning them a mnemonic.[107]2E
and 3E
prefixes are interpreted as branch hints only when used with the Jcc
conditional branch instructions (opcodes 70..7F
and 0F 80..8F
) - when used with other opcodes, they may take other meanings (e.g. for instructions with memory operands outside 64-bit mode, they will work as segment-override prefixes CS:
and DS:
, respectively). On processors that don't support branch hints, these prefixes are accepted but ignored when used with Jcc
.ENCLS
(selected by EAX) are:Any unsupported value in EAX causes a #GP exception.
ENCLU
(selected by EAX) are:Any unsupported value in EAX causes a #GP exception.
The EENTER and ERESUME functions cannot be executed inside an SGX enclave – the other functions can only be executed inside an enclave.
ENCLU
can only be executed in ring 3, not rings 0/1/2.ENCLV
(selected by EAX) are:Any unsupported value in EAX causes a #GP exception.
The ENCLV
instruction is only present on systems that support the EPC Oversubscription Extensions to SGX ("OVERSUB").
ENCLV
is only available if Intel VMX operation is enabled with VMXON
, and will produce #UD otherwise.PTWRITE
, the write to the Processor Trace Packet will only happen if a set of enable-bits (the "TriggerEn", "ContextEn", "FilterEn" bits of the RTIT_STATUS
MSR and the "PTWEn" bit of the RTIT_CTL
MSR) are all set to 1.PTWRITE
instruction is indicated in the SDM to cause an #UD exception if the 66h instruction prefix is used, regardless of other prefixes.PCONFIG
(selected by EAX) are:Any unsupported value in EAX causes a #GP(0) exception.
CLDEMOTE
, the cache level that it will demote a cache line to is implementation-dependent.UMONITOR
, the operand size of the address argument is given by the address size, which may be overridden by the 67h
prefix. The default segment used is DS:, which can be overridden with a segment prefix.UMWAIT
and TPAUSE
instructions, the operating system can use the IA32_UMWAIT_CONTROL
MSR to limit the maximum amount of time that a single UMWAIT
/TPAUSE
invocation is permitted to wait. The UMWAIT
and TPAUSE
instructions will set RFLAGS.CF
to 1 if they reached the IA32_UMWAIT_CONTROL
-defined time limit and 0 otherwise.TPAUSE
and UMWAIT
can be run outside Ring 0 only if CR4.TSD=0
.UMWAIT
and TPAUSE
instructions, the following flag bits are supported:CPUID
and IRET
, these instructions perform additional functions, causing side-effects and reduced performance when stand-alone instruction serialization is needed. (CPUID
additionally has the issue that it causes a mandatory #VMEXIT when executed under virtualization, which causes a very large overhead.) The SERIALIZE
instruction performs serialization only, avoiding these added costs.HRESET
is provided by CPUID.(EAX=20h,ECX=0):EBX.SENDUIPI
is an index to pick an entry from the UITT (User-Interrupt Target Table, a table specified by the new UINTR_TT
and UINT_MISC
MSRs.)UIRET
instruction always sets UIF (User Interrupt Flag) to 1. On Sierra Forest and later processors, UIRET
will set UIF to the value of bit 1 of the value popped off the stack for RFLAGS - this functionality is indicated by CPUID.(EAX=7,ECX=1):EDX[17]
.CMPccXADD
instructions (opcode VEX.128.66.0F38 Ex /r
with the x nibble specifying the condition) are:CMPccXADD
instructions perform a locked memory operation, they do not require or accept the LOCK
(F0h
) prefix - attempting to use this prefix results in #UD.PREFETCHIT0
and PREFETCHIT1
instructions will perform code prefetch only when using the RIP-relative addressing mode and act as NOPs otherwise.REX.R
prefix, e.g. 44 0F 20 07
(MOV RDI,CR8
). However, the REX.R
prefix is only available in 64-bit mode.F0
(LOCK
) prefix instead of REX.R
– this provides access to CR8 outside 64-bit mode.11b
.LOCK
prefix with the REX.R
prefix is not permitted and will cause an #UD exception.CLZERO
, the address size and 67h prefix control whether to use AX, EAX or RAX as address. The default segment DS: can be overridden by a segment-override prefix. The provided address does not need to be aligned – hardware will align it as necessary.CLZERO
instruction is intended for recovery from otherwise-fatal Machine Check errors. It is non-cacheable, cannot be used to allocate a cache line without a memory access, and should not be used for fast memory clears.[117]RDPRU
does not necessarily match that of RDMSR
/WRMSR
.RDPRU
as of December 2022 are:Unsupported values in ECX return 0.
CR4.TSD=1
, then the RDPRU
instruction can only run in ring 0.The x87 coprocessor, if present, provides support for floating-point arithmetic. The coprocessor provides eight data registers, each holding one 80-bit floating-point value (1 sign bit, 15 exponent bits, 64 mantissa bits) – these registers are organized as a stack, with the top-of-stack register referred to as "st" or "st(0)", and the other registers referred to as st(1),st(2),...st(7). It additionally provides a number of control and status registers, including "PC" (precision control, to control whether floating-point operations should be rounded to 24, 53 or 64 mantissa bits) and "RC" (rounding control, to pick rounding-mode: round-to-zero, round-to-positive-infinity, round-to-negative-infinity, round-to-nearest-even) and a 4-bit condition code register "CC", whose four bits are individually referred to as C0,C1,C2 and C3). Not all of the arithmetic instructions provided by x87 obey PC and RC.
WAIT
instruction is executed.FN
, there exists a pseudo-instruction that has the same mnemonic except without the N. These pseudo-instructions consist of a WAIT
instruction (opcode 9B
) followed by the corresponding non-waiting x87 instruction. For example:FNCLEX
is an instruction with the opcode DB E2
. The corresponding pseudo-instruction FCLEX
is then encoded as 9B DB E2
.FNSAVE ES:[BX+6]
is an instruction with the opcode 26 DD 77 06
. The corresponding pseudo-instruction FSAVE ES:[BX+6]
is then encoded as 9B 26 DD 77 06
FLDENV
, F(N)STENV
, FRSTOR
and F(N)SAVE
exist in 16-bit and 32-bit variants. The 16-bit variants will load/store a 14-byte floating-point environment data structure to/from memory – the 32-bit variants will load/store a 28-byte data structure instead. (F(N)SAVE
/FRSTOR
will additionally load/store an additional 80 bytes of FPU data register content after the FPU environment, for a total of 94 or 108 bytes). The choice between the 16-bit and 32-bit variants is based on the CS.D
bit and the presence of the 66h
instruction prefix. On 8087 and 80287, only the 16-bit variants are available.REX.W
under x86-64 will cause the 32-bit variants to be used. Since these can only load/store the bottom 32 bits of FIP and FDP, it is recommended to use FXSAVE64
/FXRSTOR64
instead if 64-bit operation is desired.F(N)DISI
and F(N)ENI
instructions to set/clear the Interrupt Mask bit (bit 7) of the x87 Control Word,[120] to control the interrupt.F(N)ENI
and F(N)DISI
instructions were kept for backwards compatibility, executing as NOPs that do not modify any x87 state.FST
/FSTP
with an 80-bit destination (m80 or st(i)) and an sNaN source value will produce exceptions on AMD but not Intel FPUs.FSTP ST(0)
is a commonly used idiom for popping a single register off the x87 register stack.FBSTP
and the load-constant instructions always use the round-to-nearest rounding mode. On the 80387 and later x87 FPUs, these instructions will use the rounding mode specified in the x87 RC register.FADDP
, FSUBP
, FSUBRP
, FMULP
, FDIVP
, FDIVRP
, FCOM
, FCOMP
and FXCH
instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.FXCH
is implemented as a register renaming rather than a true data move. This has no semantic effect, but enables zero-cycle-latency operation. It also allows the instruction to break data dependencies for the x87 top-of-stack value, improving attainable performance for code optimized for these processors.FBLD
instruction on non-BCD data is undefined.FPREM
and FPATAN
.[127]FXAM
instruction will set C0, C2 and C3 based on value type in st(0) as follows:C1 is set to the sign-bit of st(0), regardless of whether st(0) is Empty or not.
FXTRACT
, if st(0) is zero or ±∞, then M is set equal to st(0). If st(0) is zero, E is set to 0 on 8087/80287 but -∞ on 80387 and later. If st(0) is ±∞, then E is set to +∞.FPREM
, if the quotient Q is larger than , then the remainder calculation may have been done only partially – in this case, the FPREM
instruction will need to be run again in order to complete the remainder calculation. This is indicated by the instruction setting C2
to 1.C2
to 0 and set the three bits {C0,C3,C1}
to the bottom three bits of the quotient Q.FPREM
instruction is always exact with no roundoff errors.FSCALE
instruction on 8087 and 80287, st(1) is required to be in the range . Also, its absolute value must be either 0 or at least 1. If these requirements are not satisfied, the result is undefined.FSCALE
, rounding is only applied in the case of overflow, underflow or subnormal result.FYL2X
and FYL2XP1
instructions, the maximum error bound of ±1 ulp only holds for st(1)=1.0 – for other values of st(1), the error bound is increased to ±1.35 ulps.FPATAN
, the following adjustments are done as compared to just computing a one-argument arctangent of the ratio :FNOP
is a no-op in the sense that will leave the x87 FPU register stack unmodified, it may still modify FIP and CC, and it may fault if a pending x87 FPU exception is present.F(N)SAVE
, FRSTOR
, FLDENV
and F(N)STENV
instructions has different formats in Real Mode and Protected Mode. On 80287, the F(N)SETPM
instruction is required to communicate the real-to-protected mode transition to the FPU. On 80387 and later x87 FPUs, real↔protected mode transitions are communicated automatically to the FPU without the need for any dedicated instructions – therefore, on these FPUs, FNSETPM
executes as a NOP that does not modify any FPU state.FUCOM
and FUCOMP
instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.FPREM1
instruction differs from the older FPREM
(D9 F8
) instruction in that the quotient Q is rounded to integer with round-to-nearest-even rounding rather than the round-to-zero rounding used by FPREM
. Like FPREM
, FPREM1
always computes an exact result with no roundoff errors. Like FPREM
, it may also perform a partial computation if the quotient is too large, in which case it must be run again.FSIN
, FCOS
and FSINCOS
is not precisely 1.0, but instead given by[128][129]This argument reduction inaccuracy also affects the FPTAN
instruction.FCOMI
, FCOMIP
, FUCOMI
and FUCOMIP
instructions write their results to the ZF
, CF
and PF
bits of the EFLAGS
register. On Intel but not AMD processors, the SF
, AF
and OF
bits of EFLAGS
are also zeroed out by these instructions.FXSAVE
and FXRSTOR
instructions were added in the "Deschutes" revision of Pentium II, and are not present in earlier "Klamath" revision.FXSAVE
and FXRSTOR
instructions will save/restore SSE state only on processors that support SSE. Otherwise, they will only save/restore x87 and MMX state.FXSAVE
/FXRSTOR
has a completely different layout than the data structure of the older F(N)SAVE
/FRSTOR
instructions, enabling faster save/restore by avoiding misaligned loads and stores.CR0.EM=1
, FXSAVE(64)
and FXRSTOR(64)
are considered to be x87 instructions and will accordingly produce an #NM (device-not-available) exception. Other than WAIT
, these are the only opcodes outside the D8..DF
ESC opcode space that exhibit this behavior. (All opcodes in D8..DF
will produce #NM if CR0.EM=1
, even for undefined opcodes that would produce #UD otherwise.)F(N)SAVE
instruction, FXSAVE
will not initialize the FPU after saving its state to memory, but instead leave the x87 coprocessor state unmodified.x86 also includes discontinued instruction sets which are no longer supported by Intel and AMD, and undocumented instructions which execute but are not officially documented.
INT1
on page 86.The instruction brings down the upper word of the doubleword register without affecting its upper 16 bits.
internal (zero-)extending the value of a smaller (16-bit) register … applying the bswap to a 32-bit value "00 00 AH AL", … truncated to lower 16-bits, which are "00 00". … Bochs … bswap reg16 acts just like the bswap reg32 … QEMU … ignores the 66h prefix
CMPXCHG
with 0F A6/A7
encodings.CMPXCHG
with 0F B0/B1
encodings.CPUID
instruction)RDTSC
instruction on p.1739 describes the instruction sequences required to order the RDTSC
instruction with respect to earlier and later instructions.UD2A
and UD2B
instruction mnemomics to GNU Binutils. Archived on 25 Jul 2023.UD1
/UD2B
and added UD0
. Archived on 25 Jul 2023.0F 0B
and 0F B9
.UD0
and page 415 and 419 for UD1
.UD1
(with ModR/M byte) and UD0
(without ModR/M byte) on page 4-687.OIO
("Official invalid opcode") for the 0F FF
opcode.UD0
(with ModR/M byte) on page 4-683.0F FF
opcode without assigning it a mnemonic.MFENCE;LFENCE
sequence to enforce ordering between a memory store and a later x2apic MSR write. Archived on 4 Jul 2024MONITOR
and MWAIT
with explicit operands. Archived on 9 May 2005.MONITOR
/MWAIT
mnemonics. Archived on 6 Nov 2022.HWNT
/HST
mnemonics for the branch hint prefixes. Archived from the original on 5 Feb 2005.FSIN
, FCOS
, FSINCOS
and FPTAN
in volume 1, section 8.3.8