stringtranslate.com

listados de instrucciones x86

El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Las instrucciones suelen formar parte de un programa ejecutable , a menudo almacenado como un archivo de computadora y ejecutado 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 funciones. [1]

instrucciones enteras x86

A continuación se muestra el conjunto completo de instrucciones 8086/8088 de Intel (81 instrucciones en total). La mayoría, si no todas, estas instrucciones están disponibles en modo de 32 bits; simplemente operan con registros y valores de 32 bits ( eax , ebx , etc.) en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado también se agrupa según la arquitectura ( i386 , i486 , i686 ) y, de forma más general, se denomina x86 (32 bits) y x86-64 (64 bits) (también conocido como AMD64 ).

Instrucciones originales 8086/8088

Agregado en procesadores específicos.

Añadido con 80186/80188

Agregado con 80286

Las nuevas instrucciones agregadas en 80286 agregan soporte para el modo protegido x86 . Algunas, pero no todas, las instrucciones también están disponibles en modo real .

  1. ^ abcd Los descriptores utilizados por las instrucciones LGDT, LIDTy SGDTconstan SIDTde 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 inicial lineal de la tabla.
    Para LGDTy LIDTcon un tamaño de operando de 16 bits, la dirección se aplica mediante AND con 00FFFFFFh. En las CPU Intel (pero no AMD), las instrucciones SGDTy 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, se observó El comportamiento es que en su lugar se escriben los bits 31:24 de la dirección de la tabla de descriptores. [2]
  2. ^ abcde Las instrucciones LGDT,, y se serializan en LIDTprocesadores Pentium y posteriores .LLDTLMSWLTR
  3. ^ En 80386 y posteriores, la "Palabra de estado de la máquina" es la misma que el registro de control CR0 ; sin embargo, la LMSWinstrucción solo puede modificar los 4 bits inferiores de este registro y no puede borrar el bit 0. La imposibilidad de borrar el bit 0 significa que LMSWpuede se puede usar para ingresar pero no salir del modo protegido x86 .
    En 80286, no es posible salir del modo protegido en absoluto (ni con LMSWni con LOADALL[3] ) sin reiniciar la CPU ; en 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de 80386-y -más tarde MOVa la CR0instrucción.
  4. ^ Si CR4.UMIP=1está configurado, las instrucciones SGDT,,, y solo se pueden ejecutar en el Anillo 0. Estas instrucciones no tenían privilegios en todas las CPU x86 desde 80286 en adelante hasta la introducción de UMIP en 2017. [4]SIDT Este ha sido un problema de seguridad importante SLDTpara el software -virtualización basada en, ya que permite que estas instrucciones sean utilizadas por una VM invitada para detectar que se está ejecutando dentro de una VM. [5] [6]SMSWSTR
  5. ^ abc Las instrucciones SMSWy siempre usan un tamaño SLDTde STRoperando 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 operandos de destino más amplios y se comportan de la siguiente manera:
    • SMSW: Almacena CR0 completo en modo largo x86-64 , de lo contrario no está definido.
    • SLDT: Argumento de 16 bits con extensión cero en procesadores Pentium Pro y posteriores, indefinido en procesadores anteriores.
    • STR: Argumento de 16 bits que se extiende a cero.
  6. ^ En el modo largo de 64 bits , la instrucción no está disponible; el código de operación se ha reasignado a la instrucción solo en modo de 64 bits .ARPL63 /rMOVSXD
  7. ^ La ARPLinstrucción provoca #UD en modo real y modo virtual 8086 : se sabe que Windows 95 y OS/2 2.x hacen un uso extensivo de este #UD para usar el 63código de operación como un punto de interrupción de un byte para realizar la transición del modo virtual 8086 al modo kernel. [7] [8]
  8. ^ Los bits 19:16 de esta máscara están documentados como "indefinidos" en las CPU Intel. [9] En las CPU AMD, la máscara está documentada como 0x00FFFF00.
  9. ^ En algunas combinaciones de CPU/microcódigo Intel a partir de 2019, la VERWinstrucción también vacía los búferes de datos de microarquitectura. Esto permite que se utilice como parte de soluciones alternativas para las vulnerabilidades de seguridad de muestreo de datos de microarquitectura . [10] [11]
  10. ^ ab Indocumentado, 80286 únicamente. [3] [12] [13] (Existe una variante diferente LOADALLcon un código de operación y diseño de memoria diferentes en 80386).

Agregado con 80386

El 80386 agregó soporte para operación de 32 bits al conjunto de instrucciones x86. Esto se hizo ampliando los registros de propósito general a 32 bits e introduciendo los conceptos de OperandSize y AddressSize ; la mayoría de las formas de instrucción que anteriormente tomaban argumentos de datos de 16 bits tuvieron la capacidad de tomar argumentos de 32 bits configurando su OperandSize en 32. bits, y a las instrucciones que podían tomar argumentos de dirección de 16 bits se les dio la capacidad de tomar argumentos de dirección de 32 bits configurando su AddressSize en 32 bits. (Los formularios de instrucciones que funcionan con datos de 8 bits siguen siendo de 8 bits independientemente del OperandSize. El uso de un tamaño de datos de 16 bits provocará que solo se modifiquen los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 superiores los bits no se modifican.)

El OperandSize y AddressSize predeterminados que se usarán para cada instrucción viene dado por el bit D del descriptor de segmento del segmento de código actual: D=0ambos son de 16 bits y D=1ambos de 32 bits. Además, se pueden anular por instrucción con dos nuevos prefijos de instrucción que se introdujeron en 80386:

El 80386 también introdujo los dos nuevos registros de segmento FSy los registros de control , depuración y prueba GSx86 .

Las nuevas instrucciones introducidas en el 80386 se pueden subdividir en términos generales en dos clases:

Para formularios de instrucción donde 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 reduce posteriormente en 4 si EFLAGS.DF=1y se incrementa posteriormente en 4 en caso contrario.
    Para los operandos en los que se indica el segmento DS, el segmento DS se puede anular mediante un prefijo de anulación de segmento; cuando se indica el segmento ES, el segmento siempre es ES y no se puede anular.
    La elección de utilizar los registros SI/DI de 16 bits o los registros ESI/EDI de 32 bits como registros de direcciones a utilizar la realiza AddressSize, anulable con el 67prefijo.
  2. ^ Las instrucciones de cadena de 32 bits aceptan prefijos repetidos de la misma manera que las instrucciones de cadena más antiguas de 8/16 bits.
    Para LODSD, STOSD, y , el MOVSDprefijo ( ) repetirá la instrucción el número de veces especificado en rCX (CX o ECX, decidido por AddressSize), disminuyendo rCX para cada iteración (con rCX=0 dando como resultado no operativo y procediendo a la siguiente instrucción). Para y , los prefijos ( ) y ( ) están disponibles, lo que repetirá la instrucción pero solo mientras la condición de bandera (ZF=1 para , ZF=0 para ) sea verdadera.INSDOUTSDREPF3
    CMPSDSCASDREPEF3REPNEF2REPEREPNE
  3. ^ Para las INSB/W/Dinstrucciones, es posible que los derechos de acceso a la memoria para la ES:[rDI]dirección de la memoria no se verifiquen hasta después de que se haya realizado el acceso al puerto; si esta verificación falla (por ejemplo, falla de página u otra excepción de memoria), entonces el elemento de datos leído desde el puerto se pierde . Como tal, no se recomienda utilizar esta instrucción para acceder a un puerto de E/S que produzca algún tipo de efecto secundario tras la lectura.
  4. ^ El acceso al puerto de E/S solo se permite cuando CPL≤IOPL o los bits del mapa de bits de permiso del puerto de E/S para que el puerto acceda están todos configurados en 0.
  5. ^ La CWDEinstrucción difiere de la CWDinstrucción anterior en que CWDextendería con signo el valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX.
  6. ^ Para el E3código de operación ( JCXZ/ JECXZ), la elección de si se usará la instrucción CXo ECXpara su comparación (y, en consecuencia, qué mnemotécnico usar) se basa en AddressSize, no en OperandSize. (OperandSize en cambio controla si el destino del salto debe truncarse a 16 bits o no).
    Esto también se aplica a las instrucciones de bucle LOOP, LOOPE, LOOPNE(códigos de operación E0, E1, E2); sin embargo, a diferencia de JCXZ/ JECXZ, a estas instrucciones no se les han dado nuevos mnemotécnicos para sus variantes que usan ECX.
  7. ^ Para PUSHA(D), el valor de SP/ESP insertado en la pila es el valor que tenía justo antes de que la PUSHA(D)instrucción comenzara a ejecutarse.
  8. ^ Para POPA/ POPAD, el elemento de la pila correspondiente a SP/ESP se extrae de la pila (realizando una lectura de memoria), pero no se coloca en SP/ESP.
  9. ^ Las instrucciones PUSHFDy POPFDcausarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3.
    Las PUSHFinstrucciones POPF, IRETy IRETDcausarán una excepción #GP si se ejecutan en modo Virtual-8086 si IOPL no es 3 y VME no está habilitado .
  10. ^ Si IRETDse usa para regresar del modo kernel al modo usuario (lo que implicará un cambio de CPL) y el segmento de pila en modo usuario indicado por SS es un segmento de 16 bits, entonces la IRETDinstrucción solo restaurará los 16 bits inferiores de la pila. puntero (ESP/RSP), y los bits restantes conservan cualquier valor que tuvieran en el código del núcleo antes del archivo IRETD. Esto ha requerido soluciones complejas tanto en Linux ("ESPFIX") [14] como en Windows. [15]IRETQ Este problema también afecta a las instrucciones posteriores de 64 bits .
  1. ^ abcd Para las instrucciones BT, BTSy :BTRBTC
    • Si el primer argumento de la instrucción es un operando de registro y/o el segundo argumento es un inmediato, entonces el índice de bits en el segundo argumento se toma en tamaño de operando de módulo (16/32/64, de hecho usando solo los 4 inferiores, 5 o 6 bits del índice.)
    • Si el primer argumento es un operando de memoria y el segundo argumento es un operando de registro, entonces el índice de bits en el segundo argumento se usa en su totalidad; se interpreta como un índice de bits con signo que se usa para compensar la dirección de memoria que se usará. para la prueba de bits.
  2. ^ abc Las BTSinstrucciones BTCy BTRaceptan el prefijo LOCK( F0) cuando se usan con un argumento de memoria; esto da como resultado que la instrucción se ejecute atómicamente.
  3. ^ Si el F3prefijo se usa con el 0F BC /rcódigo de operación, la instrucción se ejecutará como TZCNTen los sistemas que admiten la extensión BMI1. TZCNTdifiere de BSFeso, TZCNTpero no BSRestá definido para devolver el tamaño del operando si el operando de origen es cero; para otros valores de operando de origen, producen el mismo resultado.
  4. ^ ab BSFy BSRestablezca el indicador EFLAGS.ZF en 1 si el argumento fuente era todo 0 y 0 en caso contrario.
    Si el argumento de origen era todo 0, entonces se documenta que el registro de destino no se modifica en los procesadores AMD, pero se establece en un valor indefinido en los procesadores Intel.
  5. ^ Si el F3prefijo se usa con el 0F BD /rcódigo de operación, la instrucción se ejecutará como LZCNTen sistemas que admiten las extensiones ABM o LZCNT. LZCNTproduce un resultado diferente al BSRde la mayoría de los valores de entrada.
  6. ^ ab Para SHLDy SHRD, la cantidad de desplazamiento está enmascarada: los 5 bits inferiores se utilizan para un tamaño de operando de 16/32 bits y 6 bits para un tamaño de operando de 64 bits.
    SHLDy SHRDcon argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 produce resultados indefinidos. (Los resultados reales difieren entre las diferentes CPU Intel, y se conocen al menos tres comportamientos diferentes. [16] )
  7. ^ ab Los códigos de condición admitidos para las instrucciones y (códigos de operación y respectivamente, con el nibble x especificando la condición) son:SETccJcc near0F 9x /00F 8x
  8. ^ Para SETcc, si bien el código de operación se especifica comúnmente como /0, lo que implica que los bits 5:3 del byte ModR/M de la instrucción deben ser 000, los procesadores x86 modernos (Pentium y posteriores) ignoran los bits 5:3 y ejecutarán la instrucción SETccindependientemente del contenido de estos bits.
  9. ^ Para y LFS, 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 es siempre de 16 bits. En el modo de 64 bits, el uso del prefijo con estas instrucciones hará que se cargue un puntero lejano con un desplazamiento de 64 bits en los procesadores Intel pero no en los procesadores AMD.LGSLSSREX.W
  10. ^ abcdef Para MOVlos registros y hacia/desde CRx, la parte reg del byte ModR/M se utiliza para indicar el registro y la parte r/m el registro general. Exclusivamente para los có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 fueran .DRxTRxCRx/DRx/TRxMOV CRx/DRx/TRx11b
  11. ^ abcd Para movimientos hacia/desde los registros CRxy DRx, el tamaño del operando es siempre de 64 bits en el modo de 64 bits y de 32 bits en caso contrario.
  12. ^ En procesadores anteriores a Pentium , los movimientos a CR0no serializarían el flujo de instrucciones; en parte por esta razón, generalmente es necesario realizar un salto lejano inmediatamente después de a MOVsi CR0se MOVusa para habilitar/deshabilitar el modo protegido y/o la memoria . paginación .
    MOVa CR2está catalogado arquitectónicamente como serializado, pero se ha informado que no se serializa en al menos algunos procesadores Intel Core-i7. [17]
    MOV a CR8(introducido con x86-64) no se serializa.
  13. ^ ab Las MOV TRxinstrucciones se suspendieron a partir del Pentium.
  14. ^ La instrucción INT1/ ICEBP( F1) está presente en todos los procesadores Intel x86 conocidos desde 80386 en adelante, [18] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 de Intel SDM (rev 067) en adelante. [19] Antes de esta publicación, la mención de la instrucción en material de Intel era esporádica, por ejemplo, AP-526 rev 001. [20]
    Para los procesadores AMD, la instrucción ha estado documentada desde 2002. [21]
  15. ^ El funcionamiento del código de operación F1( ICEBP) difiere del funcionamiento del código de operación de interrupción de software normal CD 01en varios aspectos:
      En modo protegido, CD 01comparará CPL con el campo DPL del descriptor de interrupción como una verificación de derechos de acceso, mientras que F1no lo hará.
    • En el modo virtual-8086, CD 01también comparará CPL con IOPL como verificació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, CD 01pero no F1.
  16. ^ La instrucción UMOV está presente únicamente en los procesadores 386 y 486. [18]
  17. ^ ab Las instrucciones XBTSy IBTSse suspendieron con el paso B1 de 80386.
    El software las ha utilizado principalmente para la detección del error [22] Paso B0 de 80386. Microsoft Windows (v2.01 y posteriores) intentará ejecutar la XBTSinstrucción. como parte de su detección de CPU si CPUIDno está presente y se negará a arrancar si XBTSse encuentra que está funcionando. [23]
  18. ^ ab Para XBTSy IBTS, el argumento r/m representa los datos para extraer/insertar un campo de bits desde/hacia, el argumento reg el campo de bits que se insertará/extraerá, AX/EAX un desplazamiento de bits y CL una longitud de campo de bits. [24]
  19. ^ Indocumentado, solo 80386. [25]

Agregado con 80486

  1. ^ El uso BSWAPcon registros de 16 bits no está prohibido per se (se ejecutará sin producir un #UD u otras excepciones), pero está documentado que produce resultados indefinidos; se informa que produce varios resultados diferentes en 486, [26] 586, y Bochs / QEMU . [27]
  2. ^ ab En Intel 80486 paso A, [28] la CMPXCHGinstrucción utiliza una codificación diferente: 0F A6 /rpara la variante de 8 bits, 0F A7 /rpara la variante de 16/32 bits. Las 0F B0/B1codificaciones se utilizan en 80486 paso B y posteriores. [29] [30]
  3. ^ La CMPXCHGinstrucción se establece EFLAGSde la misma manera que una CMPinstrucción que usa el acumulador (AL/AX/EAX/RAX) como lo haría su primer argumento.
  4. ^ INVLPG se ejecuta como sin operación si el argumento m8 no es válido (por ejemplo, una página no asignada o una dirección no canónica).
    INVLPGse puede utilizar para invalidar entradas TLB para páginas globales individuales.
  5. ^ ab Las instrucciones INVDy WBINVDinvalidarán todas las líneas de caché en las cachés L1 de la CPU. Está definido por la implementación si también invalidarán las cachés L2/L3.
    Estas instrucciones se serializan; en algunos procesadores, también pueden bloquear las interrupciones hasta su finalización.
  6. ^ Si la PRM (memoria reservada del procesador) se configuró utilizando los PRMRR (registros de rango PRM), entonces la INVDinstrucción no está permitida y provocará una excepción #GP(0). (El PRM es necesario para Intel SGX). [31]
  7. ^ Si el F3prefijo se usa con el 0F 09código de operación, la instrucción se ejecutará como WBNOINVDen los procesadores que admiten la extensión WBNOINVD; esto no invalidará el caché.

Agregado en procesadores de clase P5 / P6

Instrucciones de entero/sistema que no estaban presentes en el conjunto de instrucciones básico 80486, pero que se agregaron en varios procesadores x86 antes de la introducción de SSE. ( Las instrucciones descontinuadas no están incluidas).

  1. ^ En las CPU Intel y AMD, la WRMSRinstrucción también se utiliza para actualizar el microcódigo de la CPU . Esto se hace escribiendo la dirección virtual del nuevo microcódigo para cargarlo en MSR 79hen CPU Intel y MSR C001_0020h[33] en CPU AMD.
  2. ^ Las escrituras en los siguientes MSR no se serializan: [34]
  3. ^ El modo de administración del sistema y las RSMinstrucciones estuvieron disponibles en variantes que no son SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993.
  4. ^ En algunos procesadores antiguos de 32 bits, la ejecución CPUIDcon un índice de hoja (EAX) mayor que 0 puede dejar EBX y ECX sin modificar, manteniendo sus valores anteriores. Por este motivo, se recomienda poner a cero EBX y ECX antes de ejecutar CPUID.
    Los procesadores que exhiben este comportamiento incluyen Cyrix MII [39] e IDT WinChip 2. [40]

    En modo de 64 bits, CPUIDestablecerá los 32 bits superiores de RAX, RBX, RCX y RDX en cero.
  5. ^ En algunos procesadores Intel a partir de Ivy Bridge , existen MSR que se pueden usar para restringir CPUIDal anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [41] y Denverton. [42]
    La capacidad de restringir CPUIDal anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [43]
  6. ^ ab CPUIDtambién está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium.
  7. ^ 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.
  8. ^ En las CPU NexGen, CPUIDsolo es compatible con algunos BIOS del sistema. En algunas CPU NexGen que sí admiten CPUID, EFLAGS.ID no es compatible pero sí EFLAGS.AC, lo que complica la detección de la CPU. [44]
  9. ^ A diferencia de la instrucción anterior CMPXCHG, la CMPXCHG8Binstrucción no modifica ningún bit EFLAGS que no sea ZF.
  10. ^ LOCK CMPXCHG8B con un operando de registro (que es una codificación no válida) puede provocar bloqueos en algunas CPU Intel Pentium ( error Pentium F00F ).
  11. ^ abc En los procesadores IDT WinChip, Transmeta Crusoe y Rise mP6, la CMPXCHG8Binstrucción siempre es compatible, sin embargo, es posible que falte su bit CPUID. Esta es una solución para un error en Windows NT. [45]
  12. ^ ab Las instrucciones RDTSCy RDPMCno están ordenadas con respecto a otras instrucciones y pueden probar sus respectivos contadores antes de que se ejecuten las instrucciones anteriores o después de que se hayan ejecutado las instrucciones posteriores. Las invocaciones de RDPMC(pero no RDTSC) se pueden reordenar entre sí incluso para lecturas del mismo contador.
    Para imponer ordenamiento con respecto a otras instrucciones, se necesitan LFENCEinstrucciones de serialización (p. ej. ). [46]CPUID
  13. ^ El TSC de tasa fija se introdujo en dos etapas:
    TSC constante
    TSC se ejecuta 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 [47] . No tiene un bit CPUID.
    TSC invariante
    TSC se ejecuta a una velocidad fija y permanece sincronizado entre 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 [48] y posteriores; Zhaoxin LuJiaZui [49] y posteriores. Indicado con un bit CPUID (hoja 8000_0007:EDX[8]).
  14. ^ RDTSC se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0.
    En Intel Pentium y AMD K5, RDTSCno se puede ejecutar en modo Virtual-8086. [50] Los procesadores posteriores eliminaron esta restricción.
  15. ^ RDPMC se puede ejecutar fuera del anillo 0 solo si CR4.PCE=1.
  16. ^ La RDPMCinstrucción no está presente en los procesadores VIA anteriores al Nano.
  17. ^ Los códigos de condición admitidos para las instrucciones (código de operación , con el nibble x que especifica la condición) son:CMOVcc0F 4x /r
  18. ^ En modo de 64 bits, CMOVcccon un tamaño de operando de 32 bits se borrarán los 32 bits superiores del registro de destino incluso si la condición es falsa.
    En el caso CMOVccde un operando de origen de memoria, la CPU siempre leerá el operando de la memoria, lo que podría provocar excepciones de memoria y rellenos de líneas de caché, incluso si no se cumple la condición para el movimiento. (La extensión Intel APX define una variante codificada en EVEXCMOVcc que suprimirá las excepciones de memoria si la condición es falsa).
  19. ^ A diferencia de otras instrucciones agregadas en Pentium Pro , el NOP largo no tiene un bit de característica CPUID .
  20. ^ 0F 1F /0 Mientras, NOP se introdujo en el Pentium Pro, pero permaneció sin documentar hasta 2006. [52] Toda la 0F 18..1Fgama de códigos de operación estaba NOPen Pentium Pro. Sin embargo, a excepción de 0F 1F /0, Intel no garantiza que estos códigos de operación permanecerán NOPen procesadores futuros y, de hecho, ha asignado algunos de estos códigos de operación a otras instrucciones en al menos algunos procesadores. [53]
  21. ^ Documentado para AMD x86-64 desde 2002. [54]
  22. ^ Si bien el 0F 0Bcódigo de operación se reservó oficialmente como código de operación no válido desde Pentium en adelante, solo se le asignó el mnemotécnico UD2desde Pentium Pro en adelante. [55]
  23. ^ ab GNU Binutils ha utilizado los mnemónicos UD2Ay UD2Bpara los códigos de operación 0F 0By 0F B9desde la versión 2.7. [56]
    Ni UD2Ani UD2Boriginalmente tomó ningún argumento; UD2Bluego se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [57]
  24. ^ ab Los códigos de operación UD0/1/2 - 0F 0By 0F B9- 0F FFprovocarán una excepción #UD en todos los procesadores x86 desde 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. .
  25. ^ Si bien el 0F B9código de operación se reservó oficialmente como un código de operación no válido desde Pentium en adelante, solo se le asignó su mnemotécnico UD1mucho más tarde: AMD APM comenzó a incluirlo UD1en sus mapas de códigos de operación desde la rev 3.17 en adelante, [59] mientras que Intel SDM comenzó a incluirlo desde la rev 061 en adelante. . [60]
  26. ^ ab Tanto para los códigos de operación 0F B9como 0F FF, se sabe que las diferentes implementaciones x86 difieren con respecto a si los códigos de operación aceptan un byte ModR/M . [61] [62]
  27. ^ Para el 0F FFcódigo de operación, OIOCyrix introdujo el mnemónico, [63]UD0 mientras que AMD e Intel introdujeron el mnemónico (sin argumentos) al mismo tiempo que el UD1mnemónico para 0F B9. [59] [60] La documentación posterior de Intel (pero no de AMD) modificó su descripción para UD0agregar un byte ModR/M y tomar dos argumentos. [64]
  28. ^ En K6, las instrucciones SYSCALL/ SYSRETestaban disponibles en el Modelo 7 (250 nm "Little Foot") y posteriores, no en el Modelo 6 anterior. [66]
  29. ^ SYSCALL y SYSRETse convirtieron en parte integral de x86-64; como resultado, las instrucciones están disponibles en modo de 64 bits en todos los procesadores x86-64 de AMD, Intel, VIA y Zhaoxin.
    Fuera del modo de 64 bits, las instrucciones solo están disponibles en procesadores AMD.
  30. ^ La semántica exacta de SYSRETdifiere ligeramente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas provocan que se genere una excepción #GP en el Anillo 3 en las CPU AMD pero en el Anillo 0 en las CPU Intel. Se sabe que esto causa problemas de seguridad. [67]
  31. ^ ab Para las instrucciones SYSRETy SYSEXITen x86-64, es necesario agregar el REX.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).
  32. ^ abc Las instrucciones y SYSRETno están disponibles en modo Real . ( Sin embargo, está disponible en modo Virtual 8086 ).SYSENTERSYSEXITSYSENTER
  33. ^ Las CPUIDbanderas que indican soporte para SYSENTER/ SYSEXITestán configuradas en el Pentium Pro, aunque el procesador no admite oficialmente estas instrucciones. [68]
    Las pruebas de terceros indican que los códigos de operación están presentes en el Pentium Pro pero tienen demasiados errores para ser utilizables. [69]
  34. ^ En las CPU AMD, las instrucciones SYSENTERy SYSEXITno están disponibles en el modo largo x86-64 (#UD).
  35. ^ En las CPU Transmeta, las instrucciones SYSENTERy SYSEXITsolo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [71]
  36. ^ En Nehemías, SYSENTERy SYSEXITestán disponibles solo en el paso 8 y posteriores. [72]

Agregado como extensiones del conjunto de instrucciones.

Agregado con x86-64

Estas instrucciones sólo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:

La mayoría de las instrucciones con un tamaño de operando de 64 bits lo codifican mediante un REX.Wprefijo; en ausencia del REX.Wprefijo, se codifica la instrucción correspondiente con un tamaño de operando de 32 bits. Este mecanismo también se aplica a la mayoría de las otras instrucciones con un tamaño de operando de 32 bits. Estos no se enumeran aquí porque no obtienen una nueva mnemónica en la sintaxis de Intel cuando se usan con un tamaño de operando de 64 bits.

  1. ^ El operando de memoria CMPXCHG16Bdebe estar alineado con 16 bytes.
  2. ^ La CMPXCHG16Binstrucción estaba ausente en algunos de los primeros procesadores Intel/AMD x86-64. En los procesadores Intel, faltaba la instrucción en el paso D de Xeon "Nocona" , [73] pero se agregó en el paso E. [74] En los procesadores de la familia AMD K8 , se agregó en el paso F, al mismo tiempo que se introdujo el soporte DDR2. . [75]
    Por esta razón, CMPXCHG16Btiene su propio indicador CPUID, separado del resto de x86-64.
  3. ^ Se permiten codificaciones sin prefijo REX.W, pero no se recomiendan [76] ; dichas codificaciones se comportan de manera idéntica a las de 16/32 bits ( ).MOVSXDMOV8B /r

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.

  1. ^ En las CPU AMD, la extensión "ABM" proporciona tanto POPCNTy LZCNT. Sin embargo, en las CPU Intel, el bit CPUID para "ABM" solo está documentado para indicar la presencia de la LZCNTinstrucción y aparece como "LZCNT", mientras que POPCNTtiene su propio bit de característica CPUID independiente.
    Sin embargo, todos los procesadores conocidos que implementan las extensiones "ABM"/"LZCNT" también implementan POPCNTy configuran el bit de característica CPUID para POPCNT, por lo que la distinción es sólo teórica.
    (Lo contrario no es cierto: existen procesadores que admiten POPCNTABM pero no, como Intel Nehalem y VIA Nano 3000).
  2. ^ La LZCNTinstrucción se ejecutará como BSRen sistemas que no admiten las extensiones LZCNT o ABM. BSRcalcula el índice del bit establecido más alto en el operando de origen, produciendo un resultado diferente al LZCNTde la mayoría de los valores de entrada.
  3. ^ La TZCNTinstrucción se ejecutará como BSFen sistemas que no admiten la extensión BMI1. BSFproduce el mismo resultado que TZCNTpara todos los valores de operando de entrada excepto cero, para el cual TZCNTdevuelve el tamaño del operando de entrada, pero BSFproduce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas).
  4. ^ Para BEXTR, la posición inicial y la longitud no están enmascaradas y pueden tomar valores de 0 a 255. Si los bits seleccionados se extienden más allá del final del r/margumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits sobrantes se leer como 0.
  5. ^ En los procesadores AMD anteriores a Zen 3, las instrucciones PEXTy PDEPson bastante lentas [77] y exhiben una sincronización dependiente de los datos debido al uso de una implementación microcodificada (alrededor de 18 a 300 ciclos, dependiendo de la cantidad de bits establecidos en el argumento de la máscara) . Como resultado, suele ser más rápido utilizar otras secuencias de instrucciones en estos procesadores. [78] [79]

Agregado con Intel TSX

Agregado con Intel CET

Intel CET (Tecnología Control-Flow Enforcement) agrega dos características distintas para ayudar a proteger contra vulnerabilidades de seguridad, como la programación orientada al retorno : una pila oculta (CET_SS) y un seguimiento de rama indirecta (CET_IBT).

  1. ^ ab Las instrucciones RDSSPDy RDSSPQactúan como NOP en procesadores donde las pilas ocultas están deshabilitadas o no se admite CET.
  2. ^ ab ENDBR32y ENDBR64actúan como NOP en procesadores que no admiten CET_IBT o donde IBT está deshabilitado.
  3. ^ Este prefijo tiene la misma codificación que 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 tampoco proporcione una mnemónica oficial para este prefijo. [80] [81] (GNU binutils usa "notrack" [82] )

Agregado con otras extensiones de proveedores cruzados

  1. ^ abc Los procesadores AMD Athlon anteriores al Athlon XP no admitían SSE completo, pero introdujeron las instrucciones no SIMD de SSE como parte de "Extensiones MMX" . [83] Estas extensiones (sin SSE completo) también están presentes en Geode GX2 y procesadores Geode posteriores.
  2. ^ abcdefg Todas las PREFETCH*instrucciones son instrucciones de sugerencias con efectos solo en el rendimiento, no en 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 un NOP sin que se genere ninguna excepción.
  3. ^ abc Para las SFENCEinstrucciones LFENCEy MFENCE, los 3 bits inferiores del byte ModR/M se ignoran y cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida.
  4. ^ La SFENCEinstrucción garantiza que todos los almacenes de memoria posteriores a la SFENCEinstrucción se hagan observables globalmente después de todos los almacenes de memoria anteriores a SFENCE. Esto impone el orden en los almacenes que de otro modo podrían reordenarse, como los almacenes no temporales y los almacenes en regiones de memoria WC (combinación de escritura). [84]
    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 las instrucciones CLFLUSH, CLFLUSHOPTy CLWB. (Las CPU AMD más antiguas requieren MFENCEordenar CLFLUSH.)
    SFENCEno está ordenado con respecto a LFENCE, y una SFENCE+LFENCEsecuencia no es suficiente para evitar que una carga se reordene más allá de un almacén anterior. [85] Para evitar tal reordenamiento, es necesario ejecutar una instrucción de serialización MFENCE.LOCK
  5. ^ La LFENCEinstrucción garantiza que todas las cargas de memoria posteriores a la LFENCEinstrucción se hagan observables globalmente después de todas las cargas de memoria anteriores a LFENCE.
    En todas las CPU Intel que admiten SSE2, la LFENCEinstrucción proporciona una garantía de pedido más sólida: [86] es Dispatch-serializing , lo que significa que las instrucciones posteriores a la LFENCEinstrucción pueden comenzar a ejecutarse solo después de que se hayan retirado todas las instrucciones anteriores (lo que garantizará que todas cargas anteriores pero no necesariamente las tiendas se han completado). El efecto de la serialización de envío es que LFENCEtambié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 ejemplo, RDTSCo RDPMC) y MSR x2apic .
    En las CPU AMD, LFENCEno es necesariamente la serialización de envío de forma predeterminada; sin embargo, en todas las CPU AMD que admiten cualquier forma de serialización sin envío LFENCE, se puede realizar la serialización de envío configurando el bit 1 de MSR C001_1029. [87]
  6. ^ La MFENCEinstrucción garantiza que todas las cargas de memoria, almacenes y vaciados de líneas de caché después de la MFENCEinstrucción se hagan globalmente observables después de todas las cargas de memoria, almacenes y vaciados de líneas de caché antes del MFENCE.
    En las CPU Intel, noMFENCE es una serialización de envío y, por lo tanto, no se puede utilizar para imponer orden en los accesos a recursos que no son de memoria, como contadores de rendimiento y MSR x2apic. todavía está ordenado con respecto a , por lo que si se necesita una barrera de memoria con serialización de envío, se puede obtener emitiendo un seguido de un . [46] En las CPU AMD, se está serializando.MFENCELFENCEMFENCELFENCE
    MFENCE
  7. ^ El funcionamiento de la PAUSEinstrucción en modo de 64 bits, a diferencia de NOP, no se ve afectado por la presencia del REX.Rprefijo. Ni NOPni PAUSEse ven afectados por los demás bits del REXprefijo. Algunos ejemplos de código de operación 90con 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 la PAUSEinstrucción depende de la implementación.
    En sistemas sin SSE2, PAUSEse ejecutará como NOP.
  9. ^ Bajo la virtualización VT-x o AMD-V, la ejecución PAUSEmuchas veces en un intervalo de tiempo corto puede provocar un #VMEXIT. El número de PAUSEejecuciones y la duración del intervalo que pueden activar #VMEXIT son específicos de la plataforma.
  10. ^ Si bien la CLFLUSHinstrucción se introdujo junto con SSE2, tiene su propio indicador CPUID y puede estar presente en procesadores que no implementan SSE2 y/o ausente en procesadores que implementan SSE2. (Por ejemplo, AMD Geode LX es compatible CLFLUSHpero no SSE2).
  11. ^ Si bien las instrucciones MONITORy MWAITse introdujeron al mismo tiempo que SSE3, tienen su propio indicador CPUID que debe verificarse por separado del indicador CPUID SSE3 (por ejemplo, Athlon64 X2 y VIA C7 admitían SSE3 pero no MONITOR).
  12. ^ ab Para las instrucciones MONITORy MWAIT, la documentación anterior de Intel [88] enumera mnemotécnicos de instrucciones con operandos explícitos ( MONITOR EAX,ECX,EDXy MWAIT EAX,ECX), mientras que la documentación más nueva omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas variantes. [89]
  13. ^ Para MONITOR, el segmento DS: se puede anular con un prefijo de segmento.
    El área de memoria que se monitoreará no será solo el byte especificado por DS:rAX, sino una región de memoria lineal que contiene el byte; el tamaño y la alineación de esta región de memoria dependen de la implementación y se pueden consultar a través de CPUID.
    La ubicación de la memoria a monitorear debe tener el tipo de memoria WB (con reescritura en caché) o, de lo contrario, la supervisión puede fallar.
  14. ^ A marzo de 2023, no se han definido extensiones ni sugerencias para la MONITORinstrucción. Como tal, la instrucción requiere ECX=0 e ignora EDX.
  15. ^ En algunos procesadores, como Intel Xeon Phi x200 [90] y AMD K10 [91] y posteriores, existen MSR documentados que se pueden usar para habilitar MONITORy MWAITejecutar en Ring 3.
  16. ^ La espera realizada por MWAITpuede finalizar mediante eventos del sistema distintos de una escritura en la memoria (por ejemplo, desalojos de línea de caché, interrupciones); el conjunto exacto de eventos que pueden causar que finalice la espera es específico de la implementación.
    Independientemente de si la espera terminó debido a una escritura en la memoria o algún otro evento, el monitoreo habrá finalizado y será necesario configurar el monitoreo nuevamente MONITORantes de realizar más MWAITmensajes.
  17. ^ Los indicadores de extensión disponibles MWAITen el registro ECX son:
  18. ^ Los indicadores de sugerencias disponibles MWAITen el registro EAX son:

    Los estados C son estados de energía específicos del procesador, que no necesariamente corresponden 1:1 a los estados C ACPI .

  19. ^ Para la GETSECinstrucción, el REX.Wprefijo habilita direcciones de 64 bits solo para la función de hoja EXITAC; de lo contrario, los prefijos REX están permitidos, pero se ignoran para la instrucción.
  20. ^ Las funciones de hoja definidas para GETSEC(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #UD.

  21. ^ Para GETSEC, la mayoría de las funciones de hoja están restringidas al Anillo 0, pero las funciones de hoja CAPACIDADES (EAX=0) y PARÁMETROS (EAX=6) están disponibles en el Anillo 3.
  22. ^ XSAVE se agregó en los pasos E0/R0 de Penryn y no está disponible en pasos anteriores.
  23. ^ En algunos procesadores (comenzando con Skylake , Goldmont y Zen 1 ), XGETBVse permite la ejecución con ECX=1; esto no devolverá XCR1(no existe tal registro), sino que devolverá XCR0bit a bit con AND con el valor actual del estado "XINUSE". mapa de bits del componente (un mapa de bits de componentes de estado XSAVE que no se sabe que estén en su estado inicial).
    La presencia de esta funcionalidad XGETBVse indica mediante CPUID . (EAX=0Dh,ECX=1):EAX[bit 2].
  24. ^ ab El valor de "ID central" leído por RDTSCPy RDPIDes en realidad el TSC_AUXMSR (MSR C000_0103h). Si este valor corresponde realmente a una ID de procesador es una cuestión de convención del sistema operativo.
  25. ^ A diferencia de la instrucción anterior , retrasará la lectura del TSC hasta que se hayan retirado todas las instrucciones anteriores, lo que garantiza el orden con respecto a las cargas de memoria anteriores (pero no las tiendas). Sin embargo, no está ordenado con respecto a instrucciones posteriores.RDTSCRDTSCPRDTSCP
  26. ^ RDTSCP se puede ejecutar fuera del anillo 0 solo si CR4.TSD=0.
  27. ^ Se agregó soporte RDTSCPen el paso F de AMD K8 y no está disponible en pasos anteriores.
  28. ^ Si bien la POPCNTinstrucción se introdujo al mismo tiempo que SSE4.2, no se considera parte de SSE4.2, sino una extensión separada con su propio indicador CPUID.
    En los procesadores AMD, se considera parte de la extensión ABM, pero aún tiene su propio indicador CPUID.
  29. ^ Los tipos de invalidación definidos para INVPCID(seleccionados por argumento de registro) son:

    Cualquier valor no admitido en el argumento de registro provoca una excepción #GP.

  30. ^ A diferencia de la instrucción anterior INVLPG, INVPCIDprovocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [94]
  31. ^ Las instrucciones PREFETCHy PREFETCHWson partes obligatorias de 3DNow! extensión del conjunto de instrucciones, pero también están disponibles como una extensión independiente en sistemas que no son compatibles con 3DNow!
  32. ^ Los códigos de operación para PREFETCHy PREFETCHW( 0F 0D /r) se ejecutan como NOP en CPU Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante, y PREFETCHWobtienen funcionalidad de captación previa desde Broadwell en adelante.
  33. ^ La instrucción PREFETCH( 0F 0D /0) es 3DNow! Instrucción, presente en todos los procesadores con 3DNow! pero no necesariamente en procesadores con la extensión PREFETCHW.
    En las CPU AMD con PREFETCHW, está documentado que tanto el código de operación 0F 0D /0como los códigos de operación 0F 0D /2../7realizan una captación previa.
    En los procesadores Intel con PREFETCHW, se documenta que estos códigos de operación realizan NOP reservados [95] (excepto 0F 0D /2en PREFETCHWT1 m8Xeon Phi únicamente); las pruebas de terceros [96] indican que algunos o todos estos códigos de operación pueden estar realizando una búsqueda previa en al menos algunos Intel. CPU centrales.
  34. ^ abc Las extensiones del conjunto de instrucciones SMAP, PKU y RDPID se admiten en el paso 2 [97] y posteriores de Zhaoxin LuJiaZui, pero no en pasos anteriores.
  35. ^ A diferencia de la instrucción anterior RDTSCPque también se puede usar para leer la ID del procesador, el modo de usuario RDPIDno está deshabilitado por CR4.TSD=1.
  36. ^ La WBNOINVDinstrucción se ejecutará como WBINVDsi se ejecutara en un sistema que no admite la extensión WBNOINVD.
    WBINVDdifiere de WBNOINVDque WBINVDinvalidará todas las líneas de caché después de la reescritura.

Agregado con otras extensiones específicas de Intel

  1. ^ Las funciones de hoja definidas para ENCLS(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #GP.

  2. ^ SGX está obsoleto en procesadores de escritorio/portátiles desde la 11.ª generación ( Rocket Lake , Tiger Lake ) en adelante, pero sigue estando disponible en piezas de servidor de la marca Xeon . [100]
  3. ^ Las funciones de hoja definidas para ENCLU(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #GP.
    Las funciones ENTER y ERESUME no se pueden ejecutar dentro de un enclave SGX; las otras funciones solo se pueden ejecutar dentro de un enclave.

  4. ^ ENCLU solo se puede ejecutar en el anillo 3, no en los anillos 0/1/2.
  5. ^ Las funciones de hoja definidas para ENCLV(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #GP.
    La ENCLVinstrucción solo está presente en sistemas que admiten Extensiones de sobresuscripción EPC a SGX ("OVERSUB").

  6. ^ ENCLV solo está disponible si la operación Intel VMX está habilitada con VMXONy, de lo contrario, producirá #UD.
  7. ^ Para PTWRITE, la escritura en el paquete de seguimiento del procesador solo se producirá si un conjunto de bits de habilitación (los bits "TriggerEn", "ContextEn", "FilterEn" del RTIT_STATUSMSR y el bit "PTWEn" del RTIT_CTLMSR) están todos configurados. a 1.
    La PTWRITEinstrucción está indicada en el SDM para provocar una excepción #UD si se utiliza el prefijo de instrucción 66h, independientemente de otros prefijos.
  8. ^ Para MOVDIR64, la dirección de destino proporcionada por ES:reg debe estar alineada con 64 bytes.
    El tamaño del operando para el argumento del registro viene dado por el tamaño de la dirección, que puede ser anulado por el 67hprefijo.
    No es necesario que el argumento fuente de memoria de 64 bytes esté alineado con 64 bytes y no se garantiza que se lea de forma atómica.
  9. ^ Las funciones de hoja definidas para PCONFIG(seleccionadas por EAX) son:

    Cualquier valor no admitido en EAX provoca una excepción #GP(0).

  10. ^ Para CLDEMOTE, el nivel de caché al que degradará una línea de caché depende de la implementación.
    Dado que la instrucción se considera una sugerencia, se ejecutará como NOP sin excepciones si la dirección de memoria proporcionada no es válida o no está 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.
  11. ^ La documentación de Intel enumera Tremont y Alder Lake como los procesadores en los que se introdujo CLDEMOTE. Sin embargo, a partir de mayo de 2022, no se ha observado que ningún modelo Tremont o Alder Lake tenga configurado el bit de función CPUID para CLDEMOTE, mientras que varios de ellos tienen el bit CPUID borrado. [103]
    A partir de abril de 2023, se ha observado que el bit de característica CPUID para CLDEMOTE está configurado para Sapphire Rapids. [104]
  12. ^ Para UMONITOR, el tamaño del operando del argumento de dirección viene dado por el tamaño de la dirección, que puede ser anulado por el 67hprefijo. El segmento predeterminado utilizado es DS:, que se puede anular con un prefijo de segmento.
  13. ^ Para UMWAIT, el sistema operativo puede usar MSR para limitar la cantidad máxima de tiempo que se permite esperar IA32_UMWAIT_CONTROLuna única invocación. UMWAITLa UMWAITinstrucción se establecerá RFLAGS.CFen 1 si alcanzó el IA32_UMWAIT_CONTROLlímite de tiempo definido y en 0 en caso contrario.
  14. ^ TPAUSE y UMWAITse puede ejecutar fuera del anillo 0 solo si CR4.TSD=0.
  15. ^ Si bien la serialización se puede realizar con instrucciones más antiguas como, por ejemplo, CPUIDy IRET, 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 en virtualización, lo que provoca una sobrecarga muy grande). La SERIALIZEinstrucción realiza solo serialización, evitando estos costos adicionales.
  16. ^ CPUID proporciona un 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
  17. ^ El argumento de registro SENDUIPIes un índice para seleccionar una entrada de la UITT (tabla de destino de interrupción de usuario, una tabla especificada por los nuevos UINTR_TTy UINT_MISC MSR ) .

Agregado con otras extensiones específicas de AMD

  1. ^ La forma estándar de acceder al registro CR8 es utilizar una codificación que utilice el REX.Rprefijo, por ejemplo 44 0F 20 07( MOV RDI,CR8). Sin embargo, el REX.Rprefijo sólo está disponible en modo de 64 bits.
    La extensión AltMovCr8 agrega un método adicional para acceder a CR8, utilizando el prefijo F0( LOCK) en lugar de REX.R; esto proporciona acceso a CR8 fuera del modo de 64 bits.
  2. ^ ab 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 configurados en 11b.
    Las codificaciones AltMovCr8 están disponibles en modo de 64 bits. Sin embargo, no se permite combinar el LOCKprefijo con el REX.Rprefijo y provocará una excepción #UD.
  3. ^ Se agregó compatibilidad con AltMovCR8 en el paso F de AMD K8 y no está disponible en pasos anteriores.
  4. ^ Para CLZERO, el tamaño de la dirección y el prefijo 67h controlan si se utiliza AX, EAX o RAX como dirección. El segmento predeterminado DS: se puede anular mediante un prefijo de anulación de segmento. No es necesario alinear la dirección proporcionada: el hardware la alineará según sea necesario.
    La CLZEROinstrucción está destinada a la recuperación de errores de Machine Check que de otro modo serían fatales. No se puede almacenar en caché, no se puede utilizar para asignar una línea de caché sin acceso a la memoria y no se debe utilizar para borrar la memoria rápidamente. [105]
  5. ^ La numeración de registros utilizada por RDPRUno coincide necesariamente con la de RDMSR/ WRMSR.
    Los registros soportados a RDPRUdiciembre de 2022 son:

    Los valores no admitidos en ECX devuelven 0.

  6. ^ Si CR4.TSD=1, entonces la RDPRUinstrucció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 con 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, y el registro de la parte superior de la pila se denomina "st" o "st(0)", y los demás registros denominados st(1),st(2),...st(7). Además, proporciona una serie de registros de control y estado, incluido "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 redondeo). modo: redondeo a cero, redondeo a infinito positivo, redondeo a infinito negativo, redondeo a par más cercano) y un registro de código de condición de 4 bits "CC", cuyos cuatro bits están referidos individualmente como C0, C1, C2 y C3). No todas las instrucciones aritméticas proporcionadas por x87 obedecen a PC y RC.

Instrucciones originales 8087

  1. ^ Los coprocesadores x87 (distintos del 8087) manejan las excepciones de una manera bastante inusual. Cuando una instrucción x87 genera una excepción aritmética desenmascarada, aún se completará sin causar una falla de la CPU; en lugar de causar una falla, registrará dentro del 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 configure el indicador de palabra de estado de FPU para indicar que hay una excepción pendiente. Esta excepción pendiente provocará una falla de la CPU cuando WAITse ejecute el siguiente x87, MMX o instrucción.
    La excepción a esto son las instrucciones "sin espera" de x87, que se ejecutarán sin causar tal falla incluso si hay una excepción pendiente (con algunas advertencias, consulte la nota de aplicación AP-578 [106] ). Estas instrucciones son en su mayoría 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 que no espera cuyo mnemotécnico comienza con FN, existe una pseudoinstrucción que tiene el mismo mnemotécnico excepto sin la N. Estas pseudoinstrucciones constan de una WAITinstrucción (código de operación 9B) seguida de la correspondiente instrucción x87 que no espera. Por ejemplo:
    • FNCLEXes una instrucción con el código de operación DB E2. La pseudoinstrucció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 pseudoinstrucció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. ^ abcd En FPU x87 80387 y posteriores FLDENV, F(N)STENVy existen en variantes FRSTORde F(N)SAVE16 y 32 bits. Las variantes de 16 bits cargarán/almacenarán una estructura de datos de entorno de punto flotante de 14 bytes hacia/desde la memoria; las variantes de 32 bits cargarán/almacenarán una estructura de datos de 28 bytes. ( F(N)SAVE/ FRSTORcargará/almacenará adicionalmente 80 bytes adicionales de contenido del registro de datos de FPU después del entorno de FPU, para un total de 94 o 108 bytes). La elección entre las variantes de 16 y 32 bits se basa en el CS.Dbit y en la presencia del 66hprefijo de instrucción. En 8087 y 80287, sólo están disponibles las variantes de 16 bits.
    No existen variantes de 64 bits de estas instrucciones; el uso REX.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 utilizar FXSAVE64/ FXRSTOR64en su lugar si se desea una operación de 64 bits.
  4. ^ ab En el caso de que una instrucción x87 produzca una excepción de FPU desenmascarada, la FPU 8087 señalará una IRQ en un tiempo indeterminado después de que se emitió la instrucción. Es posible que esto no siempre sea posible de manejar, [107] y, por lo tanto, la FPU ofrece las instrucciones F(N)DISIy F(N)ENIpara configurar/borrar el bit de máscara de interrupción (bit 7) de la palabra de control x87, [108] para controlar la interrupción.
    Las FPU x87 posteriores, desde 80287 en adelante, cambiaron el mecanismo de excepción de la FPU para producir una excepción de CPU en la siguiente instrucción x87. Esto hizo que el bit Máscara de interrupción fuera innecesario, por lo que se eliminó. [109] En FPU Intel x87 posteriores, las instrucciones F(N)ENIy F(N)DISIse mantuvieron para compatibilidad con versiones anteriores, ejecutándose como NOP que no modifican ningún estado de x87.
  5. ^ abc FST/ FSTPcon un destino de 80 bits (m80 o st(i)) y un valor de origen sNaN producirá excepciones en las FPU de AMD pero no en las de Intel.
  6. ^ FSTP ST(0) es un modismo comúnmente utilizado para extraer un solo registro de la pila de registros x87.
  7. ^ abcdefghi Código de operación de alias 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 realizarían operaciones que se comportarían de manera similar a las instrucciones x87 definidas existentes. Estos códigos de operación se documentaron para 8087 [110] y 80287, [111] pero luego se omitieron en manuales posteriores hasta la actualización de octubre de 2017 de Intel SDM. [112]
    Están presentes en todas las FPU Intel x87 conocidas, pero no están disponibles en algunas FPU más antiguas que no son Intel, como AMD Geode GX/LX, DM&P Vortex86 [113] y NexGen 586PF. [114]
  8. ^ ab En 8087 y 80287, FBSTPy las instrucciones de carga constante siempre utilizan el modo de redondeo de redondeo al más cercano. En las FPU x87 80387 y posteriores, estas instrucciones utilizarán el modo de redondeo especificado en el registro RC x87.
  9. ^ abcdefghi Para las instrucciones FADDP, FSUBP, FSUBRP, FMULP, FDIVP, FDIVRP, y , los FCOMensambladores /desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Estas variantes son equivalentes a variantes que utilizan st(1) como primer argumento.FCOMPFXCH
  10. ^ En Intel Pentium y procesadores posteriores, FXCHse implementa como un cambio de nombre de registro en lugar de un verdadero movimiento de datos. Esto no tiene ningún efecto semántico, pero permite el funcionamiento 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, mejorando el rendimiento alcanzable para el código optimizado para estos procesadores.
  11. ^ El resultado de ejecutar la FBLDinstrucción en datos que no son BCD no está definido.
  12. ^ En los primeros procesadores Intel Pentium , la división de punto flotante estaba sujeta al error Pentium FDIV . Esto también afectó a las instrucciones que realizan división como parte de sus operaciones, como FPREMy FPATAN. [115]
  13. ^ La FXAMinstrucción establecerá C0, C2 y C3 según el tipo de valor en st(0) de la siguiente manera:

    C1 se establece en el bit de signo de st(0), independientemente de si st(0) está vacío o no.

  14. ^ Para FXTRACT, si st(0) es cero o ±∞, entonces M se iguala a st(0). Si st(0) es cero, E se establece en 0 en 8087/80287 pero -∞ en 80387 y posteriores. Si st(0) es ±∞, entonces E se establece en +∞.
  15. ^ Para FPREM, si el cociente Q es mayor que , es posible que el cálculo del resto se haya realizado solo parcialmente; en este caso, será necesario ejecutar la instrucción nuevamente para completar el cálculo del resto. Esto se indica mediante la configuración de la instrucción en 1. Si la instrucción completó el cálculo del resto, se establecerá en 0 y establecerá los tres bits en los tres bits inferiores del cociente Q. En 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 puede recuperar correctamente en una pasada posterior que complete el cálculo del resto.FPREMC2
    C2{C0,C3,C1}
  16. ^ El cálculo del resto realizado por la FPREMinstrucción es siempre exacto y sin errores de redondeo.
  17. ^ Para las FSCALEinstrucciones sobre 8087 y 80287, se requiere que st(1) esté en el rango . Además, su valor absoluto debe ser 0 o al menos 1. Si no se cumplen estos requisitos, el resultado no está definido. Estas restricciones fueron eliminadas en el 80387.
  18. ^ Para FSCALE, el redondeo solo se aplica en caso de desbordamiento, desbordamiento insuficiente o resultado subnormal.
  19. ^ Las instrucciones trascendentales x87 no obedecen a PC ni RC, sino que calculan resultados completos de 80 bits. Estos resultados no están necesariamente redondeados correctamente (consulte El dilema del creador de tablas ): pueden tener un error de hasta ±1 ulp en Pentium o posterior, o hasta ±1,5 ulp en coprocesadores x87 anteriores.
  20. ^ ab Para las instrucciones FYL2Xy FYL2XP1, el límite de error máximo de ±1 ulp solo es válido para st(1)=1,0; para otros valores de st(1), el límite de error aumenta a ±1,35 ulps.
  21. ^ Para FPATAN, se realizan los siguientes ajustes en comparación con simplemente calcular un arcotangente de la relación de un argumento :
    • Si tanto st(0) como st(1) son ±∞, entonces el arcotangente se calcula como si cada uno de st(0) y st(1) hubiera sido reemplazado por ±1 del mismo signo. Esto produce un resultado que es un múltiplo impar de .
    • Si tanto st(0) como st(1) son ±0, entonces el arcotangente se calcula como si st(0) pero no st(1) hubiera sido reemplazado con ±1 del mismo signo, produciendo un resultado de ±0 o .
    • Si st(0) es negativo (tiene el bit de signo establecido), entonces se agrega al resultado un sumando con el mismo signo que st(1).
  22. ^ Si bien FNOPes una operación no operativa en el sentido de que dejará la pila de registros de FPU x87 sin modificar, aún puede modificar FIP y CC, y puede fallar si hay una excepción pendiente de FPU x87.

Instrucciones x87 agregadas en procesadores posteriores

  1. ^ La FPU x87 necesita saber si está funcionando en modo real o en modo protegido porque el entorno de punto flotante al que acceden las instrucciones F(N)SAVE, y tiene diferentes formatos en modo real y en modo protegido FRSTOR. En 80287, se requiere la instrucción para comunicar la transición del modo real al protegido a la FPU. En las FPU 80387 y posteriores x87, las transiciones de modo real↔protegido se comunican automáticamente a la FPU sin necesidad de instrucciones dedicadas; por lo tanto, en estas FPU, se ejecuta como un NOP que no modifica ningún estado de la FPU.FLDENVF(N)STENVF(N)SETPMFNSETPM
  2. ^ Sin incluir instrucciones descontinuadas específicas para modelos particulares de FPU compatibles con 80387.
  3. ^ ab Para las instrucciones FUCOMy FUCOMP, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Estas variantes son equivalentes a variantes que utilizan st(1) como primer argumento.
  4. ^ La FPREM1instrucción 80387 se diferencia de la instrucción anterior FPREM( D9 F8) en que el cociente Q se redondea a un número entero con redondeo al par más cercano en lugar del redondeo a cero utilizado por FPREM. Al igual que FPREM, FPREM1siempre calcula un resultado exacto sin errores de redondeo. Al igual que FPREM, también puede realizar un cálculo parcial si el cociente es demasiado grande, en cuyo caso debe ejecutarse nuevamente.
  5. ^ abc Debido a que la FPU x87 realiza una reducción de argumentos para sen/cos con solo aproximadamente 68 bits de precisión, el valor de k utilizado en el cálculo de y no es precisamente 1,0, sino que está dado por [116] [117]FSINFCOSFSINCOS
    Esta reducción de la inexactitud del argumento también afecta a la FPTANinstrucción.
  6. ^ Las instrucciones FCOMI, y escriben sus resultados en los FCOMIPbits y del registro . En los procesadores Intel, pero no en los AMD , estas instrucciones también ponen a cero los bits , y de .FUCOMIFUCOMIPZFCFPFEFLAGSSFAFOFEFLAGS
  7. ^ Las instrucciones FXSAVEy FXRSTORse agregaron 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 AMD K7.
    También se consideran parte integral de SSE y, por lo tanto, están presentes en todos los procesadores con SSE.
  8. ^ ab Las instrucciones FXSAVEy FXRSTORguardarán/restaurarán el estado de 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 por FXSAVE/ tiene un diseño completamente diferente a la estructura de datos de las instrucciones / FXRSTORanteriores , lo que permite guardar/restaurar más rápido al evitar cargas y almacenamientos desalineados.F(N)SAVEFRSTOR
  9. ^ ab Cuando la emulación de punto flotante está habilitada con CR0.EM=1y se consideran instrucciones x87 y, en consecuencia, producirán una FXSAVE(64)excepción #NM (dispositivo no disponible). Aparte de , estos son los únicos códigos de operación fuera del espacio de códigos de operación ESC que exhiben este comportamiento. (Todos los códigos de operación producirán #NM si , incluso los códigos de operación no definidos que producirían #UD de lo contrario).FXRSTOR(64)WAITD8..DFD8..DFCR0.EM=1
  10. ^ A diferencia de la instrucción anterior , no 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

instrucciones SIMD

instrucciones MMX

Las instrucciones MMX operan en registros mm, que tienen 64 bits de ancho. Se comparten con los registros de la FPU.

Instrucciones originales MMX

Agregado con Pentium MMX

Instrucciones MMX agregadas en procesadores específicos.

Instrucciones MMX agregadas con MMX+ y SSE

Las siguientes instrucciones MMX se agregaron con SSE. También están disponibles en el Athlon con el nombre MMX+.

Instrucciones MMX agregadas con SSE2

Las siguientes instrucciones MMX se agregaron con SSE2:

Instrucciones MMX agregadas con SSSE3

instrucciones SSE

Agregado con Pentium III

Las instrucciones SSE operan en registros xmm, que tienen 128 bits de ancho.

SSE consta de las siguientes instrucciones de punto flotante SSE SIMD:

Instrucciones SSE2

Agregado con Pentium 4

Instrucciones de punto flotante SSE2 SIMD

Instrucciones de movimiento de datos SSE2
Instrucciones aritméticas empaquetadas SSE2
Instrucciones lógicas SSE2
Instrucciones de comparación SSE2
Instrucciones para barajar y desempaquetar SSE2
Instrucciones de conversión SSE2

Instrucciones de números enteros SIMD SSE2

Instrucciones tipo SSE2 MMX extendidas a registros SSE

SSE2 permite la ejecución de instrucciones MMX en registros SSE, procesando el doble de datos a la vez.

Instrucciones enteras SSE2 solo para registros SSE

Las siguientes instrucciones se pueden utilizar sólo en registros SSE, ya que por su naturaleza no funcionan en registros MMX.

Instrucciones SSE3

Agregado con Pentium 4 compatible con SSE3

Instrucciones de punto flotante SSE3 SIMD

Instrucciones de números enteros SIMD SSE3

Instrucciones SSSE3

Agregado con la serie Xeon 5100 y Core 2 inicial

Las siguientes instrucciones similares a MMX extendidas a los registros SSE se agregaron con SSSE3

Instrucciones SSE4

ESS4.1

Añadido con Core 2 fabricado en 45nm

Instrucciones de punto flotante SIMD SSE4.1
Instrucciones de números enteros SIMD SSE4.1

SSE4a

Agregado con procesadores Phenom

ESS4.2

Agregado con procesadores Nehalem

F16C

Conversión de coma flotante de media precisión.

AVX

AVX fue compatible por primera vez con Intel con Sandy Bridge y con AMD con Bulldozer .

Operaciones vectoriales en registros de 256 bits.

AVX2

Introducido en la microarquitectura Haswell de Intel y Excavator de AMD .

Ampliación de la mayoría de las instrucciones SSE y AVX de enteros vectoriales a 256 bits

Instrucciones FMA3 y FMA4

Las instrucciones de suma múltiple fusionadas de punto flotante se introducen en x86 como dos extensiones de conjunto de instrucciones, "FMA3" y "FMA4", las cuales se basan en AVX para proporcionar un conjunto de instrucciones escalares/vectoriales utilizando xmm/ymm/zmm. registros vectoriales. FMA3 define un conjunto de instrucciones de suma y multiplicación fusionadas de 3 operandos que toman tres operandos de entrada y escriben su resultado en el primero de ellos. FMA4 define un conjunto de instrucciones de suma multiplicada fusionada de 4 operandos que toman cuatro operandos de entrada: un operando de destino y tres operandos de origen.

FMA3 es compatible con CPU Intel que comienzan con Haswell , CPU AMD que comienzan con Piledriver y CPU Zhaoxin que comienzan con YongFeng. FMA4 solo era compatible con las CPU AMD Family 15h (Bulldozer) y se abandonó a partir de AMD Zen . Las extensiones FMA3/FMA4 no se consideran una parte intrínseca de AVX o AVX2, aunque todos los procesadores Intel y AMD (pero no Zhaoxin) que admiten AVX2 también admiten FMA3. Sin embargo, las instrucciones FMA3 (en formato codificado en EVEX) son instrucciones básicas AVX-512 .
Los conjuntos de instrucciones FMA3 y FMA4 definen un conjunto de 10 operaciones de suma-multiplicación fusionada, todas disponibles en variantes FP32 y FP64. Para cada una de estas variantes, FMA3 define tres ordenamientos de operandos mientras que FMA4 define dos.
Codificación FMA3
Las instrucciones FMA3 están codificadas con los prefijos VEX o EVEX , en el formato o . El bit VEX.W/EVEX.W selecciona el formato de punto flotante (W=0 significa FP32 , W=1 significa FP64 ). El byte del código de operación consta de dos cuartetos, donde el cuarteto superior selecciona el orden de los operandos ( ='132', ='213', ='231') y el cuarteto inferior (valores 6..F) selecciona cuál de los 10 fusionados. operaciones de multiplicación y suma a realizar. ( y fuera de los rangos dados dará como resultado algo que no es una instrucción FMA3). En el nivel del lenguaje ensamblador, el orden de los operandos se especifica en el mnemotécnico de la instrucción:VEX.66.0F38 xy /rEVEX.66.0F38 xy /rxyx9AByxy

Para todas las variantes de FMA3, los dos primeros argumentos deben ser argumentos de registro vectorial xmm/ymm/zmm, mientras que el último argumento puede ser un registro vectorial o un argumento de memoria. Según AVX-512, las variantes codificadas con EVEX admiten transmisiones, máscaras operativas y controles de redondeo codificados con prefijo EVEX.
La extensión AVX512-FP16, introducida en Sapphire Rapids , agrega variantes FP16 de las instrucciones FMA3; todas ellas toman la forma con el byte de código de operación que funciona de la misma manera que para las variantes FP32/FP64. (Para las instrucciones FMA4, no se definen variantes de FP16). Codificación FMA4 Las instrucciones FMA4 están codificadas con el prefijo VEX en el formulario (no se definen codificaciones EVEX). El byte del código de operación utiliza su bit inferior para seleccionar el formato de punto flotante (0=FP32, 1=FP64) y los bits restantes para seleccionar una de las 10 operaciones de suma y multiplicación fusionadas a realizar.EVEX.66.MAP6.W0 xy /r

VEX.66.0F3A xx /r ibxx

Para FMA4, el orden de los operandos está controlado por el bit VEX.W. Si VEX.W=0, entonces el tercer operando es el operando r/m especificado por el byte ModR/M de la instrucción y el cuarto operando es un operando de registro, especificado por los bits 7:4 de la parte ib (inmediata de 8 bits). de la instrucción. Si VEX.W=1, entonces estos dos operandos se intercambian. Por ejemplo:


Tabla de códigos de operación
Las 10 operaciones de suma, multiplicación fusionada y las 110 variantes de instrucciones a las que dan lugar se muestran en la siguiente tabla, con las instrucciones FMA4 resaltadas con * y color de celda amarillo, y las instrucciones FMA3 no resaltadas:

  1. ^ Los carriles de registros vectoriales se cuentan desde 0 hacia arriba en forma little-endian : el carril que contiene el primer byte del vector se considera par.

AVX-512

AVX-512 , presentado en 2014, agrega registros vectoriales de 512 bits de ancho (extendiendo los registros de 256 bits, que se convierten en las mitades inferiores de los nuevos registros) y duplica su recuento a 32; Por tanto, los nuevos registros se denominan desde zmm0 hasta zmm31. Agrega ocho registros de máscara, denominados k0 a k7, que pueden usarse para restringir operaciones a partes específicas de un registro vectorial. A diferencia de las extensiones de conjuntos de instrucciones anteriores, AVX-512 se implementa en varios grupos; sólo la extensión básica ("AVX-512F") es obligatoria. [121] La mayoría de las instrucciones agregadas también se pueden utilizar con los registros de 256 y 128 bits.

AMX

Intel AMX agrega ocho nuevos registros de mosaicos, tmm0cada tmm7uno con una matriz , con una capacidad máxima de 16 filas de 64 bytes por registro de mosaicos. También agrega un TILECFGregistro para configurar los tamaños de las matrices reales contenidas en cada uno de los ocho registros de mosaicos, y un conjunto de instrucciones para realizar multiplicaciones de matrices en estos registros.

  1. ^ Para , el registro de mosaico que se va a borrar se especifica mediante los bits 5:3 del byte ModR/MTILEZERO de la instrucción . Los bits 7:6 deben configurarse en 11b y los bits 2:0 deben configurarse en 000b.
  2. ^ abc Para las TILELOADDinstrucciones TILELOADDT1y TILESTORED, el argumento de memoria debe usar un modo de direccionamiento de memoria con el byte SIB. En este modo de direccionamiento, el registro base y el desplazamiento se utilizan para especificar la dirección inicial para que la primera fila del mosaico se cargue/almacene desde/en la memoria; la escala y el índice se utilizan para especificar un paso por fila.
    Todas estas instrucciones son interrumpibles: una interrupción o excepción de memoria tomada en medio de estas instrucciones hará que la información de seguimiento del progreso se escriba en TILECFG.start_row, de modo que la instrucción pueda continuar en un mosaico parcialmente cargado/almacenado después de la interrupción.
  3. ^ abcdefgh Para todas las instrucciones de multiplicación de matrices AMX, se requiere que los tres argumentos sean tres registros de mosaico diferentes; de lo contrario, la instrucción será #UD.

Instrucciones criptográficas

Instrucciones Intel AES

6 nuevas instrucciones.

Instrucciones CLMUL

RDRAND y RDSEED

  1. ^ ab Las instrucciones RDRANDy RDSEEDpueden no obtener y devolver un número aleatorio si los generadores de números aleatorios de la CPU no pueden seguir el ritmo de la emisión de estas instrucciones; si esto sucede, entonces el software puede volver a intentar las instrucciones (aunque el número de reintentos debe ser limitado). para garantizar el progreso [122] ). Las instrucciones se establecen EFLAGS.CFen 1 si se obtuvo con éxito un número aleatorio y en 0 en caso contrario. Si no se obtiene un número aleatorio, el registro de destino de la instrucción también se establecerá en 0.

Instrucciones Intel SHA

7 nuevas instrucciones.

Instrucciones del casillero de claves Intel AES

Estas instrucciones, disponibles en Tiger Lake y procesadores Intel posteriores, están diseñadas para permitir el cifrado/descifrado con una clave AES sin tener acceso a ninguna copia no cifrada de la clave durante el proceso de cifrado/descifrado real.

Instrucciones de VIA PadLock

Las instrucciones VIA/Zhaoxin PadLock son instrucciones diseñadas para aplicar primitivas criptográficas de forma masiva, similares a las instrucciones de cadena repetida 8086. Como tal, a menos que se especifique lo contrario, toman, según corresponda, punteros a datos de origen en ES:rSI y datos de destino en ES:rDI, y un tamaño de datos o recuento en rCX. Al igual que las antiguas instrucciones de cadena, todas están diseñadas para ser interrumpibles.

  1. ^ La palabra de control REP XCRYPT*es una estructura de datos de 128 bits con el siguiente diseño:
  2. ^ ACE2 también agrega características adicionales a las otras REP XCRYPTinstrucciones: un modo de resumen para las instrucciones CBC y CFB, y la capacidad de usar datos de entrada/salida que no están alineados en 16 bytes para las instrucciones que no son ECB.
  3. ^ En VIA Nano y procesadores posteriores, configurar rAX en un valor de todos 1 para las REP XSHA*instrucciones habilitará un modo de operación alternativo, donde rCX especifica la cantidad de bloques de 64 bytes y donde el procedimiento de extensión de longitud estándar FIPS-180-2 en se omite el final del cálculo del hash. Esto lo convierte en una variante más adecuada para la transmisión de datos que la variante EAX=0 original. [124] Esta funcionalidad también existe para CCS_HASH.
     
  4. ^ La estructura de datos REP MONTMULcontiene seis elementos de 32 bits, donde el primero es un inverso modular negado de los 32 bits inferiores del módulo y los 5 restantes son punteros a varios buffers de memoria:
  5. ^ La CCS_ENCRYPTpalabra de control en rAX tiene el siguiente formato:

    Los bits restantes en rAX deben establecerse en ceros.

    De los bits 10:6 en rAX (selección de modo de bloque), se debe establecer exactamente un bit, o de lo contrario el comportamiento no estará definido.

Instrucciones de virtualización

Instrucciones AMD-V

  1. ^ abcd Para el argumento rAX de las instrucciones VMRUN, y , la elección de AX/EAX/RAX depende del tamaño de VMLOADla dirección, que se puede anular con el prefijo 67h.VMSAVEINVLPGA
  2. ^ La compatibilidad con AMD-V se agregó en el paso F de AMD K8 y no está disponible en pasos anteriores.
  3. ^ ab La VMRUNinstrucción cargará solo un subconjunto limitado del estado de la CPU; VMLOADdebe ejecutarse antes VMRUNde cargar un estado adicional.
    De manera similar, #VMEXIT almacenará solo una cantidad limitada de estado invitado en el VMCB y VMSAVEes necesario para almacenar estados adicionales.
    Para condiciones de intercepción simples donde el VMM no necesita hacer uso de los elementos de estado manejados por VMSAVE/ VMLOAD, el VMM puede mejorar el rendimiento absteniéndose de realizar VMSAVE/ VMLOADantes de volver a ingresar a la máquina virtual con VMRUN.
  4. ^ En las CPU que admiten la virtualización VMLOAD/VMSAVE ( Excavator y posteriores), las instrucciones VMLOADy VMSAVEtambién se pueden ejecutar en modo invitado.
  5. ^ En las CPU que admiten GIF virtual ( Excavator y posteriores), las instrucciones STGIy CLGItambién se pueden ejecutar en modo invitado.
  6. ^ VMGEXIT se ejecuta como VMMCALLsi no lo hubiera ejecutado un invitado SEV-ES.

Instrucciones Intel VT-x

Instrucciones de virtualización Intel. VT-x también es compatible con algunos procesadores de VIA y Zhaoxin.

  1. ^ La ejecución de cualquiera de las instrucciones de VT-x VMM mientras se encuentra dentro de la VM invitada provocará un VMEXIT.
    Si no se ha ingresado la operación VMX a través de VMXON, todas las instrucciones VT-x (excepto VMXON) causarán #UD.
  2. ^ abcd El argumento m64 para VMPTRLD, VMPTRSTy VMCLEARes VMXONuna dirección física de 64 bits.
  3. ^ El argumento m64 VMXONes la dirección física de 64 bits de una "región VMXON", que es una región de 4 Kbytes que debe estar alineada en 4 Kbytes. El procesador puede utilizar esta región para admitir la operación VMX de una manera dependiente de la implementación y el software nunca debe acceder a ella hasta que el procesador haya abandonado la operación VMX a través de la VMXOFFinstrucción.
  4. ^ Si "VMCS Shadowing" está habilitado (disponible en Haswell y versiones posteriores), el invitado también puede ejecutar las instrucciones y VMREAD.VMWRITE
  5. ^ La VMCALLinstrucción también puede ser ejecutada por el VMM; al hacerlo, se producirá una salida especial de la VM SMM.
  6. ^ Las funciones disponibles VMFUNCen el registro EAX son:
  7. ^ Las operaciones disponibles SEAMOPSen el registro RAX son:

    Cualquier valor no admitido en RAX provocará una excepción #GP(0).

Otras instrucciones

x86 también incluye conjuntos de instrucciones descontinuados que ya no son compatibles con Intel y AMD, e instrucciones no documentadas que se ejecutan pero no están documentadas oficialmente.

Instrucciones indocumentadas

Instrucciones x86 no documentadas

Las CPU x86 contienen instrucciones no documentadas que se implementan en los chips pero que no figuran en algunos documentos oficiales. Se pueden encontrar en varias fuentes en Internet, como la Lista de interrupciones de Ralf Brown y en sandpile.org.

Algunas de estas instrucciones están ampliamente disponibles en muchas o la mayoría de las CPU x86, mientras que otras son específicas de una gama limitada 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

Ver también

Referencias

  1. ^ "Re: Identificación del procesador Intel e instrucción CPUID" . Consultado el 21 de abril de 2013 .
  2. ^ Michal Necasek, SGDT/SIDT Ficción y Realidad, 4 de mayo de 2017. Archivado el 29 de noviembre de 2023.
  3. ^ ab Intel, Instrucción de prueba iAPX 286 indocumentada. Archivado el 20 de diciembre de 2023.
  4. ^ WikiChip, UMIP-x86. Archivado el 16 de marzo de 2023.
  5. ^ 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.
  6. ^ Proyecto MBC, Detección de máquinas virtuales (enlace permanente) o Detección de máquinas virtuales (enlace no permanente)
  7. ^ Andrew Schulman, "Windows 95 no autorizado" ( ISBN 1-56884-169-8 ), capítulo 8, p.249,257. 
  8. ^ La patente estadounidense 4974159, "Método de transferencia de control en un sistema informático multitarea" menciona 63h/ARPL.
  9. ^ Intel, Manual del desarrollador de la familia de procesadores Pentium®, volumen 3, 1995, n.º de pedido. 241430-004, artículo 12.7, pág. 323
  10. ^ Intel, Cómo funciona el muestreo de datos de microarquitectura, consulte la sección de mitigaciones. Archivado el 22 de abril de 2022
  11. ^ Documentación del kernel de Linux, mitigación del muestreo de datos de microarquitectura (MDS) Archivado el 21 de octubre de 2020 en Wayback Machine.
  12. ^ Foros de VCF, encontré el código de operación SAVEALL, 21 de junio de 2019. Archivado el 13 de abril de 2023.
  13. ^ representante lodsb, secretos de Intel 286: modo ICE y F1 0F 04, 12 de agosto de 2022. Archivado el 8 de diciembre de 2023.
  14. ^ LKML, (PATCH) x86-64, espfix: no filtre los bits 31:16 de% esp volviendo a la pila de 16 bits, 29 de abril de 2014. Archivado el 4 de enero de 2018
  15. ^ Raymond Chen, Hacer que los juegos de MS-DOS se ejecuten en Windows 95: solucionar el problema iretd, 4 de abril de 2016. Archivado el 15 de marzo de 2019
  16. ^ sandpile.org, registro rFLAGS de arquitectura x86, consulte la nota n.° 7
  17. ^ Can Bölük, Especulando 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.
  18. ^ ab Robert Collins, OpCodes indocumentados, 29 de julio de 1995. Archivado el 21 de febrero de 2001
  19. ^ Michal Necasek, ICEBP finalmente documentado, Museo OS/2 , 25 de mayo de 2018. Archivado el 6 de junio de 2018
  20. ^ Intel, AP-526: Optimización para procesadores Intel de 32 bits, n.º de pedido. 242816-001, octubre de 1995 – listas INT1en la página 86.
  21. ^ AMD, tecnología AMD de 64 bits, volumen 2: programación del sistema, n.º de pedido. 24593, rev 3.06, agosto de 2002, página 248
  22. ^ "Información de la CPU Intel 80386 | Máquinas PCJS".
  23. ^ Geoff Chappell, Identificación de CPU antes de CPUID
  24. ^ Jeff Parsons, Instrucciones obsoletas 80386: IBTS y XBTS, máquinas PCjs . Archivado el 19 de septiembre de 2020.
  25. ^ Robert Collins, La instrucción LOADALL. Archivado desde el original el 5 de junio de 1997.
  26. ^ Toth, Ervin (16 de marzo de 1998). "BSWAP con registros de 16 bits". Archivado desde el original el 3 de noviembre de 1999. La instrucción baja la palabra superior del registro de palabra doble sin afectar sus 16 bits superiores.
  27. ^ Coldwin, Gynvael (29 de diciembre de 2009). «BSWAP + prefijo 66h» . Consultado el 3 de octubre de 2018 . interno (cero) extendiendo el 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 16 bits inferiores, que son "00 00". … Bochs … bswap reg16 actúa igual que bswap reg32 … QEMU … ignora el prefijo 66h
  28. ^ Intel "Microprocesador i486" (abril de 1989, n.º de pedido 240440-001) p.142 listas CMPXCHGcon 0F A6/A7codificaciones.
  29. ^ Intel "Microprocesador i486" (noviembre de 1989, n.º de pedido 240440-002) p.135 listas CMPXCHGcon 0F B0/B1codificaciones.
  30. ^ "CPUID Intel 486 y 486 POD, especificaciones S y pasos".
  31. ^ Intel, Referencia de programación de extensiones de Software Guard, n.º de pedido. 329298-002, octubre de 2014, apartados 3.5 y 3.6.5.
  32. ^ Frank van Gilluwe, "The Undocumented PC, segunda edición", 1997, ISBN 0-201-47950-8 , página 55 
  33. ^ AMD, Guía de revisión para procesadores AMD Athlon 64 y AMD Opteron pub.no. 25759, rev 3.79, julio de 2009, página 34. Archivado el 20 de diciembre de 2023.
  34. ^ Intel, Manual del desarrollador de software, volumen 3A, n.º de pedido. 253668-078, dic 2022, sección 9.3, página 299
  35. ^ "RSM: reanudar desde el modo de gestión del sistema". Archivado desde el original el 12 de marzo de 2012.
  36. ^ Informe del microprocesador, explicación del modo de gestión del sistema (vol 6, núm. 8, 17 de junio de 1992). Archivado el 29 de junio de 2022.
  37. ^ Ellis, Simson C., "El microprocesador 386 SL en computadoras portátiles", Intel Corporation, Microcomputer Solutions, marzo/abril de 1991, página 20
  38. ^ Hoja de datos de Cyrix 486SLC/e (1992), sección 2.6.4
  39. ^ Fuentes del kernel de Linux 6.3, /arch/x86/include/asm/cpuid.h, línea 69
  40. ^ Lista de correo de gcc-patches, parche CPUID para IDT Winchip, 21 de mayo de 2019. Archivado el 27 de abril de 2023.
  41. ^ Intel, Nota de aplicación FlexMigration de tecnología de virtualización Intel®, n.º de pedido. 323850-004, octubre de 2012, sección 2.3.2 en la página 12. Archivado el 13 de octubre de 2014.
  42. ^ Hoja de datos de la familia de productos Intel, Atom Processor C3000, n.º de pedido. 337018-002, febrero de 2018, páginas 133, 3808 y 3814. Archivado el 9 de febrero de 2022.
  43. ^ AMD, Manual del programador de arquitectura AMD64 Volumen 3 pub.no. 24594, rev 3.34, octubre de 2022, pág. 165 (entrada sobre CPUIDinstrucción)
  44. ^ Robert Collins, CPUID Algorithm Wars, noviembre de 1996. Archivado desde el original el 18 de diciembre de 2000.
  45. ^ Geoff Chappell, Compatibilidad con CMPXCHG8B en el kernel de Windows de 32 bits, 23 de enero de 2008. Archivado el 5 de noviembre de 2023.
  46. ^ ab Intel, Manual del desarrollador de software, n.º de pedido. 325426-077, noviembre de 2022: la entrada de la RDTSCinstrucción en la página 1739 describe las secuencias de instrucciones necesarias para ordenar la RDTSCinstrucción con respecto a las instrucciones anteriores y posteriores.
  47. ^ Kernel de Linux 5.4.12, /arch/x86/kernel/cpu/centaur.c
  48. ^ Stack Overflow, ¿Puede el tsc constante no invariante cambiar la frecuencia entre los estados de la CPU? Consultado el 24 de enero de 2023. Archivado el 24 de enero de 2023.
  49. ^ CPU-World, CPUID para IDT ZHAOXIN KaiXian KX-U6780 2,7 GHz (por KZ). Consultado el 24 de enero de 2023. archive.org Archivado el 24 de enero de 2023.
  50. ^ Michal Necasek, "RDTSC indocumentado", 27 de abril de 2018. Archivado el 16 de diciembre de 2023.
  51. ^ JookWiki, "nopl", 24 de septiembre de 2022: proporciona un relato extenso de la historia del NOP prolongado y los problemas que lo rodean. Archivado el 28 de octubre de 2022.
  52. ^ ab Comunidad Intel: NOP multibyte hecho oficial. Archivado el 7 de abril de 2022.
  53. ^ Manual de desarrolladores de software Intel, volumen 3B (n.º de pedido 253669-076us, diciembre de 2021), sección 22.15 "NOP reservado"
  54. ^ AMD, tecnología AMD de 64 bits: manual del programador de arquitectura AMD x86-64, volumen 3, publicación no. 24594, rev 3.02, agosto de 2002, página 379.
  55. ^ Intel, Manual del desarrollador de software de arquitectura Intel, volumen 2, 1997, n.º de pedido. 243191-001, páginas 3-9 y A-7.
  56. ^ John Hassey, Cambios en Pentium Pro, lista de correo de GAS2 , 28 de diciembre de 1995: parche que agregó mnemómicas de instrucciones UD2Ay UD2Ba GNU Binutils. Archivado el 25 de julio de 2023.
  57. ^ Jan Beulich, x86: UDn correcto, lista de correo binutils-gdb , 23 de noviembre de 2017: parche de Binutils que agregó el byte ModR/M a UD1/ UD2By agregó UD0. Archivado el 25 de julio de 2023.
  58. ^ Intel, Manual del desarrollador de la familia de procesadores Pentium®, volumen 3, 1995. n.º de pedido. 241430-004, apéndice A, página 943: reserva los códigos de operación 0F 0By 0F B9.
  59. ^ ab AMD, Manual del programador de arquitectura AMD64, volumen 3, publicación no. 24594, rev 3.17, diciembre de 2011; consulte la página 416 UD0y las páginas 415 y 419 para obtener más información UD1.
  60. ^ abc Intel, Manual del desarrollador de software, vol 2B, n.º de pedido. 253667-061, diciembre de 2016: listas UD1(con byte ModR/M ) y UD0(sin byte ModR/M) en la página 4-687.
  61. ^ Stecklina, Julián (8 de febrero de 2019). "Tomar huellas dactilares de CPU x86 mediante códigos de operación ilegales". x86.jajaja . Archivado desde el original el 15 de diciembre de 2023 . Consultado el 15 de diciembre de 2023 .
  62. ^ "corrección de longitud ud0 · intelxed/xed@7561f54". GitHub . Archivado desde el original el 1 de junio de 2023 . Consultado el 15 de diciembre de 2023 .
  63. ^ ab Cyrix, libro de datos del procesador 6x86, 1996, n.º de pedido. 94175-01, tabla 6-20, página 209: utiliza el mnemotécnico OIO("Código de operación oficial no válido") para el 0F FFcódigo de operación.
  64. ^ Intel, Manual del desarrollador de software, vol 2B, n.º de pedido. 253667-064, octubre de 2017: listas UD0(con byte ModR/M) en la página 4-683.
  65. ^ AMD, Manual de referencia técnica del procesador AMD-K5, noviembre de 1996, n.º de pedido. 18524C/0, sección 3.3.7, página 90: reserva el 0F FFcódigo de operación sin asignarle un mnemotécnico.
  66. ^ AMD, hoja de datos del procesador AMD-K6, n.º de pedido. 20695H/0, marzo de 1998, apartado 24.2, página 283.
  67. ^ George Dunlap, Escalada de privilegios Intel SYSRET, Proyecto Xen. , 13 de junio de 2012. Archivado el 15 de marzo de 2019.
  68. ^ Intel, AP-485: Identificación del procesador Intel® e instrucción CPUID, n.º de pedido. 241618-039, mayo de 2012, apartado 5.1.2.5, página 32
  69. ^ Michal Necasek, "SYSENTER, ¿Dónde estás?", 20 de julio de 2017. Archivado el 29 de noviembre de 2023.
  70. ^ AMD, Guía de optimización de código del procesador Athlon x86, publicación no. 22007, rev K, febrero de 2002, apéndice F, página 284. Archivado el 13 de abril de 2017.
  71. ^ Transmeta, Reconocimiento de procesador, 7 de mayo de 2002.
  72. ^ VIA, Hoja de datos del procesador VIA C3 Nehemiah, rev 1.13, 29 de septiembre de 2004, página 17
  73. ^ CPU-World, CPUID para Intel Xeon 3,40 GHz - Nocona paso a D CPUID sin CMPXCHG16B
  74. ^ CPU-World, CPUID para Intel Xeon 3,60 GHz: Nocona actualiza E CPUID con CMPXCHG16B
  75. ^ SuperUser StackExchange, ¿Cuán frecuentes son los procesadores x64 antiguos que carecen de la instrucción cmpxchg16b?
  76. ^ N.º de pedido de Intel SDM. 325462-077, abril de 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension" enumera MOVSXD sin REX.W como "desaconsejado"
  77. ^ Anandtech, Revisión profunda de AMD Zen 3 Ryzen, 5 de noviembre de 2020, página 6
  78. ^ @instlatx64 (31 de octubre de 2020). "Salvar Ryzen privado: funciones de reemplazo PEXT/PDEP 32/64b para CPU #AMD (BR/#Zen/Zen+/#Zen2) basadas en el zp7 de @zwegner" ( Tweet ) . Consultado el 20 de enero de 2023 - vía Twitter .
  79. ^ Wegner, Zach (4 de noviembre de 2020). "zwegner/zp7". GitHub .
  80. ^ Intel, Especificación de tecnología de aplicación de flujo de control (v3.0, n.º de pedido 334525-003, marzo de 2019)
  81. ^ Intel SDM, rev 076, diciembre de 2021, volumen 1, sección 18.3.1
  82. ^ Lista de correo de Binutils: x86: CET v2.0: actualizar el prefijo NOTRACK
  83. ^ AMD, Extensiones para 3DNow! y conjuntos de instrucciones MMX, ref no. 22466D/0, marzo de 2000, p.11
  84. ^ Hadi Brais, La importancia de la instrucción x86 SFENCE, 26 de febrero de 2019.
  85. ^ Intel, Manual del desarrollador de software, n.º de pedido. 325426-077, noviembre de 2022, Volumen 1, sección 11.4.4.3, página 276.
  86. ^ Hadi Brais, La importancia de la instrucción LFENCE, 14 de mayo de 2018
  87. ^ 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.
  88. ^ Intel, Guía del desarrollador de software de instrucciones nuevas de Prescott, n.º de pedido. 252490-003, junio de 2003, lista de páginas 3-26 y 3-38 MONITORy MWAITcon operandos explícitos.
  89. ^ Tablero de mensajes de Flat Assembler, "Sintaxis BLENDVPS/BLENDVPD/PBLENDVB", también cubre MONITOR/ MWAITmnemónicos
  90. ^ Intel, familia de productos Intel® Xeon Phi™ x200 (KNL) Modo de usuario (anillo 3) MONITOR y MWAIT (archivado el 5 de marzo de 2017)
  91. ^ Guía para desarrolladores de AMD, BIOS y kernel (BKDG) para procesadores AMD de la familia 10h, n.º de pedido. 31116, rev 3.62, página 419
  92. ^ R. Zhang et al, (M)ESPERE: cerrar la brecha entre los canales laterales microarquitectónicos y arquitectónicos, 3 de enero de 2023, página 5. Archivado desde el original el 5 de enero de 2023.
  93. ^ Guru3D, lanzamiento de procesadores SoC de 4 y 8 núcleos VIA Zhaoxin x86, 22 de enero de 2018
  94. ^ Vulners, x86: DoS al intentar utilizar INVPCID con direcciones no canónicas, 20 de noviembre de 2018
  95. ^ Manual del desarrollador de software de arquitecturas Intel, Intel® 64 e IA-32, volumen 3, n.º de pedido. 325384-078, diciembre 2022, capítulo 23.15
  96. ^ ab Catherine Easdon, Comportamiento de CPU no documentado en microarquitecturas x86 y RISC-V: una perspectiva de seguridad, 10 de mayo de 2019, página 39
  97. ^ Instlatx64, Volcado de CPUID de Zhaoxin Kaixian KX-6000G, 15 de mayo de 2023
  98. ^ abc Intel, Arquitectura Intel® Software Guard Extensions (Intel® SGX) para la sobresuscripción de memoria segura en un entorno virtualizado, 25 de junio de 2017.
  99. ^ Intel, actualizaciones de microcódigo en tiempo de ejecución con extensiones Intel® Software Guard, septiembre de 2021, n.º de pedido. 648682 rev 1.0. Archivado desde el original el 31 de marzo de 2023.
  100. ^ Intel, hoja de datos del procesador Intel® Core™ de 11.ª generación, volumen 1, mayo de 2022, n.º de pedido. 634648-004, apartado 3.5, página 65
  101. ^ Intel, ¿qué plataformas admiten Intel® Software Guard Extensions (Intel® SGX) SGX2? Archivado el 5 de mayo de 2022.
  102. ^ ab Intel, Extensiones arquitectónicas de CPU Trust Domain, n.º de pedido. 343754-002, mayo 2021.
  103. ^ @InstLatX64 (3 de mayo de 2022). "La historia de CLDEMOTE" ( Pío ) . Consultado el 23 de enero de 2023 - vía Twitter .
  104. ^ @Instlatx64 (17 de abril de 2023). "Volcado de CPUID Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 de 20 núcleos" ( Tweet ) . Consultado el 20 de abril de 2023 - vía Twitter .
  105. ^ Wikichip, CLZERO – x86
  106. ^ Intel, nota de aplicación AP-578: Consideraciones de software y hardware para controladores de excepciones FPU para procesadores de arquitectura Intel, n.º de pedido. 243291-002, febrero de 1997
  107. ^ Intel, Nota de aplicación AP-113: Introducción al procesador de datos numéricos, febrero de 1981, páginas 24 y 25
  108. ^ Intel, coprocesador matemático 8087, octubre de 1989, n.º de pedido. 285385-007, página 3-100, figura 9
  109. ^ Intel, extensión de procesador numérico HMOS de 80 bits 80287, febrero de 1983, n.º de pedido. 201920-001, página 14
  110. ^ Intel, iAPX86, 88 Manual del usuario, 1981 (n.º de pedido 210201-001), pág. 797
  111. ^ ab Manual de referencia para programadores Intel 80286 y 80287, 1987 (n.º de pedido 210498-005), p. 485
  112. ^ Manual del desarrollador de software Intel volumen 3B, revisión 064, sección 22.18.9
  113. ^ "GCC Bugzilla - 37179 - GCC emite un código de operación incorrecto 'ffreep'".
  114. ^ Michael Steil, FFREEP: las instrucciones de montaje que nunca existieron
  115. ^ Dusko Koncaliev, Error del Pentium FDIV
  116. ^ Bruce Dawson, Intel subestima los límites de error en 1,3 quintillones
  117. ^ Intel SDM, rev 053 y posteriores, describe el procedimiento exacto de reducción de argumentos utilizado para , y FSINen FCOSel volumen 1, sección 8.3.8FSINCOSFPTAN
  118. ^ Manual de referencia de optimización de arquitecturas Intel, Intel® 64 e IA-32 (n.º de pedido 248966-044, junio de 2021) sección 3.5.2.3
  119. ^ "La microarquitectura de las CPU Intel, AMD y VIA: una guía de optimización para programadores de ensamblaje y fabricantes de compiladores" (PDF) . Consultado el 17 de octubre de 2016 .
  120. ^ "Programación de ajedrez AVX2". Archivado desde el original el 10 de julio de 2017 . Consultado el 17 de octubre de 2016 .
  121. ^ "Instrucciones de Intel AVX-512". Intel . Consultado el 21 de junio de 2022 .
  122. ^ Intel, Guía de implementación del software del generador de números aleatorios digitales (DRNG), rev. 2.1, 17 de octubre de 2018, secciones 5.2 y 5.3. Archivado el 19 de noviembre de 2021.
  123. ^ Michal Ludvig, VIA PadLock: Wicked Fast Encryption, Linux Journal , 6 de abril de 2005. Archivado el 20 de junio de 2005.
  124. ^ Stack Overflow, ¿Transmisión de cálculo SHA utilizando el Padlock Hashing Engine de VIA?, 11 de agosto de 2014. Archivado el 14 de junio de 2019.
    El SDK de PadLock (v3.1) al que se hace referencia en la respuesta de Stack Overflow se puede descargar desde la wiki de Crypto++ (consultado en 11 de agosto de 2023) o Wayback Machine.
  125. ^ Zhaoxin, tecnología central | Instrucciones para el uso de instrucciones aceleradas para el algoritmo de cifrado nacional basado en el procesador Zhaoxin (en chino). Archivado el 5 de enero de 2022
  126. ^ Zhaoxin, Manual del usuario de GMI v1.0 (en chino). Archivado el 28 de febrero de 2022
  127. ^ AMD, tecnología de virtualización AMD64 con nombre en código “Pacifica”, publicación no. 33407, rev 3.01, mayo de 2005. Archivado el 13 de junio de 2011.
  128. ^ CPU-World, CPUID para AMD Turion 64 X2 RM-75, 5 de marzo de 2022.
  129. ^ Intel, hoja de datos de la familia de productos del procesador Intel® Atom™ S1200 para microservidor, volumen 1 de 2, n.º de pedido. 328194-001, dic 2012, página 44
  130. ^ SecurityWeek, Intel agrega TDX a su cartera de informática confidencial con el lanzamiento de procesadores Xeon de cuarta generación, 10 de enero de 2023
  131. ^ Robert Collins, Códigos de operación indocumentados: AAM. Archivado el 21 de febrero de 2001.
  132. ^ Retrocomputing StackExchange, prefijo de código de operación 0F1h en i80286. Archivado el 13 de abril de 2023.
  133. ^ ab Frank van Gilluwe, "The Undocumented PC - Segunda edición", p. 93-95
  134. ^ Michal Necasek, ¿Intel 486 Errata?, 6 de diciembre de 2015. Archivado el 29 de noviembre de 2023.
  135. ^ Robert Hummel, "Referencia técnica del programador de PC Magazine" ( ISBN 1-56276-016-5 ) p.728 
  136. ^ Raúl Gutiérrez Sanz, Códigos de operación 8086 indocumentados, Parte I, 27 de diciembre de 2017. Archivado el 29 de noviembre de 2023.
  137. ^ ab "Asm, código de operación 82h". 24 de diciembre de 1998. Archivado desde el original el 14 de abril de 2023.
  138. ^ Corporación Intel 2022, pag. 3698.
  139. ^ Intel, Manual del usuario de la familia 8086, octubre de 1979, códigos de operación omitidos en las páginas 4-25 y 4-31
  140. ^ Retrocomputing StackExchange, ¿Instrucciones no documentadas en CPU x86 anteriores a 80386?, 4 de junio de 2021. Archivado el 18 de julio de 2023.
  141. ^ Daniel B. Sedory, Un examen del MBR estándar, 2000. Archivado el 6 de octubre de 2023.
  142. ^ AMD, Guía de optimización de software para procesadores AMD64 (publicación 25112, revisión 3.06, septiembre de 2005), sección 6.2, p.128
  143. ^ GCC bugzilla, error 48227: "rep ret" generado para -march=core2. Archivado el 9 de abril de 2023.
  144. ^ Raymond Chen, ¡Qué NOP más extraños tienes!, 12 de enero de 2011. Archivado el 20 de mayo de 2023.
  145. ^ Jeff Parsons, información de la CPU Intel 80386 (sección de erratas B1, elemento n.º 7). Archivado el 13 de noviembre de 2023.
  146. ^ Manual de desarrolladores de software Intel, volumen 2B (enero de 2006, número de pedido 235667-018, no tiene NOP largo)
  147. ^ Manual de desarrolladores de software de Intel, volumen 2B (marzo de 2006, número de pedido 235667-019, NOP largo)
  148. ^ Agner Fog, Tablas de instrucciones, sección AMD K7.
  149. ^ "579838: glibc no es compatible con AMD Geode LX". Archivado desde el original el 30 de julio de 2023.
  150. ^ Manual de desarrolladores de software Intel, volumen 2B (abril de 2005, número de pedido 235667-015, no incluye 0F0D-nop)
  151. ^ Manual de desarrolladores de software Intel, volumen 2B (junio de 2005, número de pedido 235667-016, enumera 0F0D-nop en la tabla de códigos de operación pero no en la NOPdescripción de las instrucciones).
  152. ^ Intel Software Developers Manual, volumen 2B (n.º de pedido 253667-060, septiembre de 2016) no incluye UD0y UD1.
  153. ^ "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 desde el original el 13 de abril de 2023.
  154. ^ "¿80486 fallas de protección de paginación? \ VOGONS". Archivado desde el original el 9 de abril de 2022.
  155. ^ "Manejo de código de operación no válido \ VOGONS". Archivado desde el original el 9 de abril de 2022.
  156. ^ "Las instrucciones no válidas provocan la salida incluso si Int 6 está enganchado \ VOGONS". Archivado desde el original el 9 de abril de 2022.
  157. ^ "Tutorial: llamada a Win32 desde DOS". Tormenta de furia . 17 de septiembre de 2005. Archivado desde el original el 9 de abril de 2022.
  158. ^ "Acceso a controladores de dispositivos Windows desde programas DOS". Archivado desde el original el 8 de noviembre de 2011.
  159. ^ ab "Microcódigo 8086 desmontado". Blog reenigne . 2020-09-03. Archivado desde el original el 8 de diciembre de 2023 . Consultado 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.
  160. ^ "Re: Códigos de operación no documentados (HINT_NOP)". Archivado desde el original el 6 de noviembre de 2004 . Consultado el 7 de noviembre de 2010 .
  161. ^ "Re: También algunos códigos de operación 0Fh no documentados". Archivado desde el original el 26 de junio de 2003 . Consultado el 7 de noviembre de 2010 .
  162. ^ La biblioteca RCCE de Intel para SCC utilizó código de operación 0F 0Apara la instrucción de invalidación de mensajes de SCC.
  163. ^ Intel Labs, Especificación de arquitectura externa (EAS) de SCC, revisión 0.94, p.29. Archivado el 22 de mayo de 2022.
  164. ^ "Instrucciones x86 no documentadas para controlar la CPU a nivel de microarquitectura en procesadores Intel modernos" (PDF) . 9 de julio de 2021.
  165. ^ Robert R. Collins, Códigos de operación indocumentados: UMOV. Archivado el 21 de febrero de 2001.
  166. ^ Herbert Oppmann, NXOP (código de operación 0Fh 55h)
  167. ^ Herbert Oppmann, Fuente de hipercódigo NexGen Nx586, consulte COMMON.INC. Archivado el 9 de abril de 2023.
  168. ^ Herbert Oppmann, Dentro del BIOS del sistema NexGen Nx586. Archivado el 29 de diciembre de 2023.
  169. ^ Intel, XuCode: una tecnología innovadora para implementar flujos de instrucciones complejos, 6 de mayo de 2021. Archivado el 19 de julio de 2022.
  170. ^ Grzegorz Mazur, AMD 3DNow! instrucciones indocumentadas
  171. ^ ab "Instrucciones de 3DNow! Indocumentadas". grafi.ii.pw.edu.pl . Archivado desde el original el 30 de enero de 2003 . Consultado el 22 de febrero de 2022 .
  172. ^ OPCODE.LST de Potemkin's Hacker Group, v4.51, 15 de octubre de 1999. Archivado el 21 de mayo de 2001.
  173. ^ "[Análisis de CPU UCA] Prototipo UMC Green CPU U5S-SUPER33". 25 de mayo de 2020. Archivado desde el original el 9 de junio de 2023.
  174. ^ Agner Fog, La microarquitectura de las CPU Intel, AMD y VIA, sección 3.4 "Predicción de ramas en P4 y P4E". Archivado el 7 de enero de 2024.
  175. ^ Hilo de discusión de Reddit /r/Amd: Ryzen tiene soporte indocumentado para FMA4
  176. ^ ab Christopher Domas, Breaking the x86 ISA, 27 de julio de 2017. Archivado el 27 de diciembre de 2023.
  177. ^ ab Xixing Li et al, UISFuzz: un método eficiente de fuzzing para la búsqueda de instrucciones no documentadas en la CPU, 9 de octubre de 2019. Archivado el 27 de diciembre de 2023.
  178. ^ Informe de microprocesador, MediaGX apunta a PC de bajo costo (vol 11, núm. 3, 10 de marzo de 1997). Archivado el 6 de junio de 2022.
  179. ^ "Bienvenidos al proyecto OpenSSL". GitHub . 21 de abril de 2022. Archivado desde el original el 4 de enero de 2022.
  180. ^ LKML, criptografía (PATCH): Zhaoxin: controlador de motor de hardware para SHA1/256/384/512, 2 de agosto de 2023. Archivado el 17 de enero de 2024.
  181. ^ Kary Jin, PARCHE: Actualización del motor PadLock para CPU VIA C7 y Nano, lista de correo de openssl-dev , 10 de junio de 2011. Archivado el 11 de febrero de 2022.
  182. ^ ab Lista de correo de OpenEuler, PATCH kernel-4.19 v2 5/6: x86/cpufeatures: agregue bits de funciones de Zhaoxin. Archivado el 9 de abril de 2022.
  183. ^ USPTO/Zhaoxin, Solicitud de patente US2023/006718: Procesador con algoritmo criptográfico hash y procesamiento de datos del mismo, páginas 13 y 45, 2 de marzo de 2023. Archivado el 12 de septiembre de 2023.
  184. ^ LKML, (PATCH) crypto: x86/sm2 -agregar implementación del algoritmo Zhaoxin SM2, 11 de noviembre de 2023. Archivado el 17 de enero de 2024.
  185. ^ ab InstLatx64, volcado de CPUID para Zhaoxin KaiXian KX-6000G: tiene los bits de función SM2 y xmodx configurados ( hoja de CPUID C0000001:EDX:bits 0 y 29). Archivado el 25 de julio de 2023.
  186. ^ Solicitud de extracción del kernel OpenEuler 2602: x86/delay: agregue soporte para la instrucción Zhaoxin ZXPAUSE. Casa rural . 26 de octubre de 2023. Archivado el 22 de enero de 2024.
  187. ^ Archivo de datos ISA para Intel XED (17 de abril de 2022), líneas 916-944
  188. ^ Libro de datos del procesador Cyrix 6x86, página 6-34
  189. ^ Libro de datos de procesadores AMD Geode LX, publicación 33234H, p.670

enlaces externos