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. On some processors, including some 80186 variants, using repeat-prefixes with the BOUND instruction will modify its operation to compare only the lower-bound.[4] For this reason, repeat-prefixes should be avoided for this instruction.
  4. On Intel 80186/80188 and NEC V-series processors, bounds-check failure will cause #BR to be issued as a trap-type exception (the value of CS:IP stored on the stack points to the instruction following the BOUND instruction),[5] while on 80286 and later processors, it is issued as a fault-type exception (the value of CS:IP stored on the stack is that of the BOUND instruction itself).[6]
  5. The "IIMUL" mnemonic for the 80186 multiply-immediate instruction is sometimes used in IBM PC documentation,[7] but is not commonly used otherwise.
  6. 1234The REP (F3) prefix can be used with the INSB/INSW/OUTSB/OUTSW instructions. Doing so will cause the instruction to be repeated the number of times specified in rCX. (setting rCX to 0 will cause zero repetitions, i.e. the instructions will act as NOPs)
  7. 12On 80286 and later processors, the INSB/INSW instructions may perform access-rights checks for its memory store after the read from the I/O port has been performed - if any of these checks fail (e.g. segfault or page-fault), then the data item read from the I/O port is lost. For this reason, using the INSB/INSW instructions to read an I/O port that has side-effects upon read is not recommended.
  8. I/O port access is only allowed when CPL≤IOPL, or (on 80386 and later) the I/O port permission bitmap bits for the port to access are all set to 0.
  9. 1234567For the ROL/ROR/RCL/RCR/SHL/SHR/SAR instructions, opcode C0 is used for byte variants and opcode C1 is used for word variants.For the C0/C1 immediate versions of the shift/rotate instructions, only the bottom 5 bits of the immediate are used (6 bits for opcode C1 if it is encoded with a 64-bit operand-size under x86-64)
  10. On 80186 and later, sub-opcode /6 for the shift-opcodes C0/C1/D0/D1/D2/D3 acts as an (often poorly documented) alias of sub-opcode /4 — these are all variants of the SHL instruction.
  11. The first argument to the ENTER instruction is always a 16-bit unsigned immediate regardless of 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 80286 brindan soporte para el modo protegido x86 . Algunas, pero no todas, las instrucciones 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 se utilizan 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. LaINT1/ICEBP(F1) está presente en todos los procesadores Intel x86 conocidos desde el 80386 en adelante, [ 38 ] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 del Intel SDM (rev 067) en adelante. [ 39 ] Antes de esta versión, la mención de la instrucción en el material de Intel era esporádica, por ejemplo, AP-526 rev 001. [ 40 ] Para los procesadores AMD, la instrucción ha estado documentada desde 2002. [ 41 ]
  16. El funcionamiento delF1(ICEBP) difiere del funcionamiento del código de operación de interrupción de software regularCD 01en varios aspectos:
      En modo protegido, CD 01comprobará CPL contra el campo DPL del descriptor de interrupción como una comprobación de derechos de acceso, mientras que F1no lo hará.
    • En el modo virtual-8086, CD 01también comprobará CPL contra IOPL como una comprobación de derechos de acceso, mientras que F1no lo hará.
    • En el modo virtual-8086 con VME habilitado, se admite la redirección de interrupciones para CD 01pero no para F1.
  17. La instrucción UMOV está presente solo en los procesadores 386 y 486. [ 38 ]
  18. 1 2 LasXBTSyIBTSse descontinuaron con el paso B1 del 80386. Han sido utilizadas por software principalmente para la detección del paso B0 defectuoso [ 42 ] del 80386. Microsoft Windows (v2.01 y posteriores) intentará ejecutar laXBTSinstrucción como parte de su detección de CPU siCPUIDno está presente, y se negará a arrancar siXBTSencuentra que está funcionando. [ 43 ]
  19. 1 2 ParaXBTSyIBTS, el argumento r/m representa los datos de los que extraer/insertar un campo de bits, el argumento reg el campo de bits que se va a insertar/extraer, AX/EAX un desplazamiento de bits y CL una longitud de campo de bits. [ 44 ]
  20. No documentado, solo 80386. [ 45 ]

Añadido con 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 bits 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 códigos de operación,0F 0D /0así como los códigos de operación,0F 0D /2../7realizan prefetch.En los procesadores Intel con PREFETCHW, se documenta que estos códigos de operación realizan NOP reservados [ 147 ] (excepto0F 0D /2quePREFETCHWT1 m8en Xeon Phi ); las pruebas de terceros [ 148 ] indican que algunos o todos estos códigos de operación 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. Aunque lasCMPccXADDinstrucciones realizan una operación de memoria bloqueada, no requieren ni aceptan elLOCK(F0h); intentar usar este prefijo da como resultado #UD.

Añadido con otras extensiones específicas de AMD.

  1. La forma estándar de acceder al registro CR8 es mediante una codificación que utiliza elREX.Rprefijo, por ejemplo44 0F 20 07(MOV RDI,CR8). Sin embargo, esteREX.Rprefijo solo está disponible en modo de 64 bits.La extensión AltMovCr8 añade un método adicional para acceder a CR8, utilizando elprefijoF0(; esto permite acceder a CR8 fuera del modo de 64 bits.LOCKREX.R
  2. 1 2 Al igual que otras variantes de MOV hacia/desde los registros CRx, las codificaciones AltMovCr8 ignoran los 2 bits superiores del byte ModR/M de la instrucción y siempre se ejecutan como si estos dos bits estuvieran establecidos en11b.Las codificaciones AltMovCr8 están disponibles en modo de 64 bits. Sin embargo, no se permite combinar elLOCKprefijo con elREX.Rprefijo y provocará una excepción #UD.
  3. La compatibilidad con AltMovCR8 se agregó en la revisión F del AMD K8 y no está disponible en revisiones anteriores.
  4. ParaCLZERO, el tamaño de la dirección y el prefijo 67h controlan si se usa AX, EAX o RAX como dirección. El segmento predeterminado DS: puede ser anulado por un prefijo de anulación de segmento. La dirección proporcionada no necesita estar alineada; el hardware la alineará según sea necesario.LaCLZEROinstrucción está destinada a la recuperación de errores de comprobación de máquina que de otro modo serían fatales. No es almacenable en caché, no se puede usar para asignar una línea de caché sin un acceso a memoria y no debe usarse para borrados rápidos de memoria. [ 170 ]
  5. La numeración de registros utilizada porRDPRUno necesariamente coincide con la deRDMSR/WRMSR.Los registros compatibles conRDPRUa partir de diciembre de 2022 son: Los valores no admitidos en ECX devuelven 0.
  6. SiCR4.TSD=1, entonces laRDPRUinstrucción solo puede ejecutarse en el anillo 0.

Instrucciones de punto flotante x87

El coprocesador x87 , si está presente, proporciona soporte para aritmética de punto flotante. El coprocesador proporciona ocho registros de datos, cada uno de los cuales almacena un valor de punto flotante de 80 bits (1 bit de signo, 15 bits de exponente, 64 bits de mantisa); estos registros están organizados como una pila, donde el registro superior de la pila se denomina "st" o "st(0)", y los demás registros se denominan st(1), st(2), ..., st(7). Además, proporciona varios registros de control y estado, incluyendo "PC" (control de precisión, para controlar si las operaciones de punto flotante deben redondearse a 24, 53 o 64 bits de mantisa) y "RC" (control de redondeo, para seleccionar el modo de redondeo: redondeo a cero, redondeo a infinito positivo, redondeo a infinito negativo, redondeo al par más cercano), y un registro de código de condición de 4 bits "CC", cuyos cuatro bits se denominan individualmente C0, C1, C2 y C3. No todas las instrucciones aritméticas proporcionadas por x87 obedecen a PC y RC.

Instrucciones originales del 8087

  1. Los coprocesadores x87 (excepto el 8087) manejan las excepciones de una manera bastante inusual. Cuando una instrucción x87 genera una excepción aritmética no enmascarada, se completará sin causar una falla de la CPU; en lugar de causar una falla, registrará en el coprocesador la información necesaria para manejar la excepción (puntero de instrucción, código de operación, puntero de datos si la instrucción tenía un operando de memoria) y establecerá el indicador de palabra de estado de la FPU para indicar que hay una excepción pendiente. Esta excepción pendiente causará una falla de la CPU cuandoWAITse ejecute la siguiente instrucción x87, MMX o de otro tipo.La excepción a esto son las instrucciones "sin espera" de x87, que se ejecutarán sin causar dicha falla incluso si hay una excepción pendiente (con algunas salvedades, véase la nota de aplicación AP-578 [ 171 ] ). Estas instrucciones son principalmente instrucciones de control que pueden inspeccionar y/o modificar el estado de excepción pendiente de la FPU x87.
  2. Para cada instrucción x87 sin espera cuyo mnemónico comienza conFN, existe una pseudo-instrucción que tiene el mismo mnemónico excepto que no incluye la N. Estas pseudo-instrucciones consisten en unaWAITinstrucción (código de operación9B) seguida de la correspondiente instrucción x87 sin espera. Por ejemplo:
    • FNCLEXes una instrucción con el código de operación DB E2. La pseudo-instrucción correspondiente FCLEXse codifica entonces como 9B DB E2.
    • FNSAVE ES:[BX+6]es una instrucción con el código de operación 26 DD 77 06. La pseudo-instrucción correspondiente FSAVE ES:[BX+6]se codifica entonces como9B 26 DD 77 06
    Estas pseudoinstrucciones son comúnmente reconocidas por los ensambladores y desensambladores x86 y tratadas como instrucciones únicas, aunque todas las CPU x86 con coprocesadores x87 las ejecutan como una secuencia de dos instrucciones.
  3. 1 2 La inicialización de la FPU realizada por lasF(N)INITyF(N)SAVEconfigurará los registros de la FPU x87 de la siguiente manera:
    • El ID de palabra de control de FPU se establece 0x03FFen el 8087, [ 172 ] o 0x037Fen las FPU 80287 y posteriores (precisión de 64 bits, redondeo al más cercano, todas las excepciones enmascaradas, interrupciones habilitadas para el 8087).
    • La palabra de estado de la FPU se establece en ceros (excepto que en las FPU 8087/80287, los bits CC pueden dejarse sin modificar).
    • La palabra de etiqueta FPU está configurada en 0xFFFF(marcando todos los registros como vacíos)
    • En los procesadores i486 y posteriores, los registros del puntero de excepción de la FPU (FCS, FIP, FDS, FDP, FOP) se establecen en 0.
    Los registros de datos están marcados como vacíos, pero no han sido modificados de ninguna otra manera.
  4. En las FPU 80387 y anteriores, siFNINITse emite una instrucción antes de que se haya completado una instrucción x87 anterior que hace referencia a la memoria, entonces cualquier ciclo del bus de memoria asociado con esa instrucción x87 anterior puede ser abortado. [ 173 ]
  5. 1 2 Para la detección de coprocesadores x87 en sistemas que no admitenCPUID, es común emitir unFNINITseguido de unFNSTCWoFNSTSWy luego verificar que elFNSTCW/FNSTSWescribió el valor esperado en la memoria. En el 8087, dicho procedimiento de detección requiere al menos dos instrucciones enteras intermedias entre elFNINITy el siguienteFNSTCW/FNSTSWpara funcionar correctamente. [ 172 ]
  6. F(N)STSW La opción de usar el registro AX como destino está disponible en los modelos 80287 y posteriores, pero no en el 8087.
  7. 1 2 3 4 En las FPU x87 80387 y posteriores,FLDENV,F(N)STENV,FRSTORyF(N)SAVEexisten en variantes de 16 bits y 32 bits. Las variantes de 16 bits cargarán/almacenarán una estructura de datos de entorno de punto flotante de 14 bytes en/desde la memoria; las variantes de 32 bits cargarán/almacenarán una estructura de datos de 28 bytes en su lugar. (F(N)SAVE/FRSTORcargará/almacenará adicionalmente 80 bytes adicionales de contenido del registro de datos de la FPU después del entorno de la FPU, para un total de 94 o 108 bytes). La elección entre las variantes de 16 bits y 32 bits se basa en elCS.Dbit y la presencia del66hprefijo de instrucción. En 8087 y 80287, solo están disponibles las variantes de 16 bits.No existen variantes de 64 bits de estas instrucciones; usarREX.Wen x86-64 hará que se utilicen las variantes de 32 bits. Dado que estos solo pueden cargar/almacenar los 32 bits inferiores de FIP y FDP, se recomienda usarFXSAVE64/FXRSTOR64en su lugar si se desea una operación de 64 bits.
  8. 1 2 En el caso de una instrucción x87 que produce una excepción FPU no enmascarada, la FPU 8087 señalará una IRQ algún tiempo indeterminado después de que se haya emitido la instrucción. Esto puede no ser siempre posible de manejar, [ 172 ] y por lo tanto la FPU ofrece lasF(N)DISIyF(N)ENIpara establecer/borrar el bit de máscara de interrupción (bit 7) de la palabra de control x87, [ 174 ] para controlar la interrupción.Las FPU x87 posteriores, desde 80287 en adelante, cambiaron el mecanismo de excepción de la FPU para producir en su lugar una excepción de CPU en la siguiente instrucción x87. Esto hizo innecesario el bit de máscara de interrupción, por lo que se eliminó. [ 175 ] En las FPU x87 Intel posteriores, lasF(N)ENIyF(N)DISIse mantuvieron para compatibilidad con versiones anteriores, ejecutándose como NOP que no modifican ningún estado x87.
  9. 1 2 3FST /FSTPcon un destino de 80 bits (m80 o st(i)) y un valor de origen sNaN está documentado que produce excepciones en las FPU de AMD pero no en las de Intel.
  10. FSTP ST(0) es una expresión comúnmente utilizada para extraer un solo registro de la pila de registros x87.
  11. 1 2 3 4 5 6 7 8 9 Código de operación alias de Intel x87. No se recomienda el uso de este código de operación.En el coprocesador Intel 8087, varios códigos de operación reservados realizaban operaciones que se comportaban de manera similar a las instrucciones x87 definidas existentes. Estos códigos de operación se documentaron para el 8087 [ 176 ] y el 80287, [ 177 ] pero luego se omitieron de los manuales posteriores hasta la actualización de octubre de 2017 del Intel SDM. [ 178 ] Están presentes en todas las FPU Intel x87 conocidas, pero no están disponibles en algunas FPU no Intel más antiguas, como AMD Geode GX/LX, DM&P Vortex86 [ 179 ] y NexGen 586PF. [ 180 ]
  12. 1 2 En los procesadores 8087 y 80287,FBSTPlas instrucciones de carga constante siempre utilizan el modo de redondeo al más cercano. En los procesadores 80387 y posteriores, las FPU x87 utilizarán el modo de redondeo especificado en el registro RC x87.
  13. 1 2 3 4 5 6 7 8 9 Para lasFADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPyFXCH, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Dichas variantes son equivalentes a variantes que usan st(1) como su primer argumento.
  14. En los procesadores Intel Pentium y posteriores,FXCHse implementa como un cambio de nombre de registro en lugar de una verdadera transferencia de datos. Esto no tiene efecto semántico, pero permite una operación con latencia de ciclo cero. También permite que la instrucción rompa las dependencias de datos para el valor superior de la pila x87, lo que mejora el rendimiento alcanzable para el código optimizado para estos procesadores.
  15. 1 2 En los procesadores Intel Pentium sin MMX, la forma más rápida de copiar datos de la memoria del sistema a la memoria no caché (como la memoria de vídeo ) era usar las formas m64 deFILDyFISTPen un bucle. [ 181 ] Este método se ha utilizado en algunos juegos de MS-DOS como Carmageddon y Pete Sampras Tennis '97 .

    Un problema recurrente en los emuladores x86 que emulan los registros FPU x87 con un formato de datos con una precisión de mantisa inferior a 64 bits (por ejemplo, números FP64 , que solo tienen 53 bits de mantisa) es que, al mapear dichos bucles FILD/ FISTPa conversiones de int64 a FP64, se pierden algunos bits de datos de orden inferior de cada elemento de datos de 64 bits. En el caso de, por ejemplo, los datos del framebuffer, esta pérdida de datos se manifiesta como franjas verticales cada 8 píxeles. [ 182 ] [ 183 ]

  16. 1 2 Para lasFISTandFISTP, si el valor superior de la pila, después de ser redondeado a entero, es demasiado pequeño o demasiado grande para ser representado en el formato de memoria de destino, entonces el valor almacenado en la memoria no se limitará; en su lugar, se almacenará el valor x87 "Integer Indefinite". Este es un valor que tiene el bit superior establecido en 1 y todos los demás bits establecidos en 0. (por ejemplo,0x8000para enteros de 16 bits). El valor Integer Indefinite también se utilizará si el valor superior de la pila es Empty, NaN o ±∞.
  17. El resultado de ejecutar laFBLDinstrucción en datos que no son BCD no está definido.
  18. Para laFBSTPinstrucción, si el valor superior de la pila es NaN o tiene un valor que1018{\displaystyle 10^{18}}o mayor después del redondeo, se almacenará el valor "BCD Indefinido" de x87. En 486 y posteriores, esto es 0xFFFFC000000000000000, mientras que las FPU x87 anteriores usaban 0xFFFF8000000000000000. [ 184 ]
  19. 1 2 En los primeros procesadores Intel Pentium , la división de punto flotante estaba sujeta al error Pentium FDIVFPREM . Esto también afectó a las instrucciones que realizan la división como parte de sus operaciones ,comoFPTANyFPATAN. [ 185 ]
  20. LaFXAMinstrucción establecerá C0, C2 y C3 en función del tipo de valor en st(0) de la siguiente manera: C1 se establece al bit de signo de st(0), independientemente de si st(0) está vacío o no.
  21. ParaFXTRACT, el comportamiento que resulta de que st(0) sea cero o ±∞, difiere entre 8087 y 80387:
    • Si st(0) es ±0, entonces en 8087/80287, E y M se establecen igual a st(0) sin que se informe ninguna excepción; en 80387 y posteriores, M se establece igual a st(0), E se establece en -∞ y se genera una excepción de división por cero.
    • Si st(0) es ±∞, entonces en 8087/80287, se genera una excepción de operación no válida y tanto M como E se establecen en NaN; en 80387 y posteriores, M se establece igual a st(0) y E se establece en +∞ sin que se informe ninguna excepción. [ 173 ]
  22. ParaFPREM, si el cociente Q es mayor que263{\displaystyle 2^{63}}Entonces, es posible que el cálculo del resto se haya realizado solo parcialmente; en este caso, la FPREMinstrucción deberá ejecutarse nuevamente para completar el cálculo del resto. Esto se indica mediante la instrucción configurada C2en 1. Si la instrucción completó el cálculo del resto, se establecerá C2en 0 y establecerá los tres bits {C0,C3,C1}a los tres bits inferiores del cociente Q. En el 80387 y posteriores, si la instrucción no completó el cálculo del resto, entonces el resto calculado Q utilizado para la reducción de argumentos se habrá redondeado a un múltiplo de 8 (o una potencia de 2 mayor), de modo que los 3 bits inferiores del cociente aún se puedan recuperar correctamente en una pasada posterior que sí complete el cálculo del resto.
  23. El cálculo del resto realizado por laFPREMinstrucción es siempre exacto y sin errores de redondeo.
  24. Para laFSCALEinstrucción en 8087 y 80287, se requiere que st(1) esté en el rango215st(1)<215{\displaystyle -2^{15}\leq st(1)<2^{15}}Además, su valor absoluto debe ser 0 o al menos 1. Si no se cumplen estos requisitos, el resultado es indefinido. Estas restricciones se eliminaron en la norma 80387.
  25. ParaFSCALE, el redondeo solo se aplica en caso de desbordamiento, subdesbordamiento o resultado subnormal.
  26. Las instrucciones trascendentales x87 no obedecen a PC ni RC, sino que calculan resultados completos de 80 bits. Estos resultados no necesariamente están correctamente redondeados (véase el dilema del creador de tablas ); pueden tener un error de hasta ±1 ulp en Pentium o posterior, o de hasta ±1,5 ulps en coprocesadores x87 anteriores.
  27. 1 2 Para lasFYL2XyFYL2XP1, el límite de error máximo de ±1 ulp solo se cumple para st(1)=1.0; para otros valores de st(1), el límite de error aumenta a ±1.35 ulps.FYL2Xpuede producir una #Z (excepción de división por cero) si st(0)=0 y st(1) es un valor finito distinto de cero.FYL2XP1, sin embargo, no puede producir #Z.
  28. ParaFPATAN, se realizan los siguientes ajustes en comparación con el simple cálculo de una arcotangente de un argumento de la razónst(1)st(0){\displaystyle {\frac {st(1)}{st(0)}}}:
    • Si tanto st(0) como st(1) son ±∞, entonces la arcotangente se calcula como si cada uno de st(0) y st(1) se hubiera reemplazado por ±1 del mismo signo. Esto produce un resultado que es un múltiplo impar deπ4{\displaystyle {\frac {\pi }{4}}}.
    • Si tanto st(0) como st(1) son ±0, entonces la arcotangente se calcula como si st(0) pero no st(1) se hubiera reemplazado por ±1 del mismo signo, produciendo un resultado de ±0 o±π{\displaystyle \pm \pi }.
    • Si st(0) es negativo (tiene el bit de signo activado), entonces un sumando de±π{\displaystyle \pm \pi }con el mismo signo que st(1) se agrega al resultado.
  29. Si bienFNOPno realiza ninguna operación en el sentido de que dejará la pila de registros de la FPU x87 sin modificar, aún puede modificar FIP y CC, y puede fallar si hay una excepción pendiente de la FPU x87.
  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. La FPU x87 necesita saber si está operando en modo real o en modo protegido porque el entorno de punto flotante al que acceden lasF(N)SAVE,FRSTOR,FLDENVyF(N)STENVtiene formatos diferentes en modo real y modo protegido. En el 80287, laF(N)SETPMinstrucción es necesaria para comunicar la transición de modo real a protegido a la FPU. En las FPU x87 80387 y posteriores, las transiciones de modo real a protegido se manejan automáticamente entre la CPU y la FPU sin necesidad de instrucciones dedicadas; por lo tanto, en estas FPU,FNSETPMse ejecuta como una NOP que no modifica ningún estado de la FPU.

    En el 80287, una vez que la FPU se ha puesto en funcionamiento en modo protegido con la F(N)SETPMinstrucción, no se puede volver a poner en funcionamiento en modo real sin reiniciar la FPU; en los PC compatibles con IBM con FPU 80287/80387 (pero no en los 80486 y posteriores), dicho reinicio de la FPU se podía realizar escribiendo un byte con el valor 0 en el puerto de E/S F1h. [ 187 ]

  2. No incluye instrucciones descontinuadas específicas para modelos particulares de FPU compatibles con 80387.
  3. 1 2 Para lasFUCOMyFUCOMP, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Dichas variantes son equivalentes a las variantes que usan st(1) como su primer argumento.
  4. La instrucción 80387FPREM1difiere de la instrucción anteriorFPREM(D9 F8) en que el cociente Q se redondea a entero con redondeo al par más cercano en lugar del redondeo a cero utilizado porFPREM. Al igual queFPREM,FPREM1siempre calcula un resultado exacto sin errores de redondeo. Al igual queFPREM, también puede realizar un cálculo parcial si el cociente es demasiado grande, en cuyo caso debe ejecutarse de nuevo.
  5. 1 2 3 Debido a que la FPU x87 realiza la reducción de argumentos para seno/coseno con solo unos 68 bits de precisión, el valor de k utilizado en el cálculo deFSIN,FCOSyFSINCOSno es precisamente 1.0, sino que viene dado por [ 188 ] [ 189 ] [ 173 ]k=266π266π1.000000000000000000012874{\displaystyle k{=}{\frac {2^{66}*\pi }{\lfloor 2^{66}*\pi \rfloor }}\approx 1.0000000000000000000012874}Esta imprecisión en la reducción de argumentos también afecta a la FPTANinstrucción.

    Algunos ejemplos de números que producen grandes diferencias relativas entre la FSINinstrucción y la función seno matemática son:

    • Paraincógnita=2646693125139304345{\displaystyle x=2646693125139304345}FSINproducirá un resultado de aproximadamente0,003407{\displaystyle -0.003407}mientras que el verdadero valor depecado(incógnita){\displaystyle \sin \left(x\right)}es aproximadamente1.1881020{\displaystyle 1.188*10^{-20}}.
    • Paraincógnita=1838419787915897336{\displaystyle x=1838419787915897336}FSINproducirá un resultado de aproximadamente1.0841019{\displaystyle 1.084*10^{-19}}mientras que el verdadero valor depecado(incógnita){\displaystyle \sin \left(x\right)}es aproximadamente0,002366{\displaystyle 0.002366}.
  6. Si st(0) es finito y su valor absoluto es263{\displaystyle 2^{63}}o mayor, entonces el valor superior de la pila st(0) se deja sin modificar y se establece C2, sin generar ninguna excepción. Esto se aplica a las FSINinstrucciones FCOSy FSINCOS, así como FPTANen 80387 y posteriores. En este caso, las instrucciones FSINCOSy FPTANtambién se abstendrán de insertar un valor en la pila de registros x87.
  7. LasFCOMI,FCOMIP,FUCOMIyFUCOMIPescriben sus resultados en losZF,CFyPFdelEFLAGSregistro. En los procesadores Intel, pero no en los AMD, losbitsSF,AFytambién se ponen a cero mediante estas instrucciones.OFEFLAGS
  8. LasFXSAVEyFXRSTORse añadieron en la revisión "Deschutes" del Pentium II, y no están presentes en la revisión anterior "Klamath".También están presentes en el AMD K7.Se consideran una parte integral de SSE y, por lo tanto, están presentes en todos los procesadores con SSE.
  9. 1 2 LasFXSAVEyFXRSTORguardarán/restaurarán el estado SSE solo en procesadores que admitan SSE. De lo contrario, solo guardarán/restaurarán el estado x87 y MMX.La sección x87 del estado guardado/restaurado porFXSAVE(64)/FXRSTOR(64)tiene una disposición completamente diferente a la estructura de datos de lasF(N)SAVE/FRSTOR, lo que permite un guardado/restauración más rápido al evitar cargas y almacenamientos desalineados.FXSAVEyFXRSTORrequieren que su argumento de memoria esté alineado a 16 bytes.
  10. 1 2 Cuando la emulación de punto flotante está habilitada conCR0.EM=1,FXSAVE(64)yFXRSTOR(64)se consideran instrucciones x87 y, por lo tanto, producirán una excepción #NM (dispositivo no disponible). Aparte de, estos son los únicos códigos de operación fuera delespacio de códigos de operación ESC que exhiben este comportamiento.Excepto en las CPU Netburst (familia Pentium 4), todos los códigos de operación enproducirán #NM si, incluso para códigos de operación no definidos que producirían #UD de otro modo.WAITD8..DFD8..DFCR0.EM=1
  11. A diferencia de la instrucciónanteriorno inicializará la FPU después de guardar su estado en la memoria, sino que dejará el estado del coprocesador x87 sin modificar.F(N)SAVEFXSAVE
  12. 1 2 LaFXSAVE64/FXRSTOR64difiere de lasFXSAVE/FXRSTORen que:
    • FXSAVE/ FXRSTORguardará/restaurará FIP y FDP como elementos de 32 bits, y también guardará/restaurará FCS y FDS como elementos de 16 bits.
    • FXSAVE64/ FXRSTOR64guardará/restaurará FIP y FDP como elementos de 64 bits, pero no guardará/restaurará FCS y FDS.
    Esta diferencia también se aplica a las instrucciones posteriores XSAVE/ XRSTORvs XSAVE64/ . Como resultado, guardar tanto FCS/FDS como los 32 bits superiores de FIP/FDP de 64 bits no se puede lograr con una sola instrucción, sino que requiere ejecutar ambas y . Se sabe que esto causa problemas, especialmente para hipervisores de 64 bits que ejecutan invitados de 16/32 bits. [ 190 ] [ 191 ]XRSTOR64(F)XSAVE(F)XSAVE64
  13. LaFISTTPinstrucción, al igual que las instrucciones anterioresFIST,FISTPalmacenará el valor "Integer Indefinite" de x87 si el valor superior de la pila es demasiado pequeño/grande para ser representado en el formato de destino de la memoria.

Instrucciones SIMD

Instrucciones criptográficas

Instrucciones de virtualización

Otras instrucciones

La arquitectura x86 también incluye conjuntos de instrucciones descontinuados que ya no cuentan con el soporte de Intel y AMD, así como instrucciones no documentadas que se ejecutan pero que no están documentadas oficialmente.

Instrucciones x86 no documentadas

Las CPU x86 contienen instrucciones no documentadas que están implementadas en los chips pero que no aparecen en algunos documentos oficiales. Se pueden encontrar en diversas fuentes de Internet, como la Lista de Interrupciones de Ralf Brown y en sandpile.org.

Algunas de estas instrucciones están ampliamente disponibles en la mayoría de las CPU x86, mientras que otras son específicas de una gama reducida de CPU.

Las instrucciones no documentadas que están ampliamente disponibles en muchas CPU x86 incluyen:

Las instrucciones no documentadas que aparecen solo en un subconjunto limitado de CPU x86 incluyen:

Instrucciones x87 no documentadas

Véase también

Referencias

  1. "Re: Identificación del procesador Intel y la instrucción CPUID" . Consultado el 21 de abril de 2013 .
  2. "Resumen del conjunto de instrucciones Intel 80x86" (PDF) . eecs.wsu.edu . Archivado (PDF) del original el 5 de julio de 2024. Consultado el 29 de junio de 2024 .
  3. "Referencia rápida de Intel x85 JUMP" . Archivado del original el 7 de abril de 2025. Consultado el 1 de abril de 2025 ..
  4. Vintage Computer Federation, hilo de discusión sobre "desensamblaje de microcódigo 8088/8086" , comentario n.° 27 del 3 de octubre de 2020. Archivado el 24 de octubre de 2022.
  5. 1 2 Intel, iAPX86/88, 186/188 Manual del usuario Archivado el 27/10/2025 en Wayback Machine , número de pedido 210911-001, marzo de 1983, página 69
  6. 1 2 Intel, Manual de referencia del programador de los microcontroladores 80286 y 80287. Archivado el 17 de octubre de 2025 en Wayback Machine , número de pedido 210498-005, 1987, páginas 107 y 248.
  7. IBM, PC/AT Technical Reference Archivado el 14/11/2025 en Wayback Machine , documento número 6183355, marzo de 1986 — menciona IIMUL en la página 438
  8. AMD, Manual del programador de la arquitectura x86-64 Volumen 3 Archivado el 18/01/2023 en Wayback Machine , pub.no. 24594, rev 3.02, agosto de 2002, verENTERentrada de instrucciones en la página 138.
  9. Michal Necasek, SGDT/SIDT Ficción y Realidad , 4 de mayo de 2017. Archivado el 29 de noviembre de 2023.
  10. Michal Necasek, Nadie lo espera... , Museo OS/2 , 14 de abril de 2021 — mencionesSGDTutilizadas para la detección de CPU. Archivado el 14 de abril de 2021.
  11. Foro de discusión de Vogons, re:test386.asm Probador de CPU , ver comentario de "TheGreatCodeholio" el 20 de agosto de 2018: mencionaSGDTsu uso para la detección de CPU. Archivado el 20 de abril de 2026.
  12. Intel, Manual de referencia del programador 80286 y 80287 , número de pedido 210498-005, 1987, sección 10.4.2 en la página 185.
  13. rep_lodsb, "on:80386 Memory Pipeline , sección de comentarios de Hacker News , 19 de abril de 2026. Archivado el 20 de abril de 2026.
  14. 1 2 Intel, Instrucción de prueba iAPX 286 no documentada . Archivado el 20 de diciembre de 2023.
  15. WikiChip, UMIP – x86 . Archivado el 16 de marzo de 2023.
  16. Oracle Corp, Guía del administrador de Oracle® VM VirtualBox para la versión 6.0, sección 3.5: Detalles sobre la virtualización de software . Archivado el 8 de diciembre de 2023.
  17. Proyecto MBC, Detección de máquinas virtuales (enlace permanente) Archivado el 30/08/2023 en Wayback Machine o Detección de máquinas virtuales (enlace no permanente) Archivado el 30/08/2023 en Wayback Machine
  18. Andrew Schulman, "Windows 95 no autorizado" ( ISBN) 1-56884-169-8), capítulo 8, págs. 249, 257.
  19. Patente estadounidense 4974159 archivada el 24/04/2022 en Wayback Machine , "Método de transferencia de control en un sistema informático multitarea" menciona 63h/ARPL.
  20. Intel, Manual del desarrollador de la familia de procesadores Pentium®, Volumen 3 Archivado el 22/04/2023 en Wayback Machine , 1995, número de pedido 241430-004, sección 12.7, pág. 323
  21. Intel, Cómo funciona el muestreo de datos microarquitectónicos , véase la sección de medidas de mitigación. Archivado el 2 de diciembre de 2025.
  22. Documentación del kernel de Linux, mitigación del muestreo de datos microarquitectónicos (MDS) Archivado el 21/10/2020 en Wayback Machine
  23. AMD, Guía técnica para mitigar ataques transitorios al planificador , rev. 2.0, julio de 2025, página 3. Archivado el 14 de agosto de 2025.
  24. Intel, Vulnerabilidades de datos obsoletos en MMIO del procesador , 14 de junio de 2022 - ver la sección "Detalles de sobrescritura del búfer VERW". Archivado el 3 de octubre de 2024.
  25. Foros de VCF, encontré el código de operación SAVEALL , 21 de junio de 2019. Archivado el 13 de abril de 2023.
  26. rep lodsb, Secretos de Intel 286: Modo ICE y F1 0F 04 , 12 de agosto de 2022. Archivado el 8 de diciembre de 2023.
  27. LKML, (PARCHE) x86-64, espfix: No se filtran los bits 31:16 de %esp que regresan a la pila de 16 bits , 29 de abril de 2014. Archivado el 4 de enero de 2018.
  28. Raymond Chen, Cómo ejecutar juegos de MS-DOS en Windows 95: Solución al problema de iretd , 4 de abril de 2016. Archivado el 15 de marzo de 2019.
  29. AMD, AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions , pub.no. 24594, rev 3.37, jul 2025, páginas 123-124. Archivado el 11 ago 2025.
  30. David Howells, (tip:x86/asm) x86_64, asm: Optimizar fls(), ffs() y fls64() , 15 de diciembre de 2011, Lista de correo del kernel de Linux . Archivado el 15 de marzo de 2026.
  31. Manual del desarrollador de software para arquitecturas Intel, Intel 64 e IA-32, volumen 2 (2A, 2B, 2C y 2D): Referencia del conjunto de instrucciones, AZ , número de pedido 325383-090, febrero de 2026, páginas 225 y 227. Archivado el 15 de febrero de 2026.
  32. Robert L. Hummel, PC Magazine Programmer's Technical Reference , 1992, ISBN 1-56276-016-5, página 362.
  33. sandpile.org, registro rFLAGS de la arquitectura x86 , ver nota n.º 7. Archivado el 3 de noviembre de 2011.
  34. Intel, Manual de referencia del programador del microprocesador 386DX , número de pedido 230985-003, 1990, secciones 10.3.3 y 10.4.2 en las páginas 234-236
  35. iPXE, Commit bc35b24: Corrige el uso del segmento de código escribible en las CPU 486 y anteriores , Github , 2 de febrero de 2022 − indica que al salir del modo protegido en 386/486 escribiendo enCR0, es específicamente necesario hacer un farJMP(código de operaciónEA) para restaurar los derechos de acceso adecuados en modo real para el segmento CS, y que otras transferencias de control lejanas (por ejemploRETF,IRET) no harán esto. Archivado el 4 de noviembre de 2024.
  36. Michal Necasek, Cambios semánticos entre SCO UNIX 3.2v4.0 e IA-32 , 25 de enero de 2013. Museo OS/2 . Archivado el 21 de febrero de 2026.
  37. Can Bölük, Especulando sobre todo el conjunto de instrucciones x86-64 en segundos con este extraño truco , 22 de marzo de 2021. Archivado el 23 de marzo de 2021.
  38. 1 2 Robert Collins, Códigos de operación no documentados , 29 de julio de 1995. Archivado el 21 de febrero de 2001.
  39. Michal Necasek, ICEBP finalmente documentado , Museo OS/2 , 25 de mayo de 2018. Archivado el 6 de junio de 2018.
  40. Intel, AP-526: Optimización para procesadores Intel de 32 bits , número de pedido 242816-001, octubre de 1995 – se mencionaSALCen las páginas 83,INT186 yFFREEP114. Archivado del original el 22 de diciembre de 1996.
  41. AMD, Tecnología AMD de 64 bits, vol. 2: Programación del sistema . Archivado el 25/07/2023 en Wayback Machine , número de pedido 24593, revisión 3.06, agosto de 2002, página 248.
  42. "Información sobre la CPU Intel 80386 | PCjs Machines" . www.pcjs.org . Archivado del original el 13/11/2023 . Consultado el 07/01/2022 .
  43. Geoff Chappell, Identificación de CPU antes de CPUID , 27 de enero de 2020. Archivado el 7 de abril de 2023.
  44. Jeff Parsons, Instrucciones obsoletas para el 80386: IBTS y XBTS , PCjs Machines . Archivado el 19 de septiembre de 2020.
  45. Robert Collins, La instrucción LOADALL . Archivado del original el 5 de junio de 1997.
  46. Toth, Ervin (16 de marzo de 1998). "BSWAP con registros de 16 bits" . Archivado del original el 3 de noviembre de 1999. La instrucción baja la palabra superior del registro de doble palabra sin afectar sus 16 bits superiores.
  47. Coldwin, Gynvael (2009-12-29). "BSWAP + prefijo 66h" . Archivado del original el 2018-10-03 . Recuperado el 2018-10-03 . Extensión interna (a cero) del valor de un registro más pequeño (16 bits)... aplicando el bswap a un valor de 32 bits "00 00 AH AL",... truncado a los 16 bits inferiores, que son "00 00". ... Bochs... bswap reg16 actúa igual que bswap reg32... QEMU... ignora el prefijo 66h
  48. Intel "Microprocesador i486" Archivado el 2 de diciembre de 2021 en Wayback Machine (abril de 1989, número de pedido 240440-001) pág. 142, listasCMPXCHGcon0F A6/A7codificaciones.
  49. El manual "i486 Microprocessor" de Intel(noviembre de 1989, número de pedido 240440-002), pág. 135, incluye listasconcodificaciones.CMPXCHG0F B0/B1
  50. "Intel 486 y 486 POD CPUID, S-spec y Steppings" . Archivado del original el 9 de abril de 2022. Consultado el 8 de enero de 2022 .
  51. Intel, Software Guard Extensions Programming Reference Archivado el 7 de abril de 2023 en Wayback Machine , pedido n.º 329298-002, octubre de 2014, secciones 3.5 y 3.6.5.
  52. Intel, Guía del desarrollador de software de la tecnología Extended Memory 64, Volumen 2 , revisión 1.1, número de pedido 300835-002, 2004, páginas 207, 208, 300. Archivado del original el 31 de mayo de 2005.
  53. Manual del desarrollador de software para arquitecturas Intel,, número de pedido 253667-023, mayo de 2007, páginas 246, 248 y 410. Archivado el 30 de enero de 2014.
  54. AMD, Live Migration with AMD-V Extended Migration Technology, pub. n.º 43781, rev. 3.00, abril de 2008. Menciona la contraseña en EDI en la página 15. Archivado del original el 20 de enero de 2013.
  55. CBID, Registros específicos de máquina no documentados , 16 de abril de 2006. Archivado del original el 29 de noviembre de 2012.
  56. Christopher Domas, La fachada del anillo 0: despertando a los demonios internos del procesador , agosto de 2018, páginas 44 y 57. Archivado el 14 de septiembre de 2024.
  57. Czerno, Acceso directo a la memoria física en procesadores AMD K7 , 4 de enero de 2011. Archivado del original el 3 de enero de 2014.
  58. Manual del desarrollador de software para arquitecturas Intel,, número de pedido 325462-090, febrero de 2026. Consulte la entrada sobrelas instrucciones (vol. 2B, página 1831) para las reglas de ordenación de lectura de MSR, la sección 13.12.3 del vol. 3, página 3592, para las reglas de ordenación de acceso de MSR de x2APIC y la tabla 2.2 del vol. 4, página 4708, paralas reglas. Archivado el 12 de febrero de 2026.RDMSRLISTIA32_BARRIER
  59. AMD, Manual del programador de la arquitectura AMD64, volúmenes 1 a 5 , n.º de publicación 40332, rev. 4.08, abril de 2024. Consulte el volumen 2, sección 16.11.2, página 1112, para obtener las reglas de ordenación de acceso de x2APIC MSR. Archivado el 6 de marzo de 2026.
  60. Frank van Gilluwe, "The Undocumented PC, segunda edición", 1997, ISBN 0-201-47950-8, página 55
  61. Daming Chen y Gail-Joon Ahn, Análisis de seguridad del microcódigo del procesador x86 , 11 de diciembre de 2014, página 8. Archivado el 8 de marzo de 2016.
  62. AMD, Guía de revisión para procesadores AMD Athlon 64 y AMD Opteron , pub. n.º 25759, rev. 3.79, julio de 2009, página 34. Archivado el 20 de diciembre de 2023.
  63. Intel, Manual del desarrollador de software, vol. 3A Archivado el 4 de marzo de 2023 en Wayback Machine , número de pedido 253668-078, diciembre de 2022, sección 9.3, página 299.
  64. Intel, Enumeración de CPUID y MSR arquitectónicos , 8 de agosto de 2023. Archivado el 23 de mayo de 2024.
  65. AMD, PPR para procesadores AMD Family 19h Modelo 61h, Revisión B1 , documento n.° 56713, rev. 3.05, 8 de marzo de 2023, página 116. Archivado el 25 de abril de 2023.
  66. LKML, (PARCHE 5.4 55/65) x86/apic: Agregar serialización adicional para MSR que no se serializan. Archivado el 7 de septiembre de 2025 en Wayback Machine , 8 de febrero de 2021.
  67. Núcleo de Linux, confirmación de Git: x86/barrier: No serializar los accesos MSR en AMD. Archivado el 23 de enero de 2025 en Wayback Machine , 13 de noviembre de 2023.
  68. "RSM: Reanudar desde el modo de administración del sistema" . Archivado del original el 12 de marzo de 2012.
  69. Informe sobre microprocesadores, Explicación del modo de gestión del sistema (vol. 6, n.º 8, 17 de junio de 1992). Archivado el 29 de junio de 2022.
  70. Ellis, Simson C., "El microprocesador 386 SL en ordenadores portátiles", Intel Corporation, Microcomputer Solutions, marzo/abril de 1991, página 20
  71. Hoja de datos de Cyrix 486SLC/e (1992) Archivada el 2 de marzo de 2022 en Wayback Machine , sección 2.6.4
  72. Fuentes del kernel de Linux 6.3, /arch/x86/include/asm/cpuid.h Archivado el 27/04/2023 en Wayback Machine , línea 69
  73. Lista de correo gcc-patches, Parche CPUID para IDT Winchip , 21 de mayo de 2019. Archivado el 27 de abril de 2023.
  74. Intel, Nota de aplicación de Intel® Virtualization Technology FlexMigration , número de pedido 323850-004, octubre de 2012, sección 2.3.2, página 12. Archivado el 13 de octubre de 2014.
  75. Intel, Hoja de datos de la familia de productos procesadores Atom C3000 , número de pedido 337018-002, febrero de 2018, páginas 133, 3808 y 3814. Archivada el 9 de febrero de 2022.
  76. AMD, AMD64 Architecture Programmer's Manual Volumen 3 Archivado el 27/04/2023 en Wayback Machine pub.no. 24594, rev 3.34, oct 2022, pág. 165 (entrada sobreCPUIDinstrucciones)
  77. Robert Collins, CPUID Algorithm Wars , noviembre de 1996. Archivado del original el 18 de diciembre de 2000.
  78. Geoff Chappell, Soporte para CMPXCHG8B en el kernel de Windows de 32 bits , 23 de enero de 2008. Archivado el 5 de noviembre de 2023.
  79. 1 2 Intel, Manual del desarrollador de software Archivado el 29/12/2022 en Wayback Machine , pedido n.º 325426-077, noviembre de 2022: la entrada sobre laRDTSCinstrucción en la página 1739 describe las secuencias de instrucciones necesarias para ordenar laRDTSCinstrucción con respecto a las instrucciones anteriores y posteriores.
  80. Manual del desarrollador de software para arquitecturas Intel,, número de pedido 253669-090, febrero de 2026, sección 20.17.3, página 190. Archivado el 17 de febrero de 2026.
  81. Núcleo de Linux 5.4.12, /arch/x86/kernel/cpu/centaur.c Archivado el 24/01/2023 en Wayback Machine
  82. (PARCHE) Marcar TSC en GeodeLX como confiable. Archivado el 11 de octubre de 2025 en Wayback Machine , parche del kernel de Linux, 16 de febrero de 2007.
  83. Stack Overflow, ¿Puede la frecuencia de tsc constante no invariante cambiar entre estados de la CPU? Consultado el 24 de enero de 2023. Archivado el 24 de enero de 2023.
  84. CPU-World, CPUID para Zhaoxin KaiXian KX-5000 KX-5650 (por timw4mail) , 24 de abril de 2024. Archivado el 26 de abril de 2024.
  85. 1 2 Manual del desarrollador de software para arquitecturas Intel,, número de pedido 325462-091, marzo de 2026, véase la entrada de instrucciones NOP en la página 1449 y el volumen 3B, sección 20.17 "Contador de marca de tiempo" en la página 2853. Archivado el 21 de abril de 2026.
  86. Michal Necasek, "RDTSC no documentado" , 27 de abril de 2018. Archivado el 16 de diciembre de 2023.
  87. "GPF de RDTSC en modo V86 en AMD K6" . Grupo de noticias : comp.os.ms-windows.programmer.vxd . 2 de noviembre de 1999. Archivado del original el 15 de septiembre de 2025. Recuperado el 15 de septiembre de 2025 . 
  88. Willy Tarreau, Re: peculiaridad de i686 para AMD Geode Archivado el 11-10-2025 en Wayback Machine , Lista de correo del kernel de Linux , 10 de noviembre de 2009.
  89. Manual de referencia de optimización de arquitecturas Intel, Intel 64 e IA-32: Volumen 1 , número de pedido 248966-050US, abril de 2024, sección 3.5.1.9, página 119. Archivado el 9 de mayo de 2024.
  90. H. Peter Anvin, x86: deshabilitar completamente NOPL en 32 bits , parche del kernel de Linux, 16 de septiembre de 2008. Archivado el 22 de octubre de 2022.
  91. JookWiki, "nopl" , 24 de septiembre de 2022: ofrece un extenso relato de la historia del extenso NOP y los problemas relacionados con él. Archivado el 28 de octubre de 2022.
  92. 1 2 Comunidad Intel: Se oficializa la operación NOP multibyte . Archivado el 7 de abril de 2022.
  93. Manual para desarrolladores de software de Intel , vol. 3B Archivado el 2 de junio de 2023 en Wayback Machine (pedido n.º 253669-076us, diciembre de 2021), sección 22.15 "NOP reservado"
  94. Intel, Patente estadounidense 5701442A: Método para modificar la arquitectura del conjunto de instrucciones de un procesador informático para mantener la compatibilidad con versiones anteriores , concedida en 1997 y caducada en 2015, cubre el uso del0F 18..1Frango de códigos de operación como NOP reservados.
  95. AMD, Tecnología AMD de 64 bits – Manual del programador de la arquitectura AMD x86-64 Volumen 3 Archivado el 18/01/2023 en Wayback Machine , publicación n.º 24594, rev 3.02, agosto de 2002, página 379.
  96. Registros de informes de errores de Debian, la compilación -686 utiliza noops largos, que no son compatibles con Transmeta Crusoe, fallo inmediato al arrancar , ver mensajes 148 y 158 para NOPL en VIA C7. Archivado el 1 de agosto de 2019.
  97. Intel, Manual del desarrollador de software de la arquitectura Intel, Volumen 2 Archivado el 22/04/2023 en Wayback Machine , 1997, número de pedido 243191-001, páginas 3-9 y A-7.
  98. John Hassey, Cambios en Pentium Pro , lista de correo GAS2 , 28 de diciembre de 1995: parche que agregó losUD2AdeUD2Binstrucciones a GNU Binutils. Archivado el 25 de julio de 2023.
  99. Jan Beulich, x86: UDn correcto , lista de correo binutils-gdb , 23 nov 2017 – Parche de Binutils que agregó el byte ModR/M aUD1/UD2By agregóUD0. Archivado el 25 jul 2023.
  100. Manual de referencia de optimización de procesadores Intel,, número de pedido 248966-007, véase "Regla de codificación de ensamblador/compilador 13" en la página 74. Archivado del original el 16 de marzo de 2003.
  101. Intel, Manual del desarrollador de la familia de procesadores Pentium® Volumen 3 Archivado el 22/04/2023 en Wayback Machine , 1995. Número de pedido 241430-004, apéndice A, página 943 – se reservan los códigos de operación0F 0By0F B9.
  102. 1 2 AMD, AMD64 Architecture Programmer's Manual Volumen 3 Archivado el 22-04-2023 en Wayback Machine , publicación n.º 24594, rev 3.17, dic. 2011 – ver página 416 paraUD0y páginas 415 y 419 paraUD1.
  103. 1 2 3 Intel, Manual del desarrollador de software, vol. 2B Archivado el 8 de enero de 2022 en Wayback Machine , número de pedido 253667-061, diciembre de 2016: enumeraUD1(con byte ModR/M ) yUD0(sin byte ModR/M) en la página 4-687.
  104. Stecklina, Julian (2019-02-08). "Identificación de CPU x86 mediante códigos de operación ilegales" . x86.lol . Archivado del original el 15 de diciembre de 2023. Recuperado el 15 de diciembre de 2023 .
  105. "ud0 length fix · intelxed/xed@7561f54" . GitHub . Archivado del original el 1 de junio de 2023 . Recuperado el 15 de diciembre de 2023 .
  106. AMD, Manual del programador de la arquitectura AMD64, volumen 3 , publicación n.º 24594, rev. 3.36, marzo de 2024 – véase la descripción deUD1las instrucciones en la página 356. Archivado el 29 de diciembre de 2024.
  107. 1 2 Cyrix, libro de datos del procesador 6x86 Archivado el 17-05-2023 en Wayback Machine , 1996, pedido n.° 94175-01, tabla 6-20, página 209: utiliza el mnemónicoOIO("Official invalid opcode") para el0F FFcódigo de operación.
  108. Intel, Manual del desarrollador de software, vol. 2B Archivado el 22 de abril de 2023 en Wayback Machine , número de pedido 253667-064, octubre de 2017: listasUD0(con byte ModR/M) en la página 4-683.
  109. AMD, Manual de referencia técnica del procesador AMD-K5 Archivado el 26/02/2024 en Wayback Machine , noviembre de 1996, pedido n.º 18524C/0, sección 3.3.7, página 90: reserva el0F FFcódigo de operación sin asignarle un mnemónico.
  110. AMD, Hoja de datos del procesador AMD-K6 Archivada el 4 de marzo de 2023 en Wayback Machine , número de pedido 20695H/0, marzo de 1998, sección 24.2, página 283.
  111. George Dunlap, La escalada de privilegios de Intel SYSRET , The Xen Project, 13 de junio de 2012. Archivado el 15 de marzo de 2019.
  112. Ensamblador plano 1.73 Manual del programador , sección 2.1.19. Archivado el 28 de noviembre de 2018.
  113. Intel, AP-485: Identificación del procesador Intel® y la instrucción CPUID. Archivado el 30/01/2023 en Wayback Machine , número de pedido 241618-039, mayo de 2012, sección 5.1.2.5, página 32.
  114. Michal Necasek, "SYSENTER, ¿Dónde estás?" , 20 de julio de 2017. Archivado el 29 de noviembre de 2023.
  115. AMD, Guía de optimización de código para procesadores Athlon x86 , publicación n.º 22007, rev. K, febrero de 2002, apéndice F, página 284. Archivado el 13 de abril de 2017.
  116. Transmeta, Reconocimiento de procesadores Archivado el 19/01/2023 en Wayback Machine , 7 de mayo de 2002.
  117. VIA, Hoja de datos del procesador VIA C3 Nehemiah Archivada el 8 de enero de 2023 en Wayback Machine , revisión 1.13, 29 de septiembre de 2004, página 17
  118. CPU-World, CPUID para Intel Xeon 3.40 GHz Archivado el 26/10/2022 en Wayback Machine – CPUID Nocona stepping D sin CMPXCHG16B
  119. CPU-World, CPUID para Intel Xeon 3.60 GHz Archivado el 26/10/2022 en Wayback Machine – CPUID Nocona stepping E con CMPXCHG16B
  120. SuperUser StackExchange, ¿Qué tan comunes son los procesadores x64 antiguos que carecen de la instrucción cmpxchg16b? Archivado el 26/10/2022 en Wayback Machine
  121. Pedido Intel SDM n.° 325462-077 Archivado el 2 de junio de 2023 en Wayback Machine , abril de 2022, vol. 2B, pág. 4-130 "MOVSX/MOVSXD-Move with Sign-Extension" enumera MOVSXD sin REX.W como "desaconsejado".
  122. H. Peter Anvin, [ PARCHE 1/1 ] x86: agregar el código de operación "udb" (UD oficial permanente en modo de 64 bits) Archivado el 20 de agosto de 2025 en Wayback Machine , lista de correo GNU binutils , 11 de agosto de 2025.
  123. Anandtech, Análisis en profundidad de AMD Zen 3 Ryzen , 5 de noviembre de 2020, página 6
  124. @instlatx64 (31 de octubre de 2020). "Salvando Ryzen privado: funciones de reemplazo PEXT/PDEP de 32/64 bits para CPU #AMD (BR/#Zen/Zen+/#Zen2) basadas en el zp7 de @zwegner" ( Tweet ) . Recuperado el 20 de enero de 2023 vía Twitter .
  125. Wegner, Zach (4 de noviembre de 2020). "zwegner/zp7" . GitHub . Archivado del original el 20 de enero de 2023. Recuperado el 20 de enero de 2023 .
  126. Intel, Especificación de tecnología de aplicación de flujo de control archivada el 22/05/2022 en Wayback Machine (v3.0, número de pedido 334525-003, marzo de 2019)
  127. Intel SDM, rev 076, diciembre de 2021. Archivado el 22 de mayo de 2022 en Wayback Machine , volumen 1, sección 18.3.1.
  128. Lista de correo de Binutils: x86: CET v2.0: Actualización del prefijo NOTRACK. Archivado el 13 de marzo de 2022 en Wayback Machine.
  129. Ewan Hai, [ PARCHE 2/3 ] target/i386: Introducir el modelo de CPU del cliente Zhaoxin Shijidadao , lista de correo qemu-devel , 22 de septiembre de 2025.
  130. AMD, Extensiones para los conjuntos de instrucciones 3DNow! y MMX Archivado el 1 de enero de 2023 en Wayback Machine , ref. n.° 22466D/0, marzo de 2000, pág. 11
  131. Manual del desarrollador de software de las arquitecturas Intel, número de pedido 253667-051, junio de 2014, entrada sobrela instrucción en la página 357. Archivado del original el 24 de julio de 2014.SFENCE
  132. AMD, AMD64 Architecture Programmer's Manual Volumen 3: Instrucciones de propósito general y del sistema , pub. n.º 24594, rev. 3.04, abril de 2003, apéndice A.2.5 en la página 382. Archivado del original el 2 de agosto de 2003.
  133. Hadi Brais, La importancia de la instrucción SFENCE x86 Archivado el 28-12-2022 en Wayback Machine , 26 de febrero de 2019.
  134. Intel, Manual del desarrollador de software archivado el 29/12/2022 en Wayback Machine , número de pedido 325426-077, noviembre de 2022, volumen 1, sección 11.4.4.3, página 276.
  135. Hadi Brais, La importancia de la instrucción LFENCE Archivado el 10 de junio de 2023 en Wayback Machine , 14 de mayo de 2018
  136. AMD, Técnicas de software para gestionar la especulación sobre el procesador AMD , rev. 3.8.22, 8 de marzo de 2022, página 4. Archivado el 13 de marzo de 2022.
  137. Intel, Manual del desarrollador de software , número de pedido 325426-084, junio de 2024, vol. 3A, sección 11.12.3, página 3411: describe el uso de laMFENCE;LFENCEsecuencia para garantizar el orden entre un almacenamiento en memoria y una escritura posterior en el registro MSR x2apic. Archivado el 4 de julio de 2024.
  138. Intel, Prescott New Instructions Software Developer's Guide , número de pedido 252490-003, junio de 2003, páginas 3-26 y 3-38, listaMONITORyMWAITcon operandos explícitos. Archivado el 9 de mayo de 2005.
  139. El foro de Flat Assembler, "Sintaxis de BLENDVPS/BLENDVPD/PBLENDVB" , también incluyeMONITOR/MWAIT. Archivado el 6 de noviembre de 2022.
  140. Intel, Intel® Xeon Phi™ Product Family x200 (KNL) Modo de usuario (anillo 3) MONITOR y MWAIT (archivado el 5 de marzo de 2017)
  141. Guía para desarrolladores de AMD, BIOS y kernel (BKDG) para procesadores AMD Family 10h. Archivado el 8 de abril de 2024 en Wayback Machine , número de pedido 31116, revisión 3.62, página 419. Archivado el 8 de abril de 2024 en Wayback Machine .
  142. R. Zhang et al, (M)WAIT for It: Bridging the Gap between Microarchitectural and Architectural Side Channels , 3 de enero de 2023, página 5. Archivado del original el 5 de enero de 2023.
  143. Intel, Architecture Instruction Set Extensions Programming Reference , número de pedido 319433-052, marzo de 2024, capítulo 17. Archivado el 7 de abril de 2024.
  144. Guru3D y VIA Zhaoxin lanzan procesadores SoC x86 de 4 y 8 núcleos. Archivado el 7 de diciembre de 2022 en Wayback Machine , 22 de enero de 2018.
  145. Intel, Actualización de especificaciones de la cuarta generación de equipos de escritorio , número de pedido 328899-039, abril de 2020, véase la errata HSD145 en la página 56. Archivado del original el 6 de abril de 2024.
  146. Vulners, x86: Denegación de servicio por intentar usar INVPCID con direcciones no canónicas. Archivado el 8 de noviembre de 2022 en Wayback Machine , 20 de noviembre de 2018.
  147. Manual del desarrollador de software de las arquitecturas Intel® 64 e IA-32 Archivado el 27/01/2023 en Wayback Machine , volumen 3, número de pedido 325384-078, diciembre de 2022, capítulo 23.15
  148. 1 2 Catherine Easdon, Comportamiento no documentado de la CPU en microarquitecturas x86 y RISC-V: una perspectiva de seguridad. Archivado el 7 de marzo de 2023 en Wayback Machine , 10 de mayo de 2019, página 39.
  149. Instlatx64, volcado de CPUID de Zhaoxin Kaixian KX-6000G Archivado el 25/07/2023 en Wayback Machine , 15 de mayo de 2023
  150. Intel, Guía del desarrollador de software del procesador Willamette , número de pedido 245355-001, febrero de 2000, sección 3.5.3, página 294: listasHWNT/HSTmnemotecnias para los prefijos de sugerencias de bifurcación. Archivado del original el 5 de febrero de 2005.
  151. Intel, Manual del desarrollador de software archivado el 12 de mayo de 2024 en Wayback Machine , número de pedido 325462-083, marzo de 2024 - volumen 1, capítulo 11.4.5, página 281 y volumen 2A, capítulo 2.1.1, página 525.
  152. Código fuente de Intel XED, src/dec/xed-disas.c, línea 325 , 11 de noviembre de 2024. Archivado el 24 de noviembre de 2024.
  153. Alan Modra, Sugerencias de la rama Pentium4 , lista de correo binutils , 10 de junio de 2001. Archivado el 28 de diciembre de 2025.
  154. Manual de referencia de optimización de arquitecturas Intel, Intel 64 e IA-32: Volumen 1 , número de pedido 248966-050US, abril de 2024, capítulo 2.1.1.1, página 46. Archivado el 25 de enero de 2025.
  155. 1 2 3 Intel, Arquitectura de Intel® Software Guard Extensions (Intel® SGX) para la sobreasignación de memoria segura en un entorno virtualizado , 25 de junio de 2017. Archivado el 31 de marzo de 2023.
  156. Intel, Actualizaciones de microcódigo en tiempo de ejecución con extensiones Intel® Software Guard , septiembre de 2021, número de pedido 648682 rev 1.0. Archivado del original el 31 de marzo de 2023.
  157. Intel, Hoja de datos del procesador Intel® Core™ de 11.ª generación para ordenadores de sobremesa, Volumen 1 , mayo de 2022, número de pedido 634648-004, sección 3.5, página 65. Archivado el 19 de febrero de 2025.
  158. Intel, ¿Qué plataformas son compatibles con Intel® Software Guard Extensions (Intel® SGX) SGX2? Archivado el 25 de mayo de 2024.
  159. 1 2 Intel, Intel Architecture Instruction Set Extensions and Future Features , número de pedido 319433-044, mayo de 2021, página 20. Archivado del original el 3 de enero de 2022.
  160. InstLatx64, volcado de CPUID del Intel Core i7-1065G7 : tiene los bits de la función de sobreasignación SGX activados ( CPUID.(EAX=12h,ECX=0) .EAX[6:5]). Archivado el 6 de diciembre de 2019.
  161. Intel, Trust Domain CPU Architectural Extensions , número de pedido 343754-002, mayo de 2021. Archivado el 26 de diciembre de 2022.
  162. Intel, Notificación de salida de enclave asíncrona y la función de hoja de usuario EDECCSSA , 30 de junio de 2022. Archivado el 21 de noviembre de 2022.
  163. Intel, Intel Architecture Instruction Set Extensions and Future Features, número de pedido 319433-057, marzo de 2025, capítulo 14. Archivado el 6 de abril de 2025.
  164. @InstLatX64 (3 de mayo de 2022). "La historia de CLDEMOTE" ( Tweet ) . Recuperado el 23 de enero de 2023 vía Twitter .
  165. @Instlatx64 (17 de abril de 2023). "Volcado de CPUID 806F8 de Intel Xeon w7-2475X de 20 núcleos (SapphireRapids-64L)" ( Tweet ) . Recuperado el 20 de abril de 2023 vía Twitter .
  166. Intel, Inyección de historial de ramificación e inyección de destino de ramificación intramodo / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 , ID 824191, 12 de mayo de 2025, versión 1.0, consulte la sección "Abordaje de la inyección de destino de ramificación intramodo mediante cBPF" para obtener una descripción de la nueva instrucción IBHF. Archivado el 19 de mayo de 2025.
  167. Código fuente de Intel XED /datafiles/ibhf/ibhf-isa.xed.txt línea 31 , versión externa v2026.02.17. Archivado el 24 de febrero de 2026.
  168. Intel, Especificación de la arquitectura del acelerador de transmisión de datos de Intel , número de pedido 341204-004, septiembre de 2022, páginas 13 y 23. Archivado el 20 de julio de 2023.
  169. InstLatx64, volcado de CPUID de Lunar Lake : tiene el bit de característica para PBNDKB establecido ( CPUID.(EAX=7,ECX=1) .EBX[1]). Archivado el 14 de mayo de 2025.
  170. Wikichip, CLZERO – x86 Archivado el 9 de mayo de 2021 en Wayback Machine
  171. Intel, Nota de aplicación AP-578: Consideraciones de software y hardware para manejadores de excepciones de FPU para procesadores con arquitectura Intel. Archivado el 7 de marzo de 2023 en Wayback Machine , número de pedido 243291-002, febrero de 1997.
  172. 1 2 3 Intel, Nota de aplicación AP-113: Introducción al procesador de datos numéricos Archivado el 24/10/2022 en Wayback Machine , febrero de 1981: consulte la página 7 para la detección de la FPU x87 y elFNINITvalor de la palabra de control en el 8087, y las páginas 24-25 para el manejo de interrupciones y el indicador de habilitación de interrupciones del 8087.
  173. 1 2 3 Intel, Manual de referencia del programador 80387 Archivado el 30-01-2025 en Wayback Machine , número de pedido 231917-001, consulte la sección 4.4.12 en la página 89 y la sección C.5 en la página 190 para obtener información sobreFXTRACTcasos especiales, la sección 4.4.9 en la página 87 para obtener información sobre laFPTAN(y por extensiónFSIN/FCOS/FSINCOS), y la sección 4.8.1 en la página 99 para conocerFNINITla capacidad de abortar los ciclos del bus de memoria para la instrucción x87 precedente.
  174. Intel, Coprocesador matemático 8087 Archivado el 24/10/2022 en Wayback Machine , octubre de 1989, número de pedido 285385-007, página 3-100, figura 9
  175. Intel, 80287 Extensión de procesador numérico HMOS de 80 bits Archivado el 24/10/2022 en Wayback Machine , febrero de 1983, número de pedido 201920-001, página 14
  176. Intel, iAPX86, 88 Manual del usuario Archivado el 05/12/2022 en Wayback Machine , 1981 (número de pedido 210201-001), pág. 797
  177. 1 2 3 Manual de referencia para programadores de Intel 80286 y 80287 Archivado el 29/06/2022 en Wayback Machine , 1987 (número de pedido 210498-005), consulte la página 439 para la necesidad de usar paraWAITsincronizar operandos de memoria en el 80287 y la página 485 para los códigos de operación de alias en el 80287.
  178. Manual del desarrollador de software de Intel archivado el 5 de enero de 2022 en Wayback Machine , volumen 3B, revisión 064, sección 22.18.9
  179. "GCC Bugzilla – 37179 – GCC emite el código de operación incorrecto 'ffreep'"" . Archivado del original el 09-04-2022 . Recuperado el 26-07-2022 .
  180. Michael Steil, FFREEP: las instrucciones de montaje que nunca existieron , 26 de junio de 2006. Archivado el 11 de octubre de 2025.
  181. Agner Fog, Cómo optimizar para la familia de microprocesadores Pentium , 3 de julio de 2000, véase la sección 27.8. Archivado del original el 21 de noviembre de 2000.
  182. Repositorio de Github Dosbox-staging, incidencia 1231: Juegos con líneas verticales. Archivado el 5 de diciembre de 2025 en Wayback Machine , 29 de agosto de 2021.
  183. Repositorio Dosbox-pure de Github, problema 156: (Android) Rayas verticales por todo Carmageddon Archivado el 09-12-2025 en Wayback Machine , 10 de mayo de 2021.
  184. Norbert Juffa, Todo lo que siempre quiso saber sobre los coprocesadores matemáticos , v1.6a, 1 de octubre de 1994. Archivado el 18 de octubre de 2021.
  185. Dusko Koncaliev, Error del Pentium FDIV . Archivado el 22 de enero de 1998.
  186. Intel, Manual de referencia del programador i486 , 1990, número de pedido 240486-001, página 612
  187. IBM, Referencia técnica de la interfaz de hardware del sistema personal/2 - Interfaces comunes Archivado el 15/12/2025 en Wayback Machine , número de pedido 84F9735, primera edición, octubre de 1990, páginas 16 y 22.
  188. Bruce Dawson, Intel subestima los límites de error en 1,3 quintillones , 9 de octubre de 2014. Archivado el 1 de septiembre de 2025.
  189. Intel SDM, rev 053 Archivado el 11/02/2022 en Wayback Machine y posteriormente, describe el procedimiento exacto de reducción de argumentos utilizado paraFSIN,FCOS,FSINCOSyFPTANen el volumen 1, sección 8.3.8
  190. Michal Necasek, Failing to fail , 16 de junio de 2023, Museo OS/2 , véase el apéndice. Archivado el 1 de octubre de 2024.
  191. Rastreador de problemas de VirtualBox, ticket 12646: XP Guest GPF en WIN87EM.DLL en 0001:02C9 o 0001:02C6 . Archivado el 13 de marzo de 2016.
  192. Robert Collins, Códigos de operación no documentados: AAM . Archivado el 21 de febrero de 2001.
  193. Retrocomputing StackExchange, prefijo de código de operación 0F1h en i80286 . Archivado el 13 de abril de 2023.
  194. 1 2 Frank van Gilluwe, "El PC indocumentado - Segunda edición", págs. 93-95
  195. Michal Necasek, ¿ Errata del Intel 486?, 6 de diciembre de 2015. Archivado el 29 de noviembre de 2023.
  196. Robert Hummel, "PC Magazine Programmer's Technical Reference" ( ISBN) 1-56276-016-5) pág. 728
  197. Raúl Gutiérrez Sanz, Opcodes 8086 no documentados, Parte I , 27 de diciembre de 2017. Archivado el 29 de noviembre de 2023.
  198. 1 2 "Asm, opcode 82h" . 24 de diciembre de 1998. Archivado del original el 14 de abril de 2023.
  199. Intel Corporation 2022 , pág. 3698.
  200. Intel, Manual del usuario de la familia 8086, octubre de 1979. Archivado el 4 de abril de 2018 en Wayback Machine . Se omitieron los códigos de operación en las páginas 4-25 y 4-31.
  201. Retrocomputing StackExchange, ¿ Instrucciones no documentadas en la CPU x86 anterior al 80386?, 4 de junio de 2021. Archivado el 18 de julio de 2023.
  202. Daniel B. Sedory, Un examen del MBR estándar , 2000. Archivado el 6 de octubre de 2023.
  203. AMD, Guía de optimización de software para procesadores AMD64 Archivada el 30/01/2023 en Wayback Machine (publicación 25112, revisión 3.06, septiembre de 2005), sección 6.2, pág. 128
  204. GCC bugzilla, Error 48227 – Se generó "rep ret" para -march=core2 . Archivado el 9 de abril de 2023.
  205. Raymond Chen, ¡ Vaya, qué NOPs extraños tienes!, 12 de enero de 2011. Archivado el 20 de mayo de 2023.
  206. Jeff Parsons, Información sobre la CPU Intel 80386 (sección de erratas B1, punto n.º 7). Archivado el 13 de noviembre de 2023.
  207. Manual para desarrolladores de software de Intel , volumen 2B Archivado el 4 de marzo de 2022 en Wayback Machine (enero de 2006, número de pedido 235667-018, no tiene NOP largo)
  208. Manual para desarrolladores de software de Intel , volumen 2B Archivado el 7 de enero de 2022 en Wayback Machine (marzo de 2006, número de pedido 235667-019, tiene NOP largo)
  209. Agner Fog, Tablas de instrucciones archivadas el 10/01/2020 en Wayback Machine , sección AMD K7.
  210. "579838 – glibc no es compatible con AMD Geode LX" . Archivado del original el 30 de julio de 2023.
  211. Manual para desarrolladores de software de Intel , volumen 2B Archivado el 31/03/2022 en Wayback Machine (abril de 2005, número de pedido 235667-015, no incluye 0F0D-nop)
  212. Manual para desarrolladores de software de Intel , volumen 2B Archivado el 31/03/2022 en Wayback Machine (junio de 2005, número de pedido 235667-016, incluye 0F0D-nop en la tabla de códigos de operación, pero no en laNOPdescripción de la instrucción).
  213. El manual para desarrolladores de software de Intel , volumen 2B, archivado el 8 de enero de 2022 en Wayback Machine (número de pedido 253667-060, septiembre de 2016), no incluyeUD0yUD1.
  214. "PCJS : pcjs/x86op0F.js (controladores de código de operación x86 de dos bytes), líneas 1647–1651" . GitHub . 17 de abril de 2022. Archivado del original el 13 de abril de 2023. 
  215. "¿80486 fallos de protección de paginación? \ VOGONS" . Archivado del original el 9 de abril de 2022.
  216. "Manejo de código de operación no válido \ VOGONS" . Archivado del original el 9 de abril de 2022.
  217. "Las instrucciones no válidas provocan la salida incluso si Int 6 está interceptado \ VOGONS" . Archivado del original el 9 de abril de 2022.
  218. "Tutorial: Llamar a Win32 desde DOS" . Ragestorm . 17 de septiembre de 2005. Archivado del original el 9 de abril de 2022.
  219. "Acceso a controladores de dispositivos Windows desde programas DOS" . Archivado del original el 8 de noviembre de 2011.
  220. 1 2 "Microcódigo 8086 desensamblado" . Blog de Reenigne . 3 de septiembre de 2020. Archivado del original el 8 de diciembre de 2023. Recuperado el 26 de julio de 2022. El uso del prefijo REP o REPNE con una instrucción MUL o IMUL niega el producto. El uso del prefijo REP o REPNE con una instrucción IDIV niega el cociente.
  221. "Re: Códigos de operación no documentados (HINT_NOP)" . Archivado del original el 6 de noviembre de 2004. Consultado el 7 de noviembre de 2010 .
  222. "Re: También algunos códigos de operación 0Fh no documentados" . Archivado del original el 26 de junio de 2003. Recuperado el 7 de noviembre de 2010 .
  223. La biblioteca RCCE de Intelpara el SCC utilizaba el código de operaciónpara la instrucción de invalidación de mensajes del SCC.0F 0A
  224. Intel Labs, Especificación de arquitectura externa SCC (EAS), Revisión 0.94 , pág. 29. Archivado el 22 de mayo de 2022.
  225. "Instrucciones x86 no documentadas para controlar la CPU a nivel de microarquitectura en procesadores Intel modernos" (PDF) . 9 de julio de 2021.
  226. Robert R. Collins, Códigos de operación no documentados: UMOV . Archivado el 21 de febrero de 2001.
  227. Herbert Oppmann, NXOP (Código de operación 0Fh 55h) Archivado el 9 de abril de 2022 en Wayback Machine
  228. Herbert Oppmann, NexGen Nx586 Hypercode Source , ver COMMON.INC. Archivado el 9 de abril de 2023.
  229. Herbert Oppmann, Inside the NexGen Nx586 System BIOS . Archivado el 29 de diciembre de 2023.
  230. Intel, XuCode: Una tecnología innovadora para implementar flujos de instrucciones complejos , 6 de mayo de 2021. Archivado el 7 de enero de 2026.
  231. Grzegorz Mazur, instrucciones no documentadas de AMD 3DNow!
  232. 1 2 "Instrucciones no documentadas de 3DNow!" . grafi.ii.pw.edu.pl . Archivado del original el 30 de enero de 2003. Recuperado el 22 de febrero de 2022 .
  233. OPCODE.LST del grupo de hackers de Potemkin, v4.51 , 15 de octubre de 1999. Archivado el 21 de mayo de 2001.
  234. " [ Análisis de CPU UCA ] Prototipo de CPU verde UMC U5S-SUPER33" . 25 de mayo de 2020. Archivado del original el 9 de junio de 2023.
  235. Agner Fog, La microarquitectura de las CPU de Intel, AMD y VIA , sección 3.4 "Predicción de ramificaciones en P4 y P4E". Archivado el 7 de enero de 2024.
  236. 1 2 Christopher Domas, Rompiendo el ISA x86 , 27 de julio de 2017. Archivado el 27 de diciembre de 2023.
  237. 1 2 Xixing Li et al, UISFuzz: Un método de fuzzing eficiente para la búsqueda de instrucciones no documentadas de la CPU , 9 de octubre de 2019, pág. 9. Archivado el 21 de febrero de 2026 en Wayback Machine.
  238. Microprocessor Report, MediaGX apunta a las PC de bajo costo (vol. 11, n.° 3, 10 de marzo de 1997). Archivado el 6 de junio de 2022.
  239. "Bienvenido al proyecto OpenSSL" . GitHub . 21 de abril de 2022. Archivado del original el 4 de enero de 2022.
  240. LKML, (PARCHE) crypto: Zhaoxin: Controlador de motor de hardware para SHA1/256/384/512 , 2 de agosto de 2023. Archivado el 17 de enero de 2024.
  241. Kary Jin, PARCHE: Actualización del motor PadLock para las CPU VIA C7 y Nano , lista de correo openssl-dev , 10 de junio de 2011. Archivado el 11 de febrero de 2022.
  242. 1 2 Lista de correo de OpenEuler, PARCHE kernel-4.19 v2 5/6  : x86/cpufeatures: Agregar bits de características de Zhaoxin . Archivado el 9 de abril de 2022.
  243. USPTO/Zhaoxin, Solicitud de patente US2023/006718: Procesador con un algoritmo criptográfico hash y procesamiento de datos del mismo , páginas 13 y 45, 2 de marzo de 2023. Archivada el 12 de septiembre de 2023.
  244. LKML, (PATCH) crypto: x86/sm2 -add Implementación del algoritmo Zhaoxin SM2 , 11 de noviembre de 2023. Archivado el 17 de enero de 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 )
Obtenido de " https://en.wikipedia.org/w/index.php?title=List_of_x86_instructions&oldid=1361173850 "