Anexo:Instrucciones x86
El conjunto de instrucciones x86 ha sido extendido varias veces, introduciendo registros más amplios y tipos de datos y/o nueva funcionalidad.
Instrucciones con enteros
Este es el conjunto de instrucciones completo del 8086/8088, pero la mayoría de estas instrucciones, si no todas, están disponibles en el modo de 32 bits, ellas simplemente operarían en registros y valores de 32 bits (EAX, EBX, etc) en vez de sus contrapartes de 16 bits (AX, BX, etc). Ver lenguaje ensamblador x86 para un tutorial rápido para esta familia de procesadores. El conjunto de instrucciones actualizado también está agrupado de acuerdo a la arquitectura (i386, i486, i686) y más generalmente está referido como x86_32 y x86_64 (también conocido como AMD64).
Representación de números enteros
Los números en los registros pueden representarse de dos maneras. La primera es una representación de entero positivo sin signo, cuyo rango será desde 0 hasta 2n, donde n es 8, 16, 32 o 64 bits dependiendo del tamaño del registro. La segunda es una representación de entero con signo (complemento a dos, con un rango entre -2n-1 hasta 2n-1 - 1, donde n es, al igual que en la anterior, el ancho de bits del registro, (8, 16, 32 o 64 bits).
Rango de los números de acuerdo al tamaño de los registros y su representación como entero con signo y sin signo:
Tamaño del registro | Enteros sin signo | Enteros con signo (complemento a dos) |
---|---|---|
8 bits | 0 a 255 | -128 a 127 |
16 bits | 0 a 65.535 | -32.768 a 32.767 |
32 bits | 0 a 4.294.967.295 | -2.147.483.648 a 2.147.483.647 |
64 bits | 0 a 18.446.744.073.709.551.615 | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 |
Las operaciones aritméticas del procesador trabajan, generalmente, indistintamente con cualquiera de las dos representaciones. La misma instrucción, (el mismo opcode), para una suma, por ejemplo, puede sumar dos valores en representación como enteros positivos sin signo o dos valores en representación de enteros con signo. Para el procesador es lo mismo, y es el programador (o el compilador) el que trata o piensa en los números como estando en una representación u otra.
Hay, sin embargo, algunas instrucciones, como la multiplicación y la división, por ejemplo, donde son necesarios dos opcodes diferentes , uno para cuando se realizan operaciones con enteros positivos sin signo, y otro para cuando se realizan operaciones con enteros con signo, ya que se necesita un tratamiento especial para cada caso. Existen las instrucciones MUL y DIV para trabajar con enteros positivos sin signo, y las IMUL e IDIV para trabajar con enteros con signo. Lo mismo sucede con las instrucciones de SHIFT (desplazamiento), que tienen versiones para manejar números en representación entera sin signo (SHL y SHR) y con signo (SAL y SAR).
El CPU también puede trabajar con operaciones con números en representación BCD, pero como no hay instrucciones específicas para BCD, se usan las operaciones aritméticas convencionales, pero hay que hacer un ajuste adicional, usando instrucciones especializadas, para obtener el resultado correcto en representación BCD.
Instrucciones x86
Abajo una tabla con las instrucciones x86. La columna CPU indica el primer CPU que tuvo la instrucción, comenzando con el Intel 8086 y el Intel 8088, que fueron los primeros CPU de la serie x86
Mueve y copia datos
Movimiento de datos | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | MOV | Move | Mueve | En realidad es una copia, ya que en el destino se copia lo que está en el origen sin alterar este último | |
80386 | MOVZX | Move with zero-extend | Mueve con extensión de cero | ||
80386 | MOVSX | Move with sign-extend | Mueve con extensión de signo | ||
8086/88 | XCHG | Exchange data | Intercambia datos | ||
8086/88 | XLAT | 11010111 | Table look-up translation | Traslación de búsqueda en tabla |
Operaciones de pila
Operaciones de pila | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | PUSH | Push data onto stack | Apila dato en la pila | ||
8086/88 | POP | 0x0F | Pop data from stack | Desapila dato desde la pila | POP CS (opcode 0x0F) solo trabaja en el 8086/8088. Los CPU posteriores usan 0x0F como un prefijo para nuevas instrucciones |
8086/88 | PUSHF | 10011100 | Push flags onto stack | Apila bandera en la pila | |
8086/88 | POPF | 10011101 | Pop data into flags register | Desapila dato desde la pila hacia los registros de bandera | |
80186/188 | PUSHA | Push all general purpose registers onto stack | Apila todos los registros de propósito general hacia la pila | Equivalente a
PUSH AX, CX, DX, BX, SP, BP, SI, DI | |
80186/188 | POPA | Pop all general purpose registers from stack | Desapila todos los registros de propósito general desde la pila | Equivalente a
POP DI, SI, BP, SP, BX, DX, CX, AX | |
80386 | PUSHAD | Push all double-word (32-bit) registers onto stack | Apila todos los registros de 32 bits en la pila | ||
80386 | POPAD | Pop all double-word (32-bit) registers from stack | Desapila todos los registros de 32 bits en la pila | No desapila el registro ESP | |
80386 | PUSHFD | Push EFLAGS register onto stack | Apila el registro EFLAGS en la pila | ||
80386 | POPFD | Pop data into EFLAGS register | Desapila dato al registro EFLAGS desde la pila | ||
80186/188 | ENTER | Enter stack frame | Entra un marco de pila | Equivalente a
PUSH BP ; salva BP
MOV BP, SP ; guarda el valor original de SP
SUB SP, n ; abre un espacio en el stack para las variables locales de la función
; Ahora, con BP se pueden referenciar los parámetros de entrada
; de la función, que vienen en el stack al ser llamada ésta
; y las variables locales de la función que estarán
; en el espacio reservado aquí
| |
80186/188 | LEAVE | Leave stack frame | Sale del marco de pila | Equivalente a
MOV SP, BP ; Restaura SP
POP BP ; Restaura BP
|
Entrada y salida por puertos
Entrada/salida de puertos | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | IN | Input from port | Entrada desde un puerto | ||
8086/88 | OUT | Output to port | Salida a un puerto |
Conversiones
Conversiones | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | CBW | 10011000 | Convert byte to word | Convierte byte a palabra | |
8086/88 | CWD | 10011001 | Convert word to doubleword | Convierte palabra a doblepalabra | |
80386 | CDQ | Convert double-word to quad-word | Convierte doblepalabra a palabra cuádruple | Sign-extends EAX into EDX, forming the quad-word EDX:EAX. Since (I)DIV uses EDX:EAX as its input, CDQ must be called after setting EAX if EDX is not manually initialized (as in 64/32 division) before (I)DIV | |
80386 | CWDE | Convert word to double-word | Convierte palabra a doblepalabra | Unlike CWD, CWDE sign-extends AX to EAX instead of AX to DX:AX | |
80486 | BSWAP | Byte Swap | Intercambio de bytes | Convierte Little endian a big endian (y viceversa). Solo trabaja en registros de 32 bits |
Operaciones aritméticas
Aritméticas | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | ADD | Add | Suma | ||
8086/88 | ADC | Add with carry | Suma con acarreo | destino = destino + origen + flag de acarreo | |
80486 | XADD | Exchange and Add | Intercambia y suma | ||
8086/88 | SUB | Subtraction | Resta | ||
8086/88 | SBB | Subtraction with borrow | Resta con acarreo ("toma prestado") | ||
8086/88 | INC | Increment by 1 | Incremento por 1 | ||
8086/88 | DEC | Decrement by 1 | Decrementa por 1 | ||
8086/88 | NEG | Two's complement negation | Negación del complemento a dos | Cambio de signo. Útil para números en representación con signo (no con representación de enteros sin signo). Es equivalente a invertir los bits con NOT, y luego sumar 1 | |
8086/88 | MUL | Unsigned multiply | Multiplicación sin signo | ||
8086/88 | IMUL | Signed multiply | Multiplicación con signo | ||
8086/88 | DIV | Unsigned divide | División sin signo | ||
8086/88 | IDIV | Signed divide | División con signo |
Operaciones BCD y ASCII
Operaciones BCD y ASCII | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | DAA | 00100111 | Decimal adjust AL after addition | Ajuste decimal de AL después de la suma | Usado en BCD |
8086/88 | DAS | 00101111 | Decimal adjust AL after subtraction | Ajuste decimal después de sustracción | Usado en BCD |
8086/88 | AAA | 00110111 | ASCII adjust AL after Addition | Ajuste ASCII de AL después de la suma | Usado en BCD |
8086/88 | AAS | 00111111 | ASCII adjust AL after subtraction | Ajuste ASCII de AL después de la sustracción | |
8086/88 | AAM | ASCII adjust AX after multiplication | Ajuste ASCII de AX después de la multiplicación | Solo la versión de base 10 está documentada. La hoja de datos (datasheet) del 8086/8088 solo documenta la versión de base 10 de la instrucción AAD (opcode 0xD5 0x0A), pero cualquier base trabajará (como 0xD5 0x02 para binario, por ejemplo). La documentación posterior de Intel también tiene la forma genérica. Los procesadore NEC V20 y V30 (y posiblemente otros CPU NEC serie V) siempre usan base 10, ignorando el argumento, causando un número de incompatiblidades | |
8086/88 | AAD | ASCII adjust AX before division | Ajuste ASCII de AX antes de la división |
Operaciones lógicas (bitwise)
Lógicas (bitwise) | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | AND | Logical AND | Y lógica | ||
8086/88 | OR | Logical OR | O lógico | ||
8086/88 | XOR | Exclusive OR | O exclusivo (XOR) | ||
8086/88 | NOT | Logical NOT | NO lógico |
Rotación de bits | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | ROL | Rotate left | Rota hacia la izquierda | ||
8086/88 | ROR | Rotate right | Rota hacia la derecha | ||
8086/88 | RCL | Rotate left (with carry) | Rota hacia la izquierda con acarreo | ||
8086/88 | RCR | Rotate right (with carry) | Rota a la derecha con acarreo |
Desplazamiento de bits | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | SHL | Shift left (unsigned shift left) | Desplazamiento a la izquierda | Los bits se desplazan a la izquierda, el bit de la derecha se le asigna cero, el bit de la izquierda desaparece del operando pero queda guardado en el flag del acarreo | |
8086/88 | SHR | Shift right (unsigned shift right) | Desplazamiento hacia la derecha | Los bits se desplazan a la derecha, el bit de la izquierda se le asigna cero, el bit de la derecha desaparece del operando pero queda guardado en el flag del acarreo | |
80386 | SHLD | Shift left double-word | |||
80386 | SHRD | Shift right double-word |
Desplazamiento de bits (números con representación de signo (complemento a dos)) | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | SAL | Shift Arithmetically left (signed shift left) | Desplaza aritméticamente hacia la izquierda | Desplaza los bits del operando hacia la izquierda sin tocar el bit más significativo del operando (bit del signo). Esto permite multiplicar por 2 un operando con signo | |
8086/88 | SAR | Shift Arithmetically right (signed shift right) | Desplaza aritméticamente hacia la derecha | Desplaza los bits del operando hacia la derecha. El bit del signo no se desplaza y además se copia en el bit inmediatamente a la derecha. Esto permite dividir entre dos un operando con signo |
Operaciones con bits
Operaciones con bits | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80386 | BT | Bit test | Prueba de bit | ||
80386 | BTR | Bit test and reset | Prueba de bit y pone a cero | ||
80386 | BTS | Bit test and set | Prueba de bit y pone a 1 | ||
80386 | BTC | Bit test and complement | Prueba de bit y complementa | ||
80386 | BSF | Bit scan forward | Busca bit hacia adelante | ||
80386 | BSR | Bit scan reverse | Busca bit hacia atrás |
Operaciones con los flags (banderas)
Flags | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | CMC | 11110101 | Complement carry flag | Complementa el flag del acarreo | |
8086/88 | CLC | 11111000 | Clear carry flag | Aclara el flag del acarreo | |
8086/88 | STC | 11111001 | Set carry flag | Enciende el flag del acarreo | |
8086/88 | CLI | 11111010 | Clear interrupt flag | Aclara el flag de las interrupciones | |
8086/88 | STI | 11111011 | Set interrupt flag | Enciende el flag de las interrupciones | |
8086/88 | CLD | 11111100 | Clear direction flag | Aclara el flag de la dirección | |
8086/88 | STD | 11111101 | Set direction flag | Enciende el flag de la dirección | |
8086/88 | LAHF | 10011111 | Load flags into AH register | Carga los flags al registro AH | |
8086/88 | SAHF | 10011110 | Store AH into flags | Almacena AH en el registro de flags | usado para poner varios valores específicos en los flgs |
Operaciones de string
Carga el registro AL, AX o EAX | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | LODSB | Load string byte | Carga el siguiente byte de un string | ||
8086/88 | LODSW | string word | Carga la siguiente palabra (16 bits) de un string | ||
80386 | LODSD | Load string | Carga la siguiente doble palabra (32 bits) de un string | can be prefixed with REP | |
Guarda en contenido del registro AL, AX o EAX | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | STOSB | Store byte in string | Guarda un byte de string | ||
8086/88 | STOSW | Store word in string | Guarda una palabra de string | ||
80386 | STOSx | Store string | Guarda una doble palabra de string | ||
Mueve bytes, words o doublewords | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | MOVSB | Move byte from string to string | Mueve byte de string a string | ||
8086/88 | MOVSW | Move word from string to string | Mueve palabra de string a string | ||
80386 | MOVSW, MOVSD | Move data from string to string | Mueve datos desde string a string | ||
Compara bytes, words o doublewords | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | CMPSB | Compare bytes in memory | Compara bytes en memoria | ||
8086/88 | CMPSW | Compare words in memory | Compara palabras en memoria | ||
80386 | CMPSD | Compare string double-word | Compara string de doblepalabra | Compares ES:[(E)DI] with DS:[SI] | |
Busca bytes, words o doublewords | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | SCASB | Compare byte string | Busca byte en string | ||
8086/88 | SCASW | Compare word string | Busca palabra en string | ||
80386 | SCASD | Scan string data double-word | Busca doble palabra en string | ||
Operaciones de string (con puertos de entrada/salida) | |||||
80186/188 | Instrucción | Opcode | Significado | Traducción | Notas |
80186/188 | INS | Input from port to string | Entrada desde un puerto hacia un string | Equivalente a
IN AX, DX ; Lee el puerto de entrada apuntado por DX
MOV ES:[DI], AX ; Guarda el contenido del puerto en ES:[DI]
; Ajusta DI de acuerdo al tamaño del operando y el flag DF
| |
80186/188 | OUTS | Output string to port | Salida de string por un puerto | Equivalente a
MOV AX, DS:[SI] ; Lee un dato desde DS:[SI]
OUT DX, AX ; Envía el dato al puerto apuntado por DX
; Ajusta SI de acuerdo al tamaño del operando y al flag DF
| |
80386 | INSB, INSW, INSD | Input from port to string with explicit size | Entrada de un tamaño específico desde un puerto a un string | same as INS | |
Prefijo de repetición | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | REPxx | Repeat MOVS/STOS/CMPS/LODS/SCAS | Repite MOVS/STOS/CMPS/LODS/SCAS | (REP, REPE, REPNE, REPNZ, REPZ) |
Saltos incondicionales
Salto incondicional | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | JMP | Jump | Salto (incondicional) | La ejecución del programa salta a la dirección apuntada por JMP |
Comparaciones
Comparaciones | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | CMP | Compare operands | Compara operandos | ||
80486 | CMPXCHG | CoMPare and eXCHanGe | Compara e intercambia | ||
Pentium | CMPXCHG8B | CoMPare and eXCHanGe 8 bytes | Compara e intercambia 8 bytes | ||
8086/88 | TEST | Logical compare (AND) | Comparación lógica (Y) | Compara dos operandos y ajusta los flags. No se alteran los operandos | |
80386 | SETx | Set byte to one on condition | Ajusta byte de acuerdo a una condición | (SETA, SETAE, SETB, SETBE, SETC, SETE, SETG, SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL, SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ) |
Saltos condicionales
Saltos condicionales | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | Jxx | Jump if condition | Salta en caso de una condición | (JA, JAE, JB, JBE, JC, JCXZ, JE, JG, JGE, JL, JLE, JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO, JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ) | |
80386 | JCXZ, JECXZ | Jump if register (E)CX is zero | Salta si el registro (E)CX es cero |
Loops (bucles)
Loops (bucles) | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | LOOP/LOOPx | Loop control | Control de bucles | (LOOPE, LOOPNE, LOOPNZ, LOOPZ) | |
80386 | LOOPW, LOOPD | Loop | Bucle | Bucle; (E)CX es el registro contador | |
80386 | LOOPEW, LOOPED | Loop while equal | Loop mientras igual | ||
80386 | LOOPZW, LOOPZD | Loop while zero | Loop mientras cero | ||
80386 | LOOPNEW, LOOPNED | Loop while not equal | Loop mientras no igual | ||
80386 | LOOPNZW, LOOPNZD | Loop while not zero | Loop mientras no cero |
Llamadas a subrutinas
Llamadas a subrutinas | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | CALL | Call procedure | LLamada a procedimiento | ||
8086/88 | RET | Return from procedure | Retorno desde un procedimiento | ||
8086/88 | RETN | Return from near procedure | Retorno desde un procedimiento cercano | ||
8086/88 | RETF | Return from far procedure | Retorno desde un procedimiento lejano |
Interrupciones
Llamadas de interrupción | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | INT | Call to interrupt | Llama una interrupción | Ejecuta, mediante software, una rutina apuntada por un vector de interrupción | |
8086/88 | INTO | 11001110 | Call to interrupt if overflow | Llama a interrupción en caso de overflow | |
Retornos de interrupción | |||||
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | IRET | 11001111 | Return from interrupt | Retorna de una interrupción | |
80386 | IRETx | Interrupt return | Retorno de una interrupción | D suffix means 32-bit return, F suffix means do not generate epilogue code (i.e. LEAVE instruction), Use IRETD rather than IRET in 32-bit situations |
Detener el procesador
Detener el procesador | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | HLT | 11110100 | Enter halt state | Entra en el estado de parada |
Operaciones con registros de segmento
Operaciones con registros de segmento | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | LDS | Load DS with pointer | Carga DS con un puntero | ||
8086/88 | LES | Load ES with pointer | Carga ES con un puntero | ||
8086/88 | LEA | Load Effective Address | Carga dirección efectiva a un registro |
Operaciones de sincronización entre procesadores
Operaciones de sincronización entre procesadores | |||||
---|---|---|---|---|---|
8086/88 | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | ESC | Used with floating-point unit | Usado con la unidad de coma flotante | ||
8086/88 | LOCK | 11110000 | Assert BUS LOCK# signal | Enciende la señal del bus LOCK# | Para multiprocesamiento |
8086/88 | WAIT | 10011011 | Wait until not busy | Espera hasta que no se esté ocupado | Espera hasta que la señal dl pin de BUSY# se vuelva inactivo (usado con la unidad de coma flotante |
Verificación de límites de arreglos
Verificación de límites de arreglos | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80186/188 | BOUND | Check array index against bounds | Chequea el índice de un arreglo con límites | Eleva una interrupción 5 de software si la prueba falla |
Carga y guarda el registro de tareas
Carga y guarda el registro de tareas | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80286 | LTR | Load task register | Carga registro de tareas | ||
80286 | STR | Store task register | Guarda registro de tareas |
Carga y guarda el estado de la máquina
Carga y guarda el estado de la máquina | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80286 | LMSW | Load machine status word | Carga la palabra de estatus de la máquina | ||
80286 | SMSW | Store machine status word | Guarda la palabra de estatus de la máquina |
Operaciones para cargar y guardar tablas de descriptor
Tablas de descriptor | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80286 | LLDT | Load local descriptor table | Carga tabla de descriptores local | ||
80286 | SLDT | Store local descriptor table | Guarda tabla de descriptores local | ||
80286 | LGDT | Load global descriptor table | Carga tabla de descriptores global | ||
80286 | SGDT | Store global descriptor table | Guarda tabla de descriptores global | ||
80286 | LIDT | Load interrupt descriptor table | Carga tabla de descriptores de interrupción | ||
80286 | SIDT | Store interrupt descriptor table | Guarda tabla de descriptores de interrupción |
Segmentos
Segmentos | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80286 | LSL | Load segment limit | Carga límite del segmento | ||
80286 | VERR | Verify a segment for reading | Verifica segmento para la lectura | ||
80286 | VERW | Verify a segment for writing | Verifica segmento para la escritura |
No clasificadas
No clasificadas | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
80286 | ARPL | Adjust RPL field of selector | |||
80286 | CLTS | Clear task-switched flag in register CR0 | |||
80286 | LAR | Load access rights byte | |||
80286 | LOADALL | Load all CPU registers, including internal ones such as GDT | Undocumented, (80)286 and 386 only | ||
80386 | LFS, LGS | Load far pointer | |||
80386 | LSS | Load stack segment | |||
80486 | INVD | Invalidate Internal Caches | |||
80486 | INVLPG | Invalidate TLB Entry | |||
80486 | WBINVD | Write Back and Invalidate Cache | |||
Pentium | CPUID | CPU IDentification | This was also added to later 80486 processors | ||
Pentium | RDMSR | ReaD from Model-Specific Register | |||
Pentium | RDTSC | ReaD Time Stamp Counter | |||
Pentium | WRMSR | WRite to Model-Specific Register | |||
Pentium | RSM | Resume from System Management Mode | This was introduced by the i386SL and later and is also in the i486SL and later. Resumes from System Management Mode (SMM) |
Otras
Otras | |||||
---|---|---|---|---|---|
CPU | Instrucción | Opcode | Significado | Traducción | Notas |
8086/88 | NOP | 0x90 | No operation | No operación | opcode (0x90) equivalente a XCHG AX, AX |
Instrucciones de coma flotante
Instrucciones originales del 8087
Las siguientes son las instrucciones originales que vinieron con el coprocesador numérico Intel 8087, que estaba diseñado para suplir funcionalidad de coma flotante a los procesadores Intel 8086 y 8088.
Constantes | |||
---|---|---|---|
Instrucción | Significado | Traducción | Notas |
FLDZ | Load 0.0 onto stack | Carga 0,0 en la pila | |
FLD1 | Load 1.0 onto stack | Carga 1,0 en la pila | |
FLDPI | Load π onto stack | Carga π en la pila | |
FLDL2E | Load log2(e) onto stack | Carga log2(e) en la pila | log2(e) = 1,44269504088896340736 |
FLDLN2 | Load ln(2) onto stack | Carha ln(2) en la pila | ln(2) = 0,69314718055994530942 |
FLDL2T | Load log2(10) onto stack | Carga log2(10) en la pila | log2(10) = 3,32192809488736234787 |
FLDLG2 | Load log10(2) onto stack | Carga log10(2) en la pila | log10(2) = 0,30102999566398119521 |
Operaciones aritméticas | |||
Instrucción | Significado | Traducción | Notas |
FABS | Absolute value | Valor absoluto | |
FCHS | Change sign | Cambio de signo | |
FADD | Add | Suma | |
FSUB | Subtract | Resta | |
FSUBR | Reverse subtract | Resta reversa | |
FMUL | Multiply | Multiplica | |
FDIV | Divide | Divide | Ver Error de división del Intel Pentium |
FDIVR | Divide reversed | Divide reverso | |
FIADD | Integer add | Suma entera | |
FISUB | Integer subtract | Resta entera | |
FISUBR | Integer subtract reversed | Resta entera reversa | |
FIMUL | Integer multiply | Multiplicación entera | |
FIDIV | Integer divide | División entera | |
FIDIVR | Integer divide reversed | División entera reversa | |
FADDP | Add and pop | Suma y POP | |
FSUBP | Subtract and pop | Resta y POP | |
FSUBRP | Reverse subtract and pop | Resta reversa y POP | |
FMULP | Multiply and pop | Multiplica y POP | |
FDIVP | Divide and pop | Divide y POP | |
FDIVRP | Divide reversed and pop | Divide reverso y POP | |
FSCALE | Scale by factor of 2 | Escala por un factor de 2 | |
Partes de número | |||
Instrucción | Significado | Traducción | Notas |
FRNDINT | Round to integer | Redondea a entero | |
FXTRACT | Extract exponent and significand | Extrae el exponente y la parte significativa | |
FPREM | Partial remainder | Resto parcial | |
Funciones trascendentales | |||
Instrucción | Significado | Traducción | Notas |
FSQRT | Square root | Raíz cuadrada | |
FPTAN | Partial tangent | Tangente parcial | |
FPATAN | Partial arctangent | Arcotangente parcial | |
F2XM1 | 2x - 1 | 2x - 1 | Más preciso que 2x para cercano a cero |
FYL2X | y * log2(x) | y * log2(x) | Si , entonces el logaritmo base - es computado |
FYL2XP1 | y * log2(x+1) | y * log2(x+1) | Más preciso que cuando está cercano a cero |
Carga y guarda registros | |||
Instrucción | Significado | Traducción | Notas |
FXCH | Exchange registers | Intercambia registros | |
FLD | Floating point load | Carga coma flotante | |
FILD | Load integer | Carga entero | |
FBLD | Load BCD | Carga número en BCD | |
FSTP | Store and pop | Guarda y POP | |
FST | Floating point store | Guarda coma flotante | |
FIST | Store integer | Guarda entero | |
FISTP | Store integer and pop | Guarda entero y POP | |
FBSTP | Store BCD and pop | Guarda BCD y POP | |
FINCSTP | Increment floating point stack pointer | Incrementa el puntero de pila de coma flotante | |
FDECSTP | Decrement floating point stack pointer | Decrementa el puntero de pila de coma flotante | |
FFREE | Free register | Libera registro | |
Comparaciones | |||
Instrucción | Significado | Traducción | Notas |
FTST | Test for zero | Prueba por cero | |
FCOM | Compare | Compara | |
FCOMP | Compare and pop | Compara y POP | |
FCOMPP | Compare and pop twice | Compara y POP dos veces | |
FICOM | Integer compare | Comparación entera | |
FICOMP | Integer compare and pop | Comparación entera y POP | |
FXAM | Examine condition flags | Examina los flags de condición | |
Otras | |||
Instrucción | Significado | Traducción | Notas |
FNOP | No operation | No operación | |
FWAIT | Wait while FPU is executing | Espera mientras el FPU está ejecutando | |
Inicialización | |||
FINIT | Initialize floating point processor | Inicializa el procesador de coma flotante | |
FNINIT | Initialize floating point processor, no wait | Inicializa el procesador de coma flotante, no espera | |
Excepciones | |||
Instrucción | Significado | Traducción | Notas |
FCLEX | Clear exceptions | Aclara excepciones | |
FNCLEX | Clear exceptions, no wait | Aclara las excepciones, no espera | |
Interrupciones | |||
Instrucción | Significado | Traducción | Notas |
FENI | Enable interrupts | Enciende las interrupciones | Solo en el 8087, de lo contrario, FNOP |
FNENI | Enable interrupts, no wait | Activa las interrupciones, no espera | Solo en el 8087, de lo contrario, FNOP |
FDISI | Disable interrupts | Desactiva las interrupciones | Solo en el 8087, de lo contrario, FNOP |
FNDISI | Disable interrupts, no wait | Desactiva las interrupciones, no espera | Solo en el 8087, de lo contrario, FNOP |
Control | |||
Instrucción | Significado | Traducción | Notas |
FLDCW | Load control word | Carga la palabra de control | |
FSTCW | Store control word | Guarda la palabra de control | |
FNSTCW | Store control word, no wait | Guarda la palabra de control, no espera | |
Estatus | |||
Instrucción | Significado | Traducción | Notas |
FSTSW | Store status word | Guarda la palabra de estatus | |
FNSTSW | Store status word, no wait | Guarda la palabra de estado, no espera | |
Estado | |||
Instrucción | Significado | Traducción | Notas |
FSAVE | Save FPU state | Guarda el estado del FPU | |
FSAVEW | Save FPU state, 16-bit | Guarda el estado del FPU, 16 bits | |
FNSAVE | Save FPU state, no wait, 8-bit | Guarda el estado de la unidad de punto flotante (FPU), no espera, 8 bits | |
FNSAVEW | Save FPU state, no wait, 16-bit | Guarda el estado del FPU, no espera, 16 bits | |
FRSTOR | Restore saved state | Restaura el estado salvado | |
FRSTORW | Restore saved state | Restaura al estado salvado | Quizás no disponible realmente en el 8087 |
Ambiente | |||
Instrucción | Significado | Traducción | Notas |
FLDENV | Load environment state | Carga el estado del ambiente | |
FSTENV | Store FPU environment | Guarda el ambiente del FPU | |
FNSTENV | Store FPU environment, no wait | Guarda el ambiente del FPU, no espera | |
FSTENVW | Store FPU environment, 16-bit | Guarda el ambiente del FPU, 16 bits | |
FNSTENVW | Store FPU environment, no wait, 16-bit | Guarda el ambiente del FPU, no espera, 16 bits | |
FLDENVW |
Véase también
Procesadores x86:
Enlaces externos
- Intel 80386 Reference Programmer's Manual
- The 8086 / 80286 / 80386 / 80486 Instruction Set
- Intel Pentium Instruction Set Reference
- Free IA-32 and x86-64 documentation, provided by Intel
- Netwide Assembler Instruction List (from Netwide Assembler)
- X86 Opcode and Instruction Reference
- The Art of Assembly Language Programming