El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Estas instrucciones suelen formar parte de un programa ejecutable , que a menudo se almacena como un archivo informático 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 ]
Instrucciones enteras x86
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, en el que operan sobre registros ( eax , ebx , etc.) y valores de 32 bits en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado se agrupa según la arquitectura ( i186 , i286 , i386 , i486 , i586 / i686 ) y se denomina (32 bits) x86 y (64 bits) x86-64 (también conocido como AMD64 ).
Instrucciones originales 8086/8088
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).
Añadido en procesadores específicos
Nuevas instrucciones y formatos de instrucciones añadidos en los procesadores Intel 80186 y 80188. También presentes en los procesadores NEC V20 /V30 y sus sucesores.
- ↑ Los anillos de protección se aplican a los modelos 80286 y posteriores, no al 80186.
- 1 2 3 En modo de 64 bits, las
PUSHA,POPAyBOUNDno están disponibles; losPUSHAyPOPAcausarán #UD, y elBOUNDcódigo de operación (62) se reutiliza para el prefijo EVEX . - ↑ En algunos procesadores, incluidas algunas variantes del 80186, el uso de prefijos de repetición con la
BOUNDinstrucción modificará su funcionamiento para comparar únicamente el límite inferior. [ 4 ] Por esta razón, se deben evitar los prefijos de repetición para esta instrucción. - ↑ En los procesadores Intel 80186/80188 y NEC de la serie V, un fallo en la comprobación de límites provocará que #BR se emita como una excepción de tipo trap (el valor de CS:IP almacenado en la pila apunta a la instrucción que sigue a la
BOUNDinstrucción), [ 5 ] mientras que en los procesadores 80286 y posteriores, se emite como una excepción de tipo fault (el valor de CS:IP almacenado en la pila es el de laBOUNDpropia instrucción). [ 6 ] - ↑ El
IIMULmnemónico " " para la instrucción de multiplicación inmediata 80186 se usa a veces en la documentación de IBM PC, [ 7 ] pero no se usa comúnmente en otros lugares. - 1 2 3 4 El
REP(F3) se puede usar con lasINSB/INSW/OUTSB/OUTSW. Al hacerlo, la instrucción se repetirá el número de veces especificado en rCX. (Si se establece rCX en 0, no habrá repeticiones, es decir, las instrucciones actuarán como NOPs). - 1 2 En los procesadores 80286 y posteriores, las
INSB/INSWpueden realizar comprobaciones de derechos de acceso a su almacenamiento de memoria después de la lectura del puerto de E/S. Si alguna de estas comprobaciones falla (por ejemplo, error de segmentación o error de página), el dato leído del puerto de E/S se pierde. Por este motivo, no se recomienda utilizar lasINSB/INSWpara leer un puerto de E/S que tenga efectos secundarios durante la lectura. - ↑ El acceso al puerto de E/S solo está permitido cuando CPL≤IOPL , o (en 80386 y posteriores) los bits del mapa de bits de permisos del puerto de E/S para el puerto al que se accede están todos establecidos en 0.
- 1 2 3 4 5 6 7 Para las instrucciones ROL/ROR/RCL/RCR/SHL/SHR/SAR,
C0se utiliza el código de operación para las variantes de byte y el código de operaciónC1para las variantes de palabra.Para lasC0inmediatasC1de las instrucciones shift/rotate, solo se utilizan los 5 bits inferiores del inmediato (6 bits para el código de operaciónC1si está codificado con un operando de 64 bits en x86-64). - ↑ En el 80186 y posteriores, el subcódigo de operación /6 para los códigos de operación de cambio
C0/C1/D0/D1/D2/D3actúa como un alias (a menudo mal documentado) del subcódigo de operación /4; todas estas son variantes de laSHLinstrucción. - ↑ El primer argumento de la
ENTERinstrucción es siempre un valor inmediato sin signo de 16 bits, independientemente de OperandSize.El segundo argumento
ENTERes un valor inmediato de 8 bits: en los procesadores 80186/80188 y NEC de la serie V, se utilizan los 8 bits, [ 5 ] pero los procesadores 80286 y posteriores utilizan solo los 5 bits inferiores. [ 6 ] - ↑ En los procesadores más recientes, la
ENTERinstrucción, después de configurar el marco de pila, comprobará si la ubicación del byte a la que apunta el nuevo valor de SS:rSP es escribible; si no lo es, generará la misma excepción (por ejemplo, fallo de página) que habría causado una escritura en esa dirección. [ 8 ]
Añadido con 80286
Las nuevas instrucciones añadidas en el estándar 80286 brindan soporte para el modo protegido x86 . Algunas de las instrucciones, pero no todas, también están disponibles en modo real .
- 1 2 3 4 Los descriptores utilizados por las
LGDT,LIDT,SGDTySIDTconstan 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.ParaLGDTyLIDTcon un tamaño de operando de 16 bits, la dirección se combina con 00FFFFFFh mediante AND.En las CPU de Intel (pero no en las de AMD), las
SGDTinstruccionesSIDTcon 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. [ 9 ]En el Intel 80286, el último byte escrito por
SGDT/SIDTsiempre es 0xFF; esto ha sido utilizado por software (por ejemplo, un controlador NDIS NE2000 [ 10 ] y Microsoft Windows 3.0 [ 11 ] ) para detectar si la CPU es un 80286 o no. - 1 2 3 4 Las
LGDT,LIDT,LLDTyLTRse serializan en procesadores Pentium y posteriores. - ↑ La
LMSWinstrucción se serializa en procesadores Intel a partir de Pentium , pero no en procesadores AMD.Cuando
LMSWse utiliza la instrucción para entrar en modo protegido , debe ir seguida inmediatamente de una instrucción de salto para borrar la cola de precarga. [ 12 ] (En el Intel 80286, se ha informado que ejecutar tres instrucciones que no sean de salto inmediatamente después de unaLMSWque entra en modo protegido provoca un reinicio de la CPU). [ 13 ] - ↑ En el 80386 y posteriores, la "Palabra de estado de la máquina" es la misma que el registro de control CR0 ; sin embargo, la
LMSWinstrucció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 queLMSWse puede usar para entrar, pero no para salir del modo protegido x86 .En el 80286, no es posible salir del modo protegido en absoluto (ni conLMSWni conLOADALL[ 14 ] ) sin un reinicio de la CPUMOV; en el 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de la instrucción parael 80386 y posterioresCR0. - ↑ Si
CR4.UMIP=1está configurado, entonces lasSGDT,SIDT,SLDT,SMSWySTRsolo pueden ejecutarse en el Anillo 0.Estas instrucciones no tenían privilegios en todas las CPU x86 desde el 80286 en adelante hasta la introducción de UMIP en 2017. [ 15 ] Esto ha sido un problema de seguridad significativo para la virtualización basada en software, ya que permite que estas instrucciones sean utilizadas por un invitado de VM para detectar que se está ejecutando dentro de una VM. [ 16 ] [ 17 ] - 1 2 3 Las
SMSW,SLDTySTRsiempre usan un tamaño de operando de 16 bits cuando se usan con un argumento de memoria. Con un argumento de registro en procesadores 80386 o posteriores, hay disponibles tamaños de operando de destino más amplios y se comportan de la siguiente manera:SMSW: Almacena el CR0 completo en modo de 64 bits en CPU x86-64; de lo contrario, no está definido.SLDT: Amplía a cero el argumento de 16 bits en procesadores Pentium Pro y posteriores; no está definido en procesadores anteriores.STR: Amplía a cero el argumento de 16 bits.
- ↑ En los procesadores con x86-64, la
ARPLinstrucción no está disponible en modo de 64 bits; elinstrucción63 /rexclusiva del modo de 64 bitsMOVSXD - ↑ La
ARPLinstrucció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 este #UD para usar el63código de operación como un punto de interrupción de un byte para pasar del modo virtual 8086 al modo kernel. [ 18 ] [ 19 ] - ↑ Los bits 19:16 de esta máscara están documentados como "indefinidos" en las CPU Intel. [ 20 ] En las CPU AMD, la máscara está documentada como
0x00FFFF00. - 1 2 Para las
LARyLSL, si no se pudo cargar el descriptor de segmento especificado, entonces el registro de destino de la instrucción se deja sin modificar. - ↑ En algunas combinaciones de CPU/microcódigo Intel a partir de 2019, así como en algunas combinaciones de CPU/microcódigo AMD a partir de 2025, la
VERWinstrucción también vacía varios búferes de datos microarquitectónicos de una manera específica de la implementación. Esto permite que se utilice como parte de soluciones alternativas para vulnerabilidades de seguridad como el muestreo de datos microarquitectónicos y los ataques al planificador transitorio . [ 21 ] [ 22 ] [ 23 ] Algunas de las funciones de vaciado de búferes microarquitectónicos que se han añadidoVERWpueden requerir que la instrucción se ejecute con un operando de memoria. [ 24 ] - 1 2 No documentado, solo 80286. [ 14 ] [ 25 ] [ 26 ] (Existe una variante diferente
LOADALLcon un código de operación y una distribución de memoria diferentes en el 80386).
Añadido con 80386
El microcontrolador 80386 añadió soporte para operaciones de 32 bits al conjunto de instrucciones x86. Esto se logró ampliando los registros de propósito general a 32 bits e introduciendo los conceptos de tamaño de operando y tamaño de dirección . La mayoría de las instrucciones que antes aceptaban argumentos de datos de 16 bits ahora podían aceptar argumentos de 32 bits al establecer su tamaño de operando en 32 bits, y las instrucciones que podían aceptar argumentos de dirección de 16 bits ahora podían aceptar argumentos de dirección de 32 bits al establecer su tamaño de dirección en 32 bits. (Las instrucciones que trabajan con datos de 8 bits siguen siendo de 8 bits independientemente del tamaño de operando. Usar un tamaño de datos de 16 bits solo modificará los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 bits superiores permanecen sin cambios).
El tamaño de operando y el tamaño de dirección predeterminados que se utilizan para cada instrucción vienen dados por el bit D del descriptor de segmento del segmento de código actual: D=0ambos son de 16 bits, D=1ambos son de 32 bits. Además, se pueden anular para 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 siCS.D=0, o de 32 bits a 16 bits siCS.D=1.67h: Anulación de AddressSize. Cambiará AddressSize de 16 bits a 32 bits siCS.D=0, o de 32 bits a 16 bits siCS.D=1.
El 80386 también introdujo los dos nuevos registros de segmento FS, GSasí como los registros de control , depuración y prueba x86 .
The new instructions introduced in the 80386 can broadly be subdivided into two classes:
- Códigos de operación preexistentes que necesitaban nuevos mnemónicos para sus variantes de tamaño de operando de 32 bits (por ejemplo
CWDE, ,LODSD) - Nuevos códigos de operación que introdujeron nueva funcionalidad (por ejemplo
SHLD, ,SETcc)
Para las instrucciones en las que el tamaño del operando se puede inferir a partir de los argumentos de la instrucción (por ejemplo, ADD EAX,EBXse puede inferir que tiene un tamaño de operando de 32 bits debido al uso de EAX como argumento), no se necesitan ni se proporcionan nuevos mnemónicos de instrucción.
- ↑ Para las instrucciones de cadena de 32 bits, la notación ±± se utiliza para indicar que el registro indicado se decrementa en 4 si
EFLAGS.DF=1y se incrementa en 4 en caso contrario.Para los operandos donde se indica el segmento DS, este puede ser sobrescrito por un prefijo de sobrescritura de segmento; donde se indica el segmento ES, este siempre es ES y no puede ser sobrescrito.La elección de si usar los registros SI/DI de 16 bits o los registros ESI/EDI de 32 bits como registros de dirección se realiza mediante AddressSize, que puede ser sobrescrito con el67prefijo. - ↑ Las instrucciones de cadena de 32 bits aceptan prefijos de repetición de la misma manera que las instrucciones de cadena de 8/16 bits más antiguas.Para
LODSD,STOSD,MOVSD,INSDyOUTSD, elREPprefijo (F3) repetirá la instrucción el número de veces especificado 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).ParaCMPSDySCASD, losREPE(F3) yREPNE(F2) están disponibles, que repetirán la instrucción, decrementando rCX para cada iteración, pero solo mientras la condición de bandera (ZF=1 paraREPE, ZF=0 paraREPNE) sea verdadera Y rCX ≠ 0. - ↑ En cuanto a las
INSB/W/Dinstrucciones, es posible que los derechos de acceso a la memoria para laES:[rDI]dirección de memoria no se verifiquen hasta después de que se haya realizado el acceso al puerto. Si esta verificación falla (por ejemplo, debido a un fallo de página u otra excepción de memoria), el dato leído del puerto se pierde. Por lo tanto, no se recomienda usar esta instrucción para acceder a un puerto de E/S que realice algún tipo de efecto secundario al leerlo. - ↑ El acceso al puerto de E/S solo está permitido cuando CPL≤IOPL o los bits del mapa de bits de permisos del puerto de E/S para el puerto al que se accede están todos establecidos en 0.
- ↑ La
CWDEinstrucción difiere de la instrucción anteriorCWDen queCWDextendería el signo del valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX. - ↑ Para el
E3código de operación (JCXZ/JECXZ), la elección de si la instrucción utilizaráCXoECXpara su comparación (y, por consiguiente, qué mnemónico utilizar) se basa en AddressSize, no en OperandSize. (OperandSize controla si el destino del salto debe truncarse a 16 bits o no).Esto también se aplica a las instrucciones de bucleLOOP,LOOPE,LOOPNE(códigos de operaciónE0,E1,E2); sin embargo, a diferencia deJCXZ/JECXZ, a estas instrucciones no se les han asignado nuevos mnemónicos para sus variantes que utilizan ECX. - ↑ Para
PUSHA(D), el valor de SP/ESP que se coloca en la pila es el valor que tenía justo antes de quePUSHA(D)comenzara la ejecución de la instrucción. - ↑ Para
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. - ↑ Las
PUSHFDyPOPFDprovocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3.LasPUSHF,POPF,IRETyIRETDprovocarán una excepción #GP si se ejecutan en modo Virtual-8086 si IOPL no es 3 y VME no está habilitado. - ↑ Si
IRETDse utiliza para regresar 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 laIRETDinstrucción solo restaurará los 16 bits inferiores del puntero de pila (ESP/RSP), y los bits restantes mantendrán el valor que tenían en el código kernel antes deIRETD. Esto ha requerido soluciones alternativas complejas tanto en Linux ("ESPFIX") [ 27 ] como en Windows. [ 28 ] Este problema también afecta a la instrucción posterior de 64 bitsIRETQ.
- 1 2 3 4 Para las
BT,BTS,BTRyBTC:- Si el primer argumento de la instrucción es un operando de registro y/o el segundo argumento es un valor inmediato, entonces el índice de bits del segundo argumento se toma módulo el tamaño del operando (16/32/64, en efecto, utilizando solo los 4, 5 o 6 bits inferiores del índice).
- Si el primer argumento es un operando de memoria y el segundo argumento es un operando de registro, entonces el índice de bit en el segundo argumento se usa por completo; se interpreta como un índice de bit con signo que se usa para desplazar la dirección de memoria que se usará para la prueba de bit.
- 1 2 3 Las
BTS,BTCyBTRaceptan elLOCK(F0) cuando se usan con un argumento de memoria; esto da como resultado que la instrucción se ejecute atómicamente. - ↑ Si
F3se usa el prefijo con el0F BC /rcódigo de operación, la instrucción se ejecutará comoTZCNTen sistemas que admiten la extensión BMI1.TZCNTdifiere deBSFen queTZCNTpero noBSRestá definido para devolver el tamaño del operando si el operando fuente es cero; para otros valores de operando fuente, producen el mismo resultado (excepto para indicadores). - 1 2
BSFyBSRestablece el indicador EFLAGS.ZF en 1 si el argumento de origen era todo ceros y en 0 en caso contrario.Si el argumento de origen era todo ceros, el registro de destino permanece sin cambios en los procesadores AMD. [ 29 ] Por lo general, también permanece sin cambios en los procesadores Intel, pero existen algunas excepciones:
- En algunos procesadores Intel 64 más antiguos, las formas de 32 bits de las instrucciones
BSF/BSRdejarán sin cambios los 32 bits inferiores del registro de destino, pero borrarán los 32 bits superiores. [ 30 ] [ 31 ] - En los procesadores 386/486, se documenta que la instrucción
BSF/BSRcon una fuente de todos ceros devuelve un valor indefinido al registro de destino; la mayoría de las versiones 386/486 dejan el registro de destino sin cambios, pero se sabe que algunas versiones antiguas de Intel 486 lo modifican. [ 32 ]
- En algunos procesadores Intel 64 más antiguos, las formas de 32 bits de las instrucciones
- ↑ Si
F3se usa el prefijo con el0F BD /rcódigo de operación, la instrucción se ejecutará comoLZCNTen sistemas que admiten las extensiones ABM o LZCNT.LZCNTproduce un resultado diferenteBSRpara la mayoría de los valores de entrada. - 1 2 Para
SHLDySHRD, 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.SHLDySHRDcon argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 producen resultados indefinidos. (Los resultados reales difieren entre diferentes CPU Intel, con al menos tres comportamientos diferentes conocidos. [ 33 ] ) - 1 2 Los códigos de condición admitidos para lasinstruccionesyyrespectivamente, donde el nibble x especifica la condición) son:
SETccJcc near0F 9x /00F 8x - ↑ Para
SETcc, mientras que 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 deberían ser 000 – los procesadores x86 modernos (Pentium y posteriores) ignoran los bits 5:3 y ejecutarán la instrucción comoSETccindependientemente del contenido de estos bits. - ↑ Para
LFS,LGSyLSS, el tamaño de la parte de desplazamiento del puntero lejano viene dado por el tamaño del operando; el tamaño de la parte del segmento siempre es de 16 bits. En modo de 64 bits, usar elREX.Wprefijo con estas instrucciones hará que carguen un puntero lejano con un desplazamiento de 64 bits en procesadores Intel, pero no en AMD. - 1 2 3 4 5 6 Para
MOVhacia/desde losCRx,DRxyTRx, la parte reg del byte ModR/M se utiliza para indicarCRx/DRx/TRxel registro y la parte r/m el registro general. Únicamente para losMOV CRx/DRx/TRxcódigos de operación, los dos bits superiores del byte ModR/M se ignoran; estos códigos de operación se decodifican y ejecutan como si los dos bits superiores del byte ModR/M fueran11b. - 1 2 3 4 Para movimientos hacia/desde los
CRxyDRx, el tamaño del operando siempre es de 64 bits en modo de 64 bits y de 32 bits en caso contrario. - ↑ En los procesadores que admiten páginas globales (Pentium y posteriores), las entradas de la tabla de páginas globales no se vaciarán mediante un cambio
MOVaCR3− en su lugar, estas entradas se pueden vaciar alternando el bit CR4.PGE.En los procesadores que admiten PCID , escribir en
CR3mientras los PCID están habilitados solo vaciará las entradas TLB pertenecientes al PCID especificado en los bits 11:0 del valor escrito enCR3. El vaciado de páginas pertenecientes a otros PCID se puede realizar alternando el bit CR4.PGE, borrando el bit CR4.PCIDE o utilizando laINVPCIDinstrucción.En el modo de 64 bits, el vaciado de la TLB se puede suprimir configurando el bit 63 del valor escrito a
CR31. - ↑ En procesadores anteriores a Pentium , los movimientos a
CR0no serializaban el flujo de instrucciones; por esta razón, generalmente se requiere realizar un salto (JMPoCALL) inmediatamente después de unMOVase utilizaCR0dicho para habilitar/deshabilitar el modo protegido y/o la paginación de memoria . [ 34 ] Este puede ser un salto cercano o lejano; cualquiera funcionará para vaciar la cola de instrucciones, pero se requiere un salto lejano para actualizar los derechos de acceso para el segmento CS. [ 35 ]MOVCuando se activa o desactiva el bit CR0.PG (activando o desactivando la paginación), su efecto en la búsqueda de instrucciones es inmediato en los procesadores Pentium Pro y posteriores; sin embargo, en los procesadores 386/486/Pentium, el efecto se retrasa al menos una instrucción. Se sabe que esta diferencia causa problemas de compatibilidad, por ejemplo, con SCO UNIX 3.2v4.0. [ 36 ]
MOVEstáCR2catalogado arquitectónicamente como serializable, pero se ha informado que no lo es en al menos algunos procesadores Intel Core-i7. [ 37 ]MOVLa funciónCR8(introducida con x86-64) se serializa en procesadores AMD pero no en procesadores Intel. - 1 2 Las
MOV TRxinstrucciones se interrumpieron a partir de Pentium. - ↑The
INT1/ICEBP(F1) instruction is present on all known Intel x86 processors from the 80386 onwards,[38] but only fully documented for Intel processors from the May 2018 release of the Intel SDM (rev 067) onwards.[39] Before this release, mention of the instruction in Intel material was sporadic, e.g. AP-526 rev 001.[40]For AMD processors, the instruction has been documented since 2002.[41] - ↑The operation of the
F1(ICEBP) opcode differs from the operation of the regular software interrupt opcodeCD 01in several ways:- In protected mode,
- In virtual-8086 mode,
CD 01will also check CPL against IOPL as an access-rights check, whileF1will not. - In virtual-8086 mode with VME enabled, interrupt redirection is supported for
CD 01but notF1.
CD 01will check CPL against the interrupt descriptor's DPL field as an access-rights check, whileF1will not. - In virtual-8086 mode,
- ↑The UMOV instruction is present on 386 and 486 processors only.[38]
- 12The
XBTSandIBTSinstructions were discontinued with the B1 stepping of 80386. They have been used by software mainly for detection of the buggy[42] B0 stepping of the 80386. Microsoft Windows (v2.01 and later) will attempt to run theXBTSinstruction as part of its CPU detection ifCPUIDis not present, and will refuse to boot ifXBTSis found to be working.[43] - 12For
XBTSandIBTS, the r/m argument represents the data to extract/insert a bitfield from/to, the reg argument the bitfield to be inserted/extracted, AX/EAX a bit-offset and CL a bitfield length.[44] - ↑Undocumented, 80386 only.[45]
Added with 80486
- ↑ El uso
BSWAPcon registros de 16 bits no está prohibido en sí mismo (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, [ 46 ] 586 y Bochs / QEMU . [ 47 ] - 1 2 En Intel 80486 stepping A, [ 48 ] la
CMPXCHGinstrucción utiliza una codificación diferente:0F A6 /rpara la variante de 8 bits,0F A7 /rpara la variante de 16/32 bits. Las0F B0/B1codificaciones se utilizan en 80486 stepping B y posteriores. [ 49 ] [ 50 ] - ↑ Las
CMPXCHGinstrucciones se configuranEFLAGSde la misma manera queCMPlo haría una instrucción que utiliza el acumulador (AL/AX/EAX/RAX) como su primer argumento. - ↑
INVLPGse ejecuta como no operación si el argumento m8 no es válido (por ejemplo, página no asignada o dirección no canónica).INVLPGSe puede utilizar para invalidar entradas de TLB para páginas globales individuales. - ↑ Si
F3se utiliza el prefijo con el0F 09código de operación, la instrucción se ejecutará comoWBNOINVDen los procesadores que admiten la extensión WBNOINVD; esto no invalidará la caché. - Las instrucciones ` and` invalidarán todas las líneas de caché en las cachés L1 de la CPU. Depende de la implementación si también invalidarán el contenido de las cachés L2/L3.Las`and`no impedirán que se realice la precarga de caché mientras se ejecutan; si es necesario garantizar que las cachés estén vacías, entonces es necesario establecer el bit `and`en 1 antes de invocar cualquiera de estas instrucciones. (Si la caché se comparte entre varios procesadores lógicos, entonces para vaciar la caché se requiere que todos los procesadores lógicos que comparten la caché tengan subit `and` establecido en 1 antes`and`).
INVDWBINVDINVDWBINVDCR0.CDCR0.CDINVDWBINVD - 1 2 Las
INVDyWBINVDse están serializando; en algunos procesadores, también pueden bloquear las interrupciones hasta su finalización. - ↑ Existen varias circunstancias bajo las cuales la
INVDinstrucción no puede ejecutarse ni siquiera en el anillo 0:- En los procesadores que admiten Intel SGX , si la PRM (Memoria Reservada del Procesador) se ha configurado mediante los PRMRR (registros de rango de PRM), la
INVDinstrucción no está permitida y provocará una excepción #GP(0). [ 51 ] - En los procesadores que admiten Intel TDX , si se ha configurado el SEAM (modo de arbitraje seguro),
INVDprovocará #GP(0). - En algunos procesadores Intel más nuevos ( Meteor Lake / Arrow Lake y posteriores), intentar ejecutar
INVDcuando el bit 0 delMSR_BIOS_DONEMSR está activado dará como resultado #GP(0); esto impide efectivamente cualquier uso de esta instrucción fuera de la BIOS . - Bajo la virtualización Intel VT-x , la
INVDinstrucción provocará un #VMEXIT obligatorio.
- En los procesadores que admiten Intel SGX , si la PRM (Memoria Reservada del Procesador) se ha configurado mediante los PRMRR (registros de rango de PRM), la
Instrucciones de sistema/enteras que no estaban presentes en el conjunto de instrucciones básico del 80486, pero que se añadieron en varios procesadores x86 antes de la introducción de SSE. ( No se incluyen las instrucciones descontinuadas ).
- 1 2 3 La documentación temprana de Intel 64 indicaba que para las
RDMSR,WRMSRyRDPMCen modo de 64 bits, las instrucciones podían codificarse con unREX.Wprefijo para que interpretaran el registro RCX como un índice MSR/PMC completo de 64 bits. [ 52 ] Esto se eliminó de la documentación posterior de Intel 64 (SDM rev 023 [ 53 ] y posteriores), que indica que estas instrucciones siempre ignoran los 32 bits superiores de RCX independientemente de cualquier prefijo REX.En todos los procesadores x86-64 conocidos, estas instrucciones aceptarán el prefijo REX pero lo ignorarán, e ignorarán los 32 bits superiores de RCX.
- 1 2 3 En modo de 64 bits, las
RDMSR,RDTSCyRDPMCestablecerán los 32 bits superiores de RDX y RAX a cero. - 1 2 Para algunas combinaciones de CPU/MSR, las
RDMSRyWRMSRpueden utilizar registros distintos de ECX y EDX:EAX. Ejemplos conocidos de esto incluyen el uso de EDI [ 54 ] [ 55 ] y ESI [ 56 ] para una contraseña, y EBX [ 57 ] para una dirección de memoria física. - ↑ Las lecturas MSR realizadas con las
RDMSRyRDMSRLISTpueden, en general, reordenarse con respecto a otras instrucciones, incluidas otras lecturas MSR, con las siguientes restricciones: [ 58 ] [ 59 ]- Los accesos MSR no se pueden reordenar a través de instrucciones de serialización (por ejemplo
CPUID,IRET) o instrucciones de serialización de despacho (por ejemplo,LFENCE). - Las lecturas MSR del
IA32_BARRIERMSR (MSR2Fh, introducido con la extensión del conjunto de instrucciones MSRLIST) no se pueden reordenar a través de otras lecturas MSR. - Los accesos a los registros MSR de x2APIC no se pueden reordenar entre sí.
- Los accesos MSR no se pueden reordenar a través de instrucciones de serialización (por ejemplo
- ↑ En las CPU de Intel, AMD y VIA, la
WRMSRinstrucció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 MSR79hen las CPU de Intel y VIA [ 61 ] y en el MSRC001_0020h[ 62 ] en las CPU de AMD. - ↑ Las escrituras en los siguientes MSR no se están serializando: [ 63 ] [ 64 ]
WRMSREl ICR (Registro de Comando de Interrupción; MSR830h) del x2APIC se usa comúnmente para producir una IPI ( Interrupción entre procesadores ); en las CPU Intel [ 66 ] pero no en las AMD [ 67 ] , dicha IPI se puede reordenar antes de un almacenamiento de memoria anterior. - ↑ El modo de administración del sistema y la
RSMinstrucción estuvieron disponibles en las variantes no SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993. - ↑ En algunos procesadores de 32 bits más antiguos, la ejecución
CPUIDcon un índice de hoja (EAX) mayor que 0 puede dejar EBX y ECX sin modificar, manteniendo sus valores anteriores. Por esta razón, se recomienda poner a cero EBX y ECX antes de ejecutarCPUID.Los procesadores que se ha observado que presentan este comportamiento incluyen Cyrix MII [ 72 ] e IDT WinChip 2. [ 73 ] En modo de 64 bits,CPUIDestablecerá los 32 bits superiores de RAX, RBX, RCX y RDX a cero. - ↑ En algunos procesadores Intel a partir de Ivy Bridge , existen MSR que se pueden usar para restringir
CPUIDal anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [ 74 ] y Denverton. [ 75 ] La capacidad de restringirCPUIDal anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [ 76 ] - 1 2
CPUIDtambién está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium. - ↑ En las CPU Cyrix 5x86 y 6x86,
CPUIDno está habilitado de forma predeterminada y debe habilitarse a través de un registro de configuración de Cyrix. - ↑ En las CPU de nueva generación,
CPUIDsolo es compatible con algunas BIOS del sistema. En algunas CPU de nueva generación que sí lo admitenCPUID, EFLAGS.ID no es compatible, pero EFLAGS.AC sí, lo que complica la detección de la CPU. [ 77 ] - ↑ A diferencia de la instrucción anterior
CMPXCHG, estaCMPXCHG8Binstrucción no modifica ningún bit de EFLAGS que no sea ZF. - ↑
LOCK CMPXCHG8Bcon un operando de registro (que es una codificación no válida) provocará, en algunasCPU Intel Pentium , un bloqueo en lugar de la excepción #UD esperada; esto se conoce como el error Pentium F00F . - 1 2 3 En los procesadores IDT WinChip, Transmeta Crusoe y Rise mP6, la
CMPXCHG8Binstrucción siempre es compatible, sin embargo, su bit CPUID puede faltar. Esta es una solución alternativa para un error en Windows NT. [ 78 ] - 1 2 Las
RDTSCyRDPMCno 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 deRDPMC(pero noRDTSC) pueden reordenarse entre sí incluso para lecturas del mismo contador.Para imponer un orden con respecto a otras instrucciones,se necesitanLFENCEinstrucciones de serialización (por ejemplo , ). [ 79 ]CPUID - ↑ En todos los procesadores x86 que admiten tanto
RDTSCcomo TSC , el TSC está disponible como MSR10h, que se puede leer y escribir utilizando lasinstruccionesRDMSR/WRMSREn las primeras implementaciones (por ejemplo, P5 Pentium , AMD K5 ), así como en todos los procesadores que admiten x86-64 , este MSR se puede leer y escribir como un registro completo de 64 bits; sin embargo, en algunos procesadores que no son x86-64 (por ejemplo, Intel Pentium Pro , VIA C3 , Transmeta Efficieon ), los intentos de escribir un valor deo mayor hará que el valor escrito se combine mediante AND con
0xFFFFFFFF, borrando los 32 bits superiores.En muchos procesadores más recientes (desde Intel Haswell / Silvermont , Zhaoxin ZX-C y AMD Zen 5 ), el
TSC_ADJUSTMSR (MSR3Bh) está disponible (indicado porCPUID.(EAX=7,ECX=0):EBX[1]). En procesadores con este MSR, existe un TSC "verdadero" a nivel de sistema que se comparte o sincroniza entre todos los núcleos de la CPU; leer el TSC conRDTSCo MSR10hdevolverá el valor "verdadero" del TSC más el valor deTSC_ADJUST; los intentos de escribir en MSR10hharán que la CPU calcule la diferencia entre el valor de escritura proporcionado y el TSC "verdadero" y escriba esa diferencia enTSC_ADJUST; la sincronización del TSC entre los núcleos del procesador se puede realizar escribiendo el mismo valor enTSC_ADJUSTen cada procesador lógico. [ 80 ] - ↑ El TSC de tasa fija se introdujo en dos etapas:
- TSC constante
- TSC funciona a una velocidad fija siempre que el núcleo del procesador no esté en modo de suspensión profunda ( C2 o más profundo), pero no está sincronizado entre los núcleos de la CPU. Introducido en Intel Prescott , Yonah y Bonnell . También presente en todas las CPU Transmeta y VIA Nano [ 81 ] , así como en AMD Geode LX . [ 82 ] No tiene un bit CPUID.
- TSC invariante (TSC sin interrupciones)
- TSC funcionando a una velocidad fija e incrementándose de manera sincronizada entre todos los núcleos de la CPU en todos los estados P, C y T (pero no necesariamente en los estados S). Presente en AMD K10 y posteriores; Intel Nehalem / Saltwell [ 83 ] y posteriores; Zhaoxin WuDaoKou [ 84 ] y posteriores. Indicado con un bit CPUID (hoja
8000_0007:EDX[8]).
- ↑
RDTSCse puede ejecutar fuera del Anillo 0 solo siCR4.TSD=0.En Intel Pentium y AMD K5/K6,RDTSCno se puede ejecutar en modo Virtual-8086. [ 86 ] [ 87 ] Los procesadores posteriores (Pentium Pro, Athlon 64) eliminaron esta restricción. - ↑
RDPMCse puede ejecutar fuera del Anillo 0 solo siCR4.PCE=1. - ↑ Esta
RDPMCinstrucción no está presente en los procesadores VIA anteriores al Nano. - ↑ Los códigos de condición admitidos parala instrucción (opcode, donde el nibble x especifica la condición) son:
CMOVcc0F 4x /r - ↑ En modo de 64 bits,
CMOVcccon un operando de 32 bits, se borrarán los 32 bits superiores del registro de destino incluso si la condición es falsa.En el casoCMOVccde un operando de origen de memoria, la CPU siempre leerá el operando de la memoria, lo que podría provocar excepciones de memoria y saturación de la caché, incluso si no se cumple la condición para la operación. (La extensión Intel APX define un conjunto de nuevasvariantes codificadas en EVEXCMOVccque suprimen las excepciones de memoria si la condición es falsa). - ↑ En las variantes VIA C3 anteriores a Nehemías ("Samuel"/"Ezra"),se ha informado que las instrucciones
reg,reg, pero noreg,[mem]las formas, están presentes como instrucciones no documentadas. [ 88 ]CMOVcc - ↑ Las codificaciones de bytes recomendadas por Intel para NOPs multibyte de longitudes de 2 a 9 bytes en modo de 32/64 bits son (en hexadecimal): [ 89 ] En los casos en que sea necesario utilizar más de 9 bytes de relleno NOP, se recomienda utilizar múltiples NOP.
- ↑ A diferencia de otras instrucciones añadidas en Pentium Pro , la instrucción NOP larga no tiene un bit de característica CPUID .
A partir de abril de 2026, el SDM de Intel indica que el NOP largo está disponible en las CPU de las familias 6 y 15 [ 85 ] ; esto se aplica a las CPU de Intel, pero algunas CPU de la familia 6 de proveedores que no son de Intel (por ejemplo, Cyrix 6x86 MX y VIA C3 ) no lo admiten.
El kernel de Linux (versión 2.6.27 y posteriores) trata las instrucciones NOP largas como no disponibles en modo de 32 bits debido a la falta de una forma fiable de detectarlas. [ 90 ]
- ↑
0F 1F /0como long-NOP se introdujo en el Pentium Pro, pero permaneció sin documentar hasta 2006. [ 92 ] Todo el0F 18..1Frango de opcode estabaNOPen el Pentium Pro. Sin embargo, excepto por0F 1F /0, Intel no garantiza que estos opcodes permanezcanNOPen procesadores futuros, y de hecho ha asignado algunos de estos opcodes a otras instrucciones en al menos algunos procesadores. [ 93 ] [ 94 ] - ↑ Documentado para AMD x86-64 desde 2002. [ 95 ]
- ↑ Si bien el
0F 0Bcódigo de operación fue oficialmente reservado como un código de operación inválido desde Pentium en adelante, solo se le asignó el mnemónicoUD2desde Pentium Pro en adelante. [ 97 ] - 1 2 GNU Binutils ha utilizado los
UD2AyUD2Bpara los0F 0By0F B9desde la versión 2.7. [ 98 ] NiUD2AniUD2Boriginalmente tomaban ningún argumento;UD2Bposteriormente se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [ 99 ] - ↑ La
UD2(0F 0B) impedirá además que los bytes subsiguientes se decodifiquen como instrucciones, incluso de forma especulativa. Por esta razón, si una instrucción de salto indirecto va seguida de algo que no es código, se recomienda colocar unaUD2instrucción después del salto indirecto. [ 100 ] - 1 2 Los códigos de operación UD0/1/2 -
0F 0B,0F B9y0F 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. - ↑ Si bien el
0F B9código de operación fue oficialmente reservado como un código de operación inválido desde Pentium en adelante, solo se le asignó su mnemónicoUD1mucho más tarde: AMD APM comenzó a listarloUD1en sus mapas de códigos de operación a partir de la revisión 3.17, [ 102 ] mientras que Intel SDM comenzó a listarlo a partir de la revisión 061. [ 103 ] - 1 2 Para ambos
0F B9operación0F FF, se sabe que las diferentes implementaciones x86 difieren en cuanto a si los códigos de operación aceptan un byte ModR/M . [ 104 ] [ 105 ] [ 106 ] - ↑ Para el
0F FFcódigo de operación, elOIOmnemónico fue introducido por Cyrix, [ 107 ] mientras que elUD0mnemónico (sin argumentos) fue introducido por AMD e Intel al mismo tiempo que elUD1mnemónico para0F B9. [ 102 ] [ 103 ] Posteriormente, la documentación de Intel (pero no la de AMD) modificó su descripción deUD0para agregar un byte ModR/M y tomar dos argumentos. [ 108 ] - 1 2 3 4 Las
SYSRET,SYSENTERySYSEXITno están disponibles en el modo Real .SYSENTERSin embargo, está disponible en el modo Virtual 8086 .En los procesadores AMD, la
SYSCALLinstrucción está disponible en todos los modos de funcionamiento, incluido el modo real.Si FRED (Flexible Return and Event Delivery) está habilitado, entonces las
SYSRETinstruccionesSYSEXITno estarán disponibles. - ↑ En K6, las
SYSCALL/SYSRETestaban disponibles en el Modelo 7 (250 nm "Little Foot") y posteriores, no en el Modelo 6 anterior. [ 110 ] - ↑
SYSCALLySYSRETse integraron como parte fundamental de x86-64; por lo tanto, las instrucciones están disponibles en modo de 64 bits en todos los procesadores x86-64 de AMD, Intel, VIA y Zhaoxin.Fuera del modo de 64 bits, las instrucciones solo están disponibles en procesadores AMD. - ↑ La semántica exacta
SYSRETdifiere ligeramente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas provocan que se genere 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. [ 111 ] - 1 2 Para las
SYSRETySYSEXITen x86-64, es necesario agregar elREX.Wprefijo para las variantes que volverán al código de modo de usuario de 64 bits.Las codificaciones de estas instrucciones sin el
REX.Wprefijo 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; para volver al código de 16 bits, se debe utilizarIRET/IRETD/ ).IRETQPara variantes de las instrucciones
SYSRETySYSEXITcodificadas con elREX.Wprefijo, algunos ensambladores (por ejemplo, FASM [ 112 ] y GNU Binutils ) admiten los mnemónicosSYSRETQySYSEXITQ, sin embargo, estos mnemónicos no se utilizan en la documentación de Intel/AMD. - ↑ Las
CPUIDbanderas que indican soporte paraSYSENTER/SYSEXITestán establecidas en el Pentium Pro, aunque el procesador no admite oficialmente estas instrucciones. [ 113 ] Las pruebas de terceros indican que los códigos de operación están presentes en el Pentium Pro, pero son demasiado defectuosos para ser utilizables. [ 114 ] - ↑ En las CPU de AMD, las
SYSENTERySYSEXITno están disponibles en el modo largo x86-64 (#UD). - ↑ En las CPU Transmeta, las
SYSENTERySYSEXITsolo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [ 116 ] - ↑ En Nehemías,
SYSENTERySYSEXITestán disponibles solo en el paso 8 y posteriores. [ 117 ]
Añadido como extensiones del conjunto de instrucciones
Añadido con x86-64
Estas instrucciones solo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:
- Instrucciones originales que reutilizan códigos de operación existentes para un propósito diferente (
MOVSXDreemplazandoARPL) - Instrucciones originales con nuevos códigos de operación (
SWAPGS) - Instrucciones existentes extendidas a un tamaño de dirección de 64 bits (
JRCXZ) - Instrucciones existentes ampliadas a un tamaño de operando de 64 bits (instrucciones restantes)
La mayoría de las instrucciones con un operando de 64 bits codifican esto mediante un REX.Wprefijo; en ausencia de REX.Weste, se codifica la instrucción correspondiente con un operando de 32 bits. Este mecanismo también se aplica a la mayoría de las demás instrucciones con un operando de 32 bits. Estas no se incluyen aquí, ya que no adquieren un nuevo mnemónico en la sintaxis de Intel al usarse con un operando de 64 bits.
- ↑ El operando de memoria
CMPXCHG16Bdebe estar alineado a 16 bytes. - ↑ La
CMPXCHG16Binstrucció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 Xeon "Nocona" stepping D, [ 118 ] pero se añadió en el stepping E. [ 119 ] En los procesadores de la familia AMD K8 , se añadió en el stepping F, al mismo tiempo que se introdujo la compatibilidad con DDR2. [ 120 ] Por esta razón,CMPXCHG16Btiene su propio indicador CPUID, separado del resto de x86-64. - ↑ Se permitencodificaciones sin el prefijo REX.W, pero se desaconsejan [ 121 ] – dichas codificaciones se comportan de forma idéntica a las de 16/32 bits().
MOVSXDMOV8B /r - ↑ El
UDBcódigo de operación -D6- provocará una excepción #UD (instrucción no válida) en modo de 64 bits en todos los procesadores x86-64 conocidos, pero solo se reservó explícitamente para este propósito y se le asignó elUDBmnemónico en 2025. [ 122 ] ElD6código de operación provocará #UD solo en modo de 64 bits; en los modos de 16 y 32 bits (heredado y compatibilidad), en la mayoría de los procesadores x86, se ejecutará como laSALCinstrucción.
Extensiones de manipulación de bits
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, controlado por el bit VEX.W; ninguna de estas instrucciones está disponible en variantes de 16 bits. Las instrucciones codificadas en VEX no están disponibles en modo real ni en modo virtual-8086; por lo demás, las instrucciones de manipulación de bits están disponibles en todos los modos de funcionamiento de las CPU compatibles.
- ↑ En las CPU AMD, la extensión "ABM" proporciona tanto
POPCNTcomoLZCNT. En las CPU Intel, sin embargo, el bit CPUID para "ABM" solo está documentado para indicar la presencia de laLZCNTinstrucción y se lista como "LZCNT", mientras quePOPCNTtiene su propio bit de característica CPUID separado.Sin embargo, todos los procesadores conocidos que implementan las extensiones "ABM"/"LZCNT" también implementanPOPCNTy establecen el bit de característica CPUID para POPCNT, por lo que la distinción es solo teórica.(Lo contrario no es cierto: existen procesadores que admitenPOPCNTpero no ABM, como Intel Nehalem y VIA Nano 3000). - ↑ La
LZCNTinstrucción se ejecutará comoBSRen sistemas que no admiten las extensiones LZCNT o ABM.BSRCalcula el índice del bit más alto activado en el operando fuente, produciendo un resultado diferenteLZCNTpara la mayoría de los valores de entrada. - ↑ La
TZCNTinstrucción se ejecutará comoBSFen sistemas que no admiten la extensión BMI1.BSFproduce el mismo resultado queTZCNTpara todos los valores de operando de entrada excepto cero, para el cualTZCNTdevuelve el tamaño del operando de entrada, peroBSFproduce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas). - ↑ Para
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 delr/margumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits fuera de límites se leen como 0. - ↑ En los procesadores AMD anteriores a Zen 3, lasinstrucciones
PEXTy son bastante lentas [ 123 ] y presentan una temporización dependiente de los datos debido al uso de una implementación microcodificada (de aproximadamente 18 a 300 ciclos, dependiendo del número de bits establecidos en el argumento de máscara). Como resultado, a menudo es más rápido utilizar otras secuencias de instrucciones en estos procesadores. [ 124 ] [ 125 ]PDEP
Añadido con Intel TSX
Añadido con Intel CET
Intel CET (Control-Flow Enforcement Technology) añade dos características distintas para ayudar a proteger contra vulnerabilidades de seguridad como la programación orientada a retorno : una pila en la sombra (CET_SS) y el seguimiento indirecto de bifurcaciones (CET_IBT).
- 1 2 Las
RDSSPDinstruccionesRDSSPQactúan como NOP en procesadores donde las pilas de sombra están deshabilitadas o no se admite CET. - 1 2
ENDBR32yENDBR64actúan como NOPs en procesadores que no admiten CET_IBT o donde IBT está deshabilitado. - ↑ Este prefijo tiene la misma codificación que el DS: prefijo de anulación de segmento; a partir de abril de 2022, la documentación de Intel no parece especificar si este prefijo también conserva su antigua función de anulación de segmento cuando se usa como prefijo sin seguimiento, ni proporciona un mnemónico oficial para este prefijo. [ 126 ] [ 127 ] (GNU binutils usa "notrack" [ 128 ] )
Añadido con XSAVE
Las extensiones del conjunto de instrucciones XSAVE están diseñadas para guardar/restaurar el estado extendido de la CPU (normalmente para el cambio de contexto ) de forma que pueda ampliarse para cubrir nuevas extensiones del conjunto de instrucciones sin que el código de cambio de contexto del sistema operativo necesite comprender las especificidades de las nuevas extensiones. Esto se logra definiendo una serie de componentes de estado , cada uno con un tamaño y un desplazamiento dentro de un área de guardado determinada, y cada uno correspondiente a un subconjunto del estado necesario para una extensión de CPU u otra. La hoja EAX=0DhCPUID 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 sistema operativo pueda reservar la cantidad adecuada de espacio y establecer los bits de habilitación asociados.
- ↑ Bajo Intel APX, las
XSAVE*yXRSTOR*no se pueden codificar con el prefijo REX2. - ↑ XSAVE se agregó en las revisiones E0/R0 de Penryn y no está disponible en revisiones anteriores.
- ↑ En algunos procesadores (a partir de Skylake , Goldmont , Zen 1 y Shijidadao v2),
XGETBVse permite ejecutar con ECX=1; esto no devolveráXCR1(no existe tal registro), sino que devolveráXCR0una operación AND bit a bit con el valor actual del mapa de bits del componente de estado "XINUSE" (un mapa de bits de componentes de estado XSAVE que no se sabe que estén en su estado inicial).La presencia de esta funcionalidadXGETBVse indica mediante CPUID .(EAX=0Dh,ECX=1):EAX[bit 2]. - ↑ La
XSETBVinstrucción provocará un #VMEXIT obligatorio si se ejecuta bajo la virtualización Intel VT-x . - 1 2 XSAVEC y XSAVES se agregaron en la revisión v2 de Zhaoxin Shijidadao y no están disponibles en la revisión v1. [ 129 ]
Añadido con otras extensiones de diferentes proveedores.
- 1 2 3 Los procesadores AMD Athlon anteriores al Athlon XP no admitían SSE completo, pero sí introdujeron las instrucciones no SIMD de SSE como parte de las "Extensiones MMX" . [ 130 ] Estas extensiones (sin SSE completo) también están presentes en los procesadores Geode GX2 y Geode posteriores.
- 1 2 3 4 5 6 7 Todas las
PREFETCH*instrucciones son instrucciones de sugerencia que afectan únicamente al rendimiento, no a la semántica del programa. Proporcionar una dirección no válida (por ejemplo, la dirección de una página no asignada o una dirección no canónica) hará que la instrucción actúe como una NOP sin generar ninguna excepción. - 1 2 3 En los procesadores Intel, [ 131 ] así como en los procesadores AMD64, [ 132 ] el procesador ignora el campo r/m del byte ModR/M para las
SFENCE,LFENCEyMFENCE; cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida. (Se desconoce si esto ocurre en otros procesadores que admiten estas instrucciones, por lo que se recomienda codificarlas con x=0). - ↑ La
SFENCEinstrucción asegura que todos los almacenamientos de memoria posteriores a laSFENCEinstrucción se hagan globalmente observables después de todos los almacenamientos de memoria anteriores a laSFENCE. Esto impone un orden en los almacenamientos que de otro modo podrían reordenarse, como los almacenamientos no temporales y los almacenamientos en regiones de memoria WC (Write-Combining). [ 133 ] En las CPU Intel, así como en las CPU AMD desde Zen1 en adelante (pero no en las CPU AMD más antiguas),SFENCEtambién actúa como una barrera de reordenamiento en los vaciados/escrituras de caché realizados con lasCLFLUSH,CLFLUSHOPTyCLWB. (Las CPU AMD más antiguas requierenMFENCEordenarCLFLUSH.)SFENCEno está ordenado con respecto aLFENCE, y unaSFENCE+LFENCEsecuencia no es suficiente para evitar que una carga se reordene más allá de un almacenamiento anterior. [ 134 ] Para evitar tal reordenamiento, es necesario ejecutar unaMFENCE,LOCKo una instrucción de serialización. - ↑ La
LFENCEinstrucción garantiza que todas las cargas de memoria posteriores a laLFENCEinstrucción se hagan globalmente observables después de todas las cargas de memoria anteriores a la instrucciónLFENCE.En todas las CPU Intel que admiten SSE2, laLFENCEinstrucción proporciona una garantía de orden más fuerte: [ 135 ] es serializadora de despacho , lo que significa que las instrucciones posteriores a laLFENCEinstrucción pueden comenzar a ejecutarse solo después de que todas las instrucciones anteriores a ella se hayan retirado (lo que garantizará que todas las cargas precedentes, pero no necesariamente los almacenamientos, se hayan completado). El efecto de la serialización de despacho es queLFENCEtambié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 contadores de rendimiento (a los que se accede a través de, por ejemploRDTSC, oRDPMC) y MSR x2apic .En las CPU AMD,LFENCEno es necesariamente serializadora de despacho por defecto; sin embargo, en todas las CPU AMD que admiten cualquier forma de serialización que no sea de despachoLFENCE, se puede hacer serializadora de despacho configurando el bit 1 de MSRC001_1029. [ 136 ] - ↑ La
MFENCEinstrucción garantiza que todas las cargas de memoria, almacenamientos y vaciados de línea de caché posteriores a laMFENCEinstrucción se hagan globalmente observables después de todas las cargas de memoria, almacenamientos y vaciados de línea de caché anteriores a laMFENCE.En las CPU Intel, noMFENCEesserializador de despacho y, por lo tanto, no se puede utilizar por sí solo para imponer un orden en los accesos a recursos que no son de memoria, como contadores de rendimiento y MSR x2apic.sigue estando ordenado con respecto a, por lo que si hay necesidad de imponer un orden entre los almacenamientos de memoria y los accesos posteriores que no son de memoria, entonces dicho orden se puede obtener emitiendo unseguido de un. [ 79 ] [ 137 ] En las CPU AMD,es serializador.MFENCELFENCEMFENCELFENCEMFENCE - ↑ El funcionamiento de la
PAUSEinstrucción en modo de 64 bits, a diferencia deNOP, no se ve afectado por la presencia delREX.Rprefijo. NiNOPniPAUSEse ven afectados por los demás bits delREXprefijo. Algunos ejemplos de cómo el código de operación90interactúa con varios prefijos en modo de 64 bits son:90esNOP41 90esXCHG R8D,EAX4E 90esNOP49 90esXCHG R8,RAXF3 90esPAUSEF3 41 90esPAUSEF3 4F 90esPAUSE
- ↑ La duración real de la pausa realizada por la
PAUSEinstrucción depende de la implementación.En sistemas sin SSE2,PAUSEse ejecutará como NOP. - ↑ En entornos de virtualización VT-x o AMD-V, la ejecución
PAUSErepetida en un intervalo de tiempo corto puede provocar un error #VMEXIT. El número dePAUSEejecuciones y la duración del intervalo que pueden desencadenar un error #VMEXIT dependen de la plataforma. - ↑ Si bien la
CLFLUSHinstrucció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í lo implementan. (Por ejemplo, AMD Geode LX admiteCLFLUSH, pero no SSE2). - ↑ Si bien las
MONITORyMWAITse 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). - 1 2 Para las
MONITORyMWAIT, la documentación antigua de Intel [ 138 ] enumera los mnemónicos de las instrucciones con operandos explícitos (MONITOR EAX,ECX,EDXyMWAIT EAX,ECX), mientras que la documentación más reciente omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas de estas variantes. [ 139 ] - ↑ Para
MONITOR, el segmento DS: puede ser sobrescrito con un prefijo de segmento.El área de memoria que se supervisará no será solo el byte único especificado por DS:rAX, sino una región de memoria lineal que contenga el byte; el tamaño y la alineación de esta región de memoria dependen de la implementación y pueden consultarse a través de CPUID.La ubicación de memoria a supervisar debe tener el tipo de memoria WB (caché de escritura diferida); de lo contrario, la supervisión podría fallar. - ↑ A fecha de abril de 2024, no se han definido extensiones ni sugerencias para la
MONITORinstrucción. Por lo tanto, la instrucción requiere ECX=0 e ignora EDX. - ↑ En algunos procesadores, como Intel Xeon Phi x200 [ 140 ] y AMD K10 [ 141 ] y posteriores, existen MSR documentados que se pueden usar para habilitar
MONITORyMWAITejecutar en Ring 3. - ↑ La espera realizada
MWAITpuede finalizar debido a eventos del sistema distintos a una escritura en memoria (por ejemplo, desalojo de líneas de caché, interrupciones); el conjunto exacto de eventos que pueden provocar la finalización de la espera depende de la implementación.Independientemente de si la espera finalizó debido a una escritura en memoria u otro evento, la monitorización habrá finalizado y será necesario configurarla de nuevoMONITORantes de volverMWAITa esperar a que se produzcan escrituras en memoria. - ↑ Los indicadores de extensión disponibles
MWAITen el registro ECX son: - ↑ Los indicadores de sugerencia disponibles
MWAITen el registro EAX son: Los estados C son estados de energía específicos del procesador, que no necesariamente se corresponden 1:1 con los estados C de ACPI . - ↑ Para la
GETSECinstrucción, elREX.Wprefijo habilita direcciones de 64 bits solo para la función hoja EXITAC; los prefijos REX están permitidos en otros casos, pero se ignoran para la instrucción. - ↑ Las funciones hoja definidas para
GETSEC(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #UD. - ↑ Para
GETSEC, la mayoría de las funciones hoja están restringidas al Anillo 0, pero las funciones hoja CAPABILITIES (EAX=0) y PARAMETERS (EAX=6) están disponibles en el Anillo 3. - 1 2 El valor "core ID" leído por
RDTSCPyRDPIDes en realidad elTSC_AUXMSR (MSRC000_0103h). Si este valor corresponde realmente a un ID de procesador es una cuestión de convención del sistema operativo. - ↑ A diferencia de la instrucciónanteriorretrasará la lectura del TSC hasta que todas las instrucciones anteriores se hayan ejecutado, lo que garantiza el orden con respecto a las cargas de memoria precedentes (pero no a los almacenamientos).Sin embargo, no se ordena con respecto a las instrucciones subsiguientes.
RDTSCRDTSCPRDTSCP - ↑
RDTSCPse puede ejecutar fuera del Anillo 0 solo siCR4.TSD=0. - ↑ La compatibilidad con
RDTSCPse agregó en el paso F del AMD K8 y no está disponible en pasos anteriores. - ↑ Si bien la
POPCNTinstrucció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.En los procesadores AMD, se considera parte de la extensión ABM, pero aún conserva su propio indicador CPUID. - 1 2 Para la
MOVBEinstrucción, las codificaciones que usan tanto el66hprefijo como elREX.Wprefijo causarán #UD en algunos procesadores (por ejemplo, Haswell [ 145 ] ) y por lo tanto deben evitarse. - ↑ Los tipos de invalidación definidos para
INVPCID(seleccionados por el argumento de registro) son: Cualquier valor no admitido en el argumento del registro provoca una excepción #GP. - ↑ A diferencia de la instrucción anterior
INVLPG,INVPCIDprovocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [ 146 ] - ↑ Las
PREFETCHyPREFETCHWson 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! - ↑ Los códigos de operación para
PREFETCHyPREFETCHW(0F 0D /r) se ejecutan como NOP en las CPU de Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante,PREFETCHWobteniendo la funcionalidad de prefetch desde Broadwell en adelante. - ↑ La
PREFETCH(0F 0D /0) es una instrucción 3DNow!, presente en todos los procesadores con 3DNow! pero no necesariamente en los procesadores con la extensión PREFETCHW.En las CPU AMD con PREFETCHW, se documenta que los opcodes,0F 0D /0así como los opcodes,0F 0D /2../7realizan prefetch.En los procesadores Intel con PREFETCHW, se documenta que estos opcodes realizan NOPs reservados [ 147 ] (excepto0F 0D /2quePREFETCHWT1 m8en Xeon Phi ); las pruebas de terceros [ 148 ] indican que algunos o todos estos opcodes pueden realizar prefetch en al menos algunas CPU Intel Core. - 1 2 3 Las extensiones del conjunto de instrucciones SMAP, PKU y RDPID son compatibles con el paso 2 [ 149 ] y posteriores de Zhaoxin LuJiaZui, pero no con pasos anteriores.
- ↑ A diferencia de la instrucción anterior
RDTSCP, que también se puede utilizar para leer la ID del procesador, el modo de usuarioRDPIDno está deshabilitado porCR4.TSD=1. - ↑ Para
MOVDIR64, la dirección de destino proporcionada por ES:reg debe estar alineada a 64 bytes.El tamaño del operando para el argumento de registro viene dado por el tamaño de la dirección, que puede ser sobrescrito por el67hprefijo.El argumento de origen de memoria de 64 bytes no necesita estar alineado a 64 bytes y no se garantiza que se lea de forma atómica. - ↑ La
WBNOINVDinstrucción se ejecutará comoWBINVDsi se ejecutara en un sistema que no admite la extensión WBNOINVD.WBINVDdifiereWBNOINVDen queWBINVDinvalidará todas las líneas de caché después de la escritura diferida. - 1 2 En las implementaciones iniciales, las
PREFETCHIT0yPREFETCHIT1realizarán la precarga de código solo cuando se utilice el modo de direccionamiento relativo a RIP y actuarán como NOP en caso contrario.Las instrucciones PREFETCHI son solo instrucciones de sugerencia: si se intenta precargar una dirección no válida, las instrucciones actuarán como NOP sin generar excepciones. En los procesadores que admiten Long-NOP pero no admiten las instrucciones PREFETCHI, estas instrucciones siempre actuarán como NOP.
Añadido con otras extensiones específicas de Intel.
- 1 2 Los mnemónicos de sugerencia de rama
HWNTseHSTenumeransolo en la documentación temprana de Willamette [ 150 ] - la documentación posterior de Intel enumera los prefijos de sugerencia de rama sin asignarles un mnemónico. [ 151 ]Intel XED utiliza los mnemónicos
hint-takenyhint-not-takenpara estas sugerencias de bifurcación. [ 152 ]GNU Binutils 2.12 y versiones posteriores permiten especificar las sugerencias de bifurcación SSE2 como segundo argumento de las
Jccinstrucciones de ensamblaje: ",pt" para el prefijo predicho tomado y ",pn" para el prefijo predicho no tomado. [ 153 ] - 1 2 Los
2Ey3Ese interpretan como sugerencias de salto solo cuando se usan con lasJccinstrucciones de salto condicional (códigos de operación70..7Fy0F 80..8F); cuando se usan con otros códigos de operación, pueden tomar otros significados (por ejemplo, para instrucciones con operandos de memoria fuera del modo de 64 bits, funcionarán como prefijos de anulación de segmentoCS:yDS:, respectivamente). En procesadores que no admiten sugerencias de salto, estos prefijos se aceptan pero se ignoran cuando se usan conJcc. - ↑ Las sugerencias de ramificación son compatibles con todos los procesadores NetBurst (familia Pentium 4), pero no con ningún otro procesador conocido antes de su reintroducción en las CPU "Redwood Cove", comenzando con "Meteor Lake" en 2023.
- ↑ Las funciones hoja definidas para
ENCLS(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP. - ↑ SGX está obsoleto en procesadores de escritorio/portátiles de la 11.ª generación ( Rocket Lake , Tiger Lake ) en adelante, [ 157 ] pero sigue estando disponible en componentes de servidor de la marca Xeon .
- ↑ La documentación de Intel enumera Ice Lake-SP y Tremont como los procesadores en los que se introdujo la sobreasignación de SGX. [ 159 ] Sin embargo, a febrero de 2026, no se ha observado que ninguna variante de Ice Lake-SP o Tremont tenga los bits de características CPUID de extensión de sobreasignación de SGX activados, mientras que varias los tienen desactivados; los únicos procesadores que se han observado con estos bits de características activados son algunas variantes de Ice Lake-U. [ 160 ]
- ↑ Las funciones hoja definidas para
ENCLU(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. Las funcionesEENTERyERESUMEno se pueden ejecutar dentro de un enclave SGX; las demás funciones solo se pueden ejecutar dentro de un enclave. - ↑
ENCLUsolo se puede ejecutar en el anillo 3, no en los anillos 0/1/2. - ↑ Las funciones hoja definidas para
ENCLV(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. EstaENCLVinstrucción solo está presente en sistemas que admiten las extensiones de sobreasignación de EPC para SGX ("OVERSUB"). - ↑
ENCLVsolo está disponible si la operación Intel VMX está habilitada conVMXON, y producirá #UD de lo contrario. - ↑ Para
PTWRITE, la escritura en el paquete de rastreo del procesador solo ocurrirá si un conjunto de bits de habilitación (los bits "TriggerEn", "ContextEn", "FilterEn" delRTIT_STATUSMSR y el bit "PTWEn" delRTIT_CTLMSR) están todos establecidos en 1.LaPTWRITEinstrucción está indicada en el SDM para causar una excepción #UD si se utiliza el prefijo de instrucción 66h, independientemente de otros prefijos. - ↑ Las funciones hoja definidas para
PCONFIG(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP(0). - ↑ Para
CLDEMOTE, el nivel de caché al que degradará una línea de caché depende de la implementación.Dado que la instrucción se considera una sugerencia, se ejecutará como NOP sin excepciones si la dirección de memoria proporcionada no es válida o no se encuentra en la caché L1. También puede ejecutarse como NOP en otras circunstancias que dependen de la implementación.En sistemas que no admiten la extensión CLDEMOTE, se ejecuta como NOP. - ↑ La documentación de Intel enumera Tremont y Alder Lake como los procesadores en los que se introdujo CLDEMOTE. [ 159 ] Sin embargo, a mayo de 2022, no se ha observado que ningún modelo Tremont o Alder Lake tenga el bit de característica CPUID para CLDEMOTE activado, mientras que varios de ellos tienen el bit CPUID desactivado. [ 164 ] A abril de 2023, se ha observado que el bit de característica CPUID para CLDEMOTE está activado para Sapphire Rapids. [ 165 ]
- ↑ Para
UMONITOR, el tamaño del operando del argumento de dirección viene dado por el tamaño de la dirección, que puede ser sobrescrito por el67hprefijo. El segmento predeterminado utilizado es DS:, que puede ser sobrescrito con un prefijo de segmento. - 1 2 Para las
UMWAITyTPAUSE, el sistema operativo puede usar elIA32_UMWAIT_CONTROLMSR para limitar el tiempo máximo quese le permite esperar a una sola invocaciónUMWAIT/yse estableceránen 1 si alcanzaron ellímite de tiempo definido y en 0 en caso contrario.TPAUSEUMWAITTPAUSERFLAGS.CFIA32_UMWAIT_CONTROL - ↑
TPAUSEyUMWAITsolo se puede ejecutar fuera del Anillo 0 siCR4.TSD=0. - ↑ Para el argumento de registro de las
UMWAITyTPAUSE, se admiten los siguientes bits de bandera: - ↑ Si bien la serialización se puede realizar con instrucciones más antiguas, como por ejemplo
CPUIDyIRET, estas instrucciones realizan funciones adicionales, lo que provoca efectos secundarios y un rendimiento reducido cuando se necesita la serialización de instrucciones independientes. (CPUIDAdemás, tiene el problema de que provoca un #VMEXIT obligatorio cuando se ejecuta bajo virtualización, lo que genera una sobrecarga muy grande). LaSERIALIZEinstrucción realiza únicamente la serialización, evitando estos costos adicionales. - ↑ CPUID proporcionaun mapa de bits de los componentes del historial de la CPU que se pueden restablecer . (EAX=20h, ECX=0):EBX. A partir de julio de 2023, se definen los siguientes bits:
HRESET - ↑ La
IBHFinstrucción solo es efectiva en el Anillo 0.IBHFSe permite ejecutar la instrucción en los anillos 1/2/3, [ 167 ] pero se ejecutará como unaNOPsin funcionalidad de barrera de historial de bifurcación.En los procesadores que no admiten IBHF, la instrucción se ejecutará
NOPindependientemente del anillo. - ↑ La
IBHFinstrucción se añadió a los procesadores Intel Alder Lake y posteriores mediante una actualización de microcódigo en mayo de 2025. - ↑ El argumento de registro
SENDUIPIes un índice para seleccionar una entrada de la UITT (Tabla de destino de interrupción de usuario, una tabla especificada por los nuevosUINTR_TTMSRUINT_MISC) . - ↑ En los procesadores Sapphire Rapids , la
UIRETinstrucción siempre establece UIF (User Interrupt Flag) en 1. En los procesadores Sierra Forest y posteriores,UIRETestablecerá UIF al valor del bit 1 del valor extraído de la pila para RFLAGS; esta funcionalidad se indica medianteCPUID.(EAX=7,ECX=1):EDX[17]. - ↑ Para
ENQCMDyEMQCMDS, el tamaño del operando del argumento del registro viene dado por el tamaño de la dirección actual, que puede ser anulado con el67hprefijo. - 1 2 Para las
RDMSRLISTyWRMSRLIST, las direcciones especificadas en los registros RSI y RDI deben estar alineadas a 8 bytes. - ↑ Los códigos de condición admitidos para lasinstrucciones (código de operacióncon el nibble x que especifica la condición) son:
CMPccXADDVEX.128.66.0F38 Ex /r - ↑Even though the
CMPccXADDinstructions perform a locked memory operation, they do not require or accept theLOCK(F0h) prefix - attempting to use this prefix results in #UD.
Added with other AMD-specific extensions
- ↑The standard way to access the CR8 register is to use an encoding that makes use of the
REX.Rprefix, e.g.44 0F 20 07(MOV RDI,CR8). However, theREX.Rprefix is only available in 64-bit mode.The AltMovCr8 extension adds an additional method to access CR8, using theF0(LOCK) prefix instead ofREX.R– this provides access to CR8 outside 64-bit mode. - 12Like other variants of MOV to/from the CRx registers, the AltMovCr8 encodings ignore the top 2 bits of the instruction's ModR/M byte, and always execute as if these two bits are set to
11b.The AltMovCr8 encodings are available in 64-bit mode. However, combining theLOCKprefix with theREX.Rprefix is not permitted and will cause an #UD exception. - ↑Support for AltMovCR8 was added in stepping F of the AMD K8, and is not available on earlier steppings.
- ↑For
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.TheCLZEROinstruction 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.[170] - ↑The register numbering used by
RDPRUdoes not necessarily match that ofRDMSR/WRMSR.The registers supported byRDPRUas of December 2022 are: Unsupported values in ECX return 0. - ↑If
CR4.TSD=1, then theRDPRUinstruction can only run in ring 0.
x87 floating-point instructions
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.
Original 8087 instructions
- ↑x87 coprocessors (other than the 8087) handle exceptions in a fairly unusual way. When an x87 instruction generates an unmasked arithmetic exception, it will still complete without causing a CPU fault – instead of causing a fault, it will record within the coprocessor information needed to handle the exception (instruction pointer, opcode, data pointer if the instruction had a memory operand) and set FPU status-word flag to indicate that a pending exception is present. This pending exception will then cause a CPU fault when the next x87, MMX or
WAITinstruction is executed.The exception to this is x87's "Non-Waiting" instructions, which will execute without causing such a fault even if a pending exception is present (with some caveats, see application note AP-578[171]). These instructions are mostly control instructions that can inspect and/or modify the pending-exception state of the x87 FPU. - ↑For each non-waiting x87 instruction whose mnemonic begins with
FN, there exists a pseudo-instruction that has the same mnemonic except without the N. These pseudo-instructions consist of aWAITinstruction (opcode9B) followed by the corresponding non-waiting x87 instruction. For example:FNCLEXis an instruction with the opcodeDB E2. The corresponding pseudo-instructionFCLEXis then encoded as9B DB E2.FNSAVE ES:[BX+6]is an instruction with the opcode26 DD 77 06. The corresponding pseudo-instructionFSAVE ES:[BX+6]is then encoded as9B 26 DD 77 06
- 12The FPU initialization performed by the
F(N)INITandF(N)SAVEinstructions will set x87 FPU registers as follows:- The FPU Control Word id set to
0x03FFon the 8087,[172] or0x037Fon 80287 and later FPUs (64-bit precision, round-to-nearest, all exceptions masked, interrupts enabled for the 8087) - The FPU Status Word is set to all-0s (except that on 8087/80287 FPUs, the CC bits may be left unmodified)
- The FPU Tag Word is set to
0xFFFF(marking all registers as Empty) - On i486 and later processors, the FPU exception pointer registers (FCS,FIP,FDS,FDP,FOP) are set to 0.
- The FPU Control Word id set to
- ↑On 80387 and earlier FPUs, if an
FNINITinstruction is issued before a previous memory-referencing x87 instruction has completed, then any memory bus cycles associated with that previous x87 instruction may be aborted.[173] - 12For detection of x87 coprocessors on systems that don't support
CPUID, it is common to issue anFNINITfollowed by anFNSTCWorFNSTSWand then check that theFNSTCW/FNSTSWwrote the expected value to memory. On the 8087, such a detection procedure requires at least two intervening integer instructions between theFNINITand the followingFNSTCW/FNSTSWto work correctly.[172] - ↑
F(N)STSWwith the AX register as a destination is available on 80287 and later, but not on the 8087. - 1234On 80387 and later x87 FPUs,
FLDENV,F(N)STENV,FRSTORandF(N)SAVEexist 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/FRSTORwill 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 theCS.Dbit and the presence of the66hinstruction prefix. On 8087 and 80287, only the 16-bit variants are available.64-bit variants of these instructions do not exist – usingREX.Wunder 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 useFXSAVE64/FXRSTOR64instead if 64-bit operation is desired. - 12In the case of an x87 instruction producing an unmasked FPU exception, the 8087 FPU will signal an IRQ some indeterminate time after the instruction was issued. This may not always be possible to handle,[172] and so the FPU offers the
F(N)DISIandF(N)ENIinstructions to set/clear the Interrupt Mask bit (bit 7) of the x87 Control Word,[174] to control the interrupt.Later x87 FPUs, from 80287 onwards, changed the FPU exception mechanism to instead produce a CPU exception on the next x87 instruction. This made the Interrupt Mask bit unnecessary, so it was removed.[175] In later Intel x87 FPUs, theF(N)ENIandF(N)DISIinstructions were kept for backwards compatibility, executing as NOPs that do not modify any x87 state. - 123
FST/FSTPwith an 80-bit destination (m80 or st(i)) and an sNaN source value is documented to 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. - 123456789Intel x87 alias opcode. Use of this opcode is not recommended.On the Intel 8087 coprocessor, several reserved opcodes would perform operations behaving similarly to existing defined x87 instructions. These opcodes were documented for the 8087[176] and 80287,[177] but then omitted from later manuals until the October 2017 update of the Intel SDM.[178]They are present on all known Intel x87 FPUs but unavailable on some older non-Intel FPUs, such as AMD Geode GX/LX, DM&P Vortex86[179] and NexGen 586PF.[180]
- 12On the 8087 and 80287,
FBSTPand 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. - 123456789For the
FADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPandFXCHinstructions, 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. - ↑On Intel Pentium and later processors,
FXCHis 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. - 12On Intel Pentium processors without MMX, the fastest way to copy data from system memory to uncached memory (such as video memory) was to use the m64 forms of
FILDandFISTPin a loop.[181] This method has been used in some MS-DOS games such as Carmageddon and Pete Sampras Tennis '97.A recurring problem in x86 emulators that emulate the x87 FPU registers with a data-format that has less than 64 bits of mantissa precision (e.g. FP64 numbers, which have only 53 mantissa bits) is that when such
FILD/FISTPloops are mapped to int64↔FP64 conversions, some low-order data bits of each 64-bit data item will be lost. In the case of e.g. framebuffer data, such data loss will show up as vertical stripes every 8 pixels.[182][183] - 12For the
FISTandFISTPinstructions, if the top-of-stack value, after being rounded to integer, is too small or too large to be represented in the destination memory format, then the value stored to memory will not be clamped - instead, the x87 "Integer Indefinite" value will be stored. This is a value that has the top bit set to 1 and all other bits set to 0. (e.g.0x8000for 16-bit integers.) The Integer Indefinite value will also be used if the top-of-stack value is Empty, NaN or ±∞. - ↑The result of executing the
FBLDinstruction on non-BCD data is undefined. - ↑For the
FBSTPinstruction, if the top-of-stack value is NaN or has a value that or greater after rounding, the x87 "BCD Indefinite" value will be stored. On 486 and later, this is0xFFFFC000000000000000, while earlier x87 FPUs used0xFFFF8000000000000000.[184] - 12On early Intel Pentium processors, floating-point divide was subject to the Pentium FDIV bug. This also affected instructions that perform divide as part of their operations, such as
FPREM,FPTANandFPATAN.[185] - ↑The
FXAMinstruction 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. - ↑For
FXTRACT, the behavior that results from st(0) being zero or ±∞, differs between 8087 and 80387:- If st(0) is ±0, then on 8087/80287, E and M are both set equal to st(0) with no exception reported — on 80387 and later, M is set equal to st(0), E is set to -∞, and a zero-divide exception is raised.
- If st(0) is ±∞, then on 8087/80287, an invalid-operation exception is raised and both M and E are set to NaN — on 80387 and later, M is set equal to st(0) and E is set to +∞ with no exception reported.[173]
- ↑For
FPREM, if the quotient Q is larger than , then the remainder calculation may have been done only partially – in this case, theFPREMinstruction will need to be run again in order to complete the remainder calculation. This is indicated by the instruction settingC2to 1.If the instruction did complete the remainder calculation, it will setC2to 0 and set the three bits{C0,C3,C1}to the bottom three bits of the quotient Q.On 80387 and later, if the instruction didn't complete the remainder calculation, then the computed remainder Q used for argument reduction will have been rounded to a multiple of 8 (or larger power-of-2), so that the bottom 3 bits of the quotient can still be correctly retrieved in a later pass that does complete the remainder calculation. - ↑The remainder computation done by the
FPREMinstruction is always exact with no roundoff errors. - ↑For the
FSCALEinstruction 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.These restrictions were removed in the 80387. - ↑For
FSCALE, rounding is only applied in the case of overflow, underflow or subnormal result. - ↑The x87 transcendental instructions do not obey PC or RC, but instead compute full 80-bit results. These results are not necessarily correctly rounded (see Table-maker's dilemma) – they may have an error of up to ±1 ulp on Pentium or later, or up to ±1.5 ulps on earlier x87 coprocessors.
- 12For the
FYL2XandFYL2XP1instructions, 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.FYL2Xcan produce a #Z (divide-by-zero exception) if st(0)=0 and st(1) is a finite nonzero value.FYL2XP1, however, cannot produce #Z. - ↑For
FPATAN, the following adjustments are done as compared to just computing a one-argument arctangent of the ratio :- If both st(0) and st(1) are ±∞, then the arctangent is computed as if each of st(0) and st(1) had been replaced with ±1 of the same sign. This produces a result that is an odd multiple of .
- If both st(0) and st(1) are ±0, then the arctangent is computed as if st(0) but not st(1) had been replaced with ±1 of the same sign, producing a result of ±0 or .
- If st(0) is negative (has sign bit set), then an addend of with the same sign as st(1) is added to the result.
- ↑While
FNOPis 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. - ↑On the 8087 FPU (but not any later x87 FPU), the
WAITinstruction was needed before every x87 instruction (except the "non-waiting" instructions) to help ensure that a new x87 instruction was not issued to the FPU before the preceding instruction had completed.On some early x87 coprocessors — in particular the 8087 FPU, as well as the 80287 FPU when used in a 80286 system — the
WAITinstruction was also required to be used before a CPU instruction that attempts to access a memory location that's previously been used as an operand to an x87 data instruction.[177]On 386 and 486 systems with x87 FPUs, this requirement was removed for most x87 instructions that accessed memory, but continued to exist for the
F(N)SAVEinstruction.[186] On Pentium and later processors, this requirement was removed forF(N)SAVEas well. - ↑If the top-of-stack register st(0) is Empty, then the
FSTPNCEinstruction will behave likeFINCSTP, incrementing the stack pointer with no data movement and no exceptions reported.
x87 instructions added in later processors
- ↑The x87 FPU needs to know whether it is operating in Real Mode or Protected Mode because the floating-point environment accessed by the
F(N)SAVE,FRSTOR,FLDENVandF(N)STENVinstructions has different formats in Real Mode and Protected Mode. On 80287, theF(N)SETPMinstruction is required to communicate the real-to-protected mode transition to the FPU. On 80387 and later x87 FPUs, real↔protected mode transitions are handled automatically between the CPU and the FPU without the need for any dedicated instructions – therefore, on these FPUs,FNSETPMexecutes as a NOP that does not modify any FPU state.On the 80287, once the FPU has been brought into Protected Mode operation with the
F(N)SETPMinstruction, it cannot be brought back to Real Mode operation without an FPU reset — on IBM-compatible PCs with 80287/80387 FPUs (but not 80486 and later), such an FPU reset could be performed by writing a byte with the value 0 to I/O portF1h.[187] - ↑Not including discontinued instructions specific to particular 80387-compatible FPU models.
- 12For the
FUCOMandFUCOMPinstructions, 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. - ↑The 80387
FPREM1instruction differs from the olderFPREM(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 byFPREM. LikeFPREM,FPREM1always computes an exact result with no roundoff errors. LikeFPREM, it may also perform a partial computation if the quotient is too large, in which case it must be run again. - 123Due to the x87 FPU performing argument reduction for sin/cos with only about 68 bits of precision, the value of k used in the calculation of
FSIN,FCOSandFSINCOSis not precisely 1.0, but instead given by[188][189][173]This argument reduction inaccuracy also affects theFPTANinstruction.Examples of numbers that produce large relative differences between the
FSINinstruction and the mathematical sine function include:- For ,
FSINwill produce a result of approximately while the true value of is approximately . - For ,
FSINwill produce a result of approximately while the true value of is approximately .
- For ,
- ↑If st(0) is finite and its absolute value is or greater, then the top-of-stack value st(0) is left unmodified and C2 is set, with no exception raised. This applies to the
FSIN,FCOSandFSINCOSinstructions, as well asFPTANon 80387 and later.In this case, theFSINCOSandFPTANinstructions will also abstain from pushing a value onto the x87 register-stack. - ↑The
FCOMI,FCOMIP,FUCOMIandFUCOMIPinstructions write their results to theZF,CFandPFbits of theEFLAGSregister. On Intel but not AMD processors, theSF,AFandOFbits ofEFLAGSare also zeroed out by these instructions. - ↑The
FXSAVEandFXRSTORinstructions were added in the "Deschutes" revision of Pentium II, and are not present in earlier "Klamath" revision.They are also present in AMD K7.They are also considered an integral part of SSE and are therefore present in all processors with SSE. - 12The
FXSAVEandFXRSTORinstructions will save/restore SSE state only on processors that support SSE. Otherwise, they will only save/restore x87 and MMX state.The x87 section of the state saved/restored byFXSAVE(64)/FXRSTOR(64)has a completely different layout than the data structure of the olderF(N)SAVE/FRSTORinstructions, enabling faster save/restore by avoiding misaligned loads and stores.FXSAVEandFXRSTORrequire their memory argument to be 16-byte aligned. - 12When floating-point emulation is enabled with
CR0.EM=1,FXSAVE(64)andFXRSTOR(64)are considered to be x87 instructions and will accordingly produce an #NM (device-not-available) exception. Other thanWAIT, these are the only opcodes outside theD8..DFESC opcode space that exhibit this behavior.Except on Netburst (Pentium 4 family) CPUs, all opcodes inD8..DFwill produce #NM ifCR0.EM=1, even for undefined opcodes that would produce #UD otherwise. - ↑Unlike the older
F(N)SAVEinstruction,FXSAVEwill not initialize the FPU after saving its state to memory, but instead leave the x87 coprocessor state unmodified. - 12The
FXSAVE64/FXRSTOR64instruction differ from theFXSAVE/FXRSTORinstructions in that:FXSAVE/FXRSTORwill save/restore FIP and FDP as 32-bit items, and will also save/restore FCS and FDS as 16-bit items.FXSAVE64/FXRSTOR64will save/restore FIP and FDP as 64-bit items while not saving/restoring FCS and FDS.
XSAVE/XRSTORvsXSAVE64/XRSTOR64instructions.As a result, saving both FCS/FDS and the top 32 bits of 64-bit FIP/FDP cannot be accomplished with 1 instruction, but instead requires running both(F)XSAVEand(F)XSAVE64. This has been known to cause problems, especially for 64-bit hypervisors running 16/32-bit guests.[190][191] - ↑The
FISTTPinstruction will, like the olderFISTandFISTPinstructions, store the x87 "Integer Indefinite" value if the top-of-stack value is too small/large to be represented in the memory destination format.
SIMD instructions
Cryptographic instructions
Virtualization instructions
Other instructions
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.
Undocumented x86 instructions
The x86 CPUs contain undocumented instructions which are implemented on the chips but not listed in some official documents. They can be found in various sources across the Internet, such as Ralf Brown's Interrupt List and at sandpile.org
Some of these instructions are widely available across many/most x86 CPUs, while others are specific to a narrow range of CPUs.
Undocumented instructions that are widely available across many x86 CPUs include
Undocumented instructions that appear only in a limited subset of x86 CPUs include
Undocumented x87 instructions
See also
References
- ↑"Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
- ↑"Intel 80x86 Instruction Set Summary"(PDF). eecs.wsu.edu. Archived(PDF) from the original on 2024-07-05. Retrieved 2024-06-29.
- ↑"Intel x85 JUMP quick reference". Archived from the original on 2025-04-07. Retrieved 2025-04-01..
- ↑Vintage Computer Federation, "8088/8086 microcode disassembly" discussion thread, comment #27 on 3 Oct 2020. Archived on 24 Oct 2022.
- 12Intel, iAPX86/88, 186/188 User's ManualArchived 2025-10-27 at the Wayback Machine, order no. 210911-001, March 1983, page 69
- 12Intel, 80286 and 80287 Programmer's Reference ManualArchived 2025-10-17 at the Wayback Machine, order no. 210498-005, 1987, pages 107 and 248
- ↑IBM, PC/AT Technical ReferenceArchived 2025-11-14 at the Wayback Machine, document number 6183355, March 1986 — lists IIMUL on page 438
- ↑AMD, x86-64 Architecture Programmer’s Manual Volume 3Archived 2023-01-18 at the Wayback Machine, pub.no. 24594, rev 3.02, August 2002, see
ENTERinstruction entry on page 138. - ↑Michal Necasek, SGDT/SIDT Fiction and Reality, 4 May 2017. Archived on 29 Nov 2023.
- ↑Michal Necasek, Nobody Expects ..., OS/2 Museum, 14 Apr 2021 — mentions
SGDTused for CPU detection. Archived on 14 Apr 2021. - ↑Vogons discussion forum, re:test386.asm CPU tester, see comment from "TheGreatCodeholio" on 20 Aug 2018 - mentions
SGDTused for CPU detection. Archived on 20 Apr 2026. - ↑Intel, 80286 and 80287 Programmer's Reference Manual, order no. 210498-005, 1987, section 10.4.2 on page 185.
- ↑rep_lodsb, "on:80386 Memory Pipeline, Hacker News comment section, 19 Apr 2026. Archived on 20 Apr 2026.
- 12Intel, Undocumented iAPX 286 Test Instruction. Archived on 20 Dec 2023.
- ↑WikiChip, UMIP – x86. Archived on 16 Mar 2023.
- ↑Oracle Corp, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, section 3.5: Details About Software Virtualization. Archived on 8 Dec 2023.
- ↑MBC Project, Virtual Machine Detection (permanent link)Archived 2023-08-30 at the Wayback Machine or Virtual Machine Detection (non permanent link)Archived 2023-08-30 at the Wayback Machine
- ↑Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), chapter 8, p.249,257.
- ↑US Patent 4974159Archived 2022-04-24 at the Wayback Machine, "Method of transferring control in a multitasking computer system" mentions 63h/ARPL.
- ↑Intel, Pentium® Processor Family Developer’s Manual, Volume 3Archived 2023-04-22 at the Wayback Machine, 1995, order no. 241430-004, section 12.7, p. 323
- ↑Intel, How Microarchitectural Data Sampling works, see mitigations section. Archived on Dec 2, 2025.
- ↑Linux kernel documentation, Microarchitectural Data Sampling (MDS) mitigationArchived 2020-10-21 at the Wayback Machine
- ↑AMD, Technical Guidance For Mitigating Transient Scheduler Attacks, rev 2.0, July 2025, page 3. Archived on 14 Aug 2025.
- ↑Intel, Processor MMIO Stale Data Vulnerabilities, 14 Jun 2022 - see "VERW Buffer Overwriting Details" section. Archived on 3 Oct 2024.
- ↑VCF Forums, I found the SAVEALL opcode, jun 21, 2019. Archived on 13 Apr 2023.
- ↑rep lodsb, Intel 286 secrets: ICE mode and F1 0F 04, aug 12, 2022. Archived on 8 Dec 2023.
- ↑LKML, (PATCH) x86-64, espfix: Don't leak bits 31:16 of %esp returning to 16-bit stack, Apr 29, 2014. Archived on Jan 4, 2018
- ↑Raymond Chen, Getting MS-DOS games to run on Windows 95: Working around the iretd problem, Apr 4, 2016. Archived on Mar 15, 2019
- ↑AMD, AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions, pub.no. 24594, rev 3.37, jul 2025, pages 123-124. Archived on 11 Aug 2025.
- ↑David Howells, (tip:x86/asm) x86_64, asm: Optimise fls(), ffs() and fls64(), 15 dec 2011, Linux Kernel Mailing List. Archived on 15 Mar 2026.
- ↑Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2 (2A, 2B, 2C, & 2D): Instruction Set Reference, A-Z, order no. 325383-090, Feb 2026, pages 225 and 227. Archived on 15 Feb 2026.
- ↑Robert L. Hummel, PC Magazine Programmer's Technical Reference, 1992, ISBN 1-56276-016-5, page 362.
- ↑sandpile.org, x86 architecture rFLAGS register, see note #7. Archived on 3 Nov 2011.
- ↑Intel, 386DX Microprocessor Porgrammer's Reference Manual, order no. 230985-003, 1990, sections 10.3.3 and 10.4.2 on pages 234-236
- ↑iPXE, Commit bc35b24: Fix use of writable code segment on 486 and earlier CPUs, Github, Feb 2, 2022 − indicates that when leaving protected mode on 386/486 by writing to
CR0, it is specifically necessary to do a farJMP(opcodeEA) in order to restore proper real-mode access-rights for the CS segment, and that other far control transfers (e.g.RETF,IRET) will not do this. Archived on 4 Nov 2024. - ↑Michal Necasek, SCO UNIX 3.2v4.0 vs. IA-32 Semantics Changes, 25 jan 2013. OS/2 Museum. Archived on 21 Feb 2026.
- ↑Can Bölük, Speculating the entire x86-64 Instruction Set In Seconds with This One Weird Trick, Mar 22, 2021. Archived on Mar 23, 2021.
- 12Robert Collins, Undocumented OpCodes, 29 july 1995. Archived on 21 feb 2001
- ↑Michal Necasek, ICEBP finally documented, OS/2 Museum, May 25, 2018. Archived on 6 June 2018
- ↑Intel, AP-526: Optimization For Intel's 32-bit Processors, order no. 242816-001, october 1995 – lists
SALCon page 83,INT1on page 86 andFFREEPon page 114. Archived from the original on 22 Dec 1996. - ↑AMD, AMD 64-bit Technology, vol 2: System ProgrammingArchived 2023-07-25 at the Wayback Machine, order no. 24593, rev 3.06, aug 2002, page 248
- ↑"Intel 80386 CPU Information | PCjs Machines". www.pcjs.org. Archived from the original on 2023-11-13. Retrieved 2022-01-07.
- ↑Geoff Chappell, CPU Identification before CPUID, 27 Jan 2020. Archived on 7 Apr 2023.
- ↑Jeff Parsons, Obsolete 80386 Instructions: IBTS and XBTS, PCjs Machines. Archived on Sep 19, 2020.
- ↑Robert Collins, The LOADALL Instruction. Archived from the original on Jun 5, 1997.
- ↑Toth, Ervin (1998-03-16). "BSWAP with 16-bit registers". Archived from the original on 1999-11-03.
The instruction brings down the upper word of the doubleword register without affecting its upper 16 bits.
- ↑Coldwin, Gynvael (2009-12-29). "BSWAP + 66h prefix". Archived from the original on 2018-10-03. Retrieved 2018-10-03.
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
- ↑Intel "i486 Microprocessor"Archived 2021-12-02 at the Wayback Machine (April 1989, order no. 240440-001) p.142 lists
CMPXCHGwith0F A6/A7encodings. - ↑Intel "i486 Microprocessor" (November 1989, order no. 240440-002) p.135 lists
CMPXCHGwith0F B0/B1encodings. - ↑"Intel 486 & 486 POD CPUID, S-spec, & Steppings". Archived from the original on 2022-04-09. Retrieved 2022-01-08.
- ↑Intel, Software Guard Extensions Programming ReferenceArchived 2023-04-07 at the Wayback Machine, order no. 329298-002, oct 2014, sections 3.5 and 3.6.5.
- ↑Intel, Extended Memory 64 Technology Software Developer’s Guide Volume 2, rev 1.1. order no. 300835-002, 2004. pages 207,208,300. Archived from the original on 31 May 2005.
- ↑Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z and later, order no. 253667-023, May 2007, pages 246,248,410. Archived on 30 Jan 2014.
- ↑AMD, Live Migration with AMD-V Extended Migration Technology pub.no. 43781, rev 3.00, Apr 2008. mentions password in EDI on page 15. Archived from the original on 20 Jan 2013.
- ↑CBID, Undocumented Machine-Specific Registers, 16 Apr 2006. Archived from the original on 29 Nov 2012.
- ↑Christopher Domas, The ring 0 facade: awakening the processor's inner demons, Aug 2018, pages 44 and 57. Archived on 14 Sep 2024
- ↑Czerno, Direct access to Physical Memory on AMD K7 processors, 4 Jan 2011. Archived from the original on 3 Jan 2014.
- ↑Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual, order no. 325462-090, Feb 2026, see entry on
RDMSRLISTinstruction (vol 2B, page 1831) for MSR read-ordering rules, Vol 3 section 13.12.3 on page 3592 for x2APIC MSR access-ordering rules and Vol 4 Table 2.2 on page 4708 forIA32_BARRIERrules. Archived on 12 Feb 2026. - ↑AMD, AMD64 Architecture Programmer’s Manual Volumes 1–5, pub.no. 40332, rev 4.08, apr 2024, see vol 2, section 16.11.2 on page 1112 for x2APIC MSR access-ordering rules. Archived on 6 Mar 2026.
- ↑Frank van Gilluwe, "The Undocumented PC, second edition", 1997, ISBN 0-201-47950-8, page 55
- ↑Daming Chen and Gail-Joon Ahn, Security Analysis of x86 Processor Microcode, 11 dec 2014, page 8. Archived on 8 Mar 2016.
- ↑AMD, Revision Guide for AMD Athlon 64 and AMD Opteron Processors pub.no. 25759, rev 3.79, July 2009, page 34. Archived on 20 Dec 2023.
- ↑Intel, Software Developer’s Manual, vol 3AArchived 2023-03-04 at the Wayback Machine, order no. 253668-078, Dec 2022, section 9.3, page 299.
- ↑Intel, CPUID Enumeration and Architectural MSRs, 8 Aug 2023. Archived on 23 May 2024.
- ↑AMD, PPR for AMD Family 19h Model 61h, Revision B1 processors, document no. 56713, rev 3.05, mar 8 2023, page 116. Archived on Apr 25, 2023.
- ↑LKML, (PATCH 5.4 55/65) x86/apic: Add extra serialization for non-serializing MSRsArchived 2025-09-07 at the Wayback Machine, 8 Feb 2021
- ↑Linux kernel, git commit: x86/barrier: Do not serialize MSR accesses on AMDArchived 2025-01-23 at the Wayback Machine, 13 Nov 2023
- ↑"RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
- ↑Microprocessor Report, System Management Mode Explained (vol 6, no. 8, june 17, 1992). Archived on Jun 29, 2022.
- ↑Ellis, Simson C., "The 386 SL Microprocessor in Notebook PCs", Intel Corporation, Microcomputer Solutions, March/April 1991, page 20
- ↑Cyrix 486SLC/e Data Sheet (1992)Archived 2022-03-02 at the Wayback Machine, section 2.6.4
- ↑Linux 6.3 kernel sources, /arch/x86/include/asm/cpuid.hArchived 2023-04-27 at the Wayback Machine, line 69
- ↑gcc-patches mailing list, CPUID Patch for IDT Winchip, May 21, 2019. Archived on Apr 27, 2023.
- ↑Intel, Intel® Virtualization Technology FlexMigration Application Note order no. 323850-004, oct 2012, section 2.3.2 on page 12. Archived on Oct 13, 2014.
- ↑Intel, Atom Processor C3000 Product Family Datasheet order no. 337018-002, Feb 2018, pages 133, 3808 and 3814. Archived on Feb 9, 2022.
- ↑AMD, AMD64 Architecture Programmer’s Manual Volume 3Archived 2023-04-27 at the Wayback Machine pub.no. 24594, rev 3.34, oct 2022, p. 165 (entry on
CPUIDinstruction) - ↑Robert Collins, CPUID Algorithm Wars, nov 1996. Archived from the original on dec 18, 2000.
- ↑Geoff Chappell, CMPXCHG8B Support in the 32-Bit Windows Kernel, 23 jan 2008. Archived on 5 Nov 2023.
- 12Intel, Software Developer's ManualArchived 2022-12-29 at the Wayback Machine, order no. 325426-077, Nov 2022 – the entry on the
RDTSCinstruction on p.1739 describes the instruction sequences required to order theRDTSCinstruction with respect to earlier and later instructions. - ↑Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3B, order no. 253669-090, Feb 2026, section 20.17.3, page 190. Archived on 17 Feb 2026
- ↑Linux kernel 5.4.12, /arch/x86/kernel/cpu/centaur.cArchived 2023-01-24 at the Wayback Machine
- ↑(PATCH) Mark TSC on GeodeLX reliableArchived 2025-10-11 at the Wayback Machine, Linux kernel patch, 16 Feb 2007.
- ↑Stack Overflow, Can constant non-invariant tsc change frequency across cpu states? Accessed 24 Jan 2023. Archived on 24 Jan 2023.
- ↑CPU-World, CPUID for Zhaoxin KaiXian KX-5000 KX-5650 (by timw4mail), 24 Apr 2024. Archived on 26 Apr 2024.
- 12Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual, order no. 325462-091, Mar 2026, see NOP instruction entry on page 1449, and Volume 3B, section 20.17 "Time Stamp Counter" on page 2853. Archived on 21 Apr 2026.
- ↑Michal Necasek, "Undocumented RDTSC", 27 Apr 2018. Archived on 16 Dec 2023.
- ↑"RDTSC GPF's in V86 mode on AMD K6". Newsgroup: comp.os.ms-windows.programmer.vxd. 2 Nov 1999. Archived from the original on 15 September 2025. Retrieved 15 September 2025.
- ↑Willy Tarreau, Re: i686 quirk for AMD GeodeArchived 2025-10-11 at the Wayback Machine, Linux Kernel Mailing List, 10 Nov 2009.
- ↑Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, section 3.5.1.9, page 119. Archived on 9 May 2024.
- ↑H. Peter Anvin, x86: completely disable NOPL on 32 bits, Linux kernel patch, 16 sep 2008. Archived on 22 Oct 2022.
- ↑JookWiki, "nopl", sep 24, 2022 – provides a lengthy account of the history of the long NOP and the issues around it. Archived on oct 28, 2022.
- 12Intel Community: Multibyte NOP Made Official. Archived on 7 Apr 2022.
- ↑Intel Software Developers Manual, vol 3BArchived 2023-06-02 at the Wayback Machine (order no 253669-076us, December 2021), section 22.15 "Reserved NOP"
- ↑Intel, US Patent 5701442A: Method of modifying an instruction set architecture of a computer processor to maintain backward compatibility, granted in 1997 and expired in 2015 — covers the use of the
0F 18..1Fopcode range as reserved-NOPs. - ↑AMD, AMD 64-bit Technology – AMD x86-64 Architecture Programmer’s Manual Volume 3Archived 2023-01-18 at the Wayback Machine, publication no. 24594, rev 3.02, aug 2002, page 379.
- ↑Debian bug report logs, -686 build uses long noops, that are unsupported by Transmeta Crusoe, immediate crash on boot, see messages 148 and 158 for NOPL on VIA C7. Archived on 1 Aug 2019
- ↑Intel, Intel Architecture Software Developer’s Manual, Volume 2Archived 2023-04-22 at the Wayback Machine, 1997, order no. 243191-001, pages 3-9 and A-7.
- ↑John Hassey, Pentium Pro changes, GAS2 mailing list, 28 dec 1995 – patch that added the
UD2AandUD2Binstruction mnemomics to GNU Binutils. Archived on 25 Jul 2023. - ↑Jan Beulich, x86: correct UDn, binutils-gdb mailing list, 23 nov 2017 – Binutils patch that added ModR/M byte to
UD1/UD2Band addedUD0. Archived on 25 Jul 2023. - ↑Intel, Intel Pentium 4 and Intel Xeon Processor Optimization Reference Manual, order no. 248966-007, see "Assembly/Compiler Coding Rule 13" on page 74. Archived from the original on 16 Mar 2003.
- ↑Intel, Pentium® Processor Family Developer's Manual Volume 3Archived 2023-04-22 at the Wayback Machine, 1995. order no. 241430-004, appendix A, page 943 – reserves the opcodes
0F 0Band0F B9. - 12AMD, AMD64 Architecture Programmer’s Manual Volume 3Archived 2023-04-22 at the Wayback Machine, publication no. 24594, rev 3.17, dec 2011 – see page 416 for
UD0and page 415 and 419 forUD1. - 123Intel, Software Developer's Manual, vol 2BArchived 2022-01-08 at the Wayback Machine, order no. 253667-061, dec 2016 – lists
UD1(with ModR/M byte) andUD0(without ModR/M byte) on page 4-687. - ↑Stecklina, Julian (2019-02-08). "Fingerprinting x86 CPUs using Illegal Opcodes". x86.lol. Archived from the original on 15 Dec 2023. Retrieved 2023-12-15.
- ↑"ud0 length fix · intelxed/xed@7561f54". GitHub. Archived from the original on 1 Jun 2023. Retrieved 2023-12-15.
- ↑AMD, AMD64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.36, march 2024 – see description of
UD1instruction on page 356. Archived on 29 Dec 2024. - 12Cyrix, 6x86 processor data bookArchived 2023-05-17 at the Wayback Machine, 1996, order no. 94175-01, table 6-20, page 209 – uses the mnemonic
OIO("Official invalid opcode") for the0F FFopcode. - ↑Intel, Software Developer's Manual, vol 2BArchived 2023-04-22 at the Wayback Machine, order no. 253667-064, oct 2017 – lists
UD0(with ModR/M byte) on page 4-683. - ↑AMD, AMD-K5 Processor Technical Reference ManualArchived 2024-02-26 at the Wayback Machine, Nov 1996, order no. 18524C/0, section 3.3.7, page 90 – reserves the
0F FFopcode without assigning it a mnemonic. - ↑AMD, AMD-K6 Processor Data SheetArchived 2023-03-04 at the Wayback Machine, order no. 20695H/0, March 1998, section 24.2, page 283.
- ↑George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 13 june 2012. Archived on Mar 15, 2019.
- ↑flat assembler 1.73 Programmer's manual, section 2.1.19. Archived on 28 Nov 2018.
- ↑Intel, AP-485: Intel® Processor Identification and the CPUID InstructionArchived 2023-01-30 at the Wayback Machine, order no. 241618-039, may 2012, section 5.1.2.5, page 32
- ↑Michal Necasek, "SYSENTER, Where Are You?", 20 Jul 2017. Archived on 29 Nov 2023.
- ↑AMD, Athlon Processor x86 Code Optimization Guide, publication no. 22007, rev K, feb 2002, appendix F, page 284. Archived on 13 Apr 2017.
- ↑Transmeta, Processor RecognitionArchived 2023-01-19 at the Wayback Machine, May 7, 2002.
- ↑VIA, VIA C3 Nehemiah Processor DatasheetArchived 2023-01-08 at the Wayback Machine, rev 1.13, sep 29, 2004, page 17
- ↑CPU-World, CPUID for Intel Xeon 3.40 GHzArchived 2022-10-26 at the Wayback Machine – Nocona stepping D CPUID without CMPXCHG16B
- ↑CPU-World, CPUID for Intel Xeon 3.60 GHzArchived 2022-10-26 at the Wayback Machine – Nocona stepping E CPUID with CMPXCHG16B
- ↑SuperUser StackExchange, How prevalent are old x64 processors lacking the cmpxchg16b instruction?Archived 2022-10-26 at the Wayback Machine
- ↑Intel SDM order no. 325462-077Archived 2023-06-02 at the Wayback Machine, apr 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension" lists MOVSXD without REX.W as "discouraged"
- ↑H. Peter Anvin, [PATCH 1/1] x86: add "udb" opcode (permanent official #UD in 64-bit mode)Archived 2025-08-20 at the Wayback Machine, GNU binutils mailing list, 11 Aug 2025.
- ↑Anandtech, AMD Zen 3 Ryzen Deep Dive Review, nov 5, 2020, page 6
- ↑@instlatx64 (October 31, 2020). "Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7" (Tweet). Retrieved 2023-01-20– via Twitter.
- ↑Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub. Archived from the original on 20 January 2023. Retrieved 20 January 2023.
- ↑Intel, Control-flow Enforcement Technology SpecificationArchived 2022-05-22 at the Wayback Machine (v3.0, order no. 334525-003, March 2019)
- ↑Intel SDM, rev 076, December 2021Archived 2022-05-22 at the Wayback Machine, volume 1, section 18.3.1
- ↑Binutils mailing list: x86: CET v2.0: Update NOTRACK prefixArchived 2022-03-13 at the Wayback Machine
- ↑Ewan Hai, [PATCH 2/3] target/i386: Introduce Zhaoxin Shijidadao-Client CPU model, qemu-devel mailing list, 22 Sep 2025.
- ↑AMD, Extensions to the 3DNow! and MMX Instruction SetsArchived 2023-01-01 at the Wayback Machine, ref no. 22466D/0, March 2000, p.11
- ↑Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z, order no. 253667-051, June 2014, entry on
SFENCEinstruction on p.357. Archived from the original on 24 Jul 2014. - ↑AMD, AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions, pub.no. 24594, rev 3.04, apr 2003, appendix A.2.5 on page 382. Archived from the original on 2 Aug 2003.
- ↑Hadi Brais, The Significance of the x86 SFENCE instructionArchived 2022-12-28 at the Wayback Machine, 26 Feb 2019.
- ↑Intel, Software Developer's ManualArchived 2022-12-29 at the Wayback Machine, order no. 325426-077, Nov 2022, Volume 1, section 11.4.4.3, page 276.
- ↑Hadi Brais, The Significance of the LFENCE instructionArchived 2023-06-10 at the Wayback Machine, 14 May 2018
- ↑AMD, Software techniques for managing speculation on AMD processor, rev 3.8.22, 8 March 2022, page 4. Archived on 13 March 2022.
- ↑Intel, Software Developer's Manual, order no. 325426-084, June 2024, vol 3A, section 11.12.3, page 3411 - covers the use of the
MFENCE;LFENCEsequence to enforce ordering between a memory store and a later x2apic MSR write. Archived on 4 Jul 2024 - ↑Intel, Prescott New Instructions Software Developer’s Guide, order no. 252490-003, june 2003, pages 3-26 and 3-38 list
MONITORandMWAITwith explicit operands. Archived on 9 May 2005. - ↑Flat Assembler messageboard, "BLENDVPS/BLENDVPD/PBLENDVB syntax", also covers
MONITOR/MWAITmnemonics. Archived on 6 Nov 2022. - ↑Intel, Intel® Xeon Phi™ Product Family x200 (KNL) User mode (ring 3) MONITOR and MWAIT (archived 5 mar 2017)
- ↑AMD, BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h ProcessorsArchived 2024-04-08 at the Wayback Machine, order no. 31116, rev 3.62, page 419. ArchivedArchived 2024-04-08 at the Wayback Machine on Apr 8, 2024.
- ↑R. Zhang et al, (M)WAIT for It: Bridging the Gap between Microarchitectural and Architectural Side Channels, 3 Jan 2023, page 5. Archived from the original on 5 Jan 2023.
- ↑Intel, Architecture Instruction Set Extensions Programming Reference, order no. 319433-052, March 2024, chapter 17. Archived on Apr 7, 2024.
- ↑Guru3D, VIA Zhaoxin x86 4 and 8-core SoC processors launchArchived 2022-12-07 at the Wayback Machine, Jan 22, 2018
- ↑Intel, Desktop 4th Generation Specification Update, order no. 328899-039, apr 2020, see erratum HSD145 on page 56. Archived from the original on 6 Apr 2024.
- ↑Vulners, x86: DoS from attempting to use INVPCID with a non-canonical addressesArchived 2022-11-08 at the Wayback Machine, 20 nov 2018
- ↑Intel, Intel® 64 and IA-32 Architectures Software Developer’s ManualArchived 2023-01-27 at the Wayback Machine volume 3, order no. 325384-078, december 2022, chapter 23.15
- 12Catherine Easdon, Undocumented CPU Behaviour on x86 and RISC-V Microarchitectures: A Security PerspectiveArchived 2023-03-07 at the Wayback Machine, 10 May 2019, page 39
- ↑Instlatx64, Zhaoxin Kaixian KX-6000G CPUID dumpArchived 2023-07-25 at the Wayback Machine, May 15, 2023
- ↑Intel, Willamette Processor Software Developer’s Guide, order no. 245355-001, feb 2000, section 3.5.3, page 294 - lists
HWNT/HSTmnemonics for the branch hint prefixes. Archived from the original on 5 Feb 2005. - ↑Intel, Software Developer's ManualArchived 2024-05-12 at the Wayback Machine, order no. 325462-083, March 2024 - volume 1, chapter 11.4.5, page 281 and volume 2A, chapter 2.1.1, page 525.
- ↑Intel XED source code, src/dec/xed-disas.c, line 325, 11 Nov 2024. Archived on 24 Nov 2024.
- ↑Alan Modra, Pentium4 branch hints, binutils mailing list, 10 Jun 2001. Archived on 28 Dec 2025.
- ↑Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, chapter 2.1.1.1, page 46. Archived on 25 Jan 2025.
- 123Intel, Intel® Software Guard Extensions (Intel® SGX) Architecture for Oversubscription of Secure Memory in a Virtualized Environment, 25 Jun 2017. Archived on 31 Mar 2023.
- ↑Intel, Runtime Microcode Updates with Intel® Software Guard Extensions, sep 2021, order no. 648682 rev 1.0. Archived from the original on 31 mar 2023.
- ↑Intel, 11th Generation Intel® Core™ Processor Desktop Datasheet, Volume 1, may 2022, order no. 634648-004, section 3.5, page 65. Archived on 19 Feb 2025.
- ↑Intel, Which Platforms Support Intel® Software Guard Extensions (Intel® SGX) SGX2?Archived on 25 May 2024.
- 12Intel, Intel Architecture Instruction Set Extensions and Future Features, order no. 319433-044, May 2021, page 20. Archived from the original on 3 Jan 2022.
- ↑InstLatx64, Intel Core i7-1065G7 CPUID dump — has the SGX oversubscription feature bits set (CPUID.(EAX=12h,ECX=0).EAX[6:5]). Archived on 6 Dec 2019.
- ↑Intel, Trust Domain CPU Architectural Extensions, order no. 343754-002, may 2021. Archived on 26 Dec 2022.
- ↑Intel, Asynchronous Enclave Exit Notify and the EDECCSSA User Leaf Function, 30 Jun 2022. Archived on 21 Nov 2022.
- ↑Intel, Intel Architecture Instruction Set Extensions and Future Features order no. 319433-057, March 2025, chapter 14. Archived on 6 Apr 2025.
- ↑@InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23– via Twitter.
- ↑@Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20– via Twitter.
- ↑Intel, Branch History Injection and Intra-mode Branch Target Injection / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598, ID 824191, 12-May-2025, version 1.0, see "Addressing Intra-Mode Branch Target Injection via cBPF" section for description of the new IBHF instruction. Archived on 19 May 2025.
- ↑Intel XED source code /datafiles/ibhf/ibhf-isa.xed.txt line 31, external release v2026.02.17. Archived on 24 Feb 2026.
- ↑Intel, Intel Data Streaming Accelerator Architecture Specification, order no. 341204-004, Sep 2022, pages 13 and 23. Archived on 20 Jul 2023.
- ↑InstLatx64, Lunar Lake CPUID dump — has the feature bit for PBNDKB set (CPUID.(EAX=7,ECX=1).EBX[1]). Archived on 14 May 2025.
- ↑Wikichip, CLZERO – x86Archived 2021-05-09 at the Wayback Machine
- ↑Intel, Application note AP-578: Software and Hardware Considerations for FPU Exception Handlers for Intel Architecture ProcessorsArchived 2023-03-07 at the Wayback Machine, order no. 243291-002, February 1997
- 123Intel, Application Note AP-113: Getting Started With The Numeric Data ProcessorArchived 2022-10-24 at the Wayback Machine, feb 1981 - see page 7 for x87 FPU detection and the
FNINITcontrol-word value on the 8087, and pages 24-25 for interrupt handling and the 8087 interrupt-enable flag. - 123Intel, 80387 Programmer's Reference ManualArchived 2025-01-30 at the Wayback Machine, order no. 231917-001, see section 4.4.12 on page 89 and section C.5 on page 190 for information on
FXTRACTspecial-cases , section 4.4.9 on page 87 for information about theFPTAN(and by extensionFSIN/FCOS/FSINCOS) argument reduction inaccuracy, and section 4.8.1 on page 99 forFNINIT's ability to abort memory bus cycles for the preceding x87 instruction. - ↑Intel, 8087 Math CoprocessorArchived 2022-10-24 at the Wayback Machine, oct 1989, order no. 285385-007, page 3-100, fig 9
- ↑Intel, 80287 80-bit HMOS Numeric Processor ExtensionArchived 2022-10-24 at the Wayback Machine, feb 1983, order no. 201920-001, page 14
- ↑Intel, iAPX86, 88 User's ManualArchived 2022-12-05 at the Wayback Machine, 1981 (order no. 210201-001), p. 797
- 123Intel 80286 and 80287 Programmers Reference ManualArchived 2022-06-29 at the Wayback Machine, 1987 (order no. 210498-005), see page 439 for the need to use of
WAITto synchronize memory operands on the 80287, and page 485 for alias opcodes on the 80287. - ↑Intel Software Developer's ManualArchived 2022-01-05 at the Wayback Machine volume 3B, revision 064, section 22.18.9
- ↑"GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'". Archived from the original on 2022-04-09. Retrieved 2022-07-26.
- ↑Michael Steil, FFREEP – the assembly instruction that never existed, 26 Jun 2006. Archived on 11 Oct 2025.
- ↑Agner Fog, How to optimize for the Pentium family of microprocessors, 3 Jul 2000, see section 27.8. Archived from the original on 21 Nov 2000.
- ↑Dosbox-staging Github repository, issue 1231: Games w/ vertical linesArchived 2025-12-05 at the Wayback Machine, 29 Aug 2021
- ↑Dosbox-pure Github repository, issue 156: (Android) Vertical stripes all over CarmageddonArchived 2025-12-09 at the Wayback Machine, 10 May 2021.
- ↑Norbert Juffa, Everything you always wanted to know about math coprocessors, v1.6a, 1 Oct 1994. Archived on 18 Oct 2021.
- ↑Dusko Koncaliev, Pentium FDIV Bug. Archived on 22 Jan 1998.
- ↑Intel, i486 Programmer's Reference Manual, 1990, order no. 240486-001, page 612
- ↑IBM, Personal System/2 Hardware Interface Technical Reference - Common InterfacesArchived 2025-12-15 at the Wayback Machine, order no. 84F9735, first edition, October 1990, pages 16 and 22.
- ↑Bruce Dawson, Intel Underestimates Error Bounds by 1.3 quintillion, 9 Oct 2014. Archived on 1 Sep 2025.
- ↑Intel SDM, rev 053Archived 2022-02-11 at the Wayback Machine and later, describes the exact argument reduction procedure used for
FSIN,FCOS,FSINCOSandFPTANin volume 1, section 8.3.8 - ↑Michal Necasek, Failing to fail, 16 Jun 2023, OS/2 Museum, see addendum. Archived on 1 Oct 2024.
- ↑VirtualBox issue tracker, ticket 12646: XP Guest GPF in WIN87EM.DLL at 0001:02C9 or 0001:02C6. Archived on 13 Mar 2016.
- ↑Robert Collins, Undocumented OpCodes: AAM. Archived on 21 Feb 2001
- ↑Retrocomputing StackExchange, 0F1h opcode-prefix on i80286. Archived on 13 Apr 2023.
- 12Frank van Gilluwe, "The Undocumented PC – Second Edition", p. 93-95
- ↑Michal Necasek, Intel 486 Errata?, 6 Dec 2015. Archived on 29 Nov 2023.
- ↑Robert Hummel, "PC Magazine Programmer's Technical Reference" (ISBN 1-56276-016-5) p.728
- ↑Raúl Gutiérrez Sanz, Undocumented 8086 Opcodes, Part I, 27 Dec 2017. Archived on 29 Nov 2023.
- 12"Asm, opcode 82h". 24 Dec 1998. Archived from the original on 14 Apr 2023.
- ↑Intel Corporation 2022, p. 3698.
- ↑Intel, The 8086 Family User's Manual, October 1979Archived 2018-04-04 at the Wayback Machine, opcodes omitted on pages 4-25 and 4-31
- ↑Retrocomputing StackExchange, Undocumented instructions in x86 CPU prior to 80386?, 4 Jun 2021. Archived on 18 Jul 2023.
- ↑Daniel B. Sedory, An Examination of the Standard MBR, 2000. Archived on 6 Oct 2023.
- ↑AMD, Software Optimization Guide for AMD64 ProcessorsArchived 2023-01-30 at the Wayback Machine (publication 25112, revision 3.06, sep 2005), section 6.2, p.128
- ↑GCC bugzilla, Bug 48227 – "rep ret" generated for -march=core2. Archived on 9 Apr 2023.
- ↑Raymond Chen, My, what strange NOPs you have!, 12 Jan 2011. Archived on 20 May 2023.
- ↑Jeff Parsons, Intel 80386 CPU information (B1 errata section, item #7). Archived on 13 Nov 2023.
- ↑Intel Software Developers Manual, volume 2BArchived 2022-03-04 at the Wayback Machine (Jan 2006, order no 235667-018, does not have long NOP)
- ↑Intel Software Developers Manual, volume 2BArchived 2022-01-07 at the Wayback Machine (March 2006, order no 235667-019, has long NOP)
- ↑Agner Fog, Instruction TablesArchived 2020-01-10 at the Wayback Machine, AMD K7 section.
- ↑"579838 – glibc not compatible with AMD Geode LX". Archived from the original on 30 Jul 2023.
- ↑Intel Software Developers Manual, volume 2BArchived 2022-03-31 at the Wayback Machine (April 2005, order no 235667-015, does not list 0F0D-nop)
- ↑Intel Software Developers Manual, volume 2BArchived 2022-03-31 at the Wayback Machine (June 2005, order no 235667-016, lists 0F0D-nop in opcode table but not under
NOPinstruction description.) - ↑Intel Software Developers Manual, volume 2BArchived 2022-01-08 at the Wayback Machine (order no. 253667-060, September 2016) does not list
UD0andUD1. - ↑"PCJS : pcjs/x86op0F.js (two-byte x86 opcode handlers), lines 1647–1651". GitHub. 17 April 2022. Archived from the original on 13 Apr 2023.
- ↑"80486 paging protection faults? \ VOGONS". Archived from the original on 9 April 2022.
- ↑"Invalid opcode handling \ VOGONS". Archived from the original on 9 April 2022.
- ↑"Invalid instructions cause exit even if Int 6 is hooked \ VOGONS". Archived from the original on 9 April 2022.
- ↑"Tutorial – Calling Win32 from DOS". Ragestorm. 17 Sep 2005. Archived from the original on 9 April 2022.
- ↑"Accessing Windows device drivers from DOS programs". Archived from the original on 8 Nov 2011.
- 12"8086 microcode disassembled". Reenigne blog. 2020-09-03. Archived from the original on 8 Dec 2023. Retrieved 2022-07-26.
Using the REP or REPNE prefix with a MUL or IMUL instruction negates the product. Using the REP or REPNE prefix with an IDIV instruction negates the quotient.
- ↑"Re: Undocumented opcodes (HINT_NOP)". Archived from the original on 2004-11-06. Retrieved 2010-11-07.
- ↑"Re: Also some undocumented 0Fh opcodes". Archived from the original on 2003-06-26. Retrieved 2010-11-07.
- ↑Intel's RCCE library for the SCC used opcode
0F 0Afor SCC's message invalidation instruction. - ↑Intel Labs, SCC External Architecture Specification (EAS), Revision 0.94, p.29. Archived on May 22, 2022.
- ↑"Undocumented x86 instructions to control the CPU at the microarchitecture level in modern Intel processors"(PDF). 9 July 2021.
- ↑Robert R. Collins, Undocumented OpCodes: UMOV. Archived on Feb 21, 2001.
- ↑Herbert Oppmann, NXOP (Opcode 0Fh 55h)Archived 2022-04-09 at the Wayback Machine
- ↑Herbert Oppmann, NexGen Nx586 Hypercode Source, see COMMON.INC. Archived on 9 Apr 2023.
- ↑Herbert Oppmann, Inside the NexGen Nx586 System BIOS. Archived on 29 Dec 2023.
- ↑Intel, XuCode: An Innovative Technology for Implementing Complex Instruction Flows, May 6, 2021. Archived on Jan 7, 2026.
- ↑Grzegorz Mazur, AMD 3DNow! undocumented instructions
- 12"Undocumented 3DNow! Instructions". grafi.ii.pw.edu.pl. Archived from the original on 30 January 2003. Retrieved 22 February 2022.
- ↑Potemkin's Hacker Group's OPCODE.LST, v4.51, 15 Oct 1999. Archived on 21 May 2001.
- ↑"[UCA CPU Analysis] Prototype UMC Green CPU U5S-SUPER33". 25 May 2020. Archived from the original on 9 Jun 2023.
- ↑Agner Fog, The Microarchitecture of Intel, AMD and VIA CPUs, section 3.4 "Branch Prediction in P4 and P4E". Archived on 7 Jan 2024.
- 12Christopher Domas, Breaking the x86 ISA, 27 July 2017. Archived on 27 Dec 2023.
- 12Xixing Li et al, UISFuzz: An Efficient Fuzzing Method for CPU Undocumented Instruction Searching, 9 Oct 2019, p.9. Archived 2026-02-21 at the Wayback Machine
- ↑Microprocessor Report, MediaGX Targets Low-Cost PCs (vol 11, no. 3, mar 10, 1997). Archived on 6 Jun 2022.
- ↑"Welcome to the OpenSSL Project". GitHub. 21 April 2022. Archived from the original on 4 Jan 2022.
- ↑LKML, (PATCH) crypto: Zhaoxin: Hardware Engine Driver for SHA1/256/384/512, 2 Aug 2023. Archived on 17 Jan 2024.
- ↑Kary Jin, PATCH: Update PadLock engine for VIA C7 and Nano CPUs, openssl-dev mailing list, 10 Jun 2011. Archived on 11 Feb 2022.
- 12OpenEuler mailing list, PATCH kernel-4.19 v2 5/6 : x86/cpufeatures: Add Zhaoxin feature bits. Archived on 9 Apr 2022.
- ↑USPTO/Zhaoxin, Patent application US2023/006718: Processor with a hash cryptographic algorithm and data processing thereof, pages 13 and 45, Mar 2, 2023. Archived on Sep 12, 2023.
- ↑LKML, (PATCH) crypto: x86/sm2 -add Zhaoxin SM2 algorithm implementation, 11 Nov 2023. Archived on 17 Jan 2024.
- 1 2 InstLatx64, volcado de CPUID para Zhaoxin KaiXian KX-6000G : tiene los bits de características SM2 y xmodx activados ( hoja de CPUID C0000001:EDX:bits 0 y 29). Archivado el 25 de julio de 2023.
- ↑ Solicitud de extracción del kernel de OpenEuler 2602: x86/delay: agregar soporte para la instrucción Zhaoxin ZXPAUSE . Gitee . 26 de octubre de 2023. Archivado el 22 de enero de 2024.
- ↑ Archivo de datos ISA para Intel XED Archivado el 15/06/2022 en Wayback Machine (17 de abril de 2022), líneas 916-944
- ↑ Libro de datos del procesador Cyrix 6x86. Archivado el 27/08/2022 en Wayback Machine , página 6-34.
- ↑ Libro de datos de los procesadores AMD Geode LX archivado el 15/03/2019 en Wayback Machine , publicación 33234H, pág. 670
- Intel Corporation (abril de 2022). "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, volúmenes combinados: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D y 4" . Intel . Consultado el 21 de junio de 2022 .
Enlaces externos
- Documentación gratuita para IA-32 y x86-64 , proporcionada por Intel.
- Manual del programador de la arquitectura AMD64, volúmenes 1-5 , proporcionado por AMD.
- Referencia de códigos de operación e instrucciones x86
- Referencia de instrucciones x86 y amd64
- Tablas de instrucciones: Listas de latencias de instrucciones, rendimientos y desgloses de microoperaciones para CPUs Intel, AMD y VIA.
- Lista de instrucciones del ensamblador Netwide (de Netwide Assembler )
- Instrucciones X86
- Listados de conjuntos de instrucciones