Articulo de referencia

Lista de instrucciones x86

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 pr...

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

Añadido con 80186 / 80188

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.

  1. Los anillos de protección se aplican a los modelos 80286 y posteriores, no al 80186.
  2. 1 2 3 En modo de 64 bits, lasPUSHA,POPAyBOUNDno están disponibles; losPUSHAyPOPAcausarán #UD, y elBOUNDcódigo de operación (62) se reutiliza para el prefijo EVEX .
  3. En algunos procesadores, incluidas algunas variantes del 80186, el uso de prefijos de repetición con laBOUNDinstrucció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.
  4. 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 laBOUNDinstrucció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 ]
  5. ElIIMULmnemó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.
  6. 1 2 3 4 ElREP(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).
  7. 1 2 En los procesadores 80286 y posteriores, lasINSB/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.
  8. 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.
  9. 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).
  10. En el 80186 y posteriores, el subcódigo de operación /6 para los códigos de operación de cambioC0/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.
  11. El primer argumento de laENTERinstrucció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 ]

  12. En los procesadores más recientes, laENTERinstrucció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. 1 2 3 4 Los descriptores utilizados por lasLGDT,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 SGDTinstrucciones SIDTcon 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.

  2. 1 2 3 4 LasLGDT,LIDT,LLDTyLTRse serializan en procesadores Pentium y posteriores.
  3. LaLMSWinstrucció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 una LMSWque entra en modo protegido provoca un reinicio de la CPU). [ 13 ]

  4. En el 80386 y posteriores, la "Palabra de estado de la máquina" es la misma que el registro de control CR0 ; sin embargo, laLMSWinstrucció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.
  5. SiCR4.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 ]
  6. 1 2 3 LasSMSW,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.
  7. En los procesadores con x86-64, laARPLinstrucción no está disponible en modo de 64 bits; elinstrucción63 /rexclusiva del modo de 64 bitsMOVSXD
  8. LaARPLinstrucció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 ]
  9. 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 como0x00FFFF00.
  10. 1 2 Para lasLARyLSL, si no se pudo cargar el descriptor de segmento especificado, entonces el registro de destino de la instrucción se deja sin modificar.
  11. 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, laVERWinstrucció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 ]
  12. 1 2 No documentado, solo 80286. [ 14 ] [ 25 ] [ 26 ] (Existe una variante diferenteLOADALLcon 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 si CS.D=0, o de 32 bits a 16 bits si CS.D=1.
  • 67h: Anulación de AddressSize. Cambiará AddressSize de 16 bits a 32 bits si CS.D=0, o de 32 bits a 16 bits si CS.D=1.

El 80386 también introdujo 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.

  1. Para las instrucciones de cadena de 32 bits, la notación ±± se utiliza para indicar que el registro indicado se decrementa en 4 siEFLAGS.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.
  2. 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.ParaLODSD,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.
  3. En cuanto a lasINSB/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.
  4. 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.
  5. LaCWDEinstrucció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.
  6. Para elE3có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.
  7. ParaPUSHA(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.
  8. ParaPOPA/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.
  9. LasPUSHFDyPOPFDprovocará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.
  10. SiIRETDse 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. 1 2 3 4 Para lasBT,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.
  2. 1 2 3 LasBTS,BTCyBTRaceptan elLOCK(F0) cuando se usan con un argumento de memoria; esto da como resultado que la instrucción se ejecute atómicamente.
  3. SiF3se 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).
  4. 1 2BSF yBSRestablece 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 ]
  5. SiF3se 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.
  6. 1 2 ParaSHLDySHRD, 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 ] )
  7. 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
  8. ParaSETcc, 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.
  9. ParaLFS,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.
  10. 1 2 3 4 5 6 ParaMOVhacia/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.
  11. 1 2 3 4 Para movimientos hacia/desde losCRxyDRx, el tamaño del operando siempre es de 64 bits en modo de 64 bits y de 32 bits en caso contrario.
  12. 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 cambioMOVaCR3− 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 en CR3. El vaciado de páginas pertenecientes a otros PCID se puede realizar alternando el bit CR4.PGE, borrando el bit CR4.PCIDE o utilizando la INVPCIDinstrucción.

    En el modo de 64 bits, el vaciado de la TLB se puede suprimir configurando el bit 63 del valor escrito a CR31.

  13. En procesadores anteriores a Pentium , los movimientos aCR0no 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 ]MOV

    Cuando 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ón CR8(introducida con x86-64) se serializa en procesadores AMD pero no en procesadores Intel.

  14. 1 2 LasMOV TRxinstrucciones se interrumpieron a partir de Pentium.
  15. 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]
  16. The operation of the F1(ICEBP) opcode differs from the operation of the regular software interrupt opcode CD 01 in several ways:
      In protected mode, CD 01 will check CPL against the interrupt descriptor's DPL field as an access-rights check, while F1 will not.
    • In virtual-8086 mode, CD 01 will also check CPL against IOPL as an access-rights check, while F1 will not.
    • In virtual-8086 mode with VME enabled, interrupt redirection is supported for CD 01 but not F1.
  17. The UMOV instruction is present on 386 and 486 processors only.[38]
  18. 12The XBTS and IBTS instructions 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 the XBTS instruction as part of its CPU detection if CPUID is not present, and will refuse to boot if XBTS is found to be working.[43]
  19. 12For XBTS and IBTS, 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]
  20. Undocumented, 80386 only.[45]

Added with 80486

  1. El usoBSWAPcon 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 ]
  2. 1 2 En Intel 80486 stepping A, [ 48 ] laCMPXCHGinstrucció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 ]
  3. LasCMPXCHGinstrucciones se configuranEFLAGSde la misma manera queCMPlo haría una instrucción que utiliza el acumulador (AL/AX/EAX/RAX) como su primer argumento.
  4. INVLPG se 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.
  5. SiF3se 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é.
  6. 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
  7. 1 2 LasINVDyWBINVDse están serializando; en algunos procesadores, también pueden bloquear las interrupciones hasta su finalización.
  8. Existen varias circunstancias bajo las cuales laINVDinstrucció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 del MSR_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.

Añadido en procesadores de clase P5 / P6.

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. 1 2 3 La documentación temprana de Intel 64 indicaba que para lasRDMSR,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.

  2. 1 2 3 En modo de 64 bits, lasRDMSR,RDTSCyRDPMCestablecerán los 32 bits superiores de RDX y RAX a cero.
  3. 1 2 Para algunas combinaciones de CPU/MSR, lasRDMSRyWRMSRpueden 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.
  4. Las lecturas MSR realizadas con lasRDMSRyRDMSRLISTpueden, 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 (MSR 2Fh, 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í.
  5. En las CPU de Intel, AMD y VIA, laWRMSRinstrucció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.
  6. Las escrituras en los siguientes MSR no se están serializando: [ 63 ] [ 64 ]WRMSREl ICR (Registro de Comando de Interrupción; MSR 830h) 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.
  7. El modo de administración del sistema y laRSMinstrucción estuvieron disponibles en las variantes no SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993.
  8. En algunos procesadores de 32 bits más antiguos, la ejecuciónCPUIDcon 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.
  9. En algunos procesadores Intel a partir de Ivy Bridge , existen MSR que se pueden usar para restringirCPUIDal 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 ]
  10. 1 2CPUID también está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium.
  11. 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.
  12. 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 ]
  13. A diferencia de la instrucción anteriorCMPXCHG, estaCMPXCHG8Binstrucción no modifica ningún bit de EFLAGS que no sea ZF.
  14. LOCK CMPXCHG8B con 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 .
  15. 1 2 3 En los procesadores IDT WinChip, Transmeta Crusoe y Rise mP6, laCMPXCHG8Binstrucción siempre es compatible, sin embargo, su bit CPUID puede faltar. Esta es una solución alternativa para un error en Windows NT. [ 78 ]
  16. 1 2 LasRDTSCyRDPMCno 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
  17. En todos los procesadores x86 que admiten tantoRDTSCcomo TSC , el TSC está disponible como MSR10h, que se puede leer y escribir utilizando lasinstruccionesRDMSR/WRMSR

    En 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 de232{\displaystyle 2^{32}}o 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 (MSR 3Bh) está disponible (indicado por CPUID.(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 con RDTSCo MSR 10hdevolverá el valor "verdadero" del TSC más el valor de TSC_ADJUST; los intentos de escribir en MSR 10hharán que la CPU calcule la diferencia entre el valor de escritura proporcionado y el TSC "verdadero" y escriba esa diferencia en TSC_ADJUST; la sincronización del TSC entre los núcleos del procesador se puede realizar escribiendo el mismo valor en TSC_ADJUSTen cada procesador lógico. [ 80 ]

  18. 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]).
    En los procesadores Intel, Intel garantiza que el contador de marca de tiempo no volverá a empezar dentro de los 10 años posteriores a su reinicio. [ 85 ]
  19. RDTSC se 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.
  20. RDPMC se puede ejecutar fuera del Anillo 0 solo siCR4.PCE=1.
  21. EstaRDPMCinstrucción no está presente en los procesadores VIA anteriores al Nano.
  22. Los códigos de condición admitidos parala instrucción (opcode, donde el nibble x especifica la condición) son: CMOVcc0F 4x /r
  23. 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 EVEXCMOVcc que suprimen las excepciones de memoria si la condición es falsa).
  24. En las variantes VIA C3 anteriores a Nehemías ("Samuel"/"Ezra"),se ha informado que las instruccionesreg,reg, pero noreg,[mem]las formas, están presentes como instrucciones no documentadas. [ 88 ]CMOVcc
  25. 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.
  26. 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 ]

  27. 0F 1F /0 como 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 ]
  28. Documentado para AMD x86-64 desde 2002. [ 95 ]
  29. Si bien el0F 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 ]
  30. 1 2 GNU Binutils ha utilizado losUD2AyUD2Bpara 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 ]
  31. LaUD2(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 ]
  32. 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.
  33. Si bien el0F 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 ]
  34. 1 2 Para ambos0F 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 ]
  35. Para el0F 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 ]
  36. 1 2 3 4 LasSYSRET,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 SYSRETinstrucciones SYSEXITno estarán disponibles.

  37. En K6, lasSYSCALL/SYSRETestaban disponibles en el Modelo 7 (250 nm "Little Foot") y posteriores, no en el Modelo 6 anterior. [ 110 ]
  38. SYSCALL ySYSRETse 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.
  39. La semántica exactaSYSRETdifiere 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 ]
  40. 1 2 Para lasSYSRETySYSEXITen 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 utilizar IRET/ IRETD/ ).IRETQ

    Para variantes de las instrucciones SYSRETy SYSEXITcodificadas con el REX.Wprefijo, algunos ensambladores (por ejemplo, FASM [ 112 ] y GNU Binutils ) admiten los mnemónicos SYSRETQy SYSEXITQ, sin embargo, estos mnemónicos no se utilizan en la documentación de Intel/AMD.

  41. LasCPUIDbanderas 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 ]
  42. En las CPU de AMD, lasSYSENTERySYSEXITno están disponibles en el modo largo x86-64 (#UD).
  43. En las CPU Transmeta, lasSYSENTERySYSEXITsolo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [ 116 ]
  44. 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 ( MOVSXDreemplazando ARPL)
  • 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.

  1. El operando de memoriaCMPXCHG16Bdebe estar alineado a 16 bytes.
  2. LaCMPXCHG16Binstrucció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.
  3. 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
  4. ElUDBcó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.

  1. En las CPU AMD, la extensión "ABM" proporciona tantoPOPCNTcomoLZCNT. 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).
  2. LaLZCNTinstrucció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.
  3. LaTZCNTinstrucció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).
  4. ParaBEXTR, 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.
  5. En los procesadores AMD anteriores a Zen 3, lasinstruccionesPEXTy 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. 1 2 LasRDSSPDinstruccionesRDSSPQactúan como NOP en procesadores donde las pilas de sombra están deshabilitadas o no se admite CET.
  2. 1 2ENDBR32 yENDBR64actúan como NOPs en procesadores que no admiten CET_IBT o donde IBT está deshabilitado.
  3. 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.

  1. Bajo Intel APX, lasXSAVE*yXRSTOR*no se pueden codificar con el prefijo REX2.
  2. XSAVE se agregó en las revisiones E0/R0 de Penryn y no está disponible en revisiones anteriores.
  3. 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].
  4. LaXSETBVinstrucción provocará un #VMEXIT obligatorio si se ejecuta bajo la virtualización Intel VT-x .
  5. 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. 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.
  2. 1 2 3 4 5 6 7 Todas lasPREFETCH*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.
  3. 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 lasSFENCE,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).
  4. LaSFENCEinstrucció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.
  5. LaLFENCEinstrucció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 ]
  6. LaMFENCEinstrucció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, noMFENCE esserializador 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
  7. El funcionamiento de laPAUSEinstrucció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:
    • 90esNOP
    • 41 90esXCHG R8D,EAX
    • 4E 90esNOP
    • 49 90esXCHG R8,RAX
    • F3 90esPAUSE
    • F3 41 90esPAUSE
    • F3 4F 90esPAUSE
  8. La duración real de la pausa realizada por laPAUSEinstrucción depende de la implementación.En sistemas sin SSE2,PAUSEse ejecutará como NOP.
  9. En entornos de virtualización VT-x o AMD-V, la ejecuciónPAUSErepetida 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.
  10. Si bien laCLFLUSHinstrucció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).
  11. Si bien lasMONITORyMWAITse 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).
  12. 1 2 Para lasMONITORyMWAIT, 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 ]
  13. ParaMONITOR, 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.
  14. A fecha de abril de 2024, no se han definido extensiones ni sugerencias para laMONITORinstrucción. Por lo tanto, la instrucción requiere ECX=0 e ignora EDX.
  15. En algunos procesadores, como Intel Xeon Phi x200 [ 140 ] y AMD K10 [ 141 ] y posteriores, existen MSR documentados que se pueden usar para habilitarMONITORyMWAITejecutar en Ring 3.
  16. La espera realizadaMWAITpuede 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.
  17. Los indicadores de extensión disponiblesMWAITen el registro ECX son:
  18. Los indicadores de sugerencia disponiblesMWAITen 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 .
  19. Para laGETSECinstrucció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.
  20. Las funciones hoja definidas paraGETSEC(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #UD.
  21. ParaGETSEC, 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.
  22. 1 2 El valor "core ID" leído porRDTSCPyRDPIDes 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.
  23. 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
  24. RDTSCP se puede ejecutar fuera del Anillo 0 solo siCR4.TSD=0.
  25. La compatibilidad conRDTSCPse agregó en el paso F del AMD K8 y no está disponible en pasos anteriores.
  26. Si bien laPOPCNTinstrucció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.
  27. 1 2 Para laMOVBEinstrucció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.
  28. Los tipos de invalidación definidos paraINVPCID(seleccionados por el argumento de registro) son: Cualquier valor no admitido en el argumento del registro provoca una excepción #GP.
  29. A diferencia de la instrucción anteriorINVLPG,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 ]
  30. LasPREFETCHyPREFETCHWson 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!
  31. Los códigos de operación paraPREFETCHyPREFETCHW(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.
  32. LaPREFETCH(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.
  33. 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.
  34. A diferencia de la instrucción anteriorRDTSCP, que también se puede utilizar para leer la ID del procesador, el modo de usuarioRDPIDno está deshabilitado porCR4.TSD=1.
  35. ParaMOVDIR64, 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.
  36. LaWBNOINVDinstrucció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.
  37. 1 2 En las implementaciones iniciales, lasPREFETCHIT0yPREFETCHIT1realizará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. 1 2 Los mnemónicos de sugerencia de ramaHWNTseHSTenumeransolo 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-takeny hint-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 ]

  2. 1 2 Los2Ey3Ese 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.
  3. 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.
  4. Las funciones hoja definidas paraENCLS(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP.
  5. 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 .
  6. 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 ]
  7. Las funciones hoja definidas paraENCLU(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. Las funciones EENTERy ERESUMEno se pueden ejecutar dentro de un enclave SGX; las demás funciones solo se pueden ejecutar dentro de un enclave.
  8. ENCLU solo se puede ejecutar en el anillo 3, no en los anillos 0/1/2.
  9. Las funciones hoja definidas paraENCLV(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. Esta ENCLVinstrucción solo está presente en sistemas que admiten las extensiones de sobreasignación de EPC para SGX ("OVERSUB").
  10. ENCLV solo está disponible si la operación Intel VMX está habilitada conVMXON, y producirá #UD de lo contrario.
  11. ParaPTWRITE, 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.
  12. Las funciones hoja definidas paraPCONFIG(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP(0).
  13. ParaCLDEMOTE, 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.
  14. 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 ]
  15. ParaUMONITOR, 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.
  16. 1 2 Para lasUMWAITyTPAUSE, 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
  17. TPAUSE yUMWAITsolo se puede ejecutar fuera del Anillo 0 siCR4.TSD=0.
  18. Para el argumento de registro de lasUMWAITyTPAUSE, se admiten los siguientes bits de bandera:
  19. Si bien la serialización se puede realizar con instrucciones más antiguas, como por ejemploCPUIDyIRET, 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.
  20. 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
  21. LaIBHFinstrucció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.

  22. LaIBHFinstrucción se añadió a los procesadores Intel Alder Lake y posteriores mediante una actualización de microcódigo en mayo de 2025.
  23. El argumento de registroSENDUIPIes 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 ) .
  24. En los procesadores Sapphire Rapids , laUIRETinstrucció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].
  25. ParaENQCMDyEMQCMDS, 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.
  26. 1 2 Para lasRDMSRLISTyWRMSRLIST, las direcciones especificadas en los registros RSI y RDI deben estar alineadas a 8 bytes.
  27. 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
  28. Even though the CMPccXADD instructions perform a locked memory operation, they do not require or accept the LOCK (F0h) prefix - attempting to use this prefix results in #UD.

Added with other AMD-specific extensions

  1. The standard way to access the CR8 register is to use an encoding that makes use of the REX.R prefix, e.g. 44 0F 20 07 (MOV RDI,CR8). However, the REX.R prefix is only available in 64-bit mode.The AltMovCr8 extension adds an additional method to access CR8, using the F0 (LOCK) prefix instead of REX.R – this provides access to CR8 outside 64-bit mode.
  2. 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 the LOCK prefix with the REX.R prefix is not permitted and will cause an #UD exception.
  3. Support for AltMovCR8 was added in stepping F of the AMD K8, and is not available on earlier steppings.
  4. 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.The CLZERO instruction is intended for recovery from otherwise-fatal Machine Check errors. It is non-cacheable, cannot be used to allocate a cache line without a memory access, and should not be used for fast memory clears.[170]
  5. The register numbering used by RDPRU does not necessarily match that of RDMSR/WRMSR.The registers supported by RDPRU as of December 2022 are: Unsupported values in ECX return 0.
  6. If CR4.TSD=1, then the RDPRU instruction 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

  1. 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 WAIT instruction 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.
  2. 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 a WAIT instruction (opcode 9B) followed by the corresponding non-waiting x87 instruction. For example:
    • FNCLEX is an instruction with the opcode DB E2. The corresponding pseudo-instruction FCLEX is then encoded as 9B DB E2.
    • FNSAVE ES:[BX+6] is an instruction with the opcode 26 DD 77 06. The corresponding pseudo-instruction FSAVE ES:[BX+6] is then encoded as 9B 26 DD 77 06
    These pseudo-instructions are commonly recognized by x86 assemblers and disassemblers and treated as single instructions, even though all x86 CPUs with x87 coprocessors execute them as a sequence of two instructions.
  3. 12The FPU initialization performed by the F(N)INIT and F(N)SAVE instructions will set x87 FPU registers as follows:
    • The FPU Control Word id set to 0x03FF on the 8087,[172] or 0x037F on 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 data registers are marked as Empty but not otherwise modified.
  4. On 80387 and earlier FPUs, if an FNINIT instruction 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]
  5. 12For detection of x87 coprocessors on systems that don't support CPUID, it is common to issue an FNINIT followed by an FNSTCW or FNSTSW and then check that the FNSTCW/FNSTSW wrote the expected value to memory. On the 8087, such a detection procedure requires at least two intervening integer instructions between the FNINIT and the following FNSTCW/FNSTSW to work correctly.[172]
  6. F(N)STSW with the AX register as a destination is available on 80287 and later, but not on the 8087.
  7. 1234On 80387 and later x87 FPUs, FLDENV, F(N)STENV, FRSTOR and F(N)SAVE exist in 16-bit and 32-bit variants. The 16-bit variants will load/store a 14-byte floating-point environment data structure to/from memory – the 32-bit variants will load/store a 28-byte data structure instead. (F(N)SAVE/FRSTOR will additionally load/store an additional 80 bytes of FPU data register content after the FPU environment, for a total of 94 or 108 bytes). The choice between the 16-bit and 32-bit variants is based on the CS.D bit and the presence of the 66h instruction prefix. On 8087 and 80287, only the 16-bit variants are available.64-bit variants of these instructions do not exist – using REX.W under x86-64 will cause the 32-bit variants to be used. Since these can only load/store the bottom 32 bits of FIP and FDP, it is recommended to use FXSAVE64/FXRSTOR64 instead if 64-bit operation is desired.
  8. 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)DISI and F(N)ENI instructions 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, the F(N)ENI and F(N)DISI instructions were kept for backwards compatibility, executing as NOPs that do not modify any x87 state.
  9. 123FST/FSTP with an 80-bit destination (m80 or st(i)) and an sNaN source value is documented to produce exceptions on AMD but not Intel FPUs.
  10. FSTP ST(0) is a commonly used idiom for popping a single register off the x87 register stack.
  11. 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]
  12. 12On the 8087 and 80287, FBSTP and the load-constant instructions always use the round-to-nearest rounding mode. On the 80387 and later x87 FPUs, these instructions will use the rounding mode specified in the x87 RC register.
  13. 123456789For the FADDP, FSUBP, FSUBRP, FMULP, FDIVP, FDIVRP, FCOM, FCOMP and FXCH instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.
  14. On Intel Pentium and later processors, FXCH is implemented as a register renaming rather than a true data move. This has no semantic effect, but enables zero-cycle-latency operation. It also allows the instruction to break data dependencies for the x87 top-of-stack value, improving attainable performance for code optimized for these processors.
  15. 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 FILD and FISTP in 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/FISTP loops 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]

  16. 12For the FIST and FISTP instructions, 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. 0x8000 for 16-bit integers.) The Integer Indefinite value will also be used if the top-of-stack value is Empty, NaN or ±∞.
  17. The result of executing the FBLD instruction on non-BCD data is undefined.
  18. For the FBSTP instruction, if the top-of-stack value is NaN or has a value that 1018{\displaystyle 10^{18}} or greater after rounding, the x87 "BCD Indefinite" value will be stored. On 486 and later, this is 0xFFFFC000000000000000, while earlier x87 FPUs used 0xFFFF8000000000000000.[184]
  19. 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, FPTAN and FPATAN.[185]
  20. The FXAM instruction will set C0, C2 and C3 based on value type in st(0) as follows: C1 is set to the sign-bit of st(0), regardless of whether st(0) is Empty or not.
  21. 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]
  22. For FPREM, if the quotient Q is larger than 263{\displaystyle 2^{63}}, then the remainder calculation may have been done only partially – in this case, the FPREM instruction will need to be run again in order to complete the remainder calculation. This is indicated by the instruction setting C2 to 1.If the instruction did complete the remainder calculation, it will set C2 to 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.
  23. The remainder computation done by the FPREM instruction is always exact with no roundoff errors.
  24. For the FSCALE instruction on 8087 and 80287, st(1) is required to be in the range 215st(1)<215{\displaystyle -2^{15}\leq st(1)<2^{15}}. 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.
  25. For FSCALE, rounding is only applied in the case of overflow, underflow or subnormal result.
  26. 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.
  27. 12For the FYL2X and FYL2XP1 instructions, the maximum error bound of ±1 ulp only holds for st(1)=1.0 – for other values of st(1), the error bound is increased to ±1.35 ulps.FYL2X can produce a #Z (divide-by-zero exception) if st(0)=0 and st(1) is a finite nonzero value. FYL2XP1, however, cannot produce #Z.
  28. For FPATAN, the following adjustments are done as compared to just computing a one-argument arctangent of the ratio st(1)st(0){\displaystyle {\frac {st(1)}{st(0)}}}:
    • 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 π4{\displaystyle {\frac {\pi }{4}}}.
    • 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 ±π{\displaystyle \pm \pi }.
    • If st(0) is negative (has sign bit set), then an addend of ±π{\displaystyle \pm \pi } with the same sign as st(1) is added to the result.
  29. While FNOP is a no-op in the sense that will leave the x87 FPU register stack unmodified, it may still modify FIP and CC, and it may fault if a pending x87 FPU exception is present.
  30. On the 8087 FPU (but not any later x87 FPU), the WAIT instruction 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 WAIT instruction 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)SAVE instruction.[186] On Pentium and later processors, this requirement was removed for F(N)SAVE as well.

  31. If the top-of-stack register st(0) is Empty, then the FSTPNCE instruction will behave like FINCSTP, incrementing the stack pointer with no data movement and no exceptions reported.

x87 instructions added in later processors

  1. 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, FLDENV and F(N)STENV instructions has different formats in Real Mode and Protected Mode. On 80287, the F(N)SETPM instruction is required to communicate the real-to-protected mode transition to the FPU. On 80387 and later x87 FPUs, real↔protected mode transitions are handled automatically between the CPU and the FPU without the need for any dedicated instructions – therefore, on these FPUs, FNSETPM executes as a NOP that does not modify any FPU state.

    On the 80287, once the FPU has been brought into Protected Mode operation with the F(N)SETPM instruction, 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 port F1h.[187]

  2. Not including discontinued instructions specific to particular 80387-compatible FPU models.
  3. 12For the FUCOM and FUCOMP instructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument.
  4. The 80387 FPREM1 instruction differs from the older FPREM (D9 F8) instruction in that the quotient Q is rounded to integer with round-to-nearest-even rounding rather than the round-to-zero rounding used by FPREM. Like FPREM, FPREM1 always computes an exact result with no roundoff errors. Like FPREM, it may also perform a partial computation if the quotient is too large, in which case it must be run again.
  5. 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, FCOS and FSINCOS is not precisely 1.0, but instead given by[188][189][173]k=266π266π1.0000000000000000000012874{\displaystyle k{=}{\frac {2^{66}*\pi }{\lfloor 2^{66}*\pi \rfloor }}\approx 1.0000000000000000000012874}This argument reduction inaccuracy also affects the FPTAN instruction.

    Examples of numbers that produce large relative differences between the FSIN instruction and the mathematical sine function include:

    • For x=2646693125139304345{\displaystyle x=2646693125139304345}, FSIN will produce a result of approximately 0.003407{\displaystyle -0.003407} while the true value of sin(x){\displaystyle \sin \left(x\right)} is approximately 1.1881020{\displaystyle 1.188*10^{-20}}.
    • For x=1838419787915897336{\displaystyle x=1838419787915897336}, FSIN will produce a result of approximately 1.0841019{\displaystyle 1.084*10^{-19}} while the true value of sin(x){\displaystyle \sin \left(x\right)} is approximately 0.002366{\displaystyle 0.002366}.
  6. If st(0) is finite and its absolute value is 263{\displaystyle 2^{63}} 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, FCOS and FSINCOS instructions, as well as FPTAN on 80387 and later.In this case, the FSINCOS and FPTAN instructions will also abstain from pushing a value onto the x87 register-stack.
  7. The FCOMI, FCOMIP, FUCOMI and FUCOMIP instructions write their results to the ZF, CF and PF bits of the EFLAGS register. On Intel but not AMD processors, the SF, AF and OF bits of EFLAGS are also zeroed out by these instructions.
  8. The FXSAVE and FXRSTOR instructions 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.
  9. 12The FXSAVE and FXRSTOR instructions will save/restore SSE state only on processors that support SSE. Otherwise, they will only save/restore x87 and MMX state.The x87 section of the state saved/restored by FXSAVE(64)/FXRSTOR(64) has a completely different layout than the data structure of the older F(N)SAVE/FRSTOR instructions, enabling faster save/restore by avoiding misaligned loads and stores.FXSAVE and FXRSTOR require their memory argument to be 16-byte aligned.
  10. 12When floating-point emulation is enabled with CR0.EM=1, FXSAVE(64) and FXRSTOR(64) are considered to be x87 instructions and will accordingly produce an #NM (device-not-available) exception. Other than WAIT, these are the only opcodes outside the D8..DF ESC opcode space that exhibit this behavior.Except on Netburst (Pentium 4 family) CPUs, all opcodes in D8..DF will produce #NM if CR0.EM=1, even for undefined opcodes that would produce #UD otherwise.
  11. Unlike the older F(N)SAVE instruction, FXSAVE will not initialize the FPU after saving its state to memory, but instead leave the x87 coprocessor state unmodified.
  12. 12The FXSAVE64/FXRSTOR64 instruction differ from the FXSAVE/FXRSTOR instructions in that:
    • FXSAVE/FXRSTOR will save/restore FIP and FDP as 32-bit items, and will also save/restore FCS and FDS as 16-bit items.
    • FXSAVE64/FXRSTOR64 will save/restore FIP and FDP as 64-bit items while not saving/restoring FCS and FDS.
    This difference also applies to the later XSAVE/XRSTOR vs XSAVE64/XRSTOR64 instructions.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)XSAVE and (F)XSAVE64. This has been known to cause problems, especially for 64-bit hypervisors running 16/32-bit guests.[190][191]
  13. The FISTTP instruction will, like the older FIST and FISTP instructions, 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

  1. "Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
  2. "Intel 80x86 Instruction Set Summary"(PDF). eecs.wsu.edu. Archived(PDF) from the original on 2024-07-05. Retrieved 2024-06-29.
  3. "Intel x85 JUMP quick reference". Archived from the original on 2025-04-07. Retrieved 2025-04-01..
  4. Vintage Computer Federation, "8088/8086 microcode disassembly" discussion thread, comment #27 on 3 Oct 2020. Archived on 24 Oct 2022.
  5. 12Intel, iAPX86/88, 186/188 User's ManualArchived 2025-10-27 at the Wayback Machine, order no. 210911-001, March 1983, page 69
  6. 12Intel, 80286 and 80287 Programmer's Reference ManualArchived 2025-10-17 at the Wayback Machine, order no. 210498-005, 1987, pages 107 and 248
  7. IBM, PC/AT Technical ReferenceArchived 2025-11-14 at the Wayback Machine, document number 6183355, March 1986 — lists IIMUL on page 438
  8. 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 ENTER instruction entry on page 138.
  9. Michal Necasek, SGDT/SIDT Fiction and Reality, 4 May 2017. Archived on 29 Nov 2023.
  10. Michal Necasek, Nobody Expects ..., OS/2 Museum, 14 Apr 2021 — mentions SGDT used for CPU detection. Archived on 14 Apr 2021.
  11. Vogons discussion forum, re:test386.asm CPU tester, see comment from "TheGreatCodeholio" on 20 Aug 2018 - mentions SGDT used for CPU detection. Archived on 20 Apr 2026.
  12. Intel, 80286 and 80287 Programmer's Reference Manual, order no. 210498-005, 1987, section 10.4.2 on page 185.
  13. rep_lodsb, "on:80386 Memory Pipeline, Hacker News comment section, 19 Apr 2026. Archived on 20 Apr 2026.
  14. 12Intel, Undocumented iAPX 286 Test Instruction. Archived on 20 Dec 2023.
  15. WikiChip, UMIP – x86. Archived on 16 Mar 2023.
  16. Oracle Corp, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, section 3.5: Details About Software Virtualization. Archived on 8 Dec 2023.
  17. 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
  18. Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), chapter 8, p.249,257.
  19. US Patent 4974159Archived 2022-04-24 at the Wayback Machine, "Method of transferring control in a multitasking computer system" mentions 63h/ARPL.
  20. 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
  21. Intel, How Microarchitectural Data Sampling works, see mitigations section. Archived on Dec 2, 2025.
  22. Linux kernel documentation, Microarchitectural Data Sampling (MDS) mitigationArchived 2020-10-21 at the Wayback Machine
  23. AMD, Technical Guidance For Mitigating Transient Scheduler Attacks, rev 2.0, July 2025, page 3. Archived on 14 Aug 2025.
  24. Intel, Processor MMIO Stale Data Vulnerabilities, 14 Jun 2022 - see "VERW Buffer Overwriting Details" section. Archived on 3 Oct 2024.
  25. VCF Forums, I found the SAVEALL opcode, jun 21, 2019. Archived on 13 Apr 2023.
  26. rep lodsb, Intel 286 secrets: ICE mode and F1 0F 04, aug 12, 2022. Archived on 8 Dec 2023.
  27. 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
  28. Raymond Chen, Getting MS-DOS games to run on Windows 95: Working around the iretd problem, Apr 4, 2016. Archived on Mar 15, 2019
  29. 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.
  30. 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.
  31. 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.
  32. Robert L. Hummel, PC Magazine Programmer's Technical Reference, 1992, ISBN 1-56276-016-5, page 362.
  33. sandpile.org, x86 architecture rFLAGS register, see note #7. Archived on 3 Nov 2011.
  34. Intel, 386DX Microprocessor Porgrammer's Reference Manual, order no. 230985-003, 1990, sections 10.3.3 and 10.4.2 on pages 234-236
  35. 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 far JMP (opcode EA) 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.
  36. Michal Necasek, SCO UNIX 3.2v4.0 vs. IA-32 Semantics Changes, 25 jan 2013. OS/2 Museum. Archived on 21 Feb 2026.
  37. 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.
  38. 12Robert Collins, Undocumented OpCodes, 29 july 1995. Archived on 21 feb 2001
  39. Michal Necasek, ICEBP finally documented, OS/2 Museum, May 25, 2018. Archived on 6 June 2018
  40. Intel, AP-526: Optimization For Intel's 32-bit Processors, order no. 242816-001, october 1995 – lists SALC on page 83, INT1 on page 86 and FFREEP on page 114. Archived from the original on 22 Dec 1996.
  41. 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
  42. "Intel 80386 CPU Information | PCjs Machines". www.pcjs.org. Archived from the original on 2023-11-13. Retrieved 2022-01-07.
  43. Geoff Chappell, CPU Identification before CPUID, 27 Jan 2020. Archived on 7 Apr 2023.
  44. Jeff Parsons, Obsolete 80386 Instructions: IBTS and XBTS, PCjs Machines. Archived on Sep 19, 2020.
  45. Robert Collins, The LOADALL Instruction. Archived from the original on Jun 5, 1997.
  46. 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.
  47. 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
  48. Intel "i486 Microprocessor"Archived 2021-12-02 at the Wayback Machine (April 1989, order no. 240440-001) p.142 lists CMPXCHG with 0F A6/A7 encodings.
  49. Intel "i486 Microprocessor" (November 1989, order no. 240440-002) p.135 lists CMPXCHG with 0F B0/B1 encodings.
  50. "Intel 486 & 486 POD CPUID, S-spec, & Steppings". Archived from the original on 2022-04-09. Retrieved 2022-01-08.
  51. 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.
  52. 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.
  53. 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.
  54. 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.
  55. CBID, Undocumented Machine-Specific Registers, 16 Apr 2006. Archived from the original on 29 Nov 2012.
  56. Christopher Domas, The ring 0 facade: awakening the processor's inner demons, Aug 2018, pages 44 and 57. Archived on 14 Sep 2024
  57. Czerno, Direct access to Physical Memory on AMD K7 processors, 4 Jan 2011. Archived from the original on 3 Jan 2014.
  58. Intel, Intel 64 and IA-32 Architectures Software Developer’s Manual, order no. 325462-090, Feb 2026, see entry on RDMSRLIST instruction (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 for IA32_BARRIER rules. Archived on 12 Feb 2026.
  59. 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.
  60. Frank van Gilluwe, "The Undocumented PC, second edition", 1997, ISBN 0-201-47950-8, page 55
  61. Daming Chen and Gail-Joon Ahn, Security Analysis of x86 Processor Microcode, 11 dec 2014, page 8. Archived on 8 Mar 2016.
  62. 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.
  63. 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.
  64. Intel, CPUID Enumeration and Architectural MSRs, 8 Aug 2023. Archived on 23 May 2024.
  65. 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.
  66. 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
  67. Linux kernel, git commit: x86/barrier: Do not serialize MSR accesses on AMDArchived 2025-01-23 at the Wayback Machine, 13 Nov 2023
  68. "RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
  69. Microprocessor Report, System Management Mode Explained (vol 6, no. 8, june 17, 1992). Archived on Jun 29, 2022.
  70. Ellis, Simson C., "The 386 SL Microprocessor in Notebook PCs", Intel Corporation, Microcomputer Solutions, March/April 1991, page 20
  71. Cyrix 486SLC/e Data Sheet (1992)Archived 2022-03-02 at the Wayback Machine, section 2.6.4
  72. Linux 6.3 kernel sources, /arch/x86/include/asm/cpuid.hArchived 2023-04-27 at the Wayback Machine, line 69
  73. gcc-patches mailing list, CPUID Patch for IDT Winchip, May 21, 2019. Archived on Apr 27, 2023.
  74. 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.
  75. Intel, Atom Processor C3000 Product Family Datasheet order no. 337018-002, Feb 2018, pages 133, 3808 and 3814. Archived on Feb 9, 2022.
  76. 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 CPUID instruction)
  77. Robert Collins, CPUID Algorithm Wars, nov 1996. Archived from the original on dec 18, 2000.
  78. Geoff Chappell, CMPXCHG8B Support in the 32-Bit Windows Kernel, 23 jan 2008. Archived on 5 Nov 2023.
  79. 12Intel, Software Developer's ManualArchived 2022-12-29 at the Wayback Machine, order no. 325426-077, Nov 2022 – the entry on the RDTSC instruction on p.1739 describes the instruction sequences required to order the RDTSC instruction with respect to earlier and later instructions.
  80. 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
  81. Linux kernel 5.4.12, /arch/x86/kernel/cpu/centaur.cArchived 2023-01-24 at the Wayback Machine
  82. (PATCH) Mark TSC on GeodeLX reliableArchived 2025-10-11 at the Wayback Machine, Linux kernel patch, 16 Feb 2007.
  83. Stack Overflow, Can constant non-invariant tsc change frequency across cpu states? Accessed 24 Jan 2023. Archived on 24 Jan 2023.
  84. CPU-World, CPUID for Zhaoxin KaiXian KX-5000 KX-5650 (by timw4mail), 24 Apr 2024. Archived on 26 Apr 2024.
  85. 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.
  86. Michal Necasek, "Undocumented RDTSC", 27 Apr 2018. Archived on 16 Dec 2023.
  87. "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.
  88. Willy Tarreau, Re: i686 quirk for AMD GeodeArchived 2025-10-11 at the Wayback Machine, Linux Kernel Mailing List, 10 Nov 2009.
  89. 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.
  90. H. Peter Anvin, x86: completely disable NOPL on 32 bits, Linux kernel patch, 16 sep 2008. Archived on 22 Oct 2022.
  91. 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.
  92. 12Intel Community: Multibyte NOP Made Official. Archived on 7 Apr 2022.
  93. Intel Software Developers Manual, vol 3BArchived 2023-06-02 at the Wayback Machine (order no 253669-076us, December 2021), section 22.15 "Reserved NOP"
  94. 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..1F opcode range as reserved-NOPs.
  95. 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.
  96. 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
  97. 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.
  98. John Hassey, Pentium Pro changes, GAS2 mailing list, 28 dec 1995 – patch that added the UD2A and UD2B instruction mnemomics to GNU Binutils. Archived on 25 Jul 2023.
  99. Jan Beulich, x86: correct UDn, binutils-gdb mailing list, 23 nov 2017 – Binutils patch that added ModR/M byte to UD1/UD2B and added UD0. Archived on 25 Jul 2023.
  100. 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.
  101. 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 0B and 0F B9.
  102. 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 UD0 and page 415 and 419 for UD1.
  103. 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) and UD0 (without ModR/M byte) on page 4-687.
  104. 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.
  105. "ud0 length fix · intelxed/xed@7561f54". GitHub. Archived from the original on 1 Jun 2023. Retrieved 2023-12-15.
  106. AMD, AMD64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.36, march 2024 – see description of UD1 instruction on page 356. Archived on 29 Dec 2024.
  107. 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 the 0F FF opcode.
  108. 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.
  109. 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 FF opcode without assigning it a mnemonic.
  110. AMD, AMD-K6 Processor Data SheetArchived 2023-03-04 at the Wayback Machine, order no. 20695H/0, March 1998, section 24.2, page 283.
  111. George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 13 june 2012. Archived on Mar 15, 2019.
  112. flat assembler 1.73 Programmer's manual, section 2.1.19. Archived on 28 Nov 2018.
  113. 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
  114. Michal Necasek, "SYSENTER, Where Are You?", 20 Jul 2017. Archived on 29 Nov 2023.
  115. AMD, Athlon Processor x86 Code Optimization Guide, publication no. 22007, rev K, feb 2002, appendix F, page 284. Archived on 13 Apr 2017.
  116. Transmeta, Processor RecognitionArchived 2023-01-19 at the Wayback Machine, May 7, 2002.
  117. VIA, VIA C3 Nehemiah Processor DatasheetArchived 2023-01-08 at the Wayback Machine, rev 1.13, sep 29, 2004, page 17
  118. CPU-World, CPUID for Intel Xeon 3.40 GHzArchived 2022-10-26 at the Wayback Machine – Nocona stepping D CPUID without CMPXCHG16B
  119. CPU-World, CPUID for Intel Xeon 3.60 GHzArchived 2022-10-26 at the Wayback Machine – Nocona stepping E CPUID with CMPXCHG16B
  120. SuperUser StackExchange, How prevalent are old x64 processors lacking the cmpxchg16b instruction?Archived 2022-10-26 at the Wayback Machine
  121. 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"
  122. 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.
  123. Anandtech, AMD Zen 3 Ryzen Deep Dive Review, nov 5, 2020, page 6
  124. @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.
  125. Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub. Archived from the original on 20 January 2023. Retrieved 20 January 2023.
  126. Intel, Control-flow Enforcement Technology SpecificationArchived 2022-05-22 at the Wayback Machine (v3.0, order no. 334525-003, March 2019)
  127. Intel SDM, rev 076, December 2021Archived 2022-05-22 at the Wayback Machine, volume 1, section 18.3.1
  128. Binutils mailing list: x86: CET v2.0: Update NOTRACK prefixArchived 2022-03-13 at the Wayback Machine
  129. Ewan Hai, [PATCH 2/3] target/i386: Introduce Zhaoxin Shijidadao-Client CPU model, qemu-devel mailing list, 22 Sep 2025.
  130. AMD, Extensions to the 3DNow! and MMX Instruction SetsArchived 2023-01-01 at the Wayback Machine, ref no. 22466D/0, March 2000, p.11
  131. 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 SFENCE instruction on p.357. Archived from the original on 24 Jul 2014.
  132. 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.
  133. Hadi Brais, The Significance of the x86 SFENCE instructionArchived 2022-12-28 at the Wayback Machine, 26 Feb 2019.
  134. 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.
  135. Hadi Brais, The Significance of the LFENCE instructionArchived 2023-06-10 at the Wayback Machine, 14 May 2018
  136. AMD, Software techniques for managing speculation on AMD processor, rev 3.8.22, 8 March 2022, page 4. Archived on 13 March 2022.
  137. 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;LFENCE sequence to enforce ordering between a memory store and a later x2apic MSR write. Archived on 4 Jul 2024
  138. Intel, Prescott New Instructions Software Developer’s Guide, order no. 252490-003, june 2003, pages 3-26 and 3-38 list MONITOR and MWAIT with explicit operands. Archived on 9 May 2005.
  139. Flat Assembler messageboard, "BLENDVPS/BLENDVPD/PBLENDVB syntax", also covers MONITOR/MWAIT mnemonics. Archived on 6 Nov 2022.
  140. Intel, Intel® Xeon Phi™ Product Family x200 (KNL) User mode (ring 3) MONITOR and MWAIT (archived 5 mar 2017)
  141. 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.
  142. 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.
  143. Intel, Architecture Instruction Set Extensions Programming Reference, order no. 319433-052, March 2024, chapter 17. Archived on Apr 7, 2024.
  144. Guru3D, VIA Zhaoxin x86 4 and 8-core SoC processors launchArchived 2022-12-07 at the Wayback Machine, Jan 22, 2018
  145. 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.
  146. Vulners, x86: DoS from attempting to use INVPCID with a non-canonical addressesArchived 2022-11-08 at the Wayback Machine, 20 nov 2018
  147. 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
  148. 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
  149. Instlatx64, Zhaoxin Kaixian KX-6000G CPUID dumpArchived 2023-07-25 at the Wayback Machine, May 15, 2023
  150. Intel, Willamette Processor Software Developer’s Guide, order no. 245355-001, feb 2000, section 3.5.3, page 294 - lists HWNT/HST mnemonics for the branch hint prefixes. Archived from the original on 5 Feb 2005.
  151. 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.
  152. Intel XED source code, src/dec/xed-disas.c, line 325, 11 Nov 2024. Archived on 24 Nov 2024.
  153. Alan Modra, Pentium4 branch hints, binutils mailing list, 10 Jun 2001. Archived on 28 Dec 2025.
  154. 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.
  155. 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.
  156. 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.
  157. 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.
  158. Intel, Which Platforms Support Intel® Software Guard Extensions (Intel® SGX) SGX2?Archived on 25 May 2024.
  159. 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.
  160. 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.
  161. Intel, Trust Domain CPU Architectural Extensions, order no. 343754-002, may 2021. Archived on 26 Dec 2022.
  162. Intel, Asynchronous Enclave Exit Notify and the EDECCSSA User Leaf Function, 30 Jun 2022. Archived on 21 Nov 2022.
  163. Intel, Intel Architecture Instruction Set Extensions and Future Features order no. 319433-057, March 2025, chapter 14. Archived on 6 Apr 2025.
  164. @InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23 via Twitter.
  165. @Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20 via Twitter.
  166. 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.
  167. Intel XED source code /datafiles/ibhf/ibhf-isa.xed.txt line 31, external release v2026.02.17. Archived on 24 Feb 2026.
  168. Intel, Intel Data Streaming Accelerator Architecture Specification, order no. 341204-004, Sep 2022, pages 13 and 23. Archived on 20 Jul 2023.
  169. InstLatx64, Lunar Lake CPUID dump — has the feature bit for PBNDKB set (CPUID.(EAX=7,ECX=1).EBX[1]). Archived on 14 May 2025.
  170. Wikichip, CLZERO – x86Archived 2021-05-09 at the Wayback Machine
  171. 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
  172. 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 FNINIT control-word value on the 8087, and pages 24-25 for interrupt handling and the 8087 interrupt-enable flag.
  173. 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 FXTRACT special-cases , section 4.4.9 on page 87 for information about the FPTAN (and by extension FSIN/FCOS/FSINCOS) argument reduction inaccuracy, and section 4.8.1 on page 99 for FNINIT's ability to abort memory bus cycles for the preceding x87 instruction.
  174. Intel, 8087 Math CoprocessorArchived 2022-10-24 at the Wayback Machine, oct 1989, order no. 285385-007, page 3-100, fig 9
  175. Intel, 80287 80-bit HMOS Numeric Processor ExtensionArchived 2022-10-24 at the Wayback Machine, feb 1983, order no. 201920-001, page 14
  176. Intel, iAPX86, 88 User's ManualArchived 2022-12-05 at the Wayback Machine, 1981 (order no. 210201-001), p. 797
  177. 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 WAIT to synchronize memory operands on the 80287, and page 485 for alias opcodes on the 80287.
  178. Intel Software Developer's ManualArchived 2022-01-05 at the Wayback Machine volume 3B, revision 064, section 22.18.9
  179. "GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'". Archived from the original on 2022-04-09. Retrieved 2022-07-26.
  180. Michael Steil, FFREEP – the assembly instruction that never existed, 26 Jun 2006. Archived on 11 Oct 2025.
  181. 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.
  182. Dosbox-staging Github repository, issue 1231: Games w/ vertical linesArchived 2025-12-05 at the Wayback Machine, 29 Aug 2021
  183. Dosbox-pure Github repository, issue 156: (Android) Vertical stripes all over CarmageddonArchived 2025-12-09 at the Wayback Machine, 10 May 2021.
  184. Norbert Juffa, Everything you always wanted to know about math coprocessors, v1.6a, 1 Oct 1994. Archived on 18 Oct 2021.
  185. Dusko Koncaliev, Pentium FDIV Bug. Archived on 22 Jan 1998.
  186. Intel, i486 Programmer's Reference Manual, 1990, order no. 240486-001, page 612
  187. 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.
  188. Bruce Dawson, Intel Underestimates Error Bounds by 1.3 quintillion, 9 Oct 2014. Archived on 1 Sep 2025.
  189. Intel SDM, rev 053Archived 2022-02-11 at the Wayback Machine and later, describes the exact argument reduction procedure used for FSIN, FCOS, FSINCOS and FPTAN in volume 1, section 8.3.8
  190. Michal Necasek, Failing to fail, 16 Jun 2023, OS/2 Museum, see addendum. Archived on 1 Oct 2024.
  191. VirtualBox issue tracker, ticket 12646: XP Guest GPF in WIN87EM.DLL at 0001:02C9 or 0001:02C6. Archived on 13 Mar 2016.
  192. Robert Collins, Undocumented OpCodes: AAM. Archived on 21 Feb 2001
  193. Retrocomputing StackExchange, 0F1h opcode-prefix on i80286. Archived on 13 Apr 2023.
  194. 12Frank van Gilluwe, "The Undocumented PC – Second Edition", p. 93-95
  195. Michal Necasek, Intel 486 Errata?, 6 Dec 2015. Archived on 29 Nov 2023.
  196. Robert Hummel, "PC Magazine Programmer's Technical Reference" (ISBN 1-56276-016-5) p.728
  197. Raúl Gutiérrez Sanz, Undocumented 8086 Opcodes, Part I, 27 Dec 2017. Archived on 29 Nov 2023.
  198. 12"Asm, opcode 82h". 24 Dec 1998. Archived from the original on 14 Apr 2023.
  199. Intel Corporation 2022, p. 3698.
  200. 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
  201. Retrocomputing StackExchange, Undocumented instructions in x86 CPU prior to 80386?, 4 Jun 2021. Archived on 18 Jul 2023.
  202. Daniel B. Sedory, An Examination of the Standard MBR, 2000. Archived on 6 Oct 2023.
  203. 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
  204. GCC bugzilla, Bug 48227 – "rep ret" generated for -march=core2. Archived on 9 Apr 2023.
  205. Raymond Chen, My, what strange NOPs you have!, 12 Jan 2011. Archived on 20 May 2023.
  206. Jeff Parsons, Intel 80386 CPU information (B1 errata section, item #7). Archived on 13 Nov 2023.
  207. Intel Software Developers Manual, volume 2BArchived 2022-03-04 at the Wayback Machine (Jan 2006, order no 235667-018, does not have long NOP)
  208. Intel Software Developers Manual, volume 2BArchived 2022-01-07 at the Wayback Machine (March 2006, order no 235667-019, has long NOP)
  209. Agner Fog, Instruction TablesArchived 2020-01-10 at the Wayback Machine, AMD K7 section.
  210. "579838 – glibc not compatible with AMD Geode LX". Archived from the original on 30 Jul 2023.
  211. Intel Software Developers Manual, volume 2BArchived 2022-03-31 at the Wayback Machine (April 2005, order no 235667-015, does not list 0F0D-nop)
  212. 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 NOP instruction description.)
  213. Intel Software Developers Manual, volume 2BArchived 2022-01-08 at the Wayback Machine (order no. 253667-060, September 2016) does not list UD0 and UD1.
  214. "PCJS : pcjs/x86op0F.js (two-byte x86 opcode handlers), lines 1647–1651". GitHub. 17 April 2022. Archived from the original on 13 Apr 2023.
  215. "80486 paging protection faults? \ VOGONS". Archived from the original on 9 April 2022.
  216. "Invalid opcode handling \ VOGONS". Archived from the original on 9 April 2022.
  217. "Invalid instructions cause exit even if Int 6 is hooked \ VOGONS". Archived from the original on 9 April 2022.
  218. "Tutorial – Calling Win32 from DOS". Ragestorm. 17 Sep 2005. Archived from the original on 9 April 2022.
  219. "Accessing Windows device drivers from DOS programs". Archived from the original on 8 Nov 2011.
  220. 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.
  221. "Re: Undocumented opcodes (HINT_NOP)". Archived from the original on 2004-11-06. Retrieved 2010-11-07.
  222. "Re: Also some undocumented 0Fh opcodes". Archived from the original on 2003-06-26. Retrieved 2010-11-07.
  223. Intel's RCCE library for the SCC used opcode 0F 0A for SCC's message invalidation instruction.
  224. Intel Labs, SCC External Architecture Specification (EAS), Revision 0.94, p.29. Archived on May 22, 2022.
  225. "Undocumented x86 instructions to control the CPU at the microarchitecture level in modern Intel processors"(PDF). 9 July 2021.
  226. Robert R. Collins, Undocumented OpCodes: UMOV. Archived on Feb 21, 2001.
  227. Herbert Oppmann, NXOP (Opcode 0Fh 55h)Archived 2022-04-09 at the Wayback Machine
  228. Herbert Oppmann, NexGen Nx586 Hypercode Source, see COMMON.INC. Archived on 9 Apr 2023.
  229. Herbert Oppmann, Inside the NexGen Nx586 System BIOS. Archived on 29 Dec 2023.
  230. Intel, XuCode: An Innovative Technology for Implementing Complex Instruction Flows, May 6, 2021. Archived on Jan 7, 2026.
  231. Grzegorz Mazur, AMD 3DNow! undocumented instructions
  232. 12"Undocumented 3DNow! Instructions". grafi.ii.pw.edu.pl. Archived from the original on 30 January 2003. Retrieved 22 February 2022.
  233. Potemkin's Hacker Group's OPCODE.LST, v4.51, 15 Oct 1999. Archived on 21 May 2001.
  234. "[UCA CPU Analysis] Prototype UMC Green CPU U5S-SUPER33". 25 May 2020. Archived from the original on 9 Jun 2023.
  235. Agner Fog, The Microarchitecture of Intel, AMD and VIA CPUs, section 3.4 "Branch Prediction in P4 and P4E". Archived on 7 Jan 2024.
  236. 12Christopher Domas, Breaking the x86 ISA, 27 July 2017. Archived on 27 Dec 2023.
  237. 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
  238. Microprocessor Report, MediaGX Targets Low-Cost PCs (vol 11, no. 3, mar 10, 1997). Archived on 6 Jun 2022.
  239. "Welcome to the OpenSSL Project". GitHub. 21 April 2022. Archived from the original on 4 Jan 2022.
  240. LKML, (PATCH) crypto: Zhaoxin: Hardware Engine Driver for SHA1/256/384/512, 2 Aug 2023. Archived on 17 Jan 2024.
  241. Kary Jin, PATCH: Update PadLock engine for VIA C7 and Nano CPUs, openssl-dev mailing list, 10 Jun 2011. Archived on 11 Feb 2022.
  242. 12OpenEuler mailing list, PATCH kernel-4.19 v2 5/6 : x86/cpufeatures: Add Zhaoxin feature bits. Archived on 9 Apr 2022.
  243. 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.
  244. LKML, (PATCH) crypto: x86/sm2 -add Zhaoxin SM2 algorithm implementation, 11 Nov 2023. Archived on 17 Jan 2024.
  245. 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.
  246. 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.
  247. Archivo de datos ISA para Intel XED Archivado el 15/06/2022 en Wayback Machine (17 de abril de 2022), líneas 916-944
  248. Libro de datos del procesador Cyrix 6x86. Archivado el 27/08/2022 en Wayback Machine , página 6-34.
  249. 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 .
  • 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 )