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
editar
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
editar
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
editar
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
editar
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
editar
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
editar
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 y lógicas
editar
Operaciones aritméticas
editar
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
editar
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)
editar
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
editar
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)
editar
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
editar
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)
|
Control del flujo del programa
editar
Saltos incondicionales
editar
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
editar
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
editar
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)
editar
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
editar
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
editar
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
editar
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
editar
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 |
|