El conjunto de instrucciones x86 se refiere al conjunto de instrucciones que admiten los microprocesadores compatibles con x86 . Estas instrucciones suelen formar parte de un programa ejecutable , que a menudo se almacena como un archivo informático y se ejecuta en el procesador.
El conjunto de instrucciones x86 se ha ampliado varias veces, introduciendo registros y tipos de datos más amplios, así como nuevas funcionalidades. [ 1 ]
Instrucciones enteras x86
A continuación se muestra el conjunto completo de instrucciones 8086/8088 de Intel (81 instrucciones en total). [ 2 ] Estas instrucciones también están disponibles en modo de 32 bits, en el que operan sobre registros ( eax , ebx , etc.) y valores de 32 bits en lugar de sus contrapartes de 16 bits ( ax , bx , etc.). El conjunto de instrucciones actualizado se agrupa según la arquitectura ( i186 , i286 , i386 , i486 , i586 / i686 ) y se denomina (32 bits) x86 y (64 bits) x86-64 (también conocido como AMD64 ).
Instrucciones originales 8086/8088
Este es el conjunto de instrucciones original. En la columna 'Notas', r significa registro , m significa dirección de memoria e imm significa inmediato (es decir, un valor).
Añadido en procesadores específicos
Nuevas instrucciones y formatos de instrucciones añadidos en los procesadores Intel 80186 y 80188. También presentes en los procesadores NEC V20 /V30 y sus sucesores.
- ↑ Los anillos de protección se aplican a los modelos 80286 y posteriores, no al 80186.
- 1 2 3 En modo de 64 bits, las
PUSHA,POPAyBOUNDno están disponibles; losPUSHAyPOPAcausarán #UD, y elBOUNDcódigo de operación (62) se reutiliza para el prefijo EVEX . - ↑On some processors, including some 80186 variants, using repeat-prefixes with the
BOUNDinstruction will modify its operation to compare only the lower-bound.[4] For this reason, repeat-prefixes should be avoided for this instruction. - ↑On Intel 80186/80188 and NEC V-series processors, bounds-check failure will cause #BR to be issued as a trap-type exception (the value of CS:IP stored on the stack points to the instruction following the
BOUNDinstruction),[5] while on 80286 and later processors, it is issued as a fault-type exception (the value of CS:IP stored on the stack is that of theBOUNDinstruction itself).[6] - ↑The "
IIMUL" mnemonic for the 80186 multiply-immediate instruction is sometimes used in IBM PC documentation,[7] but is not commonly used otherwise. - 1234The
REP(F3) prefix can be used with theINSB/INSW/OUTSB/OUTSWinstructions. Doing so will cause the instruction to be repeated the number of times specified in rCX. (setting rCX to 0 will cause zero repetitions, i.e. the instructions will act as NOPs) - 12On 80286 and later processors, the
INSB/INSWinstructions may perform access-rights checks for its memory store after the read from the I/O port has been performed - if any of these checks fail (e.g. segfault or page-fault), then the data item read from the I/O port is lost. For this reason, using theINSB/INSWinstructions to read an I/O port that has side-effects upon read is not recommended. - ↑I/O port access is only allowed when CPL≤IOPL, or (on 80386 and later) the I/O port permission bitmap bits for the port to access are all set to 0.
- 1234567For the ROL/ROR/RCL/RCR/SHL/SHR/SAR instructions, opcode
C0is used for byte variants and opcodeC1is used for word variants.For theC0/C1immediate versions of the shift/rotate instructions, only the bottom 5 bits of the immediate are used (6 bits for opcodeC1if it is encoded with a 64-bit operand-size under x86-64) - ↑On 80186 and later, sub-opcode /6 for the shift-opcodes
C0/C1/D0/D1/D2/D3acts as an (often poorly documented) alias of sub-opcode /4 — these are all variants of theSHLinstruction. - ↑The first argument to the
ENTERinstruction is always a 16-bit unsigned immediate regardless of OperandSize.El segundo argumento
ENTERes un valor inmediato de 8 bits: en los procesadores 80186/80188 y NEC de la serie V, se utilizan los 8 bits, [ 5 ] pero los procesadores 80286 y posteriores utilizan solo los 5 bits inferiores. [ 6 ] - ↑ En los procesadores más recientes, la
ENTERinstrucción, después de configurar el marco de pila, comprobará si la ubicación del byte a la que apunta el nuevo valor de SS:rSP es escribible; si no lo es, generará la misma excepción (por ejemplo, fallo de página) que habría causado una escritura en esa dirección. [ 8 ]
Añadido con 80286
Las nuevas instrucciones añadidas en 80286 brindan soporte para el modo protegido x86 . Algunas, pero no todas, las instrucciones también están disponibles en modo real .
- 1 2 3 4 Los descriptores utilizados por las
LGDT,LIDT,SGDTySIDTconstan de una estructura de datos de 2 partes. La primera parte es un valor de 16 bits, que especifica el tamaño de la tabla en bytes menos 1. La segunda parte es un valor de 32 bits (valor de 64 bits en modo de 64 bits), que especifica la dirección de inicio lineal de la tabla.ParaLGDTyLIDTcon un tamaño de operando de 16 bits, la dirección se combina con 00FFFFFFh mediante AND.En las CPU de Intel (pero no en las de AMD), las
SGDTinstruccionesSIDTcon un tamaño de operando de 16 bits están documentadas —a partir de la revisión 079 de Intel SDM, marzo de 2023— para escribir un descriptor en la memoria con el último byte establecido en 0. Sin embargo, el comportamiento observado es que se escriben los bits 31:24 de la dirección de la tabla de descriptores. [ 9 ]En el Intel 80286, el último byte escrito por
SGDT/SIDTsiempre es 0xFF; esto ha sido utilizado por software (por ejemplo, un controlador NDIS NE2000 [ 10 ] y Microsoft Windows 3.0 [ 11 ] ) para detectar si la CPU es un 80286 o no. - 1 2 3 4 Las
LGDT,LIDT,LLDTyLTRse serializan en procesadores Pentium y posteriores. - ↑ La
LMSWinstrucción se serializa en procesadores Intel a partir de Pentium , pero no en procesadores AMD.Cuando
LMSWse utiliza la instrucción para entrar en modo protegido , debe ir seguida inmediatamente de una instrucción de salto para borrar la cola de precarga. [ 12 ] (En el Intel 80286, se ha informado que ejecutar tres instrucciones que no sean de salto inmediatamente después de unaLMSWque entra en modo protegido provoca un reinicio de la CPU). [ 13 ] - ↑ En el 80386 y posteriores, la "Palabra de estado de la máquina" es la misma que el registro de control CR0 ; sin embargo, la
LMSWinstrucción solo puede modificar los 4 bits inferiores de este registro y no puede borrar el bit 0. La incapacidad de borrar el bit 0 significa queLMSWse puede usar para entrar, pero no para salir del modo protegido x86 .En el 80286, no es posible salir del modo protegido en absoluto (ni conLMSWni conLOADALL[ 14 ] ) sin un reinicio de la CPUMOV; en el 80386 y posteriores, es posible salir del modo protegido, pero esto requiere el uso de la instrucción parael 80386 y posterioresCR0. - ↑ Si
CR4.UMIP=1está configurado, entonces lasSGDT,SIDT,SLDT,SMSWySTRsolo pueden ejecutarse en el Anillo 0.Estas instrucciones no tenían privilegios en todas las CPU x86 desde el 80286 en adelante hasta la introducción de UMIP en 2017. [ 15 ] Esto ha sido un problema de seguridad significativo para la virtualización basada en software, ya que permite que estas instrucciones sean utilizadas por un invitado de VM para detectar que se está ejecutando dentro de una VM. [ 16 ] [ 17 ] - 1 2 3 Las
SMSW,SLDTySTRsiempre usan un tamaño de operando de 16 bits cuando se usan con un argumento de memoria. Con un argumento de registro en procesadores 80386 o posteriores, hay disponibles tamaños de operando de destino más amplios y se comportan de la siguiente manera:SMSW: Almacena el CR0 completo en modo de 64 bits en CPU x86-64; de lo contrario, no está definido.SLDT: Amplía a cero el argumento de 16 bits en procesadores Pentium Pro y posteriores; no está definido en procesadores anteriores.STR: Amplía a cero el argumento de 16 bits.
- ↑ En los procesadores con x86-64, la
ARPLinstrucción no está disponible en modo de 64 bits; elinstrucción63 /rexclusiva del modo de 64 bitsMOVSXD - ↑ La
ARPLinstrucción provoca #UD en modo real y modo virtual 8086 : se sabe que Windows 95 y OS/2 2.x hacen un uso extensivo de este #UD para usar el63código de operación como un punto de interrupción de un byte para pasar del modo virtual 8086 al modo kernel. [ 18 ] [ 19 ] - ↑ Los bits 19:16 de esta máscara están documentados como "indefinidos" en las CPU Intel. [ 20 ] En las CPU AMD, la máscara está documentada como
0x00FFFF00. - 1 2 Para las
LARyLSL, si no se pudo cargar el descriptor de segmento especificado, entonces el registro de destino de la instrucción se deja sin modificar. - ↑ En algunas combinaciones de CPU/microcódigo Intel a partir de 2019, así como en algunas combinaciones de CPU/microcódigo AMD a partir de 2025, la
VERWinstrucción también vacía varios búferes de datos microarquitectónicos de una manera específica de la implementación. Esto permite que se utilice como parte de soluciones alternativas para vulnerabilidades de seguridad como el muestreo de datos microarquitectónicos y los ataques al planificador transitorio . [ 21 ] [ 22 ] [ 23 ] Algunas de las funciones de vaciado de búferes microarquitectónicos que se han añadidoVERWpueden requerir que la instrucción se ejecute con un operando de memoria. [ 24 ] - 1 2 No documentado, solo 80286. [ 14 ] [ 25 ] [ 26 ] (Existe una variante diferente
LOADALLcon un código de operación y una distribución de memoria diferentes en el 80386).
Añadido con 80386
El microcontrolador 80386 añadió soporte para operaciones de 32 bits al conjunto de instrucciones x86. Esto se logró ampliando los registros de propósito general a 32 bits e introduciendo los conceptos de tamaño de operando y tamaño de dirección . La mayoría de las instrucciones que antes aceptaban argumentos de datos de 16 bits ahora podían aceptar argumentos de 32 bits al establecer su tamaño de operando en 32 bits, y las instrucciones que podían aceptar argumentos de dirección de 16 bits ahora podían aceptar argumentos de dirección de 32 bits al establecer su tamaño de dirección en 32 bits. (Las instrucciones que trabajan con datos de 8 bits siguen siendo de 8 bits independientemente del tamaño de operando. Usar un tamaño de datos de 16 bits solo modificará los 16 bits inferiores de los registros de propósito general de 32 bits; los 16 bits superiores permanecen sin cambios).
El tamaño de operando y el tamaño de dirección predeterminados que se utilizan para cada instrucción vienen dados por el bit D del descriptor de segmento del segmento de código actual: D=0ambos son de 16 bits, D=1ambos son de 32 bits. Además, se pueden anular para cada instrucción con dos nuevos prefijos de instrucción que se introdujeron en el 80386:
66h: Anulación de OperandSize. Cambiará OperandSize de 16 bits a 32 bits siCS.D=0, o de 32 bits a 16 bits siCS.D=1.67h: Anulación de AddressSize. Cambiará AddressSize de 16 bits a 32 bits siCS.D=0, o de 32 bits a 16 bits siCS.D=1.
El 80386 también introdujo los dos nuevos registros de segmento FS, GSasí como los registros de control , depuración y prueba x86 .
The new instructions introduced in the 80386 can broadly be subdivided into two classes:
- Códigos de operación preexistentes que necesitaban nuevos mnemónicos para sus variantes de tamaño de operando de 32 bits (por ejemplo
CWDE, ,LODSD) - Nuevos códigos de operación que introdujeron nueva funcionalidad (por ejemplo
SHLD, ,SETcc)
Para las instrucciones en las que el tamaño del operando se puede inferir a partir de los argumentos de la instrucción (por ejemplo, ADD EAX,EBXse puede inferir que tiene un tamaño de operando de 32 bits debido al uso de EAX como argumento), no se necesitan ni se proporcionan nuevos mnemónicos de instrucción.
- ↑ Para las instrucciones de cadena de 32 bits, la notación ±± se utiliza para indicar que el registro indicado se decrementa en 4 si
EFLAGS.DF=1y se incrementa en 4 en caso contrario.Para los operandos donde se indica el segmento DS, este puede ser sobrescrito por un prefijo de sobrescritura de segmento; donde se indica el segmento ES, este siempre es ES y no puede ser sobrescrito.La elección de si se utilizan los registros SI/DI de 16 bits o los registros ESI/EDI de 32 bits como registros de dirección se realiza mediante AddressSize, que puede ser sobrescrito con el67prefijo. - ↑ Las instrucciones de cadena de 32 bits aceptan prefijos de repetición de la misma manera que las instrucciones de cadena de 8/16 bits más antiguas.Para
LODSD,STOSD,MOVSD,INSDyOUTSD, elREPprefijo (F3) repetirá la instrucción el número de veces especificado en rCX (CX o ECX, decidido por AddressSize), decrementando rCX para cada iteración (con rCX=0 resultando en no-op y procediendo a la siguiente instrucción).ParaCMPSDySCASD, losREPE(F3) yREPNE(F2) están disponibles, que repetirán la instrucción, decrementando rCX para cada iteración, pero solo mientras la condición de bandera (ZF=1 paraREPE, ZF=0 paraREPNE) sea verdadera Y rCX ≠ 0. - ↑ En cuanto a las
INSB/W/Dinstrucciones, es posible que los derechos de acceso a la memoria para laES:[rDI]dirección de memoria no se verifiquen hasta después de que se haya realizado el acceso al puerto. Si esta verificación falla (por ejemplo, debido a un fallo de página u otra excepción de memoria), el dato leído del puerto se pierde. Por lo tanto, no se recomienda usar esta instrucción para acceder a un puerto de E/S que realice algún tipo de efecto secundario al leerlo. - ↑ El acceso al puerto de E/S solo está permitido cuando CPL≤IOPL o los bits del mapa de bits de permisos del puerto de E/S para el puerto al que se accede están todos establecidos en 0.
- ↑ La
CWDEinstrucción difiere de la instrucción anteriorCWDen queCWDextendería el signo del valor de 16 bits en AX a un valor de 32 bits en el par de registros DX:AX. - ↑ Para el
E3código de operación (JCXZ/JECXZ), la elección de si la instrucción utilizaráCXoECXpara su comparación (y, por consiguiente, qué mnemónico utilizar) se basa en AddressSize, no en OperandSize. (OperandSize controla si el destino del salto debe truncarse a 16 bits o no).Esto también se aplica a las instrucciones de bucleLOOP,LOOPE,LOOPNE(códigos de operaciónE0,E1,E2); sin embargo, a diferencia deJCXZ/JECXZ, a estas instrucciones no se les han asignado nuevos mnemónicos para sus variantes que utilizan ECX. - ↑ Para
PUSHA(D), el valor de SP/ESP que se coloca en la pila es el valor que tenía justo antes de quePUSHA(D)comenzara la ejecución de la instrucción. - ↑ Para
POPA/POPAD, el elemento de la pila correspondiente a SP/ESP se extrae de la pila (realizando una lectura de memoria), pero no se coloca en SP/ESP. - ↑ Las
PUSHFDyPOPFDprovocarán una excepción #GP si se ejecutan en modo virtual 8086 si IOPL no es 3.LasPUSHF,POPF,IRETyIRETDprovocarán una excepción #GP si se ejecutan en modo Virtual-8086 si IOPL no es 3 y VME no está habilitado. - ↑ Si
IRETDse utiliza para regresar del modo kernel al modo usuario (lo que implicará un cambio de CPL) y el segmento de pila del modo usuario indicado por SS es un segmento de 16 bits, entonces laIRETDinstrucción solo restaurará los 16 bits inferiores del puntero de pila (ESP/RSP), y los bits restantes mantendrán el valor que tenían en el código kernel antes deIRETD. Esto ha requerido soluciones alternativas complejas tanto en Linux ("ESPFIX") [ 27 ] como en Windows. [ 28 ] Este problema también afecta a la instrucción posterior de 64 bitsIRETQ.
- 1 2 3 4 Para las
BT,BTS,BTRyBTC:- Si el primer argumento de la instrucción es un operando de registro y/o el segundo argumento es un valor inmediato, entonces el índice de bits del segundo argumento se toma módulo el tamaño del operando (16/32/64, en efecto, utilizando solo los 4, 5 o 6 bits inferiores del índice).
- Si el primer argumento es un operando de memoria y el segundo argumento es un operando de registro, entonces el índice de bit en el segundo argumento se usa por completo; se interpreta como un índice de bit con signo que se usa para desplazar la dirección de memoria que se usará para la prueba de bit.
- 1 2 3 Las
BTS,BTCyBTRaceptan elLOCK(F0) cuando se usan con un argumento de memoria; esto da como resultado que la instrucción se ejecute atómicamente. - ↑ Si
F3se usa el prefijo con el0F BC /rcódigo de operación, la instrucción se ejecutará comoTZCNTen sistemas que admiten la extensión BMI1.TZCNTdifiere deBSFen queTZCNTpero noBSRestá definido para devolver el tamaño del operando si el operando fuente es cero; para otros valores de operando fuente, producen el mismo resultado (excepto para indicadores). - 1 2
BSFyBSRestablece el indicador EFLAGS.ZF en 1 si el argumento de origen era todo ceros y en 0 en caso contrario.Si el argumento de origen era todo ceros, el registro de destino permanece sin cambios en los procesadores AMD. [ 29 ] Por lo general, también permanece sin cambios en los procesadores Intel, pero existen algunas excepciones:
- En algunos procesadores Intel 64 más antiguos, las formas de 32 bits de las instrucciones
BSF/BSRdejarán sin cambios los 32 bits inferiores del registro de destino, pero borrarán los 32 bits superiores. [ 30 ] [ 31 ] - En los procesadores 386/486, se documenta que la instrucción
BSF/BSRcon una fuente de todos ceros devuelve un valor indefinido al registro de destino; la mayoría de las versiones 386/486 dejan el registro de destino sin cambios, pero se sabe que algunas versiones antiguas de Intel 486 lo modifican. [ 32 ]
- En algunos procesadores Intel 64 más antiguos, las formas de 32 bits de las instrucciones
- ↑ Si
F3se usa el prefijo con el0F BD /rcódigo de operación, la instrucción se ejecutará comoLZCNTen sistemas que admiten las extensiones ABM o LZCNT.LZCNTproduce un resultado diferenteBSRpara la mayoría de los valores de entrada. - 1 2 Para
SHLDySHRD, la cantidad de desplazamiento está enmascarada: los 5 bits inferiores se utilizan para un tamaño de operando de 16/32 bits y 6 bits para un tamaño de operando de 64 bits.SHLDySHRDcon argumentos de 16 bits y una cantidad de desplazamiento mayor que 16 producen resultados indefinidos. (Los resultados reales difieren entre diferentes CPU Intel, con al menos tres comportamientos diferentes conocidos. [ 33 ] ) - 1 2 Los códigos de condición admitidos para lasinstruccionesyyrespectivamente, donde el nibble x especifica la condición) son:
SETccJcc near0F 9x /00F 8x - ↑ Para
SETcc, mientras que el código de operación se especifica comúnmente como /0 – lo que implica que los bits 5:3 del byte ModR/M de la instrucción deberían ser 000 – los procesadores x86 modernos (Pentium y posteriores) ignoran los bits 5:3 y ejecutarán la instrucción comoSETccindependientemente del contenido de estos bits. - ↑ Para
LFS,LGSyLSS, el tamaño de la parte de desplazamiento del puntero lejano viene dado por el tamaño del operando; el tamaño de la parte del segmento siempre es de 16 bits. En modo de 64 bits, usar elREX.Wprefijo con estas instrucciones hará que carguen un puntero lejano con un desplazamiento de 64 bits en procesadores Intel, pero no en AMD. - 1 2 3 4 5 6 Para
MOVhacia/desde losCRx,DRxyTRx, la parte reg del byte ModR/M se utiliza para indicarCRx/DRx/TRxel registro y la parte r/m el registro general. Únicamente para losMOV CRx/DRx/TRxcódigos de operación, los dos bits superiores del byte ModR/M se ignoran; estos códigos de operación se decodifican y ejecutan como si los dos bits superiores del byte ModR/M fueran11b. - 1 2 3 4 Para movimientos hacia/desde los
CRxyDRx, el tamaño del operando siempre es de 64 bits en modo de 64 bits y de 32 bits en caso contrario. - ↑ En los procesadores que admiten páginas globales (Pentium y posteriores), las entradas de la tabla de páginas globales no se vaciarán mediante un cambio
MOVaCR3− en su lugar, estas entradas se pueden vaciar alternando el bit CR4.PGE.En los procesadores que admiten PCID , escribir en
CR3mientras los PCID están habilitados solo vaciará las entradas TLB pertenecientes al PCID especificado en los bits 11:0 del valor escrito enCR3. El vaciado de páginas pertenecientes a otros PCID se puede realizar alternando el bit CR4.PGE, borrando el bit CR4.PCIDE o utilizando laINVPCIDinstrucción.En el modo de 64 bits, el vaciado de la TLB se puede suprimir configurando el bit 63 del valor escrito a
CR31. - ↑ En procesadores anteriores a Pentium , los movimientos a
CR0no serializaban el flujo de instrucciones; por esta razón, generalmente se requiere realizar un salto (JMPoCALL) inmediatamente después de unMOVase utilizaCR0dicho para habilitar/deshabilitar el modo protegido y/o la paginación de memoria . [ 34 ] Este puede ser un salto cercano o lejano; cualquiera funcionará para vaciar la cola de instrucciones, pero se requiere un salto lejano para actualizar los derechos de acceso para el segmento CS. [ 35 ]MOVCuando se activa o desactiva el bit CR0.PG (activando o desactivando la paginación), su efecto en la búsqueda de instrucciones es inmediato en los procesadores Pentium Pro y posteriores; sin embargo, en los procesadores 386/486/Pentium, el efecto se retrasa al menos una instrucción. Se sabe que esta diferencia causa problemas de compatibilidad, por ejemplo, con SCO UNIX 3.2v4.0. [ 36 ]
MOVEstáCR2catalogado arquitectónicamente como serializable, pero se ha informado que no lo es en al menos algunos procesadores Intel Core-i7. [ 37 ]MOVLa funciónCR8(introducida con x86-64) se serializa en procesadores AMD pero no en procesadores Intel. - 1 2 Las
MOV TRxinstrucciones se interrumpieron a partir de Pentium. - ↑ La
INT1/ICEBP(F1) está presente en todos los procesadores Intel x86 conocidos desde el 80386 en adelante, [ 38 ] pero solo está completamente documentada para los procesadores Intel desde la versión de mayo de 2018 del Intel SDM (rev 067) en adelante. [ 39 ] Antes de esta versión, la mención de la instrucción en el material de Intel era esporádica, por ejemplo, AP-526 rev 001. [ 40 ] Para los procesadores AMD, la instrucción ha estado documentada desde 2002. [ 41 ] - ↑ El funcionamiento del
F1(ICEBP) difiere del funcionamiento del código de operación de interrupción de software regularCD 01en varios aspectos:- En modo protegido,
- En el modo virtual-8086,
CD 01también comprobará CPL contra IOPL como una comprobación de derechos de acceso, mientras queF1no lo hará. - En el modo virtual-8086 con VME habilitado, se admite la redirección de interrupciones para
CD 01pero no paraF1.
CD 01comprobará CPL contra el campo DPL del descriptor de interrupción como una comprobación de derechos de acceso, mientras queF1no lo hará. - En el modo virtual-8086,
- ↑ La instrucción UMOV está presente solo en los procesadores 386 y 486. [ 38 ]
- 1 2 Las
XBTSyIBTSse descontinuaron con el paso B1 del 80386. Han sido utilizadas por software principalmente para la detección del paso B0 defectuoso [ 42 ] del 80386. Microsoft Windows (v2.01 y posteriores) intentará ejecutar laXBTSinstrucción como parte de su detección de CPU siCPUIDno está presente, y se negará a arrancar siXBTSencuentra que está funcionando. [ 43 ] - 1 2 Para
XBTSyIBTS, el argumento r/m representa los datos de los que extraer/insertar un campo de bits, el argumento reg el campo de bits que se va a insertar/extraer, AX/EAX un desplazamiento de bits y CL una longitud de campo de bits. [ 44 ] - ↑ No documentado, solo 80386. [ 45 ]
Añadido con 80486
- ↑ El uso
BSWAPcon registros de 16 bits no está prohibido en sí mismo (se ejecutará sin producir un #UD u otras excepciones), pero está documentado que produce resultados indefinidos; se informa que produce varios resultados diferentes en 486, [ 46 ] 586 y Bochs / QEMU . [ 47 ] - 1 2 En Intel 80486 stepping A, [ 48 ] la
CMPXCHGinstrucción utiliza una codificación diferente:0F A6 /rpara la variante de 8 bits,0F A7 /rpara la variante de 16/32 bits. Las0F B0/B1codificaciones se utilizan en 80486 stepping B y posteriores. [ 49 ] [ 50 ] - ↑ Las
CMPXCHGinstrucciones se configuranEFLAGSde la misma manera queCMPlo haría una instrucción que utiliza el acumulador (AL/AX/EAX/RAX) como su primer argumento. - ↑
INVLPGse ejecuta como no operación si el argumento m8 no es válido (por ejemplo, página no asignada o dirección no canónica).INVLPGSe puede utilizar para invalidar entradas de TLB para páginas globales individuales. - ↑ Si
F3se utiliza el prefijo con el0F 09código de operación, la instrucción se ejecutará comoWBNOINVDen los procesadores que admiten la extensión WBNOINVD; esto no invalidará la caché. - Las instrucciones ` and` invalidarán todas las líneas de caché en las cachés L1 de la CPU. Depende de la implementación si también invalidarán el contenido de las cachés L2/L3.Las`and`no impedirán que se realice la precarga de caché mientras se ejecutan; si es necesario garantizar que las cachés estén vacías, entonces es necesario establecer el bit `and`en 1 antes de invocar cualquiera de estas instrucciones. (Si la caché se comparte entre varios procesadores lógicos, entonces para vaciar la caché se requiere que todos los procesadores lógicos que comparten la caché tengan subit `and` establecido en 1 antes`and`).
INVDWBINVDINVDWBINVDCR0.CDCR0.CDINVDWBINVD - 1 2 Las
INVDyWBINVDse están serializando; en algunos procesadores, también pueden bloquear las interrupciones hasta su finalización. - ↑ Existen varias circunstancias bajo las cuales la
INVDinstrucción no puede ejecutarse ni siquiera en el anillo 0:- En los procesadores que admiten Intel SGX , si la PRM (Memoria Reservada del Procesador) se ha configurado mediante los PRMRR (registros de rango de PRM), la
INVDinstrucción no está permitida y provocará una excepción #GP(0). [ 51 ] - En los procesadores que admiten Intel TDX , si se ha configurado el SEAM (modo de arbitraje seguro),
INVDprovocará #GP(0). - En algunos procesadores Intel más nuevos ( Meteor Lake / Arrow Lake y posteriores), intentar ejecutar
INVDcuando el bit 0 delMSR_BIOS_DONEMSR está activado dará como resultado #GP(0); esto impide efectivamente cualquier uso de esta instrucción fuera de la BIOS . - Bajo la virtualización Intel VT-x , la
INVDinstrucción provocará un #VMEXIT obligatorio.
- En los procesadores que admiten Intel SGX , si la PRM (Memoria Reservada del Procesador) se ha configurado mediante los PRMRR (registros de rango de PRM), la
Instrucciones de sistema/enteras que no estaban presentes en el conjunto de instrucciones básico del 80486, pero que se añadieron en varios procesadores x86 antes de la introducción de SSE. ( No se incluyen las instrucciones descontinuadas ).
- 1 2 3 La documentación temprana de Intel 64 indicaba que para las
RDMSR,WRMSRyRDPMCen modo de 64 bits, las instrucciones podían codificarse con unREX.Wprefijo para que interpretaran el registro RCX como un índice MSR/PMC completo de 64 bits. [ 52 ] Esto se eliminó de la documentación posterior de Intel 64 (SDM rev 023 [ 53 ] y posteriores), que indica que estas instrucciones siempre ignoran los 32 bits superiores de RCX independientemente de cualquier prefijo REX.En todos los procesadores x86-64 conocidos, estas instrucciones aceptarán el prefijo REX pero lo ignorarán, e ignorarán los 32 bits superiores de RCX.
- 1 2 3 En modo de 64 bits, las
RDMSR,RDTSCyRDPMCestablecerán los 32 bits superiores de RDX y RAX a cero. - 1 2 Para algunas combinaciones de CPU/MSR, las
RDMSRyWRMSRpueden utilizar registros distintos de ECX y EDX:EAX. Ejemplos conocidos de esto incluyen el uso de EDI [ 54 ] [ 55 ] y ESI [ 56 ] para una contraseña, y EBX [ 57 ] para una dirección de memoria física. - ↑ Las lecturas MSR realizadas con las
RDMSRyRDMSRLISTpueden, en general, reordenarse con respecto a otras instrucciones, incluidas otras lecturas MSR, con las siguientes restricciones: [ 58 ] [ 59 ]- Los accesos MSR no se pueden reordenar a través de instrucciones de serialización (por ejemplo
CPUID,IRET) o instrucciones de serialización de despacho (por ejemplo,LFENCE). - Las lecturas MSR del
IA32_BARRIERMSR (MSR2Fh, introducido con la extensión del conjunto de instrucciones MSRLIST) no se pueden reordenar a través de otras lecturas MSR. - Los accesos a los registros MSR de x2APIC no se pueden reordenar entre sí.
- Los accesos MSR no se pueden reordenar a través de instrucciones de serialización (por ejemplo
- ↑ En las CPU de Intel, AMD y VIA, la
WRMSRinstrucción también se utiliza para actualizar el microcódigo de la CPU . Esto se hace escribiendo la dirección virtual del nuevo microcódigo para cargarlo en el MSR79hen las CPU de Intel y VIA [ 61 ] y en el MSRC001_0020h[ 62 ] en las CPU de AMD. - ↑ Las escrituras en los siguientes MSR no se están serializando: [ 63 ] [ 64 ]
WRMSREl ICR (Registro de Comando de Interrupción; MSR830h) del x2APIC se usa comúnmente para producir una IPI ( Interrupción entre procesadores ); en las CPU Intel [ 66 ] pero no en las AMD [ 67 ] , dicha IPI se puede reordenar antes de un almacenamiento de memoria anterior. - ↑ El modo de administración del sistema y la
RSMinstrucción estuvieron disponibles en las variantes no SL del Intel 486 solo después del lanzamiento inicial del Intel Pentium en 1993. - ↑ En algunos procesadores de 32 bits más antiguos, la ejecución
CPUIDcon un índice de hoja (EAX) mayor que 0 puede dejar EBX y ECX sin modificar, manteniendo sus valores anteriores. Por esta razón, se recomienda poner a cero EBX y ECX antes de ejecutarCPUID.Los procesadores que se ha observado que presentan este comportamiento incluyen Cyrix MII [ 72 ] e IDT WinChip 2. [ 73 ] En modo de 64 bits,CPUIDestablecerá los 32 bits superiores de RAX, RBX, RCX y RDX a cero. - ↑ En algunos procesadores Intel a partir de Ivy Bridge , existen MSR que se pueden usar para restringir
CPUIDal anillo 0. Dichos MSR están documentados al menos para Ivy Bridge [ 74 ] y Denverton. [ 75 ] La capacidad de restringirCPUIDal anillo 0 también existe en los procesadores AMD que admiten la función "CpuidUserDis" ( Zen 4 "Raphael" y posteriores). [ 76 ] - 1 2
CPUIDtambién está disponible en algunas variantes de procesadores Intel y AMD 486 que se lanzaron después del lanzamiento inicial del Intel Pentium. - ↑ En las CPU Cyrix 5x86 y 6x86,
CPUIDno está habilitado de forma predeterminada y debe habilitarse a través de un registro de configuración de Cyrix. - ↑ En las CPU de nueva generación,
CPUIDsolo es compatible con algunas BIOS del sistema. En algunas CPU de nueva generación que sí lo admitenCPUID, EFLAGS.ID no es compatible, pero EFLAGS.AC sí, lo que complica la detección de la CPU. [ 77 ] - ↑ A diferencia de la instrucción anterior
CMPXCHG, estaCMPXCHG8Binstrucción no modifica ningún bit de EFLAGS que no sea ZF. - ↑
LOCK CMPXCHG8Bcon un operando de registro (que es una codificación no válida) provocará, en algunasCPU Intel Pentium , un bloqueo en lugar de la excepción #UD esperada; esto se conoce como el error Pentium F00F . - 1 2 3 En los procesadores IDT WinChip, Transmeta Crusoe y Rise mP6, la
CMPXCHG8Binstrucción siempre es compatible, sin embargo, su bit CPUID puede faltar. Esta es una solución alternativa para un error en Windows NT. [ 78 ] - 1 2 Las
RDTSCyRDPMCno están ordenadas con respecto a otras instrucciones, y pueden muestrear sus respectivos contadores antes de que se ejecuten las instrucciones anteriores o después de que se hayan ejecutado las instrucciones posteriores. Las invocaciones deRDPMC(pero noRDTSC) pueden reordenarse entre sí incluso para lecturas del mismo contador.Para imponer un orden con respecto a otras instrucciones,se necesitanLFENCEinstrucciones de serialización (por ejemplo , ). [ 79 ]CPUID - ↑ En todos los procesadores x86 que admiten tanto
RDTSCcomo TSC , el TSC está disponible como MSR10h, que se puede leer y escribir utilizando lasinstruccionesRDMSR/WRMSREn las primeras implementaciones (por ejemplo, P5 Pentium , AMD K5 ), así como en todos los procesadores que admiten x86-64 , este MSR se puede leer y escribir como un registro completo de 64 bits; sin embargo, en algunos procesadores que no son x86-64 (por ejemplo, Intel Pentium Pro , VIA C3 , Transmeta Efficieon ), los intentos de escribir un valor deo mayor hará que el valor escrito se combine mediante AND con
0xFFFFFFFF, borrando los 32 bits superiores.En muchos procesadores más recientes (desde Intel Haswell / Silvermont , Zhaoxin ZX-C y AMD Zen 5 ), el
TSC_ADJUSTMSR (MSR3Bh) está disponible (indicado porCPUID.(EAX=7,ECX=0):EBX[1]). En procesadores con este MSR, existe un TSC "verdadero" a nivel de sistema que se comparte o sincroniza entre todos los núcleos de la CPU; leer el TSC conRDTSCo MSR10hdevolverá el valor "verdadero" del TSC más el valor deTSC_ADJUST; los intentos de escribir en MSR10hharán que la CPU calcule la diferencia entre el valor de escritura proporcionado y el TSC "verdadero" y escriba esa diferencia enTSC_ADJUST; la sincronización del TSC entre los núcleos del procesador se puede realizar escribiendo el mismo valor enTSC_ADJUSTen cada procesador lógico. [ 80 ] - ↑ El TSC de tasa fija se introdujo en dos etapas:
- TSC constante
- TSC funciona a una velocidad fija siempre que el núcleo del procesador no esté en modo de suspensión profunda ( C2 o más profundo), pero no está sincronizado entre los núcleos de la CPU. Introducido en Intel Prescott , Yonah y Bonnell . También presente en todas las CPU Transmeta y VIA Nano [ 81 ] , así como en AMD Geode LX . [ 82 ] No tiene un bit CPUID.
- TSC invariante (TSC sin interrupciones)
- TSC funcionando a una velocidad fija e incrementándose de manera sincronizada entre todos los núcleos de la CPU en todos los estados P, C y T (pero no necesariamente en los estados S). Presente en AMD K10 y posteriores; Intel Nehalem / Saltwell [ 83 ] y posteriores; Zhaoxin WuDaoKou [ 84 ] y posteriores. Indicado con un bit CPUID (hoja
8000_0007:EDX[8]).
- ↑
RDTSCse puede ejecutar fuera del Anillo 0 solo siCR4.TSD=0.En Intel Pentium y AMD K5/K6,RDTSCno se puede ejecutar en modo Virtual-8086. [ 86 ] [ 87 ] Los procesadores posteriores (Pentium Pro, Athlon 64) eliminaron esta restricción. - ↑
RDPMCse puede ejecutar fuera del Anillo 0 solo siCR4.PCE=1. - ↑ Esta
RDPMCinstrucción no está presente en los procesadores VIA anteriores al Nano. - ↑ Los códigos de condición admitidos parala instrucción (opcode, donde el nibble x especifica la condición) son:
CMOVcc0F 4x /r - ↑ En modo de 64 bits,
CMOVcccon un operando de 32 bits, se borrarán los 32 bits superiores del registro de destino incluso si la condición es falsa.En el casoCMOVccde un operando de origen de memoria, la CPU siempre leerá el operando de la memoria, lo que podría provocar excepciones de memoria y saturación de la caché, incluso si no se cumple la condición para la operación. (La extensión Intel APX define un conjunto de nuevasvariantes codificadas en EVEXCMOVccque suprimen las excepciones de memoria si la condición es falsa). - ↑ En las variantes VIA C3 anteriores a Nehemías ("Samuel"/"Ezra"),se ha informado que las instrucciones
reg,reg, pero noreg,[mem]las formas, están presentes como instrucciones no documentadas. [ 88 ]CMOVcc - ↑ Las codificaciones de bytes recomendadas por Intel para NOPs multibyte de longitudes de 2 a 9 bytes en modo de 32/64 bits son (en hexadecimal): [ 89 ] En los casos en que sea necesario utilizar más de 9 bytes de relleno NOP, se recomienda utilizar múltiples NOP.
- ↑ A diferencia de otras instrucciones añadidas en Pentium Pro , la instrucción NOP larga no tiene un bit de característica CPUID .
A partir de abril de 2026, el SDM de Intel indica que el NOP largo está disponible en las CPU de las familias 6 y 15 [ 85 ] ; esto se aplica a las CPU de Intel, pero algunas CPU de la familia 6 de proveedores que no son de Intel (por ejemplo, Cyrix 6x86 MX y VIA C3 ) no lo admiten.
El kernel de Linux (versión 2.6.27 y posteriores) trata las instrucciones NOP largas como no disponibles en modo de 32 bits debido a la falta de una forma fiable de detectarlas. [ 90 ]
- ↑
0F 1F /0como long-NOP se introdujo en el Pentium Pro, pero permaneció sin documentar hasta 2006. [ 92 ] Todo el0F 18..1Frango de opcode estabaNOPen el Pentium Pro. Sin embargo, excepto por0F 1F /0, Intel no garantiza que estos opcodes permanezcanNOPen procesadores futuros, y de hecho ha asignado algunos de estos opcodes a otras instrucciones en al menos algunos procesadores. [ 93 ] [ 94 ] - ↑ Documentado para AMD x86-64 desde 2002. [ 95 ]
- ↑ Si bien el
0F 0Bcódigo de operación fue oficialmente reservado como un código de operación inválido desde Pentium en adelante, solo se le asignó el mnemónicoUD2desde Pentium Pro en adelante. [ 97 ] - 1 2 GNU Binutils ha utilizado los
UD2AyUD2Bpara los0F 0By0F B9desde la versión 2.7. [ 98 ] NiUD2AniUD2Boriginalmente tomaban ningún argumento;UD2Bposteriormente se modificó para aceptar un byte ModR/M , en la versión 2.30 de Binutils. [ 99 ] - ↑ La
UD2(0F 0B) impedirá además que los bytes subsiguientes se decodifiquen como instrucciones, incluso de forma especulativa. Por esta razón, si una instrucción de salto indirecto va seguida de algo que no es código, se recomienda colocar unaUD2instrucción después del salto indirecto. [ 100 ] - 1 2 Los códigos de operación UD0/1/2 -
0F 0B,0F B9y0F FF- provocarán una excepción #UD en todos los procesadores x86 desde el 80186 en adelante (excepto los procesadores NEC de la serie V ), pero no se reservaron explícitamente para este propósito hasta los procesadores de clase P5. - ↑ Si bien el
0F B9código de operación fue oficialmente reservado como un código de operación inválido desde Pentium en adelante, solo se le asignó su mnemónicoUD1mucho más tarde: AMD APM comenzó a listarloUD1en sus mapas de códigos de operación a partir de la revisión 3.17, [ 102 ] mientras que Intel SDM comenzó a listarlo a partir de la revisión 061. [ 103 ] - 1 2 Para ambos
0F B9operación0F FF, se sabe que las diferentes implementaciones x86 difieren en cuanto a si los códigos de operación aceptan un byte ModR/M . [ 104 ] [ 105 ] [ 106 ] - ↑ Para el
0F FFcódigo de operación, elOIOmnemónico fue introducido por Cyrix, [ 107 ] mientras que elUD0mnemónico (sin argumentos) fue introducido por AMD e Intel al mismo tiempo que elUD1mnemónico para0F B9. [ 102 ] [ 103 ] Posteriormente, la documentación de Intel (pero no la de AMD) modificó su descripción deUD0para agregar un byte ModR/M y tomar dos argumentos. [ 108 ] - 1 2 3 4 Las
SYSRET,SYSENTERySYSEXITno están disponibles en el modo Real .SYSENTERSin embargo, está disponible en el modo Virtual 8086 .En los procesadores AMD, la
SYSCALLinstrucción está disponible en todos los modos de funcionamiento, incluido el modo real.Si FRED (Flexible Return and Event Delivery) está habilitado, entonces las
SYSRETinstruccionesSYSEXITno estarán disponibles. - ↑ En K6, las
SYSCALL/SYSRETestaban disponibles en el Modelo 7 (250 nm "Little Foot") y posteriores, no en el Modelo 6 anterior. [ 110 ] - ↑
SYSCALLySYSRETse integraron como parte fundamental de x86-64; por lo tanto, las instrucciones están disponibles en modo de 64 bits en todos los procesadores x86-64 de AMD, Intel, VIA y Zhaoxin.Fuera del modo de 64 bits, las instrucciones solo están disponibles en procesadores AMD. - ↑ La semántica exacta
SYSRETdifiere ligeramente entre los procesadores AMD e Intel: las direcciones de retorno no canónicas provocan que se genere una excepción #GP en el Anillo 3 en las CPU AMD, pero en el Anillo 0 en las CPU Intel. Se sabe que esto causa problemas de seguridad. [ 111 ] - 1 2 Para las
SYSRETySYSEXITen x86-64, es necesario agregar elREX.Wprefijo para las variantes que volverán al código de modo de usuario de 64 bits.Las codificaciones de estas instrucciones sin el
REX.Wprefijo se utilizan para volver al código de modo de usuario de 32 bits. (Ninguna de estas instrucciones se puede utilizar para volver al código de modo de usuario de 16 bits; para volver al código de 16 bits, se debe utilizarIRET/IRETD/ ).IRETQPara variantes de las instrucciones
SYSRETySYSEXITcodificadas con elREX.Wprefijo, algunos ensambladores (por ejemplo, FASM [ 112 ] y GNU Binutils ) admiten los mnemónicosSYSRETQySYSEXITQ, sin embargo, estos mnemónicos no se utilizan en la documentación de Intel/AMD. - ↑ Las
CPUIDbanderas que indican soporte paraSYSENTER/SYSEXITestán establecidas en el Pentium Pro, aunque el procesador no admite oficialmente estas instrucciones. [ 113 ] Las pruebas de terceros indican que los códigos de operación están presentes en el Pentium Pro, pero son demasiado defectuosos para ser utilizables. [ 114 ] - ↑ En las CPU de AMD, las
SYSENTERySYSEXITno están disponibles en el modo largo x86-64 (#UD). - ↑ En las CPU Transmeta, las
SYSENTERySYSEXITsolo están disponibles con la versión 4.2 o superior del software Transmeta Code Morphing. [ 116 ] - ↑ En Nehemías,
SYSENTERySYSEXITestán disponibles solo en el paso 8 y posteriores. [ 117 ]
Añadido como extensiones del conjunto de instrucciones
Añadido con x86-64
Estas instrucciones solo se pueden codificar en modo de 64 bits. Se dividen en cuatro grupos:
- Instrucciones originales que reutilizan códigos de operación existentes para un propósito diferente (
MOVSXDreemplazandoARPL) - Instrucciones originales con nuevos códigos de operación (
SWAPGS) - Instrucciones existentes extendidas a un tamaño de dirección de 64 bits (
JRCXZ) - Instrucciones existentes ampliadas a un tamaño de operando de 64 bits (instrucciones restantes)
La mayoría de las instrucciones con un operando de 64 bits codifican esto mediante un REX.Wprefijo; en ausencia de REX.Weste, se codifica la instrucción correspondiente con un operando de 32 bits. Este mecanismo también se aplica a la mayoría de las demás instrucciones con un operando de 32 bits. Estas no se incluyen aquí, ya que no adquieren un nuevo mnemónico en la sintaxis de Intel al usarse con un operando de 64 bits.
- ↑ El operando de memoria
CMPXCHG16Bdebe estar alineado a 16 bytes. - ↑ La
CMPXCHG16Binstrucción no estaba presente en algunos de los primeros procesadores Intel/AMD x86-64. En los procesadores Intel, la instrucción no estaba presente en el Xeon "Nocona" stepping D, [ 118 ] pero se añadió en el stepping E. [ 119 ] En los procesadores de la familia AMD K8 , se añadió en el stepping F, al mismo tiempo que se introdujo la compatibilidad con DDR2. [ 120 ] Por esta razón,CMPXCHG16Btiene su propio indicador CPUID, separado del resto de x86-64. - ↑ Se permitencodificaciones sin el prefijo REX.W, pero se desaconsejan [ 121 ] – dichas codificaciones se comportan de forma idéntica a las de 16/32 bits().
MOVSXDMOV8B /r - ↑ El
UDBcódigo de operación -D6- provocará una excepción #UD (instrucción no válida) en modo de 64 bits en todos los procesadores x86-64 conocidos, pero solo se reservó explícitamente para este propósito y se le asignó elUDBmnemónico en 2025. [ 122 ] ElD6código de operación provocará #UD solo en modo de 64 bits; en los modos de 16 bits y 32 bits (heredado y compatibilidad), en la mayoría de los procesadores x86, se ejecutará como laSALCinstrucción.
Extensiones de manipulación de bits
Instrucciones de manipulación de bits. Para todas las instrucciones codificadas en VEX definidas por BMI1 y BMI2, el tamaño del operando puede ser de 32 o 64 bits, controlado por el bit VEX.W; ninguna de estas instrucciones está disponible en variantes de 16 bits. Las instrucciones codificadas en VEX no están disponibles en modo real ni en modo virtual-8086; por lo demás, las instrucciones de manipulación de bits están disponibles en todos los modos de funcionamiento de las CPU compatibles.
- ↑ En las CPU AMD, la extensión "ABM" proporciona tanto
POPCNTcomoLZCNT. En las CPU Intel, sin embargo, el bit CPUID para "ABM" solo está documentado para indicar la presencia de laLZCNTinstrucción y se lista como "LZCNT", mientras quePOPCNTtiene su propio bit de característica CPUID separado.Sin embargo, todos los procesadores conocidos que implementan las extensiones "ABM"/"LZCNT" también implementanPOPCNTy establecen el bit de característica CPUID para POPCNT, por lo que la distinción es solo teórica.(Lo contrario no es cierto: existen procesadores que admitenPOPCNTpero no ABM, como Intel Nehalem y VIA Nano 3000). - ↑ La
LZCNTinstrucción se ejecutará comoBSRen sistemas que no admiten las extensiones LZCNT o ABM.BSRCalcula el índice del bit más alto activado en el operando fuente, produciendo un resultado diferenteLZCNTpara la mayoría de los valores de entrada. - ↑ La
TZCNTinstrucción se ejecutará comoBSFen sistemas que no admiten la extensión BMI1.BSFproduce el mismo resultado queTZCNTpara todos los valores de operando de entrada excepto cero, para el cualTZCNTdevuelve el tamaño del operando de entrada, peroBSFproduce un comportamiento indefinido (deja el destino sin modificar en la mayoría de las CPU modernas). - ↑ Para
BEXTR, la posición inicial y la longitud no están enmascaradas y pueden tomar valores de 0 a 255. Si los bits seleccionados se extienden más allá del final delr/margumento (que tiene el tamaño de operando habitual de 32/64 bits), entonces los bits fuera de límites se leen como 0. - ↑ En los procesadores AMD anteriores a Zen 3, lasinstrucciones
PEXTy son bastante lentas [ 123 ] y presentan una temporización dependiente de los datos debido al uso de una implementación microcodificada (de aproximadamente 18 a 300 ciclos, dependiendo del número de bits establecidos en el argumento de máscara). Como resultado, a menudo es más rápido utilizar otras secuencias de instrucciones en estos procesadores. [ 124 ] [ 125 ]PDEP
Añadido con Intel TSX
Añadido con Intel CET
Intel CET (Control-Flow Enforcement Technology) añade dos características distintas para ayudar a proteger contra vulnerabilidades de seguridad como la programación orientada a retorno : una pila en la sombra (CET_SS) y el seguimiento indirecto de bifurcaciones (CET_IBT).
- 1 2 Las
RDSSPDinstruccionesRDSSPQactúan como NOP en procesadores donde las pilas de sombra están deshabilitadas o no se admite CET. - 1 2
ENDBR32yENDBR64actúan como NOPs en procesadores que no admiten CET_IBT o donde IBT está deshabilitado. - ↑ Este prefijo tiene la misma codificación que el DS: prefijo de anulación de segmento; a partir de abril de 2022, la documentación de Intel no parece especificar si este prefijo también conserva su antigua función de anulación de segmento cuando se usa como prefijo sin seguimiento, ni proporciona un mnemónico oficial para este prefijo. [ 126 ] [ 127 ] (GNU binutils usa "notrack" [ 128 ] )
Añadido con XSAVE
Las extensiones del conjunto de instrucciones XSAVE están diseñadas para guardar/restaurar el estado extendido de la CPU (normalmente para el cambio de contexto ) de forma que pueda ampliarse para cubrir nuevas extensiones del conjunto de instrucciones sin que el código de cambio de contexto del sistema operativo necesite comprender las especificidades de las nuevas extensiones. Esto se logra definiendo una serie de componentes de estado , cada uno con un tamaño y un desplazamiento dentro de un área de guardado determinada, y cada uno correspondiente a un subconjunto del estado necesario para una extensión de CPU u otra. La hoja EAX=0DhCPUID se utiliza para proporcionar información sobre qué componentes de estado admite la CPU y cuáles son sus tamaños/desplazamientos, de modo que el sistema operativo pueda reservar la cantidad adecuada de espacio y establecer los bits de habilitación asociados.
- ↑ Bajo Intel APX, las
XSAVE*yXRSTOR*no se pueden codificar con el prefijo REX2. - ↑ XSAVE se agregó en las revisiones E0/R0 de Penryn y no está disponible en revisiones anteriores.
- ↑ En algunos procesadores (a partir de Skylake , Goldmont , Zen 1 y Shijidadao v2),
XGETBVse permite ejecutar con ECX=1; esto no devolveráXCR1(no existe tal registro), sino que devolveráXCR0una operación AND bit a bit con el valor actual del mapa de bits del componente de estado "XINUSE" (un mapa de bits de componentes de estado XSAVE que no se sabe que estén en su estado inicial).La presencia de esta funcionalidadXGETBVse indica mediante CPUID .(EAX=0Dh,ECX=1):EAX[bit 2]. - ↑ La
XSETBVinstrucción provocará un #VMEXIT obligatorio si se ejecuta bajo la virtualización Intel VT-x . - 1 2 XSAVEC y XSAVES se agregaron en la revisión v2 de Zhaoxin Shijidadao y no están disponibles en la revisión v1. [ 129 ]
Añadido con otras extensiones de diferentes proveedores.
- 1 2 3 Los procesadores AMD Athlon anteriores al Athlon XP no admitían SSE completo, pero sí introdujeron las instrucciones no SIMD de SSE como parte de las "Extensiones MMX" . [ 130 ] Estas extensiones (sin SSE completo) también están presentes en los procesadores Geode GX2 y Geode posteriores.
- 1 2 3 4 5 6 7 Todas las
PREFETCH*instrucciones son instrucciones de sugerencia que afectan únicamente al rendimiento, no a la semántica del programa. Proporcionar una dirección no válida (por ejemplo, la dirección de una página no asignada o una dirección no canónica) hará que la instrucción actúe como una NOP sin generar ninguna excepción. - 1 2 3 En los procesadores Intel, [ 131 ] así como en los procesadores AMD64, [ 132 ] el procesador ignora el campo r/m del byte ModR/M para las
SFENCE,LFENCEyMFENCE; cualquier valor de x en el rango 0..7 dará como resultado una instrucción válida. (Se desconoce si esto ocurre en otros procesadores que admiten estas instrucciones, por lo que se recomienda codificarlas con x=0). - ↑ La
SFENCEinstrucción asegura que todos los almacenamientos de memoria posteriores a laSFENCEinstrucción se hagan globalmente observables después de todos los almacenamientos de memoria anteriores a laSFENCE. Esto impone un orden en los almacenamientos que de otro modo podrían reordenarse, como los almacenamientos no temporales y los almacenamientos en regiones de memoria WC (Write-Combining). [ 133 ] En las CPU Intel, así como en las CPU AMD desde Zen1 en adelante (pero no en las CPU AMD más antiguas),SFENCEtambién actúa como una barrera de reordenamiento en los vaciados/escrituras de caché realizados con lasCLFLUSH,CLFLUSHOPTyCLWB. (Las CPU AMD más antiguas requierenMFENCEordenarCLFLUSH.)SFENCEno está ordenado con respecto aLFENCE, y unaSFENCE+LFENCEsecuencia no es suficiente para evitar que una carga se reordene más allá de un almacenamiento anterior. [ 134 ] Para evitar tal reordenamiento, es necesario ejecutar unaMFENCE,LOCKo una instrucción de serialización. - ↑ La
LFENCEinstrucción garantiza que todas las cargas de memoria posteriores a laLFENCEinstrucción se hagan globalmente observables después de todas las cargas de memoria anteriores a la instrucciónLFENCE.En todas las CPU Intel que admiten SSE2, laLFENCEinstrucción proporciona una garantía de orden más fuerte: [ 135 ] es serializadora de despacho , lo que significa que las instrucciones posteriores a laLFENCEinstrucción pueden comenzar a ejecutarse solo después de que todas las instrucciones anteriores a ella se hayan retirado (lo que garantizará que todas las cargas precedentes, pero no necesariamente los almacenamientos, se hayan completado). El efecto de la serialización de despacho es queLFENCEtambién actúa como una barrera de especulación y una barrera de reordenamiento para los accesos a recursos que no son de memoria, como contadores de rendimiento (a los que se accede a través de, por ejemploRDTSC, oRDPMC) y MSR x2apic .En las CPU AMD,LFENCEno es necesariamente serializadora de despacho por defecto; sin embargo, en todas las CPU AMD que admiten cualquier forma de serialización que no sea de despachoLFENCE, se puede hacer serializadora de despacho configurando el bit 1 de MSRC001_1029. [ 136 ] - ↑ La
MFENCEinstrucción garantiza que todas las cargas de memoria, almacenamientos y vaciados de línea de caché posteriores a laMFENCEinstrucción se hagan globalmente observables después de todas las cargas de memoria, almacenamientos y vaciados de línea de caché anteriores a laMFENCE.En las CPU Intel, noMFENCEesserializador de despacho y, por lo tanto, no se puede utilizar por sí solo para imponer un orden en los accesos a recursos que no son de memoria, como contadores de rendimiento y MSR x2apic.sigue estando ordenado con respecto a, por lo que si hay necesidad de imponer un orden entre los almacenamientos de memoria y los accesos posteriores que no son de memoria, entonces dicho orden se puede obtener emitiendo unseguido de un. [ 79 ] [ 137 ] En las CPU AMD,es serializador.MFENCELFENCEMFENCELFENCEMFENCE - ↑ El funcionamiento de la
PAUSEinstrucción en modo de 64 bits, a diferencia deNOP, no se ve afectado por la presencia delREX.Rprefijo. NiNOPniPAUSEse ven afectados por los demás bits delREXprefijo. Algunos ejemplos de cómo el código de operación90interactúa con varios prefijos en modo de 64 bits son:90esNOP41 90esXCHG R8D,EAX4E 90esNOP49 90esXCHG R8,RAXF3 90esPAUSEF3 41 90esPAUSEF3 4F 90esPAUSE
- ↑ La duración real de la pausa realizada por la
PAUSEinstrucción depende de la implementación.En sistemas sin SSE2,PAUSEse ejecutará como NOP. - ↑ En entornos de virtualización VT-x o AMD-V, la ejecución
PAUSErepetida en un intervalo de tiempo corto puede provocar un error #VMEXIT. El número dePAUSEejecuciones y la duración del intervalo que pueden desencadenar un error #VMEXIT dependen de la plataforma. - ↑ Si bien la
CLFLUSHinstrucción se introdujo junto con SSE2, tiene su propio indicador CPUID y puede estar presente en procesadores que no implementan SSE2 o estar ausente en procesadores que sí lo implementan. (Por ejemplo, AMD Geode LX admiteCLFLUSH, pero no SSE2). - ↑ Si bien las
MONITORyMWAITse introdujeron al mismo tiempo que SSE3, tienen su propio indicador CPUID que debe verificarse por separado del indicador CPUID de SSE3 (por ejemplo, Athlon 64 X2 y VIA C7 admitían SSE3 pero no MONITOR). - 1 2 Para las
MONITORyMWAIT, la documentación antigua de Intel [ 138 ] enumera los mnemónicos de las instrucciones con operandos explícitos (MONITOR EAX,ECX,EDXyMWAIT EAX,ECX), mientras que la documentación más reciente omite estos operandos. Los ensambladores/desensambladores pueden admitir una o ambas de estas variantes. [ 139 ] - ↑ Para
MONITOR, el segmento DS: puede ser sobrescrito con un prefijo de segmento.El área de memoria que se supervisará no será solo el byte único especificado por DS:rAX, sino una región de memoria lineal que contenga el byte; el tamaño y la alineación de esta región de memoria dependen de la implementación y pueden consultarse a través de CPUID.La ubicación de memoria a supervisar debe tener el tipo de memoria WB (caché de escritura diferida); de lo contrario, la supervisión podría fallar. - ↑ A fecha de abril de 2024, no se han definido extensiones ni sugerencias para la
MONITORinstrucción. Por lo tanto, la instrucción requiere ECX=0 e ignora EDX. - ↑ En algunos procesadores, como Intel Xeon Phi x200 [ 140 ] y AMD K10 [ 141 ] y posteriores, existen MSR documentados que se pueden usar para habilitar
MONITORyMWAITejecutar en Ring 3. - ↑ La espera realizada
MWAITpuede finalizar debido a eventos del sistema distintos a una escritura en memoria (por ejemplo, desalojo de líneas de caché, interrupciones); el conjunto exacto de eventos que pueden provocar la finalización de la espera depende de la implementación.Independientemente de si la espera finalizó debido a una escritura en memoria u otro evento, la monitorización habrá finalizado y será necesario configurarla de nuevoMONITORantes de volverMWAITa esperar a que se produzcan escrituras en memoria. - ↑ Los indicadores de extensión disponibles
MWAITen el registro ECX son: - ↑ Los indicadores de sugerencia disponibles
MWAITen el registro EAX son: Los estados C son estados de energía específicos del procesador, que no necesariamente se corresponden 1:1 con los estados C de ACPI . - ↑ Para la
GETSECinstrucción, elREX.Wprefijo habilita direcciones de 64 bits solo para la función hoja EXITAC; los prefijos REX están permitidos en otros casos, pero se ignoran para la instrucción. - ↑ Las funciones hoja definidas para
GETSEC(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #UD. - ↑ Para
GETSEC, la mayoría de las funciones hoja están restringidas al Anillo 0, pero las funciones hoja CAPABILITIES (EAX=0) y PARAMETERS (EAX=6) están disponibles en el Anillo 3. - 1 2 El valor "core ID" leído por
RDTSCPyRDPIDes en realidad elTSC_AUXMSR (MSRC000_0103h). Si este valor corresponde realmente a un ID de procesador es una cuestión de convención del sistema operativo. - ↑ A diferencia de la instrucciónanteriorretrasará la lectura del TSC hasta que todas las instrucciones anteriores se hayan ejecutado, lo que garantiza el orden con respecto a las cargas de memoria precedentes (pero no a los almacenamientos).Sin embargo, no se ordena con respecto a las instrucciones subsiguientes.
RDTSCRDTSCPRDTSCP - ↑
RDTSCPse puede ejecutar fuera del Anillo 0 solo siCR4.TSD=0. - ↑ La compatibilidad con
RDTSCPse agregó en el paso F del AMD K8 y no está disponible en pasos anteriores. - ↑ Si bien la
POPCNTinstrucción se introdujo al mismo tiempo que SSE4.2, no se considera parte de SSE4.2, sino una extensión independiente con su propio indicador CPUID.En los procesadores AMD, se considera parte de la extensión ABM, pero aún conserva su propio indicador CPUID. - 1 2 Para la
MOVBEinstrucción, las codificaciones que usan tanto el66hprefijo como elREX.Wprefijo causarán #UD en algunos procesadores (por ejemplo, Haswell [ 145 ] ) y por lo tanto deben evitarse. - ↑ Los tipos de invalidación definidos para
INVPCID(seleccionados por el argumento de registro) son: Cualquier valor no admitido en el argumento del registro provoca una excepción #GP. - ↑ A diferencia de la instrucción anterior
INVLPG,INVPCIDprovocará una excepción #GP si la dirección de memoria proporcionada no es canónica. Se sabe que esta discrepancia causa problemas de seguridad. [ 146 ] - ↑ Las
PREFETCHyPREFETCHWson partes obligatorias de la extensión del conjunto de instrucciones 3DNow!, pero también están disponibles como una extensión independiente en sistemas que no admiten 3DNow! - ↑ Los códigos de operación para
PREFETCHyPREFETCHW(0F 0D /r) se ejecutan como NOP en las CPU de Intel desde Cedar Mill ( Pentium 4 de 65 nm ) en adelante,PREFETCHWobteniendo la funcionalidad de prefetch desde Broadwell en adelante. - ↑ La
PREFETCH(0F 0D /0) es una instrucción 3DNow!, presente en todos los procesadores con 3DNow! pero no necesariamente en los procesadores con la extensión PREFETCHW.En las CPU AMD con PREFETCHW, se documenta que los códigos de operación,0F 0D /0así como los códigos de operación,0F 0D /2../7realizan prefetch.En los procesadores Intel con PREFETCHW, se documenta que estos códigos de operación realizan NOP reservados [ 147 ] (excepto0F 0D /2quePREFETCHWT1 m8en Xeon Phi ); las pruebas de terceros [ 148 ] indican que algunos o todos estos códigos de operación pueden realizar prefetch en al menos algunas CPU Intel Core. - 1 2 3 Las extensiones del conjunto de instrucciones SMAP, PKU y RDPID son compatibles con el paso 2 [ 149 ] y posteriores de Zhaoxin LuJiaZui, pero no con pasos anteriores.
- ↑ A diferencia de la instrucción anterior
RDTSCP, que también se puede utilizar para leer la ID del procesador, el modo de usuarioRDPIDno está deshabilitado porCR4.TSD=1. - ↑ Para
MOVDIR64, la dirección de destino proporcionada por ES:reg debe estar alineada a 64 bytes.El tamaño del operando para el argumento de registro viene dado por el tamaño de la dirección, que puede ser sobrescrito por el67hprefijo.El argumento de origen de memoria de 64 bytes no necesita estar alineado a 64 bytes y no se garantiza que se lea de forma atómica. - ↑ La
WBNOINVDinstrucción se ejecutará comoWBINVDsi se ejecutara en un sistema que no admite la extensión WBNOINVD.WBINVDdifiereWBNOINVDen queWBINVDinvalidará todas las líneas de caché después de la escritura diferida. - 1 2 En las implementaciones iniciales, las
PREFETCHIT0yPREFETCHIT1realizarán la precarga de código solo cuando se utilice el modo de direccionamiento relativo a RIP y actuarán como NOP en caso contrario.Las instrucciones PREFETCHI son solo instrucciones de sugerencia: si se intenta precargar una dirección no válida, las instrucciones actuarán como NOP sin generar excepciones. En los procesadores que admiten Long-NOP pero no admiten las instrucciones PREFETCHI, estas instrucciones siempre actuarán como NOP.
Añadido con otras extensiones específicas de Intel.
- 1 2 Los mnemónicos de sugerencia de rama
HWNTseHSTenumeransolo en la documentación temprana de Willamette [ 150 ] - la documentación posterior de Intel enumera los prefijos de sugerencia de rama sin asignarles un mnemónico. [ 151 ]Intel XED utiliza los mnemónicos
hint-takenyhint-not-takenpara estas sugerencias de bifurcación. [ 152 ]GNU Binutils 2.12 y versiones posteriores permiten especificar las sugerencias de bifurcación SSE2 como segundo argumento de las
Jccinstrucciones de ensamblaje: ",pt" para el prefijo predicho tomado y ",pn" para el prefijo predicho no tomado. [ 153 ] - 1 2 Los
2Ey3Ese interpretan como sugerencias de salto solo cuando se usan con lasJccinstrucciones de salto condicional (códigos de operación70..7Fy0F 80..8F); cuando se usan con otros códigos de operación, pueden tomar otros significados (por ejemplo, para instrucciones con operandos de memoria fuera del modo de 64 bits, funcionarán como prefijos de anulación de segmentoCS:yDS:, respectivamente). En procesadores que no admiten sugerencias de salto, estos prefijos se aceptan pero se ignoran cuando se usan conJcc. - ↑ Las sugerencias de ramificación son compatibles con todos los procesadores NetBurst (familia Pentium 4), pero no con ningún otro procesador conocido antes de su reintroducción en las CPU "Redwood Cove", comenzando con "Meteor Lake" en 2023.
- ↑ Las funciones hoja definidas para
ENCLS(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP. - ↑ SGX está obsoleto en procesadores de escritorio/portátiles de la 11.ª generación ( Rocket Lake , Tiger Lake ) en adelante, [ 157 ] pero sigue estando disponible en componentes de servidor de la marca Xeon .
- ↑ La documentación de Intel enumera Ice Lake-SP y Tremont como los procesadores en los que se introdujo la sobreasignación de SGX. [ 159 ] Sin embargo, a febrero de 2026, no se ha observado que ninguna variante de Ice Lake-SP o Tremont tenga los bits de características CPUID de extensión de sobreasignación de SGX activados, mientras que varias los tienen desactivados; los únicos procesadores que se han observado con estos bits de características activados son algunas variantes de Ice Lake-U. [ 160 ]
- ↑ Las funciones hoja definidas para
ENCLU(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. Las funcionesEENTERyERESUMEno se pueden ejecutar dentro de un enclave SGX; las demás funciones solo se pueden ejecutar dentro de un enclave. - ↑
ENCLUsolo se puede ejecutar en el anillo 3, no en los anillos 0/1/2. - ↑ Las funciones hoja definidas para
ENCLV(seleccionadas por EAX) son: Cualquier valor no compatible en EAX provoca una excepción #GP. EstaENCLVinstrucción solo está presente en sistemas que admiten las extensiones de sobreasignación de EPC para SGX ("OVERSUB"). - ↑
ENCLVsolo está disponible si la operación Intel VMX está habilitada conVMXON, y producirá #UD de lo contrario. - ↑ Para
PTWRITE, la escritura en el paquete de rastreo del procesador solo ocurrirá si un conjunto de bits de habilitación (los bits "TriggerEn", "ContextEn", "FilterEn" delRTIT_STATUSMSR y el bit "PTWEn" delRTIT_CTLMSR) están todos establecidos en 1.LaPTWRITEinstrucción está indicada en el SDM para causar una excepción #UD si se utiliza el prefijo de instrucción 66h, independientemente de otros prefijos. - ↑ Las funciones hoja definidas para
PCONFIG(seleccionadas por EAX) son: Cualquier valor no admitido en EAX provoca una excepción #GP(0). - ↑ Para
CLDEMOTE, el nivel de caché al que degradará una línea de caché depende de la implementación.Dado que la instrucción se considera una sugerencia, se ejecutará como NOP sin excepciones si la dirección de memoria proporcionada no es válida o no se encuentra en la caché L1. También puede ejecutarse como NOP en otras circunstancias que dependen de la implementación.En sistemas que no admiten la extensión CLDEMOTE, se ejecuta como NOP. - ↑ La documentación de Intel enumera Tremont y Alder Lake como los procesadores en los que se introdujo CLDEMOTE. [ 159 ] Sin embargo, a mayo de 2022, no se ha observado que ningún modelo Tremont o Alder Lake tenga el bit de característica CPUID para CLDEMOTE activado, mientras que varios de ellos tienen el bit CPUID desactivado. [ 164 ] A abril de 2023, se ha observado que el bit de característica CPUID para CLDEMOTE está activado para Sapphire Rapids. [ 165 ]
- ↑ Para
UMONITOR, el tamaño del operando del argumento de dirección viene dado por el tamaño de la dirección, que puede ser sobrescrito por el67hprefijo. El segmento predeterminado utilizado es DS:, que puede ser sobrescrito con un prefijo de segmento. - 1 2 Para las
UMWAITyTPAUSE, el sistema operativo puede usar elIA32_UMWAIT_CONTROLMSR para limitar el tiempo máximo quese le permite esperar a una sola invocaciónUMWAIT/yse estableceránen 1 si alcanzaron ellímite de tiempo definido y en 0 en caso contrario.TPAUSEUMWAITTPAUSERFLAGS.CFIA32_UMWAIT_CONTROL - ↑
TPAUSEyUMWAITsolo se puede ejecutar fuera del Anillo 0 siCR4.TSD=0. - ↑ Para el argumento de registro de las
UMWAITyTPAUSE, se admiten los siguientes bits de bandera: - ↑ Si bien la serialización se puede realizar con instrucciones más antiguas, como por ejemplo
CPUIDyIRET, estas instrucciones realizan funciones adicionales, lo que provoca efectos secundarios y un rendimiento reducido cuando se necesita la serialización de instrucciones independientes. (CPUIDAdemás, tiene el problema de que provoca un #VMEXIT obligatorio cuando se ejecuta bajo virtualización, lo que genera una sobrecarga muy grande). LaSERIALIZEinstrucción realiza únicamente la serialización, evitando estos costos adicionales. - ↑ CPUID proporcionaun mapa de bits de los componentes del historial de la CPU que se pueden restablecer . (EAX=20h, ECX=0):EBX. A partir de julio de 2023, se definen los siguientes bits:
HRESET - ↑ La
IBHFinstrucción solo es efectiva en el Anillo 0.IBHFSe permite ejecutar la instrucción en los anillos 1/2/3, [ 167 ] pero se ejecutará como unaNOPsin funcionalidad de barrera de historial de bifurcación.En los procesadores que no admiten IBHF, la instrucción se ejecutará
NOPindependientemente del anillo. - ↑ La
IBHFinstrucción se añadió a los procesadores Intel Alder Lake y posteriores mediante una actualización de microcódigo en mayo de 2025. - ↑ El argumento de registro
SENDUIPIes un índice para seleccionar una entrada de la UITT (Tabla de destino de interrupción de usuario, una tabla especificada por los nuevosUINTR_TTMSRUINT_MISC) . - ↑ En los procesadores Sapphire Rapids , la
UIRETinstrucción siempre establece UIF (User Interrupt Flag) en 1. En los procesadores Sierra Forest y posteriores,UIRETestablecerá UIF al valor del bit 1 del valor extraído de la pila para RFLAGS; esta funcionalidad se indica medianteCPUID.(EAX=7,ECX=1):EDX[17]. - ↑ Para
ENQCMDyEMQCMDS, el tamaño del operando del argumento del registro viene dado por el tamaño de la dirección actual, que puede ser anulado con el67hprefijo. - 1 2 Para las
RDMSRLISTyWRMSRLIST, las direcciones especificadas en los registros RSI y RDI deben estar alineadas a 8 bytes. - ↑ Los códigos de condición admitidos para lasinstrucciones (código de operacióncon el nibble x que especifica la condición) son:
CMPccXADDVEX.128.66.0F38 Ex /r - ↑ Aunque las
CMPccXADDinstrucciones realizan una operación de memoria bloqueada, no requieren ni aceptan elLOCK(F0h); intentar usar este prefijo da como resultado #UD.
Añadido con otras extensiones específicas de AMD.
- ↑ La forma estándar de acceder al registro CR8 es mediante una codificación que utiliza el
REX.Rprefijo, por ejemplo44 0F 20 07(MOV RDI,CR8). Sin embargo, esteREX.Rprefijo solo está disponible en modo de 64 bits.La extensión AltMovCr8 añade un método adicional para acceder a CR8, utilizando elprefijoF0(; esto permite acceder a CR8 fuera del modo de 64 bits.LOCKREX.R - 1 2 Al igual que otras variantes de MOV hacia/desde los registros CRx, las codificaciones AltMovCr8 ignoran los 2 bits superiores del byte ModR/M de la instrucción y siempre se ejecutan como si estos dos bits estuvieran establecidos en
11b.Las codificaciones AltMovCr8 están disponibles en modo de 64 bits. Sin embargo, no se permite combinar elLOCKprefijo con elREX.Rprefijo y provocará una excepción #UD. - ↑ La compatibilidad con AltMovCR8 se agregó en la revisión F del AMD K8 y no está disponible en revisiones anteriores.
- ↑ Para
CLZERO, el tamaño de la dirección y el prefijo 67h controlan si se usa AX, EAX o RAX como dirección. El segmento predeterminado DS: puede ser anulado por un prefijo de anulación de segmento. La dirección proporcionada no necesita estar alineada; el hardware la alineará según sea necesario.LaCLZEROinstrucción está destinada a la recuperación de errores de comprobación de máquina que de otro modo serían fatales. No es almacenable en caché, no se puede usar para asignar una línea de caché sin un acceso a memoria y no debe usarse para borrados rápidos de memoria. [ 170 ] - ↑ La numeración de registros utilizada por
RDPRUno necesariamente coincide con la deRDMSR/WRMSR.Los registros compatibles conRDPRUa partir de diciembre de 2022 son: Los valores no admitidos en ECX devuelven 0. - ↑ Si
CR4.TSD=1, entonces laRDPRUinstrucción solo puede ejecutarse en el anillo 0.
Instrucciones de punto flotante x87
El coprocesador x87 , si está presente, proporciona soporte para aritmética de punto flotante. El coprocesador proporciona ocho registros de datos, cada uno de los cuales almacena un valor de punto flotante de 80 bits (1 bit de signo, 15 bits de exponente, 64 bits de mantisa); estos registros están organizados como una pila, donde el registro superior de la pila se denomina "st" o "st(0)", y los demás registros se denominan st(1), st(2), ..., st(7). Además, proporciona varios registros de control y estado, incluyendo "PC" (control de precisión, para controlar si las operaciones de punto flotante deben redondearse a 24, 53 o 64 bits de mantisa) y "RC" (control de redondeo, para seleccionar el modo de redondeo: redondeo a cero, redondeo a infinito positivo, redondeo a infinito negativo, redondeo al par más cercano), y un registro de código de condición de 4 bits "CC", cuyos cuatro bits se denominan individualmente C0, C1, C2 y C3. No todas las instrucciones aritméticas proporcionadas por x87 obedecen a PC y RC.
Instrucciones originales del 8087
- ↑ Los coprocesadores x87 (excepto el 8087) manejan las excepciones de una manera bastante inusual. Cuando una instrucción x87 genera una excepción aritmética no enmascarada, se completará sin causar una falla de la CPU; en lugar de causar una falla, registrará en el coprocesador la información necesaria para manejar la excepción (puntero de instrucción, código de operación, puntero de datos si la instrucción tenía un operando de memoria) y establecerá el indicador de palabra de estado de la FPU para indicar que hay una excepción pendiente. Esta excepción pendiente causará una falla de la CPU cuando
WAITse ejecute la siguiente instrucción x87, MMX o de otro tipo.La excepción a esto son las instrucciones "sin espera" de x87, que se ejecutarán sin causar dicha falla incluso si hay una excepción pendiente (con algunas salvedades, véase la nota de aplicación AP-578 [ 171 ] ). Estas instrucciones son principalmente instrucciones de control que pueden inspeccionar y/o modificar el estado de excepción pendiente de la FPU x87. - ↑ Para cada instrucción x87 sin espera cuyo mnemónico comienza con
FN, existe una pseudo-instrucción que tiene el mismo mnemónico excepto que no incluye la N. Estas pseudo-instrucciones consisten en unaWAITinstrucción (código de operación9B) seguida de la correspondiente instrucción x87 sin espera. Por ejemplo:FNCLEXes una instrucción con el código de operaciónDB E2. La pseudo-instrucción correspondienteFCLEXse codifica entonces como9B DB E2.FNSAVE ES:[BX+6]es una instrucción con el código de operación26 DD 77 06. La pseudo-instrucción correspondienteFSAVE ES:[BX+6]se codifica entonces como9B 26 DD 77 06
- 1 2 La inicialización de la FPU realizada por las
F(N)INITyF(N)SAVEconfigurará los registros de la FPU x87 de la siguiente manera:- El ID de palabra de control de FPU se establece
0x03FFen el 8087, [ 172 ] o0x037Fen las FPU 80287 y posteriores (precisión de 64 bits, redondeo al más cercano, todas las excepciones enmascaradas, interrupciones habilitadas para el 8087). - La palabra de estado de la FPU se establece en ceros (excepto que en las FPU 8087/80287, los bits CC pueden dejarse sin modificar).
- La palabra de etiqueta FPU está configurada en
0xFFFF(marcando todos los registros como vacíos) - En los procesadores i486 y posteriores, los registros del puntero de excepción de la FPU (FCS, FIP, FDS, FDP, FOP) se establecen en 0.
- El ID de palabra de control de FPU se establece
- ↑ En las FPU 80387 y anteriores, si
FNINITse emite una instrucción antes de que se haya completado una instrucción x87 anterior que hace referencia a la memoria, entonces cualquier ciclo del bus de memoria asociado con esa instrucción x87 anterior puede ser abortado. [ 173 ] - 1 2 Para la detección de coprocesadores x87 en sistemas que no admiten
CPUID, es común emitir unFNINITseguido de unFNSTCWoFNSTSWy luego verificar que elFNSTCW/FNSTSWescribió el valor esperado en la memoria. En el 8087, dicho procedimiento de detección requiere al menos dos instrucciones enteras intermedias entre elFNINITy el siguienteFNSTCW/FNSTSWpara funcionar correctamente. [ 172 ] - ↑
F(N)STSWLa opción de usar el registro AX como destino está disponible en los modelos 80287 y posteriores, pero no en el 8087. - 1 2 3 4 En las FPU x87 80387 y posteriores,
FLDENV,F(N)STENV,FRSTORyF(N)SAVEexisten en variantes de 16 bits y 32 bits. Las variantes de 16 bits cargarán/almacenarán una estructura de datos de entorno de punto flotante de 14 bytes en/desde la memoria; las variantes de 32 bits cargarán/almacenarán una estructura de datos de 28 bytes en su lugar. (F(N)SAVE/FRSTORcargará/almacenará adicionalmente 80 bytes adicionales de contenido del registro de datos de la FPU después del entorno de la FPU, para un total de 94 o 108 bytes). La elección entre las variantes de 16 bits y 32 bits se basa en elCS.Dbit y la presencia del66hprefijo de instrucción. En 8087 y 80287, solo están disponibles las variantes de 16 bits.No existen variantes de 64 bits de estas instrucciones; usarREX.Wen x86-64 hará que se utilicen las variantes de 32 bits. Dado que estos solo pueden cargar/almacenar los 32 bits inferiores de FIP y FDP, se recomienda usarFXSAVE64/FXRSTOR64en su lugar si se desea una operación de 64 bits. - 1 2 En el caso de una instrucción x87 que produce una excepción FPU no enmascarada, la FPU 8087 señalará una IRQ algún tiempo indeterminado después de que se haya emitido la instrucción. Esto puede no ser siempre posible de manejar, [ 172 ] y por lo tanto la FPU ofrece las
F(N)DISIyF(N)ENIpara establecer/borrar el bit de máscara de interrupción (bit 7) de la palabra de control x87, [ 174 ] para controlar la interrupción.Las FPU x87 posteriores, desde 80287 en adelante, cambiaron el mecanismo de excepción de la FPU para producir en su lugar una excepción de CPU en la siguiente instrucción x87. Esto hizo innecesario el bit de máscara de interrupción, por lo que se eliminó. [ 175 ] En las FPU x87 Intel posteriores, lasF(N)ENIyF(N)DISIse mantuvieron para compatibilidad con versiones anteriores, ejecutándose como NOP que no modifican ningún estado x87. - 1 2 3
FST/FSTPcon un destino de 80 bits (m80 o st(i)) y un valor de origen sNaN está documentado que produce excepciones en las FPU de AMD pero no en las de Intel. - ↑
FSTP ST(0)es una expresión comúnmente utilizada para extraer un solo registro de la pila de registros x87. - 1 2 3 4 5 6 7 8 9 Código de operación alias de Intel x87. No se recomienda el uso de este código de operación.En el coprocesador Intel 8087, varios códigos de operación reservados realizaban operaciones que se comportaban de manera similar a las instrucciones x87 definidas existentes. Estos códigos de operación se documentaron para el 8087 [ 176 ] y el 80287, [ 177 ] pero luego se omitieron de los manuales posteriores hasta la actualización de octubre de 2017 del Intel SDM. [ 178 ] Están presentes en todas las FPU Intel x87 conocidas, pero no están disponibles en algunas FPU no Intel más antiguas, como AMD Geode GX/LX, DM&P Vortex86 [ 179 ] y NexGen 586PF. [ 180 ]
- 1 2 En los procesadores 8087 y 80287,
FBSTPlas instrucciones de carga constante siempre utilizan el modo de redondeo al más cercano. En los procesadores 80387 y posteriores, las FPU x87 utilizarán el modo de redondeo especificado en el registro RC x87. - 1 2 3 4 5 6 7 8 9 Para las
FADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPyFXCH, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Dichas variantes son equivalentes a variantes que usan st(1) como su primer argumento. - ↑ En los procesadores Intel Pentium y posteriores,
FXCHse implementa como un cambio de nombre de registro en lugar de una verdadera transferencia de datos. Esto no tiene efecto semántico, pero permite una operación con latencia de ciclo cero. También permite que la instrucción rompa las dependencias de datos para el valor superior de la pila x87, lo que mejora el rendimiento alcanzable para el código optimizado para estos procesadores. - 1 2 En los procesadores Intel Pentium sin MMX, la forma más rápida de copiar datos de la memoria del sistema a la memoria no caché (como la memoria de vídeo ) era usar las formas m64 de
FILDyFISTPen un bucle. [ 181 ] Este método se ha utilizado en algunos juegos de MS-DOS como Carmageddon y Pete Sampras Tennis '97 .Un problema recurrente en los emuladores x86 que emulan los registros FPU x87 con un formato de datos con una precisión de mantisa inferior a 64 bits (por ejemplo, números FP64 , que solo tienen 53 bits de mantisa) es que, al mapear dichos bucles
FILD/FISTPa conversiones de int64 a FP64, se pierden algunos bits de datos de orden inferior de cada elemento de datos de 64 bits. En el caso de, por ejemplo, los datos del framebuffer, esta pérdida de datos se manifiesta como franjas verticales cada 8 píxeles. [ 182 ] [ 183 ] - 1 2 Para las
FISTandFISTP, si el valor superior de la pila, después de ser redondeado a entero, es demasiado pequeño o demasiado grande para ser representado en el formato de memoria de destino, entonces el valor almacenado en la memoria no se limitará; en su lugar, se almacenará el valor x87 "Integer Indefinite". Este es un valor que tiene el bit superior establecido en 1 y todos los demás bits establecidos en 0. (por ejemplo,0x8000para enteros de 16 bits). El valor Integer Indefinite también se utilizará si el valor superior de la pila es Empty, NaN o ±∞. - ↑ El resultado de ejecutar la
FBLDinstrucción en datos que no son BCD no está definido. - ↑ Para la
FBSTPinstrucción, si el valor superior de la pila es NaN o tiene un valor queo mayor después del redondeo, se almacenará el valor "BCD Indefinido" de x87. En 486 y posteriores, esto es0xFFFFC000000000000000, mientras que las FPU x87 anteriores usaban0xFFFF8000000000000000. [ 184 ] - 1 2 En los primeros procesadores Intel Pentium , la división de punto flotante estaba sujeta al error Pentium FDIV
FPREM. Esto también afectó a las instrucciones que realizan la división como parte de sus operaciones ,comoFPTANyFPATAN. [ 185 ] - ↑ La
FXAMinstrucción establecerá C0, C2 y C3 en función del tipo de valor en st(0) de la siguiente manera: C1 se establece al bit de signo de st(0), independientemente de si st(0) está vacío o no. - ↑ Para
FXTRACT, el comportamiento que resulta de que st(0) sea cero o ±∞, difiere entre 8087 y 80387:- Si st(0) es ±0, entonces en 8087/80287, E y M se establecen igual a st(0) sin que se informe ninguna excepción; en 80387 y posteriores, M se establece igual a st(0), E se establece en -∞ y se genera una excepción de división por cero.
- Si st(0) es ±∞, entonces en 8087/80287, se genera una excepción de operación no válida y tanto M como E se establecen en NaN; en 80387 y posteriores, M se establece igual a st(0) y E se establece en +∞ sin que se informe ninguna excepción. [ 173 ]
- ↑ Para
FPREM, si el cociente Q es mayor queEntonces, es posible que el cálculo del resto se haya realizado solo parcialmente; en este caso, laFPREMinstrucción deberá ejecutarse nuevamente para completar el cálculo del resto. Esto se indica mediante la instrucción configuradaC2en 1. Si la instrucción completó el cálculo del resto, se estableceráC2en 0 y establecerá los tres bits{C0,C3,C1}a los tres bits inferiores del cociente Q. En el 80387 y posteriores, si la instrucción no completó el cálculo del resto, entonces el resto calculado Q utilizado para la reducción de argumentos se habrá redondeado a un múltiplo de 8 (o una potencia de 2 mayor), de modo que los 3 bits inferiores del cociente aún se puedan recuperar correctamente en una pasada posterior que sí complete el cálculo del resto. - ↑ El cálculo del resto realizado por la
FPREMinstrucción es siempre exacto y sin errores de redondeo. - ↑ Para la
FSCALEinstrucción en 8087 y 80287, se requiere que st(1) esté en el rangoAdemás, su valor absoluto debe ser 0 o al menos 1. Si no se cumplen estos requisitos, el resultado es indefinido. Estas restricciones se eliminaron en la norma 80387. - ↑ Para
FSCALE, el redondeo solo se aplica en caso de desbordamiento, subdesbordamiento o resultado subnormal. - ↑ Las instrucciones trascendentales x87 no obedecen a PC ni RC, sino que calculan resultados completos de 80 bits. Estos resultados no necesariamente están correctamente redondeados (véase el dilema del creador de tablas ); pueden tener un error de hasta ±1 ulp en Pentium o posterior, o de hasta ±1,5 ulps en coprocesadores x87 anteriores.
- 1 2 Para las
FYL2XyFYL2XP1, el límite de error máximo de ±1 ulp solo se cumple para st(1)=1.0; para otros valores de st(1), el límite de error aumenta a ±1.35 ulps.FYL2Xpuede producir una #Z (excepción de división por cero) si st(0)=0 y st(1) es un valor finito distinto de cero.FYL2XP1, sin embargo, no puede producir #Z. - ↑ Para
FPATAN, se realizan los siguientes ajustes en comparación con el simple cálculo de una arcotangente de un argumento de la razón:- Si tanto st(0) como st(1) son ±∞, entonces la arcotangente se calcula como si cada uno de st(0) y st(1) se hubiera reemplazado por ±1 del mismo signo. Esto produce un resultado que es un múltiplo impar de.
- Si tanto st(0) como st(1) son ±0, entonces la arcotangente se calcula como si st(0) pero no st(1) se hubiera reemplazado por ±1 del mismo signo, produciendo un resultado de ±0 o.
- Si st(0) es negativo (tiene el bit de signo activado), entonces un sumando decon el mismo signo que st(1) se agrega al resultado.
- ↑ Si bien
FNOPno realiza ninguna operación en el sentido de que dejará la pila de registros de la FPU x87 sin modificar, aún puede modificar FIP y CC, y puede fallar si hay una excepción pendiente de la FPU x87. - ↑On the 8087 FPU (but not any later x87 FPU), the
WAITinstruction was needed before every x87 instruction (except the "non-waiting" instructions) to help ensure that a new x87 instruction was not issued to the FPU before the preceding instruction had completed.On some early x87 coprocessors — in particular the 8087 FPU, as well as the 80287 FPU when used in a 80286 system — the
WAITinstruction was also required to be used before a CPU instruction that attempts to access a memory location that's previously been used as an operand to an x87 data instruction.[177]On 386 and 486 systems with x87 FPUs, this requirement was removed for most x87 instructions that accessed memory, but continued to exist for the
F(N)SAVEinstruction.[186] On Pentium and later processors, this requirement was removed forF(N)SAVEas well. - ↑If the top-of-stack register st(0) is Empty, then the
FSTPNCEinstruction will behave likeFINCSTP, incrementing the stack pointer with no data movement and no exceptions reported.
x87 instructions added in later processors
- ↑ La FPU x87 necesita saber si está operando en modo real o en modo protegido porque el entorno de punto flotante al que acceden las
F(N)SAVE,FRSTOR,FLDENVyF(N)STENVtiene formatos diferentes en modo real y modo protegido. En el 80287, laF(N)SETPMinstrucción es necesaria para comunicar la transición de modo real a protegido a la FPU. En las FPU x87 80387 y posteriores, las transiciones de modo real a protegido se manejan automáticamente entre la CPU y la FPU sin necesidad de instrucciones dedicadas; por lo tanto, en estas FPU,FNSETPMse ejecuta como una NOP que no modifica ningún estado de la FPU.En el 80287, una vez que la FPU se ha puesto en funcionamiento en modo protegido con la
F(N)SETPMinstrucción, no se puede volver a poner en funcionamiento en modo real sin reiniciar la FPU; en los PC compatibles con IBM con FPU 80287/80387 (pero no en los 80486 y posteriores), dicho reinicio de la FPU se podía realizar escribiendo un byte con el valor 0 en el puerto de E/SF1h. [ 187 ] - ↑ No incluye instrucciones descontinuadas específicas para modelos particulares de FPU compatibles con 80387.
- 1 2 Para las
FUCOMyFUCOMP, los ensambladores/desensambladores x86 pueden reconocer variantes de las instrucciones sin argumentos. Dichas variantes son equivalentes a las variantes que usan st(1) como su primer argumento. - ↑ La instrucción 80387
FPREM1difiere de la instrucción anteriorFPREM(D9 F8) en que el cociente Q se redondea a entero con redondeo al par más cercano en lugar del redondeo a cero utilizado porFPREM. Al igual queFPREM,FPREM1siempre calcula un resultado exacto sin errores de redondeo. Al igual queFPREM, también puede realizar un cálculo parcial si el cociente es demasiado grande, en cuyo caso debe ejecutarse de nuevo. - 1 2 3 Debido a que la FPU x87 realiza la reducción de argumentos para seno/coseno con solo unos 68 bits de precisión, el valor de k utilizado en el cálculo de
FSIN,FCOSyFSINCOSno es precisamente 1.0, sino que viene dado por [ 188 ] [ 189 ] [ 173 ]Esta imprecisión en la reducción de argumentos también afecta a laFPTANinstrucción.Algunos ejemplos de números que producen grandes diferencias relativas entre la
FSINinstrucción y la función seno matemática son:- Para
FSINproducirá un resultado de aproximadamentemientras que el verdadero valor dees aproximadamente. - Para
FSINproducirá un resultado de aproximadamentemientras que el verdadero valor dees aproximadamente.
- Para
- ↑ Si st(0) es finito y su valor absoluto eso mayor, entonces el valor superior de la pila st(0) se deja sin modificar y se establece C2, sin generar ninguna excepción. Esto se aplica a las
FSINinstruccionesFCOSyFSINCOS, así comoFPTANen 80387 y posteriores. En este caso, las instruccionesFSINCOSyFPTANtambién se abstendrán de insertar un valor en la pila de registros x87. - ↑ Las
FCOMI,FCOMIP,FUCOMIyFUCOMIPescriben sus resultados en losZF,CFyPFdelEFLAGSregistro. En los procesadores Intel, pero no en los AMD, losbitsSF,AFytambién se ponen a cero mediante estas instrucciones.OFEFLAGS - ↑ Las
FXSAVEyFXRSTORse añadieron en la revisión "Deschutes" del Pentium II, y no están presentes en la revisión anterior "Klamath".También están presentes en el AMD K7.Se consideran una parte integral de SSE y, por lo tanto, están presentes en todos los procesadores con SSE. - 1 2 Las
FXSAVEyFXRSTORguardarán/restaurarán el estado SSE solo en procesadores que admitan SSE. De lo contrario, solo guardarán/restaurarán el estado x87 y MMX.La sección x87 del estado guardado/restaurado porFXSAVE(64)/FXRSTOR(64)tiene una disposición completamente diferente a la estructura de datos de lasF(N)SAVE/FRSTOR, lo que permite un guardado/restauración más rápido al evitar cargas y almacenamientos desalineados.FXSAVEyFXRSTORrequieren que su argumento de memoria esté alineado a 16 bytes. - 1 2 Cuando la emulación de punto flotante está habilitada con
CR0.EM=1,FXSAVE(64)yFXRSTOR(64)se consideran instrucciones x87 y, por lo tanto, producirán una excepción #NM (dispositivo no disponible). Aparte de, estos son los únicos códigos de operación fuera delespacio de códigos de operación ESC que exhiben este comportamiento.Excepto en las CPU Netburst (familia Pentium 4), todos los códigos de operación enproducirán #NM si, incluso para códigos de operación no definidos que producirían #UD de otro modo.WAITD8..DFD8..DFCR0.EM=1 - ↑ A diferencia de la instrucciónanteriorno inicializará la FPU después de guardar su estado en la memoria, sino que dejará el estado del coprocesador x87 sin modificar.
F(N)SAVEFXSAVE - 1 2 La
FXSAVE64/FXRSTOR64difiere de lasFXSAVE/FXRSTORen que:FXSAVE/FXRSTORguardará/restaurará FIP y FDP como elementos de 32 bits, y también guardará/restaurará FCS y FDS como elementos de 16 bits.FXSAVE64/FXRSTOR64guardará/restaurará FIP y FDP como elementos de 64 bits, pero no guardará/restaurará FCS y FDS.
XSAVE/XRSTORvsXSAVE64/ . Como resultado, guardar tanto FCS/FDS como los 32 bits superiores de FIP/FDP de 64 bits no se puede lograr con una sola instrucción, sino que requiere ejecutar ambas y . Se sabe que esto causa problemas, especialmente para hipervisores de 64 bits que ejecutan invitados de 16/32 bits. [ 190 ] [ 191 ]XRSTOR64(F)XSAVE(F)XSAVE64 - ↑ La
FISTTPinstrucción, al igual que las instrucciones anterioresFIST,FISTPalmacenará el valor "Integer Indefinite" de x87 si el valor superior de la pila es demasiado pequeño/grande para ser representado en el formato de destino de la memoria.
Instrucciones SIMD
Instrucciones criptográficas
Instrucciones de virtualización
Otras instrucciones
La arquitectura x86 también incluye conjuntos de instrucciones descontinuados que ya no cuentan con el soporte de Intel y AMD, así como instrucciones no documentadas que se ejecutan pero que no están documentadas oficialmente.
Instrucciones x86 no documentadas
Las CPU x86 contienen instrucciones no documentadas que están implementadas en los chips pero que no aparecen en algunos documentos oficiales. Se pueden encontrar en diversas fuentes de Internet, como la Lista de Interrupciones de Ralf Brown y en sandpile.org.
Algunas de estas instrucciones están ampliamente disponibles en la mayoría de las CPU x86, mientras que otras son específicas de una gama reducida de CPU.
Las instrucciones no documentadas que están ampliamente disponibles en muchas CPU x86 incluyen:
Las instrucciones no documentadas que aparecen solo en un subconjunto limitado de CPU x86 incluyen:
Instrucciones x87 no documentadas
Véase también
Referencias
- ↑ "Re: Identificación del procesador Intel y la instrucción CPUID" . Consultado el 21 de abril de 2013 .
- ↑ "Resumen del conjunto de instrucciones Intel 80x86" (PDF) . eecs.wsu.edu . Archivado (PDF) del original el 5 de julio de 2024. Consultado el 29 de junio de 2024 .
- ↑ "Referencia rápida de Intel x85 JUMP" . Archivado del original el 7 de abril de 2025. Consultado el 1 de abril de 2025 ..
- ↑ Vintage Computer Federation, hilo de discusión sobre "desensamblaje de microcódigo 8088/8086" , comentario n.° 27 del 3 de octubre de 2020. Archivado el 24 de octubre de 2022.
- 1 2 Intel, iAPX86/88, 186/188 Manual del usuario Archivado el 27/10/2025 en Wayback Machine , número de pedido 210911-001, marzo de 1983, página 69
- 1 2 Intel, Manual de referencia del programador de los microcontroladores 80286 y 80287. Archivado el 17 de octubre de 2025 en Wayback Machine , número de pedido 210498-005, 1987, páginas 107 y 248.
- ↑ IBM, PC/AT Technical Reference Archivado el 14/11/2025 en Wayback Machine , documento número 6183355, marzo de 1986 — menciona IIMUL en la página 438
- ↑ AMD, Manual del programador de la arquitectura x86-64 Volumen 3 Archivado el 18/01/2023 en Wayback Machine , pub.no. 24594, rev 3.02, agosto de 2002, ver
ENTERentrada de instrucciones en la página 138. - ↑ Michal Necasek, SGDT/SIDT Ficción y Realidad , 4 de mayo de 2017. Archivado el 29 de noviembre de 2023.
- ↑ Michal Necasek, Nadie lo espera... , Museo OS/2 , 14 de abril de 2021 — menciones
SGDTutilizadas para la detección de CPU. Archivado el 14 de abril de 2021. - ↑ Foro de discusión de Vogons, re:test386.asm Probador de CPU , ver comentario de "TheGreatCodeholio" el 20 de agosto de 2018: menciona
SGDTsu uso para la detección de CPU. Archivado el 20 de abril de 2026. - ↑ Intel, Manual de referencia del programador 80286 y 80287 , número de pedido 210498-005, 1987, sección 10.4.2 en la página 185.
- ↑ rep_lodsb, "on:80386 Memory Pipeline , sección de comentarios de Hacker News , 19 de abril de 2026. Archivado el 20 de abril de 2026.
- 1 2 Intel, Instrucción de prueba iAPX 286 no documentada . Archivado el 20 de diciembre de 2023.
- ↑ WikiChip, UMIP – x86 . Archivado el 16 de marzo de 2023.
- ↑ 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.
- ↑ Proyecto MBC, Detección de máquinas virtuales (enlace permanente) Archivado el 30/08/2023 en Wayback Machine o Detección de máquinas virtuales (enlace no permanente) Archivado el 30/08/2023 en Wayback Machine
- ↑ Andrew Schulman, "Windows 95 no autorizado" ( ISBN) 1-56884-169-8), capítulo 8, págs. 249, 257.
- ↑ Patente estadounidense 4974159 archivada el 24/04/2022 en Wayback Machine , "Método de transferencia de control en un sistema informático multitarea" menciona 63h/ARPL.
- ↑ Intel, Manual del desarrollador de la familia de procesadores Pentium®, Volumen 3 Archivado el 22/04/2023 en Wayback Machine , 1995, número de pedido 241430-004, sección 12.7, pág. 323
- ↑ Intel, Cómo funciona el muestreo de datos microarquitectónicos , véase la sección de medidas de mitigación. Archivado el 2 de diciembre de 2025.
- ↑ Documentación del kernel de Linux, mitigación del muestreo de datos microarquitectónicos (MDS) Archivado el 21/10/2020 en Wayback Machine
- ↑ AMD, Guía técnica para mitigar ataques transitorios al planificador , rev. 2.0, julio de 2025, página 3. Archivado el 14 de agosto de 2025.
- ↑ Intel, Vulnerabilidades de datos obsoletos en MMIO del procesador , 14 de junio de 2022 - ver la sección "Detalles de sobrescritura del búfer VERW". Archivado el 3 de octubre de 2024.
- ↑ Foros de VCF, encontré el código de operación SAVEALL , 21 de junio de 2019. Archivado el 13 de abril de 2023.
- ↑ rep lodsb, Secretos de Intel 286: Modo ICE y F1 0F 04 , 12 de agosto de 2022. Archivado el 8 de diciembre de 2023.
- ↑ LKML, (PARCHE) x86-64, espfix: No se filtran los bits 31:16 de %esp que regresan a la pila de 16 bits , 29 de abril de 2014. Archivado el 4 de enero de 2018.
- ↑ Raymond Chen, Cómo ejecutar juegos de MS-DOS en Windows 95: Solución al problema de iretd , 4 de abril de 2016. Archivado el 15 de marzo de 2019.
- ↑ AMD, AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions , pub.no. 24594, rev 3.37, jul 2025, páginas 123-124. Archivado el 11 ago 2025.
- ↑ David Howells, (tip:x86/asm) x86_64, asm: Optimizar fls(), ffs() y fls64() , 15 de diciembre de 2011, Lista de correo del kernel de Linux . Archivado el 15 de marzo de 2026.
- ↑ Manual del desarrollador de software para arquitecturas Intel, Intel 64 e IA-32, volumen 2 (2A, 2B, 2C y 2D): Referencia del conjunto de instrucciones, AZ , número de pedido 325383-090, febrero de 2026, páginas 225 y 227. Archivado el 15 de febrero de 2026.
- ↑ Robert L. Hummel, PC Magazine Programmer's Technical Reference , 1992, ISBN 1-56276-016-5, página 362.
- ↑ sandpile.org, registro rFLAGS de la arquitectura x86 , ver nota n.º 7. Archivado el 3 de noviembre de 2011.
- ↑ Intel, Manual de referencia del programador del microprocesador 386DX , número de pedido 230985-003, 1990, secciones 10.3.3 y 10.4.2 en las páginas 234-236
- ↑ iPXE, Commit bc35b24: Corrige el uso del segmento de código escribible en las CPU 486 y anteriores , Github , 2 de febrero de 2022 − indica que al salir del modo protegido en 386/486 escribiendo en
CR0, es específicamente necesario hacer un farJMP(código de operaciónEA) para restaurar los derechos de acceso adecuados en modo real para el segmento CS, y que otras transferencias de control lejanas (por ejemploRETF,IRET) no harán esto. Archivado el 4 de noviembre de 2024. - ↑ Michal Necasek, Cambios semánticos entre SCO UNIX 3.2v4.0 e IA-32 , 25 de enero de 2013. Museo OS/2 . Archivado el 21 de febrero de 2026.
- ↑ Can Bölük, Especulando sobre todo el conjunto de instrucciones x86-64 en segundos con este extraño truco , 22 de marzo de 2021. Archivado el 23 de marzo de 2021.
- 1 2 Robert Collins, Códigos de operación no documentados , 29 de julio de 1995. Archivado el 21 de febrero de 2001.
- ↑ Michal Necasek, ICEBP finalmente documentado , Museo OS/2 , 25 de mayo de 2018. Archivado el 6 de junio de 2018.
- ↑ Intel, AP-526: Optimización para procesadores Intel de 32 bits , número de pedido 242816-001, octubre de 1995 – se menciona
SALCen las páginas 83,INT186 yFFREEP114. Archivado del original el 22 de diciembre de 1996. - ↑ AMD, Tecnología AMD de 64 bits, vol. 2: Programación del sistema . Archivado el 25/07/2023 en Wayback Machine , número de pedido 24593, revisión 3.06, agosto de 2002, página 248.
- ↑ "Información sobre la CPU Intel 80386 | PCjs Machines" . www.pcjs.org . Archivado del original el 13/11/2023 . Consultado el 07/01/2022 .
- ↑ Geoff Chappell, Identificación de CPU antes de CPUID , 27 de enero de 2020. Archivado el 7 de abril de 2023.
- ↑ Jeff Parsons, Instrucciones obsoletas para el 80386: IBTS y XBTS , PCjs Machines . Archivado el 19 de septiembre de 2020.
- ↑ Robert Collins, La instrucción LOADALL . Archivado del original el 5 de junio de 1997.
- ↑ Toth, Ervin (16 de marzo de 1998). "BSWAP con registros de 16 bits" . Archivado del original el 3 de noviembre de 1999.
La instrucción baja la palabra superior del registro de doble palabra sin afectar sus 16 bits superiores.
- ↑ Coldwin, Gynvael (2009-12-29). "BSWAP + prefijo 66h" . Archivado del original el 2018-10-03 . Recuperado el 2018-10-03 .
Extensión interna (a cero) del valor de un registro más pequeño (16 bits)... aplicando el bswap a un valor de 32 bits "00 00 AH AL",... truncado a los 16 bits inferiores, que son "00 00". ... Bochs... bswap reg16 actúa igual que bswap reg32... QEMU... ignora el prefijo 66h
- ↑ Intel "Microprocesador i486" Archivado el 2 de diciembre de 2021 en Wayback Machine (abril de 1989, número de pedido 240440-001) pág. 142, listas
CMPXCHGcon0F A6/A7codificaciones. - ↑ El manual "i486 Microprocessor" de Intel(noviembre de 1989, número de pedido 240440-002), pág. 135, incluye listasconcodificaciones.
CMPXCHG0F B0/B1 - ↑ "Intel 486 y 486 POD CPUID, S-spec y Steppings" . Archivado del original el 9 de abril de 2022. Consultado el 8 de enero de 2022 .
- ↑ Intel, Software Guard Extensions Programming Reference Archivado el 7 de abril de 2023 en Wayback Machine , pedido n.º 329298-002, octubre de 2014, secciones 3.5 y 3.6.5.
- ↑ Intel, Guía del desarrollador de software de la tecnología Extended Memory 64, Volumen 2 , revisión 1.1, número de pedido 300835-002, 2004, páginas 207, 208, 300. Archivado del original el 31 de mayo de 2005.
- ↑ Manual del desarrollador de software para arquitecturas Intel,, número de pedido 253667-023, mayo de 2007, páginas 246, 248 y 410. Archivado el 30 de enero de 2014.
- ↑ AMD, Live Migration with AMD-V Extended Migration Technology, pub. n.º 43781, rev. 3.00, abril de 2008. Menciona la contraseña en EDI en la página 15. Archivado del original el 20 de enero de 2013.
- ↑ CBID, Registros específicos de máquina no documentados , 16 de abril de 2006. Archivado del original el 29 de noviembre de 2012.
- ↑ Christopher Domas, La fachada del anillo 0: despertando a los demonios internos del procesador , agosto de 2018, páginas 44 y 57. Archivado el 14 de septiembre de 2024.
- ↑ Czerno, Acceso directo a la memoria física en procesadores AMD K7 , 4 de enero de 2011. Archivado del original el 3 de enero de 2014.
- ↑ Manual del desarrollador de software para arquitecturas Intel,, número de pedido 325462-090, febrero de 2026. Consulte la entrada sobrelas instrucciones (vol. 2B, página 1831) para las reglas de ordenación de lectura de MSR, la sección 13.12.3 del vol. 3, página 3592, para las reglas de ordenación de acceso de MSR de x2APIC y la tabla 2.2 del vol. 4, página 4708, paralas reglas. Archivado el 12 de febrero de 2026.
RDMSRLISTIA32_BARRIER - ↑ AMD, Manual del programador de la arquitectura AMD64, volúmenes 1 a 5 , n.º de publicación 40332, rev. 4.08, abril de 2024. Consulte el volumen 2, sección 16.11.2, página 1112, para obtener las reglas de ordenación de acceso de x2APIC MSR. Archivado el 6 de marzo de 2026.
- ↑ Frank van Gilluwe, "The Undocumented PC, segunda edición", 1997, ISBN 0-201-47950-8, página 55
- ↑ Daming Chen y Gail-Joon Ahn, Análisis de seguridad del microcódigo del procesador x86 , 11 de diciembre de 2014, página 8. Archivado el 8 de marzo de 2016.
- ↑ AMD, Guía de revisión para procesadores AMD Athlon 64 y AMD Opteron , pub. n.º 25759, rev. 3.79, julio de 2009, página 34. Archivado el 20 de diciembre de 2023.
- ↑ Intel, Manual del desarrollador de software, vol. 3A Archivado el 4 de marzo de 2023 en Wayback Machine , número de pedido 253668-078, diciembre de 2022, sección 9.3, página 299.
- ↑ Intel, Enumeración de CPUID y MSR arquitectónicos , 8 de agosto de 2023. Archivado el 23 de mayo de 2024.
- ↑ AMD, PPR para procesadores AMD Family 19h Modelo 61h, Revisión B1 , documento n.° 56713, rev. 3.05, 8 de marzo de 2023, página 116. Archivado el 25 de abril de 2023.
- ↑ LKML, (PARCHE 5.4 55/65) x86/apic: Agregar serialización adicional para MSR que no se serializan. Archivado el 7 de septiembre de 2025 en Wayback Machine , 8 de febrero de 2021.
- ↑ Núcleo de Linux, confirmación de Git: x86/barrier: No serializar los accesos MSR en AMD. Archivado el 23 de enero de 2025 en Wayback Machine , 13 de noviembre de 2023.
- ↑ "RSM: Reanudar desde el modo de administración del sistema" . Archivado del original el 12 de marzo de 2012.
- ↑ Informe sobre microprocesadores, Explicación del modo de gestión del sistema (vol. 6, n.º 8, 17 de junio de 1992). Archivado el 29 de junio de 2022.
- ↑ Ellis, Simson C., "El microprocesador 386 SL en ordenadores portátiles", Intel Corporation, Microcomputer Solutions, marzo/abril de 1991, página 20
- ↑ Hoja de datos de Cyrix 486SLC/e (1992) Archivada el 2 de marzo de 2022 en Wayback Machine , sección 2.6.4
- ↑ Fuentes del kernel de Linux 6.3, /arch/x86/include/asm/cpuid.h Archivado el 27/04/2023 en Wayback Machine , línea 69
- ↑ Lista de correo gcc-patches, Parche CPUID para IDT Winchip , 21 de mayo de 2019. Archivado el 27 de abril de 2023.
- ↑ Intel, Nota de aplicación de Intel® Virtualization Technology FlexMigration , número de pedido 323850-004, octubre de 2012, sección 2.3.2, página 12. Archivado el 13 de octubre de 2014.
- ↑ Intel, Hoja de datos de la familia de productos procesadores Atom C3000 , número de pedido 337018-002, febrero de 2018, páginas 133, 3808 y 3814. Archivada el 9 de febrero de 2022.
- ↑ AMD, AMD64 Architecture Programmer's Manual Volumen 3 Archivado el 27/04/2023 en Wayback Machine pub.no. 24594, rev 3.34, oct 2022, pág. 165 (entrada sobre
CPUIDinstrucciones) - ↑ Robert Collins, CPUID Algorithm Wars , noviembre de 1996. Archivado del original el 18 de diciembre de 2000.
- ↑ Geoff Chappell, Soporte para CMPXCHG8B en el kernel de Windows de 32 bits , 23 de enero de 2008. Archivado el 5 de noviembre de 2023.
- 1 2 Intel, Manual del desarrollador de software Archivado el 29/12/2022 en Wayback Machine , pedido n.º 325426-077, noviembre de 2022: la entrada sobre la
RDTSCinstrucción en la página 1739 describe las secuencias de instrucciones necesarias para ordenar laRDTSCinstrucción con respecto a las instrucciones anteriores y posteriores. - ↑ Manual del desarrollador de software para arquitecturas Intel,, número de pedido 253669-090, febrero de 2026, sección 20.17.3, página 190. Archivado el 17 de febrero de 2026.
- ↑ Núcleo de Linux 5.4.12, /arch/x86/kernel/cpu/centaur.c Archivado el 24/01/2023 en Wayback Machine
- ↑ (PARCHE) Marcar TSC en GeodeLX como confiable. Archivado el 11 de octubre de 2025 en Wayback Machine , parche del kernel de Linux, 16 de febrero de 2007.
- ↑ Stack Overflow, ¿Puede la frecuencia de tsc constante no invariante cambiar entre estados de la CPU? Consultado el 24 de enero de 2023. Archivado el 24 de enero de 2023.
- ↑ CPU-World, CPUID para Zhaoxin KaiXian KX-5000 KX-5650 (por timw4mail) , 24 de abril de 2024. Archivado el 26 de abril de 2024.
- 1 2 Manual del desarrollador de software para arquitecturas Intel,, número de pedido 325462-091, marzo de 2026, véase la entrada de instrucciones NOP en la página 1449 y el volumen 3B, sección 20.17 "Contador de marca de tiempo" en la página 2853. Archivado el 21 de abril de 2026.
- ↑ Michal Necasek, "RDTSC no documentado" , 27 de abril de 2018. Archivado el 16 de diciembre de 2023.
- ↑ "GPF de RDTSC en modo V86 en AMD K6" . Grupo de noticias : comp.os.ms-windows.programmer.vxd . 2 de noviembre de 1999. Archivado del original el 15 de septiembre de 2025. Recuperado el 15 de septiembre de 2025 .
- ↑ Willy Tarreau, Re: peculiaridad de i686 para AMD Geode Archivado el 11-10-2025 en Wayback Machine , Lista de correo del kernel de Linux , 10 de noviembre de 2009.
- ↑ Manual de referencia de optimización de arquitecturas Intel, Intel 64 e IA-32: Volumen 1 , número de pedido 248966-050US, abril de 2024, sección 3.5.1.9, página 119. Archivado el 9 de mayo de 2024.
- ↑ H. Peter Anvin, x86: deshabilitar completamente NOPL en 32 bits , parche del kernel de Linux, 16 de septiembre de 2008. Archivado el 22 de octubre de 2022.
- ↑ JookWiki, "nopl" , 24 de septiembre de 2022: ofrece un extenso relato de la historia del extenso NOP y los problemas relacionados con él. Archivado el 28 de octubre de 2022.
- 1 2 Comunidad Intel: Se oficializa la operación NOP multibyte . Archivado el 7 de abril de 2022.
- ↑ Manual para desarrolladores de software de Intel , vol. 3B Archivado el 2 de junio de 2023 en Wayback Machine (pedido n.º 253669-076us, diciembre de 2021), sección 22.15 "NOP reservado"
- ↑ Intel, Patente estadounidense 5701442A: Método para modificar la arquitectura del conjunto de instrucciones de un procesador informático para mantener la compatibilidad con versiones anteriores , concedida en 1997 y caducada en 2015, cubre el uso del
0F 18..1Frango de códigos de operación como NOP reservados. - ↑ AMD, Tecnología AMD de 64 bits – Manual del programador de la arquitectura AMD x86-64 Volumen 3 Archivado el 18/01/2023 en Wayback Machine , publicación n.º 24594, rev 3.02, agosto de 2002, página 379.
- ↑ Registros de informes de errores de Debian, la compilación -686 utiliza noops largos, que no son compatibles con Transmeta Crusoe, fallo inmediato al arrancar , ver mensajes 148 y 158 para NOPL en VIA C7. Archivado el 1 de agosto de 2019.
- ↑ Intel, Manual del desarrollador de software de la arquitectura Intel, Volumen 2 Archivado el 22/04/2023 en Wayback Machine , 1997, número de pedido 243191-001, páginas 3-9 y A-7.
- ↑ John Hassey, Cambios en Pentium Pro , lista de correo GAS2 , 28 de diciembre de 1995: parche que agregó los
UD2AdeUD2Binstrucciones a GNU Binutils. Archivado el 25 de julio de 2023. - ↑ Jan Beulich, x86: UDn correcto , lista de correo binutils-gdb , 23 nov 2017 – Parche de Binutils que agregó el byte ModR/M a
UD1/UD2By agregóUD0. Archivado el 25 jul 2023. - ↑ Manual de referencia de optimización de procesadores Intel,, número de pedido 248966-007, véase "Regla de codificación de ensamblador/compilador 13" en la página 74. Archivado del original el 16 de marzo de 2003.
- ↑ Intel, Manual del desarrollador de la familia de procesadores Pentium® Volumen 3 Archivado el 22/04/2023 en Wayback Machine , 1995. Número de pedido 241430-004, apéndice A, página 943 – se reservan los códigos de operación
0F 0By0F B9. - 1 2 AMD, AMD64 Architecture Programmer's Manual Volumen 3 Archivado el 22-04-2023 en Wayback Machine , publicación n.º 24594, rev 3.17, dic. 2011 – ver página 416 para
UD0y páginas 415 y 419 paraUD1. - 1 2 3 Intel, Manual del desarrollador de software, vol. 2B Archivado el 8 de enero de 2022 en Wayback Machine , número de pedido 253667-061, diciembre de 2016: enumera
UD1(con byte ModR/M ) yUD0(sin byte ModR/M) en la página 4-687. - ↑ Stecklina, Julian (2019-02-08). "Identificación de CPU x86 mediante códigos de operación ilegales" . x86.lol . Archivado del original el 15 de diciembre de 2023. Recuperado el 15 de diciembre de 2023 .
- ↑ "ud0 length fix · intelxed/xed@7561f54" . GitHub . Archivado del original el 1 de junio de 2023 . Recuperado el 15 de diciembre de 2023 .
- ↑ AMD, Manual del programador de la arquitectura AMD64, volumen 3 , publicación n.º 24594, rev. 3.36, marzo de 2024 – véase la descripción de
UD1las instrucciones en la página 356. Archivado el 29 de diciembre de 2024. - 1 2 Cyrix, libro de datos del procesador 6x86 Archivado el 17-05-2023 en Wayback Machine , 1996, pedido n.° 94175-01, tabla 6-20, página 209: utiliza el mnemónico
OIO("Official invalid opcode") para el0F FFcódigo de operación. - ↑ Intel, Manual del desarrollador de software, vol. 2B Archivado el 22 de abril de 2023 en Wayback Machine , número de pedido 253667-064, octubre de 2017: listas
UD0(con byte ModR/M) en la página 4-683. - ↑ AMD, Manual de referencia técnica del procesador AMD-K5 Archivado el 26/02/2024 en Wayback Machine , noviembre de 1996, pedido n.º 18524C/0, sección 3.3.7, página 90: reserva el
0F FFcódigo de operación sin asignarle un mnemónico. - ↑ AMD, Hoja de datos del procesador AMD-K6 Archivada el 4 de marzo de 2023 en Wayback Machine , número de pedido 20695H/0, marzo de 1998, sección 24.2, página 283.
- ↑ George Dunlap, La escalada de privilegios de Intel SYSRET , The Xen Project, 13 de junio de 2012. Archivado el 15 de marzo de 2019.
- ↑ Ensamblador plano 1.73 Manual del programador , sección 2.1.19. Archivado el 28 de noviembre de 2018.
- ↑ Intel, AP-485: Identificación del procesador Intel® y la instrucción CPUID. Archivado el 30/01/2023 en Wayback Machine , número de pedido 241618-039, mayo de 2012, sección 5.1.2.5, página 32.
- ↑ Michal Necasek, "SYSENTER, ¿Dónde estás?" , 20 de julio de 2017. Archivado el 29 de noviembre de 2023.
- ↑ AMD, Guía de optimización de código para procesadores Athlon x86 , publicación n.º 22007, rev. K, febrero de 2002, apéndice F, página 284. Archivado el 13 de abril de 2017.
- ↑ Transmeta, Reconocimiento de procesadores Archivado el 19/01/2023 en Wayback Machine , 7 de mayo de 2002.
- ↑ VIA, Hoja de datos del procesador VIA C3 Nehemiah Archivada el 8 de enero de 2023 en Wayback Machine , revisión 1.13, 29 de septiembre de 2004, página 17
- ↑ CPU-World, CPUID para Intel Xeon 3.40 GHz Archivado el 26/10/2022 en Wayback Machine – CPUID Nocona stepping D sin CMPXCHG16B
- ↑ CPU-World, CPUID para Intel Xeon 3.60 GHz Archivado el 26/10/2022 en Wayback Machine – CPUID Nocona stepping E con CMPXCHG16B
- ↑ SuperUser StackExchange, ¿Qué tan comunes son los procesadores x64 antiguos que carecen de la instrucción cmpxchg16b? Archivado el 26/10/2022 en Wayback Machine
- ↑ Pedido Intel SDM n.° 325462-077 Archivado el 2 de junio de 2023 en Wayback Machine , abril de 2022, vol. 2B, pág. 4-130 "MOVSX/MOVSXD-Move with Sign-Extension" enumera MOVSXD sin REX.W como "desaconsejado".
- ↑ H. Peter Anvin, [ PARCHE 1/1 ] x86: agregar el código de operación "udb" (UD oficial permanente en modo de 64 bits) Archivado el 20 de agosto de 2025 en Wayback Machine , lista de correo GNU binutils , 11 de agosto de 2025.
- ↑ Anandtech, Análisis en profundidad de AMD Zen 3 Ryzen , 5 de noviembre de 2020, página 6
- ↑ @instlatx64 (31 de octubre de 2020). "Salvando Ryzen privado: funciones de reemplazo PEXT/PDEP de 32/64 bits para CPU #AMD (BR/#Zen/Zen+/#Zen2) basadas en el zp7 de @zwegner" ( Tweet ) . Recuperado el 20 de enero de 2023 – vía Twitter .
- ↑ Wegner, Zach (4 de noviembre de 2020). "zwegner/zp7" . GitHub . Archivado del original el 20 de enero de 2023. Recuperado el 20 de enero de 2023 .
- ↑ Intel, Especificación de tecnología de aplicación de flujo de control archivada el 22/05/2022 en Wayback Machine (v3.0, número de pedido 334525-003, marzo de 2019)
- ↑ Intel SDM, rev 076, diciembre de 2021. Archivado el 22 de mayo de 2022 en Wayback Machine , volumen 1, sección 18.3.1.
- ↑ Lista de correo de Binutils: x86: CET v2.0: Actualización del prefijo NOTRACK. Archivado el 13 de marzo de 2022 en Wayback Machine.
- ↑ Ewan Hai, [ PARCHE 2/3 ] target/i386: Introducir el modelo de CPU del cliente Zhaoxin Shijidadao , lista de correo qemu-devel , 22 de septiembre de 2025.
- ↑ AMD, Extensiones para los conjuntos de instrucciones 3DNow! y MMX Archivado el 1 de enero de 2023 en Wayback Machine , ref. n.° 22466D/0, marzo de 2000, pág. 11
- ↑ Manual del desarrollador de software de las arquitecturas Intel, número de pedido 253667-051, junio de 2014, entrada sobrela instrucción en la página 357. Archivado del original el 24 de julio de 2014.
SFENCE - ↑ AMD, AMD64 Architecture Programmer's Manual Volumen 3: Instrucciones de propósito general y del sistema , pub. n.º 24594, rev. 3.04, abril de 2003, apéndice A.2.5 en la página 382. Archivado del original el 2 de agosto de 2003.
- ↑ Hadi Brais, La importancia de la instrucción SFENCE x86 Archivado el 28-12-2022 en Wayback Machine , 26 de febrero de 2019.
- ↑ Intel, Manual del desarrollador de software archivado el 29/12/2022 en Wayback Machine , número de pedido 325426-077, noviembre de 2022, volumen 1, sección 11.4.4.3, página 276.
- ↑ Hadi Brais, La importancia de la instrucción LFENCE Archivado el 10 de junio de 2023 en Wayback Machine , 14 de mayo de 2018
- ↑ 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.
- ↑ Intel, Manual del desarrollador de software , número de pedido 325426-084, junio de 2024, vol. 3A, sección 11.12.3, página 3411: describe el uso de la
MFENCE;LFENCEsecuencia para garantizar el orden entre un almacenamiento en memoria y una escritura posterior en el registro MSR x2apic. Archivado el 4 de julio de 2024. - ↑ Intel, Prescott New Instructions Software Developer's Guide , número de pedido 252490-003, junio de 2003, páginas 3-26 y 3-38, lista
MONITORyMWAITcon operandos explícitos. Archivado el 9 de mayo de 2005. - ↑ El foro de Flat Assembler, "Sintaxis de BLENDVPS/BLENDVPD/PBLENDVB" , también incluye
MONITOR/MWAIT. Archivado el 6 de noviembre de 2022. - ↑ Intel, Intel® Xeon Phi™ Product Family x200 (KNL) Modo de usuario (anillo 3) MONITOR y MWAIT (archivado el 5 de marzo de 2017)
- ↑ Guía para desarrolladores de AMD, BIOS y kernel (BKDG) para procesadores AMD Family 10h. Archivado el 8 de abril de 2024 en Wayback Machine , número de pedido 31116, revisión 3.62, página 419. Archivado el 8 de abril de 2024 en Wayback Machine .
- ↑ R. Zhang et al, (M)WAIT for It: Bridging the Gap between Microarchitectural and Architectural Side Channels , 3 de enero de 2023, página 5. Archivado del original el 5 de enero de 2023.
- ↑ Intel, Architecture Instruction Set Extensions Programming Reference , número de pedido 319433-052, marzo de 2024, capítulo 17. Archivado el 7 de abril de 2024.
- ↑ Guru3D y VIA Zhaoxin lanzan procesadores SoC x86 de 4 y 8 núcleos. Archivado el 7 de diciembre de 2022 en Wayback Machine , 22 de enero de 2018.
- ↑ Intel, Actualización de especificaciones de la cuarta generación de equipos de escritorio , número de pedido 328899-039, abril de 2020, véase la errata HSD145 en la página 56. Archivado del original el 6 de abril de 2024.
- ↑ Vulners, x86: Denegación de servicio por intentar usar INVPCID con direcciones no canónicas. Archivado el 8 de noviembre de 2022 en Wayback Machine , 20 de noviembre de 2018.
- ↑ Manual del desarrollador de software de las arquitecturas Intel® 64 e IA-32 Archivado el 27/01/2023 en Wayback Machine , volumen 3, número de pedido 325384-078, diciembre de 2022, capítulo 23.15
- 1 2 Catherine Easdon, Comportamiento no documentado de la CPU en microarquitecturas x86 y RISC-V: una perspectiva de seguridad. Archivado el 7 de marzo de 2023 en Wayback Machine , 10 de mayo de 2019, página 39.
- ↑ Instlatx64, volcado de CPUID de Zhaoxin Kaixian KX-6000G Archivado el 25/07/2023 en Wayback Machine , 15 de mayo de 2023
- ↑ Intel, Guía del desarrollador de software del procesador Willamette , número de pedido 245355-001, febrero de 2000, sección 3.5.3, página 294: listas
HWNT/HSTmnemotecnias para los prefijos de sugerencias de bifurcación. Archivado del original el 5 de febrero de 2005. - ↑ Intel, Manual del desarrollador de software archivado el 12 de mayo de 2024 en Wayback Machine , número de pedido 325462-083, marzo de 2024 - volumen 1, capítulo 11.4.5, página 281 y volumen 2A, capítulo 2.1.1, página 525.
- ↑ Código fuente de Intel XED, src/dec/xed-disas.c, línea 325 , 11 de noviembre de 2024. Archivado el 24 de noviembre de 2024.
- ↑ Alan Modra, Sugerencias de la rama Pentium4 , lista de correo binutils , 10 de junio de 2001. Archivado el 28 de diciembre de 2025.
- ↑ Manual de referencia de optimización de arquitecturas Intel, Intel 64 e IA-32: Volumen 1 , número de pedido 248966-050US, abril de 2024, capítulo 2.1.1.1, página 46. Archivado el 25 de enero de 2025.
- 1 2 3 Intel, Arquitectura de Intel® Software Guard Extensions (Intel® SGX) para la sobreasignación de memoria segura en un entorno virtualizado , 25 de junio de 2017. Archivado el 31 de marzo de 2023.
- ↑ Intel, Actualizaciones de microcódigo en tiempo de ejecución con extensiones Intel® Software Guard , septiembre de 2021, número de pedido 648682 rev 1.0. Archivado del original el 31 de marzo de 2023.
- ↑ Intel, Hoja de datos del procesador Intel® Core™ de 11.ª generación para ordenadores de sobremesa, Volumen 1 , mayo de 2022, número de pedido 634648-004, sección 3.5, página 65. Archivado el 19 de febrero de 2025.
- ↑ Intel, ¿Qué plataformas son compatibles con Intel® Software Guard Extensions (Intel® SGX) SGX2? Archivado el 25 de mayo de 2024.
- 1 2 Intel, Intel Architecture Instruction Set Extensions and Future Features , número de pedido 319433-044, mayo de 2021, página 20. Archivado del original el 3 de enero de 2022.
- ↑ InstLatx64, volcado de CPUID del Intel Core i7-1065G7 : tiene los bits de la función de sobreasignación SGX activados ( CPUID.(EAX=12h,ECX=0) .EAX[6:5]). Archivado el 6 de diciembre de 2019.
- ↑ Intel, Trust Domain CPU Architectural Extensions , número de pedido 343754-002, mayo de 2021. Archivado el 26 de diciembre de 2022.
- ↑ Intel, Notificación de salida de enclave asíncrona y la función de hoja de usuario EDECCSSA , 30 de junio de 2022. Archivado el 21 de noviembre de 2022.
- ↑ Intel, Intel Architecture Instruction Set Extensions and Future Features, número de pedido 319433-057, marzo de 2025, capítulo 14. Archivado el 6 de abril de 2025.
- ↑ @InstLatX64 (3 de mayo de 2022). "La historia de CLDEMOTE" ( Tweet ) . Recuperado el 23 de enero de 2023 – vía Twitter .
- ↑ @Instlatx64 (17 de abril de 2023). "Volcado de CPUID 806F8 de Intel Xeon w7-2475X de 20 núcleos (SapphireRapids-64L)" ( Tweet ) . Recuperado el 20 de abril de 2023 – vía Twitter .
- ↑ Intel, Inyección de historial de ramificación e inyección de destino de ramificación intramodo / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 , ID 824191, 12 de mayo de 2025, versión 1.0, consulte la sección "Abordaje de la inyección de destino de ramificación intramodo mediante cBPF" para obtener una descripción de la nueva instrucción IBHF. Archivado el 19 de mayo de 2025.
- ↑ Código fuente de Intel XED /datafiles/ibhf/ibhf-isa.xed.txt línea 31 , versión externa v2026.02.17. Archivado el 24 de febrero de 2026.
- ↑ Intel, Especificación de la arquitectura del acelerador de transmisión de datos de Intel , número de pedido 341204-004, septiembre de 2022, páginas 13 y 23. Archivado el 20 de julio de 2023.
- ↑ InstLatx64, volcado de CPUID de Lunar Lake : tiene el bit de característica para PBNDKB establecido ( CPUID.(EAX=7,ECX=1) .EBX[1]). Archivado el 14 de mayo de 2025.
- ↑ Wikichip, CLZERO – x86 Archivado el 9 de mayo de 2021 en Wayback Machine
- ↑ Intel, Nota de aplicación AP-578: Consideraciones de software y hardware para manejadores de excepciones de FPU para procesadores con arquitectura Intel. Archivado el 7 de marzo de 2023 en Wayback Machine , número de pedido 243291-002, febrero de 1997.
- 1 2 3 Intel, Nota de aplicación AP-113: Introducción al procesador de datos numéricos Archivado el 24/10/2022 en Wayback Machine , febrero de 1981: consulte la página 7 para la detección de la FPU x87 y el
FNINITvalor de la palabra de control en el 8087, y las páginas 24-25 para el manejo de interrupciones y el indicador de habilitación de interrupciones del 8087. - 1 2 3 Intel, Manual de referencia del programador 80387 Archivado el 30-01-2025 en Wayback Machine , número de pedido 231917-001, consulte la sección 4.4.12 en la página 89 y la sección C.5 en la página 190 para obtener información sobre
FXTRACTcasos especiales, la sección 4.4.9 en la página 87 para obtener información sobre laFPTAN(y por extensiónFSIN/FCOS/FSINCOS), y la sección 4.8.1 en la página 99 para conocerFNINITla capacidad de abortar los ciclos del bus de memoria para la instrucción x87 precedente. - ↑ Intel, Coprocesador matemático 8087 Archivado el 24/10/2022 en Wayback Machine , octubre de 1989, número de pedido 285385-007, página 3-100, figura 9
- ↑ Intel, 80287 Extensión de procesador numérico HMOS de 80 bits Archivado el 24/10/2022 en Wayback Machine , febrero de 1983, número de pedido 201920-001, página 14
- ↑ Intel, iAPX86, 88 Manual del usuario Archivado el 05/12/2022 en Wayback Machine , 1981 (número de pedido 210201-001), pág. 797
- 1 2 3 Manual de referencia para programadores de Intel 80286 y 80287 Archivado el 29/06/2022 en Wayback Machine , 1987 (número de pedido 210498-005), consulte la página 439 para la necesidad de usar para
WAITsincronizar operandos de memoria en el 80287 y la página 485 para los códigos de operación de alias en el 80287. - ↑ Manual del desarrollador de software de Intel archivado el 5 de enero de 2022 en Wayback Machine , volumen 3B, revisión 064, sección 22.18.9
- ↑ "GCC Bugzilla – 37179 – GCC emite el código de operación incorrecto 'ffreep'"" . Archivado del original el 09-04-2022 . Recuperado el 26-07-2022 .
- ↑ Michael Steil, FFREEP: las instrucciones de montaje que nunca existieron , 26 de junio de 2006. Archivado el 11 de octubre de 2025.
- ↑ Agner Fog, Cómo optimizar para la familia de microprocesadores Pentium , 3 de julio de 2000, véase la sección 27.8. Archivado del original el 21 de noviembre de 2000.
- ↑ Repositorio de Github Dosbox-staging, incidencia 1231: Juegos con líneas verticales. Archivado el 5 de diciembre de 2025 en Wayback Machine , 29 de agosto de 2021.
- ↑ Repositorio Dosbox-pure de Github, problema 156: (Android) Rayas verticales por todo Carmageddon Archivado el 09-12-2025 en Wayback Machine , 10 de mayo de 2021.
- ↑ Norbert Juffa, Todo lo que siempre quiso saber sobre los coprocesadores matemáticos , v1.6a, 1 de octubre de 1994. Archivado el 18 de octubre de 2021.
- ↑ Dusko Koncaliev, Error del Pentium FDIV . Archivado el 22 de enero de 1998.
- ↑ Intel, Manual de referencia del programador i486 , 1990, número de pedido 240486-001, página 612
- ↑ IBM, Referencia técnica de la interfaz de hardware del sistema personal/2 - Interfaces comunes Archivado el 15/12/2025 en Wayback Machine , número de pedido 84F9735, primera edición, octubre de 1990, páginas 16 y 22.
- ↑ Bruce Dawson, Intel subestima los límites de error en 1,3 quintillones , 9 de octubre de 2014. Archivado el 1 de septiembre de 2025.
- ↑ Intel SDM, rev 053 Archivado el 11/02/2022 en Wayback Machine y posteriormente, describe el procedimiento exacto de reducción de argumentos utilizado para
FSIN,FCOS,FSINCOSyFPTANen el volumen 1, sección 8.3.8 - ↑ Michal Necasek, Failing to fail , 16 de junio de 2023, Museo OS/2 , véase el apéndice. Archivado el 1 de octubre de 2024.
- ↑ Rastreador de problemas de VirtualBox, ticket 12646: XP Guest GPF en WIN87EM.DLL en 0001:02C9 o 0001:02C6 . Archivado el 13 de marzo de 2016.
- ↑ Robert Collins, Códigos de operación no documentados: AAM . Archivado el 21 de febrero de 2001.
- ↑ Retrocomputing StackExchange, prefijo de código de operación 0F1h en i80286 . Archivado el 13 de abril de 2023.
- 1 2 Frank van Gilluwe, "El PC indocumentado - Segunda edición", págs. 93-95
- ↑ Michal Necasek, ¿ Errata del Intel 486?, 6 de diciembre de 2015. Archivado el 29 de noviembre de 2023.
- ↑ Robert Hummel, "PC Magazine Programmer's Technical Reference" ( ISBN) 1-56276-016-5) pág. 728
- ↑ Raúl Gutiérrez Sanz, Opcodes 8086 no documentados, Parte I , 27 de diciembre de 2017. Archivado el 29 de noviembre de 2023.
- 1 2 "Asm, opcode 82h" . 24 de diciembre de 1998. Archivado del original el 14 de abril de 2023.
- ↑ Intel Corporation 2022 , pág. 3698.
- ↑ Intel, Manual del usuario de la familia 8086, octubre de 1979. Archivado el 4 de abril de 2018 en Wayback Machine . Se omitieron los códigos de operación en las páginas 4-25 y 4-31.
- ↑ Retrocomputing StackExchange, ¿ Instrucciones no documentadas en la CPU x86 anterior al 80386?, 4 de junio de 2021. Archivado el 18 de julio de 2023.
- ↑ Daniel B. Sedory, Un examen del MBR estándar , 2000. Archivado el 6 de octubre de 2023.
- ↑ AMD, Guía de optimización de software para procesadores AMD64 Archivada el 30/01/2023 en Wayback Machine (publicación 25112, revisión 3.06, septiembre de 2005), sección 6.2, pág. 128
- ↑ GCC bugzilla, Error 48227 – Se generó "rep ret" para -march=core2 . Archivado el 9 de abril de 2023.
- ↑ Raymond Chen, ¡ Vaya, qué NOPs extraños tienes!, 12 de enero de 2011. Archivado el 20 de mayo de 2023.
- ↑ Jeff Parsons, Información sobre la CPU Intel 80386 (sección de erratas B1, punto n.º 7). Archivado el 13 de noviembre de 2023.
- ↑ Manual para desarrolladores de software de Intel , volumen 2B Archivado el 4 de marzo de 2022 en Wayback Machine (enero de 2006, número de pedido 235667-018, no tiene NOP largo)
- ↑ Manual para desarrolladores de software de Intel , volumen 2B Archivado el 7 de enero de 2022 en Wayback Machine (marzo de 2006, número de pedido 235667-019, tiene NOP largo)
- ↑ Agner Fog, Tablas de instrucciones archivadas el 10/01/2020 en Wayback Machine , sección AMD K7.
- ↑ "579838 – glibc no es compatible con AMD Geode LX" . Archivado del original el 30 de julio de 2023.
- ↑ Manual para desarrolladores de software de Intel , volumen 2B Archivado el 31/03/2022 en Wayback Machine (abril de 2005, número de pedido 235667-015, no incluye 0F0D-nop)
- ↑ Manual para desarrolladores de software de Intel , volumen 2B Archivado el 31/03/2022 en Wayback Machine (junio de 2005, número de pedido 235667-016, incluye 0F0D-nop en la tabla de códigos de operación, pero no en la
NOPdescripción de la instrucción). - ↑ El manual para desarrolladores de software de Intel , volumen 2B, archivado el 8 de enero de 2022 en Wayback Machine (número de pedido 253667-060, septiembre de 2016), no incluye
UD0yUD1. - ↑ "PCJS : pcjs/x86op0F.js (controladores de código de operación x86 de dos bytes), líneas 1647–1651" . GitHub . 17 de abril de 2022. Archivado del original el 13 de abril de 2023.
- ↑ "¿80486 fallos de protección de paginación? \ VOGONS" . Archivado del original el 9 de abril de 2022.
- ↑ "Manejo de código de operación no válido \ VOGONS" . Archivado del original el 9 de abril de 2022.
- ↑ "Las instrucciones no válidas provocan la salida incluso si Int 6 está interceptado \ VOGONS" . Archivado del original el 9 de abril de 2022.
- ↑ "Tutorial: Llamar a Win32 desde DOS" . Ragestorm . 17 de septiembre de 2005. Archivado del original el 9 de abril de 2022.
- ↑ "Acceso a controladores de dispositivos Windows desde programas DOS" . Archivado del original el 8 de noviembre de 2011.
- 1 2 "Microcódigo 8086 desensamblado" . Blog de Reenigne . 3 de septiembre de 2020. Archivado del original el 8 de diciembre de 2023. Recuperado el 26 de julio de 2022.
El uso del prefijo REP o REPNE con una instrucción MUL o IMUL niega el producto. El uso del prefijo REP o REPNE con una instrucción IDIV niega el cociente.
- ↑ "Re: Códigos de operación no documentados (HINT_NOP)" . Archivado del original el 6 de noviembre de 2004. Consultado el 7 de noviembre de 2010 .
- ↑ "Re: También algunos códigos de operación 0Fh no documentados" . Archivado del original el 26 de junio de 2003. Recuperado el 7 de noviembre de 2010 .
- ↑ La biblioteca RCCE de Intelpara el SCC utilizaba el código de operaciónpara la instrucción de invalidación de mensajes del SCC.
0F 0A - ↑ Intel Labs, Especificación de arquitectura externa SCC (EAS), Revisión 0.94 , pág. 29. Archivado el 22 de mayo de 2022.
- ↑ "Instrucciones x86 no documentadas para controlar la CPU a nivel de microarquitectura en procesadores Intel modernos" (PDF) . 9 de julio de 2021.
- ↑ Robert R. Collins, Códigos de operación no documentados: UMOV . Archivado el 21 de febrero de 2001.
- ↑ Herbert Oppmann, NXOP (Código de operación 0Fh 55h) Archivado el 9 de abril de 2022 en Wayback Machine
- ↑ Herbert Oppmann, NexGen Nx586 Hypercode Source , ver COMMON.INC. Archivado el 9 de abril de 2023.
- ↑ Herbert Oppmann, Inside the NexGen Nx586 System BIOS . Archivado el 29 de diciembre de 2023.
- ↑ Intel, XuCode: Una tecnología innovadora para implementar flujos de instrucciones complejos , 6 de mayo de 2021. Archivado el 7 de enero de 2026.
- ↑ Grzegorz Mazur, instrucciones no documentadas de AMD 3DNow!
- 1 2 "Instrucciones no documentadas de 3DNow!" . grafi.ii.pw.edu.pl . Archivado del original el 30 de enero de 2003. Recuperado el 22 de febrero de 2022 .
- ↑ OPCODE.LST del grupo de hackers de Potemkin, v4.51 , 15 de octubre de 1999. Archivado el 21 de mayo de 2001.
- ↑ " [ Análisis de CPU UCA ] Prototipo de CPU verde UMC U5S-SUPER33" . 25 de mayo de 2020. Archivado del original el 9 de junio de 2023.
- ↑ Agner Fog, La microarquitectura de las CPU de Intel, AMD y VIA , sección 3.4 "Predicción de ramificaciones en P4 y P4E". Archivado el 7 de enero de 2024.
- 1 2 Christopher Domas, Rompiendo el ISA x86 , 27 de julio de 2017. Archivado el 27 de diciembre de 2023.
- 1 2 Xixing Li et al, UISFuzz: Un método de fuzzing eficiente para la búsqueda de instrucciones no documentadas de la CPU , 9 de octubre de 2019, pág. 9. Archivado el 21 de febrero de 2026 en Wayback Machine.
- ↑ Microprocessor Report, MediaGX apunta a las PC de bajo costo (vol. 11, n.° 3, 10 de marzo de 1997). Archivado el 6 de junio de 2022.
- ↑ "Bienvenido al proyecto OpenSSL" . GitHub . 21 de abril de 2022. Archivado del original el 4 de enero de 2022.
- ↑ LKML, (PARCHE) crypto: Zhaoxin: Controlador de motor de hardware para SHA1/256/384/512 , 2 de agosto de 2023. Archivado el 17 de enero de 2024.
- ↑ Kary Jin, PARCHE: Actualización del motor PadLock para las CPU VIA C7 y Nano , lista de correo openssl-dev , 10 de junio de 2011. Archivado el 11 de febrero de 2022.
- 1 2 Lista de correo de OpenEuler, PARCHE kernel-4.19 v2 5/6 : x86/cpufeatures: Agregar bits de características de Zhaoxin . Archivado el 9 de abril de 2022.
- ↑ USPTO/Zhaoxin, Solicitud de patente US2023/006718: Procesador con un algoritmo criptográfico hash y procesamiento de datos del mismo , páginas 13 y 45, 2 de marzo de 2023. Archivada el 12 de septiembre de 2023.
- ↑ LKML, (PATCH) crypto: x86/sm2 -add Implementación del algoritmo Zhaoxin SM2 , 11 de noviembre de 2023. Archivado el 17 de enero de 2024.
- 1 2 InstLatx64, volcado de CPUID para Zhaoxin KaiXian KX-6000G : tiene los bits de características SM2 y xmodx activados ( hoja de CPUID C0000001:EDX:bits 0 y 29). Archivado el 25 de julio de 2023.
- ↑ Solicitud de extracción del kernel de OpenEuler 2602: x86/delay: agregar soporte para la instrucción Zhaoxin ZXPAUSE . Gitee . 26 de octubre de 2023. Archivado el 22 de enero de 2024.
- ↑ Archivo de datos ISA para Intel XED Archivado el 15/06/2022 en Wayback Machine (17 de abril de 2022), líneas 916-944
- ↑ Libro de datos del procesador Cyrix 6x86. Archivado el 27/08/2022 en Wayback Machine , página 6-34.
- ↑ Libro de datos de los procesadores AMD Geode LX archivado el 15/03/2019 en Wayback Machine , publicación 33234H, pág. 670
- Intel Corporation (abril de 2022). "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, volúmenes combinados: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D y 4" . Intel . Consultado el 21 de junio de 2022 .
Enlaces externos
- Documentación gratuita para IA-32 y x86-64 , proporcionada por Intel.
- Manual del programador de la arquitectura AMD64, volúmenes 1-5 , proporcionado por AMD.
- Referencia de códigos de operación e instrucciones x86
- Referencia de instrucciones x86 y amd64
- Tablas de instrucciones: Listas de latencias de instrucciones, rendimientos y desgloses de microoperaciones para CPUs Intel, AMD y VIA.
- Lista de instrucciones del ensamblador Netwide (de Netwide Assembler )
- Instrucciones X86
- Listados de conjuntos de instrucciones