Está en la página 1de 59

ÍNDICE

Introducción…………………………………………………………………………..2

Historia de los microprocesadores.………………………………………………4

Los Microprocesadores 8088 y 8086……………………………………………..7

Terminales (pinout) del 8088……………………………………………………….9

Terminales (pinout) del 8086……………………………………………………..11

Conclusión…………………………………………………………………………...13

Referencias…………………………………………………………………………..14

Conjunto de instrucciones de los μP´s 8086/8088……………………...……15

Clasificación de las instrucciones………………………………………………16

Conjunto de instrucciones………………………………………………………..21

Conclusión…………………………………………………………………………...43

Referencias…………………………………………………………………………..44
INTRODUCCIÓN

El procesador es un circuito electrónico que actúa como unidad central de proceso de un


ordenador, en inglés CPU “Central Processin Unit” . Es el encargado de proporcionar las
operaciones de cálculo, como un cerebro que organiza, da órdenes y envía información al resto del
cuerpo. Los microprocesadores se utilizan, sobretodo, en ordenadores pero también en otros
sistemas informáticos avanzados, como impresoras, automóviles o aviones.

En sus inicios el tamaño del procesador era el de un armario y después fue perdiendo en
dimensiones. De armario pasó a una caja grande y más tarde a 15 por 15 pulgadas (menos de
medio metro cuadrado). Eran procesadores para grandes máquinas nada que ver con los
ordenadores de sobremesa o portátiles a los que estamos tan acostumbrados.

Para fabricar los ordenadores personales hacía falta un procesador mucho más pequeño, el
microprocesador: es un circuito sumamente integrado, es decir un microchip. El microchip es un
circuito electrónico complejo cuyos componentes son diminutos y forman una sola pieza plana
muy fina y semiconductora.

El funcionamiento del microprocesador es realmente complejo pero conocer mínimamente sus


componentes y funciones ayudará a entender mejor la relevancia de los progresos que van
haciendo a lo largo de los años.

Hay que entender, por ejemplo, que el tamaño del que hablamos es sumamente pequeño, el
microprocesador podría equipararse a un sello postal y los transistores de sus circuitos no
alcanzan ni la décima parte de un cabello humano. Con estas dimensiones una simple mota de
polvo puede colapsar el sistema.

Hay que entender también que al trabajar a esta escala supone que un pequeño avance en
reducción del tamaño es un cambio enorme en la velocidad de la máquina. Si el recorrido que
deben hacer los bits (unidad mínima de información, 1 o 0).

Se envía a través del bus de datos en paquetes se reduce, aminora también el tiempo que se tarda
en recibir la información. Si multiplicamos esa diferencia por los millones de “viajes” que se hacen
en un segundo el resultado es que el usuario espera mucho menos tiempo a que se ejecute la
tarea ordenada.

El microprocesador está compuesto por:

• Resistencias

• Diodos

• Condensadores

• Conexiones
• Millones de transistores

Secciones del microprocesador:

• ALU: unidad aritmético-lógica que hace cálculos con números y toma decisiones lógicas.

• Registros: zonas de memoria especiales para almacenar información temporalmente.

• Unidad de control: descodifica los programas.

• Bus: transportan información digital (en bits) a través del chip y de la computadora.

• Memoria local: utilizada para los cómputos efectuados en el mismo chip.

• Memoria cache: memoria especializada que sirve para acelerar el acceso a los dispositivos
externos de almacenamiento de datos.

El ordenador posee un cristal oscilante que proporciona una señal de sincronización. Esta señal es
la que coordina todas las actividades del microprocesador y es más conocida como señal de reloj.
La velocidad de reloj se mide en MHz, a lo largo de la historia de los microprocesadores iremos
viendo como la velocidad de esta señal aumenta y nos permite ejecutar millones de instrucciones
por segundo.

Historia de los microprocesadores

Dicen que si la industria del automóvil se hubiera desarrollado tan rápido como la de los
microprocesadores ahora se podría cruzar en coche EEUU de costa a costa en cuestión de
segundos. El microprocesador apenas ha cumplido los 40 años pero los cambios que ha
experimentado hacen parecer un pasado mucho más lejano.

Según muchos Intel Inside creó el primer microprocesador de la historia (para otros el mérito es
de Texas Instruments) pero además se ha mantenido en primera fila desde el inicio hasta nuestros
días. Su poder en el mercado es tal que se le ha acusado de monopolio y no hay señal de que sus
cuotas puedan reducirse sustancialmente.

Si hablamos de PC prácticamente siempre nos referimos a su procesador por el modelo de Intel.


Incluso en los 90, cuando aparecía la familia Pentium en microprocesadores, era frecuente
referirse a Pentium como modelo de ordenador.
Por esta razón la historia de Intel y la de los microprocesadores van tan de la mano que es casi
imposible separarlas. Empezaremos por el principio, cuando Intel Inside sacaba al mercado su
primer y revolucionario modelo de microprocesador.

Era el año 1971 y una empresa japonesa, Busicom, tenía un proyecto para una nueva calculadora.
Ted Hoff, ingeniero de Intel, diseñó un chip (circuito integrado) con una memoria capaz de hacer
varias acciones. Con 4 chips como este y dos chips más de memoria se diseñó el primer
microprocesador de Intel, el 4004. Antes de crear el microprocesador hacía falta un chip para cada
parte de la calculadora, con el 4004 todas las funciones estaban integradas en un solo circuito.

Este microprocesador contenía 2.300 transistores y transmitía con un bus de 4 bits. El 4004 podía
realizar 60.000 operaciones por segundo, una miseria para nuestros días, todo un logro en los
años 70.

La evolución de los Microprocesadores

El siguiente paso de Intel fue en 1974. Creó el 8080, un microprocesador con 4.500 transistores,
un bus de 8 bits y capaz de ejecutar 200.000 instrucciones por segundo. El gran éxito de la
empresa llegó con el 8088 y el 8086, microprocesadores que IBM utilizaría para su primer
ordenador personal.

Debido a la buena respuesta de los consumidores por este ordenador se convirtió en un estándar
y, en consecuencia, también sería un estándar el microprocesador de Intel. Muchas empresas lo
utilizarían para sus nuevos ordenadores e incluso fabricantes de hardware clonarían a Intel.

Los siguientes productos de Intel Inside fueron siempre compatibles con sus predecesores así
como los microprocesadores de otros fabricantes. Empresas como IBM, AMD o Apple se han
dedicado también a fabricar microprocesadores pero estos son compatibles a nivel ensamblador
con el juego de instrucciones Intel, de manera que no todos los PCs tienen que ser
obligatoriamente “Intel Inside”.

Durante los primeros años de la historia de los microprocesadores las aportaciones de otras
empresas eran pocas, en la mayoría de los casos lo que se fabricaba eran clones de los productos
de Intel. AMD, por ejemplo, entró fuerte en el mercado cuando la contrató IBM como segundo
fabricante de sus microprocesadores.

Según la política interna del gigante azul debía tener dos fabricantes y no solo Intel. Las tres
empresas trabajaron en conjunto hasta que Intel decide rescindir el contrato e ir por su cuenta, a
partir de ese momento ya no comparte información ni códigos con AMD que la demanda por
incumplimiento de contrato.
A pesar de ganar la batalla contra Intel, AMD empieza a crear sus propios modelos ya que se da
cuenta de que creando clones de Intel siempre estará por detrás de la gran empresa. A
continuación una tabla resumen de los principales microprocesadores de Intel permite observar el
gran crecimiento de esta industria.

|Modelo |Año |Bus de Datos (Bits) |Frecuencia Interna Máxima |

|8088 |1979 |8 | 14 MHz. |

|80286 |1982 |16 | 12.5 MHz |

|80386 |1985 |32 | 20 MHz |

|80486 |1989 |32 | 25 MHz |

|Pentium |1993 |64 | 60 MHz |

|Pentium-pro |1995 |64 | 200 MHz |

|Pentium II |1995 |64 | 266 MHz |

|Pentium III |1999 |64 | 550 MHz |

|Pentium 4 |2001 |64 | 2 GHz |

|Pentium M |2003 |64 | 2.26 GHz |

|Intel Core 2 |2007 |64 | 3.16 GHz |

Aunque no se observa en la tabla es importante resaltar que hasta el momento Intel ha cumplido
siempre con la Ley de Moore. Gordon Moore era miembro cofundador de Intel y en 1965 formuló
la ley empírica conocida como Ley de Moore. Según la ley los microprocesadores duplicarán su
número de transistores en aproximadamente año y medio.

En consecuencia el ordenador baja de precio rápidamente pero también queda obsoleto en


cuestión de dos años. Es una ventaja para el consumidor en tanto que pronto dispone de mayor
tecnología y una desventaja porque para estar al día debe invertir mucho capital. De todas
maneras los de Intel se muestran orgullosos de no haber fallado a la Ley de su fundador y seguir
mejorando tan rápidamente sus productos.

Son muchas las tecnologías que han permitido este gran crecimiento en las capacidades de los
microprocesadores, estas son algunas:

• Soporte para memoria virtual.

• Soprocesador matemático integrado.


• Capacidad de procesar varias instrucciones en paralelo.

• Multiprocesador.

• Multinúcleo.

Otros fabricantes de microprocesadores

Apple, Motorota, Cyrix, Sun Microsystems, Digital Equipment Corporation, Compaq, IBM y AMD
son las principales empresas que se dedican también a la fabricación de microprocesadores. En un
principio la mayoría de ellas lo que hacía era copiar los procesadores de Intel pero esto suponía un
doble problema.

Siempre estaban por detrás de Intel Inside lo que se traducía en pérdidas ya que el que llega antes
se lleva más cuotas de ventas. Por otro lado, los fabricantes de ordenadores exigen actualizar sus
equipos con cierta rapidez para poder ser los primeros en sacar el mejor modelo del momento.

El caso de Apple es un poco diferente debido a que esta empresa es la única que fabrica el modelo
Macintosh. De todas maneras es frecuente que Apple utilice microprocesadores Intel aunque
nunca ha llegado a necesitar un Pentium.

De los antes mencionados el principal competidor de Intel Inside es AMD. Aunque es la segunda
empresa en fabricación de microprocesadores más importante, la distancia entre AMD e Intel es
abismal. Mientras Intel controla cerca del 80% del mercado (habiendo llegado incluso al 90%)
AMD se conforma con un 15%.

Como decíamos unas líneas atrás, AMD se dedicó largo tiempo a clonar los microprocesadores de
Intel pero llegó un punto de inflexión en el que diseñaba sus propios productos. En la actualidad
AMD tiene defensores acérrimos que consideran sus microprocesadores de mayor calidad que los
de Intel.

Los Microprocesadores 8088 y 8086

El 8086 es un microprocesador de 16 bits, tanto en lo que se refiere a su estructura como en sus


conexiones externas, mientras que el 8088 es un procesador de 8 bits que internamente es casi
idéntico al 8086. La única diferencia entre ambos es el tamaño del bus de datos externo. Intel trata
esta igualdad interna y desigualdad externa dividiendo cada procesador 8086 y 8088 en dos sub-
procesadores. O sea, cada uno consta de una unidad de ejecución (EU: Execution Unit) y una
unidad interfaz del bus (BIU: Bus Interface Unit). La unidad de ejecución es la encargada de realizar
todas las operaciones mientras que la unidad de interfaz del bus es la encargada de acceder a
datos e instrucciones del mundo exterior. Las unidades de ejecución son idénticas en ambos
microprocesadores, pero las unidades de interfaz del bus son diferentes en varias cuestiones,
como se desprende del siguiente diagrama en bloques:

[pic]

Registros de uso general del 8088/8086

Tienen 16 bits cada uno y son ocho:

1. AX = Registro acumulador, dividido en AH y AL (8 bits cada uno). Usándolo se produce (en


general) una instrucción que ocupa un byte menos que si se utilizaran otros registros de uso
general. Su parte más baja, AL, también tiene esta propiedad. El último registro mencionado es el
equivalente al acumulador de los procesadores anteriores (8080 y 8085).

2. BX = Registro base, dividido en BH y BL. Es el registro base de propósito similar (se usa para
direccionamiento indirecto) y es una versión más potente del par de registros HL de los
procesadores anteriores.

3. CX = Registro contador, dividido en CH y CL. Se utiliza como contador en bucles (instrucción


LOOP), en operaciones con cadenas (usando el prefijo REP) y en desplazamientos y rotaciones
(usando el registro CL en los dos últimos casos).

4. DX = Registro de datos, dividido en DH y DL. Se utiliza junto con el registro AX en


multiplicaciones y divisiones, en la instrucción CWD y en IN y OUT para direccionamiento indirecto
de puertos (el registro DX indica el número de puerto de entrada/salida).

5. SP = Puntero de pila (no se puede subdividir). Aunque es un registro de uso general, debe
utilizarse sólo como puntero de pila, la cual sirve para almacenar las direcciones de retorno de
subrutinas y los datos temporarios (mediante las instrucciones PUSH y POP). Al introducir (push)
un valor en la pila a este registro se le resta dos, mientras que al extraer (pop) un valor de la pila
este a registro se le suma dos.
6. BP = Puntero base (no se puede subdividir). Generalmente se utiliza para realizar
direccionamiento indirecto dentro de la pila.

7. SI = Puntero índice (no se puede subdividir). Sirve como puntero fuente para las operaciones
con cadenas. También sirve para realizar direccionamiento indirecto.

8. DI = Puntero destino (no se puede subdividir). Sirve como puntero destino para las
operaciones con cadenas. También sirve para realizar direccionamiento indirecto.

Terminales (pinout) del 8088

[pic]

Este microprocesador está encapsulado en el formato DIP (Dual Inline Package) de 40 patas
(veinte de cada lado).

El 8086/8088 puede conectarse al circuito de dos formas distintas: el modo máximo y el modo
mínimo. El modo queda determinado al poner una determinada terminal (llamado MN/MX) a
tierra o a la tensión de alimentación.

Los 40 pines del 8088 en modo MÍNIMO tienen las siguientes funciones:

1. GND (Masa)

2. A14 (Bus de direcciones)

3. A13 (Bus de direcciones)

4. A12 (Bus de direcciones)

5. A11 (Bus de direcciones)

6. A10 (Bus de direcciones)

7. A9 (Bus de direcciones)

8. A8 (Bus de direcciones)

9. AD7 (Bus de direcciones y datos)

10. AD6 (Bus de direcciones y datos)


11. AD5 (Bus de direcciones y datos)

12. AD4 (Bus de direcciones y datos)

13. AD3 (Bus de direcciones y datos)

14. AD2 (Bus de direcciones y datos)

15. AD1 (Bus de direcciones y datos)

16. AD0 (Bus de direcciones y datos)

17. NMI (Entrada de interrupción no enmascarable)

18. INTR (Entrada de interrupción enmascarable)

19. CLK (Entrada de reloj generada por el 8284)

20. GND (Masa)

21. RESET (Para inicializar el 8088)

22. READY (Para sincronizar periféricos y memorias lentas)

23. /TEST

24. /INTA (El 8088 indica que reconoció la interrupción)

25. ALE (Cuando está uno indica que salen direcciones por AD, en caso contrario, es el bus de
datos)

26. /DEN (Data enable: cuando vale cero debe habilitar los transceptores 8286 y 8287 (se
conecta al pin de "output enable"), esto sirve para que no se mezclen los datos y las direcciones).

27. DT/R (Data transmit/receive: se conecta al pin de dirección de los chips recién indicados).

28. IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la memoria)

29. /WR (Cuando vale cero hay una escritura)

30. HLDA (Hold Acknowledge: el 8088 reconoce el HOLD)

31. HOLD (Indica que otro integrado quiere adueñarse del control de los buses, generalmente se
usa para DMA o acceso directo a memoria).

32. /RD (Cuando vale cero hay una lectura)

33. MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo mínimo, en caso
contrario está en modo máximo)
34. /SSO (Junto con IO/M y DT/R esta salida sirve para determinar estados del 8088)

35. A19/S6 (Bus de direcciones/bit de estado)

36. A18/S5 (Bus de direcciones/bit de estado)

37. A17/S4 (Bus de direcciones/bit de estado)

38. A16/S3 (Bus de direcciones/bit de estado)

39. A15 (Bus de direcciones)

40. Vcc (+5V)

En modo MÁXIMO hay algunos pines que cambian de significado:

24.- QS1: Estado de la cola de instrucciones (bit 1).

25.- QS0: Estado de la cola de instrucciones (bit 0).

26.- S0: Bit de estado 0.

27.- S1: Bit de estado 1.

28.- S2: Bit de estado 2.

29.- /LOCK: Cuando vale cero indica a otros controladores del bus (otros microprocesadores o un
dispositivo de DMA) que no deben ganar el control del bus. Se activa poniéndose a cero cuando
una instrucción tiene el prefijo LOCK.

30.- RQ/GT1: Es bidireccional y tiene la misma función que HOLD/HLDA en modo mínimo.

31.- RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad. 34.- Esta salida siempre está a uno.

Terminales (pinout) del 8086

[pic]

Los 40 pines del 8086 en modo MÁXIMO tienen las siguientes funciones:

1. GND (Masa)

2. AD14 (Bus de direcciones y datos)

3. AD13 (Bus de direcciones y datos)

4. AD12 (Bus de direcciones y datos)


5. AD11 (Bus de direcciones y datos)

6. AD10 (Bus de direcciones y datos)

7. AD9 (Bus de direcciones y datos)

8. AD8 (Bus de direcciones y datos)

9. AD7 (Bus de direcciones y datos)

10. AD6 (Bus de direcciones y datos)

11. AD5 (Bus de direcciones y datos)

12. AD4 (Bus de direcciones y datos)

13. AD3 (Bus de direcciones y datos)

14. AD2 (Bus de direcciones y datos)

15. AD1 (Bus de direcciones y datos)

16. AD0 (Bus de direcciones y datos)

17. NMI (Entrada de interrupción no enmascarable)

18. INTR (Entrada de interrupción enmascarable)

19. CLK (Entrada de reloj generada por el 8284)

20. GND (Masa)

21. RESET (Para inicializar el 8088)

22. READY (Para sincronizar periféricos y memorias lentas)

23. /TEST

24.- QS1: Estado de la cola de instrucciones (bit 1).

25.- QS0: Estado de la cola de instrucciones (bit 0).

26.- S0: Bit de estado 0.

27.- S1: Bit de estado 1.

28.- S2: Bit de estado 2.


29.- /LOCK: Cuando vale cero indica a otros controladores del bus (otros microprocesadores o un
dispositivo de DMA) que no deben ganar el control del bus. Se activa poniéndose a cero cuando
una instrucción tiene el prefijo LOCK.

30.- RQ/GT1: Es bidireccional y tiene la misma función que HOLD/HLDA en modo mínimo.

31.- RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad. 34.- Esta salida siempre está a uno.

32. /RD (Cuando vale cero hay una lectura)

33. MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo mínimo, en caso
contrario está en modo máximo)

34. BHE/S7 Terminal de salida BHE# (multiplexada con S7) que habilita la parte alta (D8-D15) del
bus de datos.

35. A19/S6 (Bus de direcciones/bit de estado)

36. A18/S5 (Bus de direcciones/bit de estado)

37. A17/S4 (Bus de direcciones/bit de estado)

38. A16/S3 (Bus de direcciones/bit de estado)

39. AD15 (Bus de direcciones y datos)

40. Vcc (+5V)

En modo MÍNIMO hay algunos pines que cambian de significado:

24. /INTA (El 8086 indica que reconoció la interrupción)

25. ALE (Cuando está uno indica que salen direcciones por AD, en caso contrario, es el bus de
datos)

26. /DEN (Data enable: cuando vale cero debe habilitar los transceptores 8286 y 8287 (se conecta
al pin de "output enable"), esto sirve para que no se mezclen los datos y las direcciones).

27. DT/R (Data transmit/receive: se conecta al pin de dirección de los chips recién indicados).

28. IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la memoria)

29. /WR (Cuando vale cero hay una escritura)

30. HLDA (Hold Acknowledge: el 8086 reconoce el HOLD)


31. HOLD (Indica que otro integrado quiere adueñarse del control de los buses, generalmente se
usa para DMA o acceso directo a memoria).

CONCLUSIÓN

Como se ha podido observar a lo largo de esta entrega, los procesadores 8088/8086 fueron los
encargados de revolucionar la industria de los microprocesadores ya que fueron un parte aguas
muy importante en su época ya que trajeron muchas innovaciones y mejoras para sus
predecesores.

Al observar detalladamente el microprocesador 8088 y el 8086 se puede ver que no existe una
gran diferencia entre ambos, ya que tienen una estructura muy similar, las diferencias entre
ambos es que el 8086 posee un canal de datos externos de 16 bits y que el 8088 tiene un canal de
datos externos de 8 bits y que el 8086 tiene 16 terminales de bus de direcciones y datos que van a
desde AD0 hasta AD15, mientras el 8088 solo tiene 8 terminales de bus de dirección y datos los
cuales son desde AD0 hasta AD7 y 8 terminales de bus de dirección que van de A8 hasta A15.

Ambas trabajan en modo máximo y modo mínimo con las mismas funciones, solo que el
microprocesador 8086 trabaja en base a Modo Máximo y el 8088 en base a Modo Mínimo
cambiando ambos las funciones de algunas terminales que son de la terminal 24 a la terminal 31
dependiendo del tipo de Modo en el que estén trabajando, este cambio de modo se da cuando en
la terminal 33 se le aplican +5V.

Podemos resumir que este par de procesadores tienen una igualdad interna y una diferencia
externa, resaltando como el punto mas importante el tamaño de bus de datos externo que
aunque no sean muchas las diferencias, si es una ventaja que tiene el microprocesador 8086 ante
el 8088.

REFERENCIAS

http://www.maestrosdelweb.com/principiantes/historia-de-los-microprocesadores/
http://www.ie.unan.edu.ni/~jmedal/2006/sem1/arquitectura/mp/mp-docs/8088.pdf

http://atc2.aut.uah.es/~avicente/asignaturas/ects/pdf/ects_t3.pdf

CLASIFICACION DE LAS INSTRUCCIONES

Operaciones aritméticas y lógicas

Estas instrucciones son realizadas por la ALU de la máquina. Una unidad aritmética lógica puede
realizar un conjunto de operaciones aritméticas básicas y un conjunto de operaciones lógicas, a
través de líneas de selección. En inglés ALU significa Arithmetic Logic Unit (Unidad Aritmética
Lógica).

• Operaciones puramente lógicas

Son aquellas instrucciones que realizan operaciones a nivel de bit (operaciones de tipo lógica o de
aritmética binaria) con los operandos. Al igual que las anteriores, alteran las banderas de estado.

|Instrucción |Función |

|AND |Realiza un lógico. |

|NOT |Realiza un lógico. |

|OR |Realiza una lógica. |

|XOR |Realiza una exclusiva. |

• Operaciones puramente aritméticas

Aquellas instrucciones que realizan operaciones aritméticas con los operandos, como suma, resta,
etc. Alteran las banderas de estado.
|Instrucción |Función |

|ADC |Sumar dos operandos y añadir el acarreo. |

|ADD |Sumar dos operandos sin añadir el acarreo. |

|DEC |Decrementa operando en 1. |

|DIV |División sin signo. |

|IDIV |División considerando los signos de los operandos.


|

|IMUL |Multiplicación considerando los signos de los operandos.


|

|INC |Incrementa el operando en 1. |

|MUL |Multiplicación sin considerar los signos. |

|NEG |Cambiar el signo del operando. |

|SBB |Resta añadiendo el acarreo. |

|SUB |Resta sin acarreo. |

• Operaciones de manejo de bits

Son instrucciones que realizan traslaciones (rotaciones) con los bits del operando. Al igual que las
anteriores, alteran las banderas de estado.

|Instrucción |Función |

|RCL |Rota a la izquierda a través del acarreo. |

|RCR |Rota a la derecha considerando el acarreo. |

|ROL |Rotación a la izquierda. |

|ROR |Rotación a la derecha. |

|SAL/SHL |Desplazamiento a la izquierda. |

|SAR/SHR |Desplazamiento hacia la derecha. |


• Operaciones de conversión

Realizan conversiones de los operandos para transformarlos en otro tipo de representación


numérica.

|Instrucción |Función |

|AAA |Ajusta el valor ASCII de una suma. |

|AAD |Ajuste del valor ASCII de una división. |

|AAM |Ajuste del valor ASCII de una multiplicación. |

|AAS |Ajuste del valor ASCII de una resta. |

|CBW |Convierte un byte en un word. |

|CWD |Convierte un word en un double word. |

|DAA |Ajuste decimal en una suma. |

|DAS |Ajuste decimal en una resta. |

Instrucciones de comparación

Las instrucciones de comparación permiten alterar las banderas de estado de la máquina y, con
ello, tomar decisiones cambiando el flujo de un programa. Estas operaciones realizan
internamente alguna operación (por lo general la resta), pero no almacenan el resultado de esa
operación, sino que únicamente actualizan las banderas de estado.

El 8086/8088 dispone de las siguientes instrucciones de comparación:

|Instrucción |Función |

|CMP |Comparar dos operandos y actualizar banderas.


|

|CMPS |Comparar cadenas de un byte o de una palabra.


|
|TEST |Comparar dos operandos utilizando operación AND.
|

Instrucciones de salto

El 8086/8088 dispone de 36 instrucciones de salto que permiten controlar el flujo de ejecución de


un programa. Se pueden clasificar en dos tipos: instrucciones de salto condicional e instrucciones
de salto incondicional.

• Salto condicional

Realizan el salto si se cumple una determinada condición. Esta condición se comprueba analizando
las banderas de estado. Se utilizan combinadas con alguna instrucción que afecta el estado de las
banderas, como las vistas en los apartados anteriores.

|Instrucción |Función |

|JA |Saltar si superior. |

|JAE |Saltar si superior o igual. |

|JB |Saltar si inferior. |

|JBE |Saltar si inferior o igual. |

|JC |Saltar si hay acarreo. |

|JCXZ |Saltar si cx es cero. |

|JE |Saltar si igual. |

|JG |Saltar si mayor, considerando signos. |

|JGE |Saltar si mayor o igual, considerando signos. |

|JL |Saltar si menor, considerando signos. |

|JLE |Saltar si menor o igual, considerando signos. |

|JNA |Saltar si no superior. |


|JNAE |Saltar si no superior o igual. |

|JNB |Saltar si no inferior. |

|JNBE |Saltar si no inferior o igual. |

|JNC |Saltar si no hay acarreo. |

|JNE |Saltar si no igual. |

|JNG |Saltar si no mayor (con signo). |

|JNGE |Saltar si no mayor o igual (con signo). |

|JNL |Saltar si no menor (con signo). |

|JNLE |Saltar si no menor o igual (con signo). |

|JNO |Saltar si no hay overflow (considerando signos). |

|JNS |Saltar si positivo. |

|JNZ |Saltar si no es cero. |

|JO |Saltar si hay overflow (con signo). |

|JP/JPE |Saltar si par. |

|JNP/JPO |Saltar si impar. |

|JS |Saltar si negativo (signo activado). |

|JZ |Saltar si es cero. |

|LOOP |Saltar hasta que CX sea 0. |

|LOOPE/LOOPZ |Saltar hasta que el resultado de la última operación sea igual a cero.
|

|LOOPNZ |Saltar hasta que el resultado de última operación sea distinto de cero.
|

|LOOPNE |Saltar hasta que última comparación sea “distinta”.


|

• Salto Incondicional
Este tipo de instrucciones de salto se diferencian del anterior en que el salto se realiza siempre, es
decir, sin comprobar ninguna condición.

|Instrucción |Función |

|CALL |Llamada a función, con retorno. |

|JMP |Salto incondicional (saltar siempre). |

|RET |Retorno incondicional de un procedimiento. |

Instrucciones de manejo de interrupciones

Estas instrucciones permiten activar interrupciones o acceder a servicios del sistema o de la ROM-
BIOS.

|Instrucción |Función |

|INT |Genera una interrupción. |

|INTO |Genera una interrupción si desbordamiento. |

|IRET |Retorno de interrupción. |

Instrucciones de transferencia de información

Estas instrucciones se pueden clasificar en varios grupos:

• Transferencia usando registros y/o memoria

Realizan movimientos de datos desde un registro a memoria (o viceversa) y desde un registro


hacia otro registro, con la salvedad de que no se pueden hacer transferencias de memoria a
memoria. Son las siguientes:

|Instrucción |Función |
|LAHF |Cargar las banderas en AH. |

|LDS |Carga un puntero en DS. |

|LEA |Carga dirección efectiva. |

|LES |Carga un puntero en ES. |

|MOV |Mover un dato. |

|POP |Extraer dato de la pila. |

|POPF |Extraer dato de la pila y almacenarlo en registro de banderas.


|

|PUSH |Almacenar dato en la pila. |

|PUSHF |Almacenar registro de banderas en la pila. |

|SAHF |Almacena el contenido de AH en el registro de banderas.


|

|XCHG |Intercambiar valores de los operandos. |

|XLAT |Traducir posición. |

• Transferencia usando puertos de E/S

Permiten la comunicación del procesador con otros elementos del bus (como controladoras y
coprocesadores), y con los periféricos conectados al sistema (como impresoras, ratón, etc.).
Únicamente son cuatro, aunque las dos últimas son especializaciones de las dos primeras:

|Instrucción |Función |

|IN |Entrada de byte o palabra desde un puerto de E/S. |

|OUT |Salida de byte o palabra a un puerto de E/S. |

|ESC |Enviar información al coprocesador. |

|WAIT |Espera a un coprocesador. |

• Transferencias “especiales”
A este apartado pertenecen aquellas instrucciones que realizan transferencias de datos de forma
repetitiva y/o utilizando registros de direccionamiento, como el DI y el SI. Son las siguientes:

|Instrucción |Función |

|LODS |Carga una cadena. |

|MOVS |Mueve cadena de datos. |

|REP |Repetir operación de manejo de cadenas. |

|REPE |Repetir operación de manejo de cadenas mientras igual.


|

|REPNE |Repetir operación de manejo de cadenas mientras no igual.


|

|REPNZ |Repetir operación de manejo de cadenas mientras no cero.


|

|REPZ |Repetir operación de manejo de cadenas mientras cero.


|

|SCAS |Explora cadena de datos. |

|STOS |Almacena cadena de datos. |

Instrucciones de control del microprocesador

En este apartado se encuentran aquellas instrucciones que alteran el contenido del registro de
banderas, o que afectan al funcionamiento básico del procesador.

Se pueden clasificar, por tanto, en dos grupos:

• Operaciones con las banderas

Alteran el contenido de las banderas.


|Instrucción |Función |

|CLC |Pone a 0 la bandera de acarreo. |

|CLD |Pone a 0 la bandera de dirección. |

|CLI |Pone a 0 la bandera de interrupción. |

|CMC |Complementa la bandera de acarreo. |

|STC |Pone la bandera de acarreo a 1. |

|STD |Pone la bandera de dirección a 1. |

|STI |Pone la bandera de interrupción a 1. |

• Operaciones con el procesador y el bus

Son instrucciones utilizadas para comunicar la CPU con el bus y con otros procesadores.

|Instrucción |Función |

|HTL |Detiene el procesador. |

|LOCK |Bloquea el bus de datos. |

|NOP |Operación sin comentario (sólo consume tiempo)


|

CONJUNTO DE INSTRUCCIONES

FUNCIONES ARITMETICAS

AAA ASCII Adjust for Addition

(Ajuste ASCII para suma): AAA cambia el contenido de AL a un número decimal no empacado
valido con el nibble de alto orden en ceros.

Banderas afectadas
AF, CF, OF(no definida), SF(no definida), ZF(no definida), PF(no definida).

AAD ASCII Adjust for División

(Ajuste ASCII para división): AAD multiplica el contenido de AH por 10, añade el resultado al
contenido del AL y ubica dicho resultado en AL.

Luego, la instrucción pone AH en 0. Esta instrucción se usa antes de dividir números decimales no
empacados.

Banderas afectadas:

SF, ZF, PF, OF(no definida), AF(no definida), CF(no definida).

AAM ASCII Adjust for Multiplication

(Ajuste ASCII para multiplicación): Después de multiplicar dos números decimales no empacados,
se utiliza AAM a fin de corregir el resultado para un número decimal no empacado. Para que la
instrucción trabaje adecuadamente, los nibbles de alto orden de cada número multiplicado deben
ponerse en 0.

Banderas afectadas

SF, ZF, PF, OF(no definida),

AF (no definida),

CF (no definida).

AAS ASCII Adjust for Subtraction

(Ajuste ASCII para resta): AAS corrige el resultado de una resta decimal no empacada anterior, de
tal forma que el valor en AL es un verdadero número decimal no empacado.

Banderas afectadas

AF, CF, OF(no definida), SF(no definida), ZF(no definida), PF(no definida).

ADC Add with carry


(Sumar con acarreo): ADC suma el contenido del operando fuente al operando de destino (y
almacena el resultado en este ultimo). Si la bandera de acarreo esta activada, el resultado cambia
en incrementos de l. En esta rutina se supone que los valores que se están añadiendo son binarios.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

ADC AX, BX ;AX=AX+BX+CF

ADC AX, TEMP ;AX=AX+TEMP+CF

ADC SUM, BX ;SUM=SUM+BX+CF

ADC CL,10 ;CL=CL+ 10+CF

ADC AX, TEMP [BX] ;Direcc. Indirecta.

ADD Add:

(Sumar): ADD añade el contenido del operando fuente al operando de destino (y almacena el
resultado en este ultimo). En esta rutina se supone que los valores que están añadiendo son
binarios.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

ADD AX, BX ;AX=AX+BX

ADD AX, TEMP ;AX=AX+TEMP

ADD SUM, BX ;SUM=SUM+BX

ADD CL,10 ;CL=CL+10

ADD AX, TEMP [BX] ;Direcc. Indirecta

CBW Convert byte to Word


(Convertir el byte en palabra): CBW convierte el valor de byte en AL a un valor de palabra en AX
extendiendo el valor de bit de alto orden de AL a través de todos los bits de AH.

CMP Compare

(Comparar): CMP se considera una instrucción aritmética debido a que el operando fuente se
sustrae del operando de destino. Sin embargo, el resultado se emplea para activar las banderas;
no se almacena en ningún lugar. Se puede hacer una prueba posterior de las banderas para el
control del programa.

Banderas afectadas

OF, SF, ZF, AF, PF, GF

Ejemplos de codificación

CMP AX, BX;

CMP AX, TEMP ;TEMP debe ser una palabra

CMP SUM, BX ;SUM debe ser una palabra

CMP CL, 3 ;Comparar con una constante

CMP AX,TEMP[BX) ;Dirección indirecta

CWD Convert Word to Doubleword

(Convertir una palabra en palabra doble): CWD convierte el valor de palabra en AX a un valor de
palabra doble en DX:AX extendiendo el valor de bit de alto orden de AX a través de todos los bits
de DX.

DAA Decimal Adjust for Addition

(Ajuste decimal para suma): DAA corrige el resultado (AL) de una operación anterior de suma
decimal codificada en binario (BCD).

Banderas afectadas

SF, ZF, AF, PF, CF, OF(no definida)


DAS Decimal Adjust for Subtraction

(Ajuste decimal para resta): DAS corrige el resultado (AL) de una operación anterior de resta
decimal codificada en binario (BCD).

Banderas afectadas

SF, ZF, AF, PF, CF, OF(no definida)

DEC Decrement

(Disminuir): DEC cambia, en decrementos de 1, el contenido del operando. Se supone que el


operando es un valor binario sin signo.

Banderas afectadas

OF, SF, ZF, AF, PF

Ejemplos de codificación

DEC AX

DEC SUM

DEC CL

DEC TEMP [SI]

DIV Divide

(Dividir): Si el operando es un valor de byte, DIV divide el contenido de AX entre el contenido del
operando y luego almacena el resultado en AL y el residuo en AH. Si el operando es un valor de
palabra, DIV divide el contenido de DX:AX entre el contenido del operando y luego almacena el
resultado en AX y el residuo en DX. Esta instrucción trata los números como valores binarios sin
signo.

Banderas afectadas

OF(no definida), SF(no definida), ZF(no definida), AF(no definida),

PF(no definida), CF(no definida).

Ejemplos de codificación

DIV BX ;AX=DX:AX/BX
DIV WRDTMP ;AX=DX:AX/WRDTMP

DIV BYTE SUM ;AL=AX/BYTE SUM

IDIV Integer Divide

(División de enteros): Si el operando es un valor de byte, IDIV divide el contenido de AX entre el


contenido del operando; luego almacena el resultado en AL y el residuo en AH. Si el operando es
un valor de palabra, IDIV divide el contenido de DX:AX entre el contenido del operando y luego
almacena el resultado en AX y el residuo en DX. Esta instrucción trata los números como valores
binarios sin signo.

Banderas afectadas

OF(no definida), SF[no definida), ZF(no definida), AF(no definida),

PF(no definida), CF(no definida)

Ejemplos de codificación

IDIV BX ;AX=DX:AX/BX

IDIV WRDTMP ;AX=DX:AX/WRDTMP

iDIV BYTE SUM ;AL=AX/BYTE_SUM

IDIV WORDTBL[BX] ;Dirección indirecta

IMUL Integer Multiply

(Multiplicación de enteros): Si el operando es un valor de byte, IMUL multiplica AL por el


contenido del operando y almacena el resultado en AX. Si el operando es un valor de palabra,
IMUL multiplica el contenido de AX por el contenido del operando y almacena al resultado en
DX:AX.Esta instrucción trata los números como valores binarios con signo.

Banderas afectadas

OF, CF, SF(no definida), ZF(no definida), AF(no definida), PF(no definida).

Ejemplos de codificación

IMUL BX ; DX:AX=AX*BX

IMUL WRDTMP ; DX:AX=AX*WKDTMP


IMUL BYTE_SUM ; AX=AL*BYTE_SUM

IMUL WORDTBL[BX] ; Dirección indirecta

INC Increment

(Incrementar): INC cambia, mediante incrementos de l , el contenido del operando. Se supone que
el operando es un valor binario sin signo.

Banderas afectadas

OF, SF, ZF, AF, PF

Ejemplos de codificación

INC AX

INC SUM

INC CL

INC TEMP [SI]

MUL Multiply

(Multiplicar): Si el operando es un valor de byte, MUL multiplica el contenido de AL por el


contenido del operando y almacena al resultado en AX. Si el operando es un valor de palabra, MUL
multiplica el contenido de AX por el contenido del operando y almacena el resultado en DX:AX.
Esta instrucción trata los números como valores binarios.

Banderas afectadas

OF, CF, SF (no definida),

ZF (no definida),

AF (no definida),

PF (no definida).

Ejemplos de codificación

MUL BX ;DX:AX=AX*BX

MUL WORD_TEMP ;DX:AX=AX*WORD TEMP


MUL BYTE_SUM ;AX=AL*BYTE SUM

MUL WORLD_TBL[BX] ;Dirección indirecta

SBB Subtract with Carry

(Restar con acarreo): SBB resta el contenido del operando fuente del operando de destino (y
almacena el resultado en este). Si la bandera de acarreo esta activada, el resultado cambia en
decrementos de 1. En esta instrucción, se supone que los valores añadidos son binarios.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

SBB AX,BX ;AX=AX-AX-CF

SBB AX,TEMP ;AX=AX-TEMP-CF

SBB SUM,BX ;SUM=SUM-BX-CF

SBB CL,l0 ;CL=CL-l0-CF

SBB AX,TEMP(BX) ;Dirección indirecta

SUB Subtract

(Restar): SUB resta el contenido del operando fuente del operando de destino (y almacena el
resultado en este). En esta instrucción, se supone que los valores añadidos son binarios.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

SUB AX,BX ; AX=AX-AX

SUB AX,TEMP ; AX=AX-TEMP

SUB SUM,BS ; SUM=SUM-BX

SUB CL,10 ; CL=CL-10

SUB AX,TEMP[BX] ; Dirección indirecta


FUNCIONES DE MANIPULACION DE BITS

AND Logical AND on Bits

(Y lógico sobre bits): Esta instrucción realiza un Y lógico de los operandos y almacena el resultado
en el operando de destino. Cada bit del byte o palabra resultante se pone en 1 solo si el bit
correspondiente de cada operando se pone en 1.

Banderas afectadas

OF, SF, ZF, PF, CF, AF(no definida)

Ejemplos de codificación

AND AX, BX ;

AND AX, TEMP ;TEMP debe ser una palabra

AND SUM, BX ;SUM debe ser una palabra

AND Cl,OOOOllllb ;Nibble alto en cero

AND AX, TEMP[BX] ;Dirección indirecta

OR Logical OR on Bits

(O lógico en bits): Esta instrucción realiza un O lógico de los operandos y almacena el resultado en
el operando de destino. Cada bit del byte o palabra resultante se pone en I si uno o ambos bits
correspondientes a cada operando se ponen en I.

Banderas afectadas

OF, SF, ZF, PF, CF,

AF (no definida)

Ejemplos de codificación

OR AL, BL

OR AL, l0000000b

OR DX, TEMP
OR AX, CX

RCL Rotate Left through Carry

(Rotar a la izquierda a lo largo del acarreo): RCL rota todos los bits del operando de destino a la
izquierda tantos lugares como indique el operando fuente. La rotación se realiza a través de la
bandera de acarreo en un orden que rota el bit mas significativo del operando de destino a la
bandera de acarreo, y esta al bit menos significativo del operando de destino.

Banderas afectadas

OF, CF

Ejemplos de codificación

RCL AX,1

RCL BL,3

RCL TEMP,CL

RCR Rotate Right through Carry

(Rotar a la derecha a lo largo del acarreo): RCR rota todos los bits del operando de destino a la
derecha tantos lugares como indique el operando fuente. La rotación se realiza a través de la
bandera de acarreo en un orden que rota el bit menos significativo del operando de destino a la
bandera de acarreo, y esta al bit mas significativo del operando de destino.

Banderas afectadas

OF, CF

Ejemplos de codificación

RCR AX,1

RCR BL,3

RCR TEMP,CL
ROL Rotate Left

(Rotar a la izquierda): ROL rota todos los bits del operando de destino a la izquierda tantos lugares
como indique el operando fuente.

Banderas afectadas

OF, CF

Ejemplos de codificación

ROL AX,1

ROL BL,3

ROL TEMP,CL

ROR Rotate Right

(Rotar a la derecha): ROR rota todos los bits del operando de destino a la derecha tantos lugares
como indique el operando fuente.

Banderas afectadas

OF, CF

Ejemplos de codificación

ROR AX, l

ROR BL, 3

ROR TEMP, CL

SAL Arithmetic Shift Left

(Desplazamiento aritmético a la izquierda): SAL desplaza todos los bits del operando de destino a
la izquierda tantos lugares como indique el operando fuente. Los bits de alto orden se pierden,
mientras que los de orden inferior se limpian.

Banderas afectadas

OF, SF, ZF, PF, CF,

AF (no definida)
Ejemplos de codificación

SAL AX,1

SAL BL,3

SAL TEMP,CL

SAR Arithmetic Shift Right

(Desplazamiento aritmético a la derecha): SAR desplaza todos los bits del operando de destino a la
derecha tantos lugares como indique el operando fuente. Los bits de orden inferior se pierden
mientras que los de alto orden adquieren el valor del bit de alto orden existente.

Banderas afectadas

OF, SF, ZF, PF, CF, AF (no definida)

Ejemplos de codificación

SAR AX,1

SAR BL,3

SAR TEMP,CL

SHL Shift Left

(Desplazar a la izquierda): SHL desplaza todos los bits del operando de destino a la izquierda tantos
lugares como indique el operando fuente. Los bits de alto orden se pierden y los de orden inferior
se limpian.

Banderas afectadas

OF, SF, ZF, PF, CF,

AF (no definida)

Ejemplos de codificación

SHL AX,1

SHL BL,3
SHL TEMP,CL

SHR Shift Right

(Desplazar a la derecha): SHR desplaza todos los bits del operando de destino a la derecha tantos
lugares como indique el operando fuente. Los bits de orden inferior se pierden y los de alto orden
se limpian.

Banderas afectadas

OF, SF, ZF, PF, CF,

AF (no definida)

Ejemplos de codificación

SHR AX,l

SHR BL,3

TEST Test Bits

(Bits de prueba): TEST realiza un Y lógico de los operandos, pero no se almacena el resultado. Solo
las banderas se ven afectadas. Cada bit del byte o palabra resultante se pone en 1 solo si el bit
correspondiente de cada operando es 1.

Banderas afectadas

OF, SF, ZF, PF, CF,

AF (no definida)

Ejemplos de codificación

TEST AX,BX;

TEST AX,TEMP ; TEMP debe ser una palabra

TEST SUM,BX ; SUM debe ser una palabra

TEST CL,OOOOllllb ;

TEST AX,TEMP[BX] ; Dirección indirecta


XOR Logical Exclusive-Or on bits

(O exclusivo lógico sobre bits): Esta instrucción realiza un XOR lógico de los operandos y almacena
el resultado en el operando de destino. Cada bit del byte o palabra resultante se pone en 1 solo si
el bit correspondiente de cada operando contiene valores opuestos.

Banderas afectadas

OF, SF, ZF, PF, CF, AF (no definida)

Ejemplos de codificación

XOR AX,BX;

XOR AX,TEMP ; TEMP debe ser una palabra

XOR SUM,BX ; SUM debe ser una palabra

XOR CL,OOOllllb ;

XOR AX,TEMP[BX] ;Dirección indirecta

FUNCIONES DE TRANSFERNCIA DE CONTROL

CALL Perform Subroutine

(Ejecutar una subrutina): CALL hace lo siguiente: 1)mete la dirección de desplazamiento de la


siguiente instrucción en la pila; 2)si el procedimiento llamado se declara como far (lejano),mete la
dirección de segmento de la siguiente instrucción en la pila; 3)carga IP (apuntador a instrucción)
con la dirección de desplazamiento del procedimiento llamado; y 4)si el procedimiento llamado se
declara como far, carga CS (segmento de código) con la dirección de segmento del procedimiento
llamado.

La ejecución continua entonces en la recién cargada dirección CS:IP hasta que se encuentre RET.

Ejemplos de codificación

CALL WHIZ BANG;

CALL [BX) ;Subrutina en dirección en [BX)

CALL AX ;Dirección en AX
INT Software Interrupt

(Interrupción por software): INT inicia una interrupción de software de la UCP y hace lo siguiente:
1)mete las banderas en la pila; 2)limpia las banderas TF e IF; 3)mete el valor de CS en la pila;
4)Carga CS Con la dirección de segmento de la interrupción invocada (que se encontró en la
dirección calculada en la tabla vectorial de interrupciones); 5)mete el valor de IP en la pila; y
6)carga IP con la dirección de desplazamiento de la interrupción invocada (que se encontró en la
dirección calculada en la tabla vectorial de interrupciones).

Después, la ejecución continua en la dirección CS:IP recién cargada hasta que se encuentre una
instrucción IRET.

Banderas afectadas

IF, TF

Ejemplos de codificación

INT lOh

INT 13h

INTO Interrupt on Overflow

(Interrumpir en sobreflujo): Si la bandera de sobreflujo (OF) esta activada, INTO ejecuta una
interrupción 4 y el control procede como si se hubiera emitido una INT 4. Hay que tener en cuenta
que, en este Caso, el registro de banderas se ve afectado como se describe para la instrucción INT.

IRET Return from Interrupt

(Regresar de una interrupción): IRET ocasiona la terminación de un procedimiento de interrupción


y (sacando los valores de IF, CS y el registro de banderas de la pila) regresa el control al punto en el
que ocurrió la interrupción.

Banderas afectadas

OF, DF, IF, TF, SF, ZF, AF, PF, CF

JA Jump if Above
(Saltar si es arriba): JA ocasiona que la ejecución de un programa se ramifique hacia la dirección
del operando si tanto la bandera de acarreo como la de cero están limpias. Esta instrucción es
funcionalmente igual que JNBE.

Ejemplo de codificación

JA NEXT_STEP

(JA SIGUIENTE_PASO)

JAE Jump if Above or Equal

(Saltar si es arriba o igual): JAE ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de acarreo esta limpia. Esta instrucción es funcionalmente
igual que JNB o JNC.

Ejemplo de codificación

JAE NEXT_STEP

(JAE SIGUIENTE PASO)

JB Jump if Below

(Saltar si es abajo): JB ocasiona que la ejecución de un programa se ramifique hacia la dirección del
operando si la bandera de acarreo esta activada. Esta instrucción es funcionalmente igual que JC o
JNAE.

Ejemplo de codificación

JB NEXT_STEP

(JB SIGUIENTE PASO)

JBE Jump if Below or Equal

(Saltar si es abajo o igual): JBE ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si esta activada la bandera de acarreo o la de cero. Esta instrucción es
funcionalmente igual que JNA.

Ejemplo de codificación

JBE NEXT_STEP
(JBE SIGUIENTE PASO)

JC Jump on Carry

(Saltar en acarreo): JC ocasiona que la ejecución de un programa se ramifique hacia la dirección


del operando si la bandera de acarreo esta activada. Esta instrucción es funcionalmente igual que
JB o JNAE.

Ejemplo de codificación

JC NEXT_STEP

(JC SIGUIENTE_PASO)

JCXZ Jump if CX=O

(Saltar si CX=0): JCXZ ocasiona que la ejecución de un programa se ramifique hacia la dirección del
operando si el valor de CX es 0.

Ejemplo de codificación

JCXZ SKIP LOOP

(JCXZ SALTAR CICLO)

JE Jump if Equal

(Saltar si es igual): JE ocasiona que la ejecución de un programa se ramifique hacia la dirección del
operando si la bandera de cero esta activada. Esta instrucción es funcionalmente igual que JZ.

Ejemplo de codificación

JE NEXT_STEP

(JE SIGUIENTE PASO)

JG Jump if Greater

(Saltar si es mayor): JG ocasiona que la ejecución de un programa se ramifique hacia la dirección


del operando si la bandera de signo es igual a la de sobreflujo o si la bandera de cero esta limpia.
Esta instrucción es funcionalmente igual que JNLE.
Ejemplo de codificación

JG NEXT_STEP

(JG SIGUIENTE PASO)

JGE Jump if Greater or Equal

(Saltar si es mayor o igual): JGE ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de signo es igual a la de sobreflujo. Esta instrucción es
funcionalmente igual que JNL.

Ejemplo de codificación

JGE NEXT_STEP

(JGE SIGUIENTE PASO)

JL Jump if Less Than

(Saltar si es menor que): JL ocasiona que la ejecución de un programa se ramifique hacia la


dirección del operando si la bandera de signo no es igual a la de sobreflujo. Esta instrucción es
funcionalmente igual que JNGE.

Ejemplo de codificación

JL NEXT_STEP

(JL SIGUIENTE_PASO)

JLE Jump if Less Than or Equal

(Saltar si es menor que o igual a): JLE ocasiona que la ejecución de un programa se ramifique hacia
la dirección del operando si la bandera de signo no es igual a la de sobreflujo o si la bandera de
cero esta activada.

Esta instrucción es funcionalmente igual que JNG.

Ejemplo de codificación

JLE NEXT_STEP

(JLE SIGUIENTE PASO)


JMP Jump

(Saltar): JMP ocasiona que la ejecución de un programa comience en la dirección del operando
designado. JMP afecta los registros CS e IP según sea necesario para producir esta ramificación
incondicional.

Ejemplos de codificación

JMP EXIT CODE

(JMP CODIGO SALIDA)

JMP [BX] ;Dirección en [BX]

JMP AX ;Dirección en AX

JNA Jump if Not Above

(Saltar si no es arriba): JNA ocasiona que la ejecución de un programa se ramifique hacia la


dirección del operando si esta activada la bandera de acarreo o la de cero. Esta instrucción es
funcionalmente igual que JBE.

Ejemplo de codificación

JNA NEXT_STEP

(JNA SIGUIENTE PASO)

JNAE Jump if Not Above or Equal

(Saltar si no es arriba o igual): JNAE ocasiona que la ejecución de un programa se ramifique hacia
la dirección del operando si la bandera de acarreo esta activada. Esta instrucción es
funcionalmente igual que JB o JC.

Ejemplo de codificación

JNAE NEXT_STEP

(JNAE SIGUIENTE_PASO)

JNB Jump if not Below


(Saltar si no es abajo): JNB ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de acarreo esta en cero. Esta instrucción es funcionalmente
igual que JAE o JNC.

Ejemplo de codificación

JNB NEXT_STEP

(JNB SIGUIENTE PASO

JNBE Jump if Not Below or Equal

(Saltar si no es abajo o igual): JNBE ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si tanto la bandera de acarreo como la de cero están limpias. Esta
instrucción es funcionalmente igual que JA.

Ejemplo de codificación

JNBE NEXT_STEP

(JNBE SIGUIENTE_PASO)

JNC Jump on No Carry

(Saltar en no acarreo): JNC ocasiona que la ejecución de un programa se ramifique hacia la


dirección del operando si la bandera de acarreo esta limpia. Esta instrucción es funcionalmente
igual que JAE o JNB.

Ejemplo de codificación

JNC NEXT_STEP

(JNC SIGUIENTE_PASO)

JNE Jump if Not Equal

(Saltar si no es igual): JNE ocasiona que la ejecución de un programa se ramifique hacia la


dirección del operando si la bandera de cero esta limpia. Esta instrucción es funcionalmente igual
que JNZ.

Ejemplo de codificación

JNE NEXT_STEP
(JNE SIGUIENTE_PASO)

JNG Jump if Not Greater Than

(Saltar si no es mayor que): JNG ocasiona que la ejecución del programa se ramifique hacia la
dirección del operando si la bandera de signo no es igual a la de sobreflujo o si la bandera de cero
esta activada. Esta instrucción es funcionalmente igual que JLE.

Ejemplo de codificación

JNG NEXT_STEP

(JNG SIGUIENTE_PASO)

JNGE Jump if Not Greater Than or Equal

(Saltar si no es mayor que o igual a): JNGE ocasiona que la ejecución del programa se ramifique
hacia la dirección del operando si la bandera de signo no es igual a la de sobreflujo. Esta
instrucción es funcionalmente igual que JL.

Ejemplo de codificación

JNGE NEXT_STEP

(JNGE SIGUIENTE_PASO)

JNL Jump if Not Less Than

(Saltar si no es menor que): JNL ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de signo es igual a la de sobreflujo. Esta instrucción es
funcionalmente igual que JGE.

Ejemplo de codificación

JNL NEXT_STEP

(JNL SIGUIENTE_PASO)

JNLE Jump if Not Less Than or Equal


(Saltar si no es menor que o igual a): JNLE ocasiona que la ejecución de un programa se ramifique
hacia la dirección del operando si la bandera de signo es igual a la de sobreflujo o si la bandera de
cero esta limpia. Esta instrucción es funcionalmente igual que JG.

Ejemplo de codificación

JNLE NEXT_STEP

(JNLE SIGUIENTE_PASO)

JNO Jump on No Overflow

(Saltar en no sobreflujo): JNO ocasiona que la ejecución de un programa se ramifique hacia la


dirección del operando si la bandera de sobreflujo esta limpia.

Ejemplo de codificación

JNO NEXT_STEP

(JNO SIGUIENTE_PASO)

JNP Jump on No Parity

(Saltar en no paridad): JNP ocasiona que la ejecución de un programa se ramifique hacia 1a


dirección del operando si la bandera de paridad esta limpia. Esta instrucción es funcionalmente
igual que JPO.

Ejemplo de codificación

JNP NEXT_STEP

(JNP SIGUIENTE_PASO)

JNS Jump on Not Sign

(Saltar en no signo): JNS ocasiona que la ejecución de un programa se ramifique hacia la dirección
del operando si la bandera de signo esta limpia.

Ejemplo de codificación

JNS NEXT_STEP

(JNP SIGUIENTE_PASO)
JNZ Jump on Not Zero

(Saltar en no cero): JNZ ocasiona que la ejecución un programa se ramifique hacia la dirección del
operando si la bandera de cero esta limpia. Esta instrucción es funcionalmente igual que JNE.

Ejemplo de codificación

JNZ NEXT_STEP

(JNZ SIGUIENTE_PASO)

JO Jump on Overflow

(Saltar en sobreflujo): JO ocasiona que la ejecución de un programa se ramifique hacia la dirección


del operando si la bandera de sobreflujo esta activada.

Ejemplo de codificación

JO NEXT_STEP

(JO SIGUIENTE_PASO)

JP Jump on Parity

(Saltar en paridad): JP ocasiona que la ejecución de un programa se ramifique hacia la dirección


del operando si la bandera de paridad esta activada. Esta instrucción es funcionalmente igual que
JPE.

Ejemplo de codificación

JP NEXT_STEP

(JP SIGUIENTE_PASO)

JPE Jump on Parity Even

(Saltar en paridad par): JPE ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de paridad esta activada. Esta instrucción es funcionalmente
igual que JP.
Ejemplo de codificación

JPE NEXT_STEP

(JPE SIGUIENTE_PASO)

JPO Jump on Parity Odd

(Saltar en paridad impar): JPO ocasiona que la ejecución de un programa se ramifique hacia la
dirección del operando si la bandera de paridad esta limpia. Esta instrucción es funcionalmente
igual que JNP.

Ejemplo de codificación

JPO NEXT_STEP

(JPO SIGUIENTE_PASO)

JS Jump on Sign

(Saltar en signo): JS ocasiona que la ejecución de un programa se ramifique hacia la dirección del
operando si la bandera de signo esta activada.

Ejemplo de codificación

JE NEXT_STEP

(JS SIGUIENTE_PASO)

JZ Jump on Zero

(Saltar en cero): JZ ocasiona que la ejecución de un programa se ramifique hacia la dirección del
operando si la bandera de cero esta activada. Esta instrucción es funcionalmente igual que JE.

Ejemplo de codificación

JZ NEXT_STEP

(JZ SIGUIENTE_PASO)

LOOP Loop
(Ciclo): Basándose en el contenido de CX, la ejecución del programa se ramifica hacia la dirección
del operando de destino. Si CX no es igual a 0, CX cambia en decrementos de 1 y ocurre la
ramificación. Si CX es 0, no ocurre decremento o ramificación y la ejecución continua en la
siguiente instrucción.

Ejemplo de codificación

LOOP PRINT LOOP

(LOOP IMPRIMIR CICLO)

LOOPE Loop While Equal

(Ciclo mientras es igual):Basándose en el contenido de CX y en la bandera de cero, la ejecución del


programa se ramifica hacia la dirección del operando de destino. Si CX no es igual a 0 y la bandera
de cero esta activada, CX cambia en decrementos de 1 y ocurre la ramificación. Si CX es 0 o si la
bandera de cero esta limpia, no ocurre decremento o ramificación, y la ejecución continua en la
siguiente instrucción. Esta instrucción es funcionalmente equivalente a LOOPZ.

Ejemplo de codificación

LOOPE TEST LOOP

(LOOPE CICLO PRUEBA)

LOOPNE Loop While Not Equal

(Ciclo mientras no es igual): Basándose en el contenido de CX y en la bandera de cero, la ejecución


del programa se ramifica hacia la dirección del operando de destino.

Si CX no es igual a 0 y la bandera de cero esta limpia, CX cambia en decrementos de 1 y ocurre la


ramificación. Si CX es 0 o la bandera de cero esta activada, no ocurre decremento o ramificación, y
la ejecución continua en la siguiente instrucción. Esta instrucción es funcionalmente equivalente a
LOOPNZ.

Ejemplo de codificación

LOOPNE TEST LOOP

(LOOPNE CICLO PRUEBA)


LOOPNZ Loop While Not Zero

(Ciclo mientras no es cero): Basándose en el contenido de CX y en la bandera de cero, la ejecución


del programa se ramifica hacia la dirección del operando de destino. Si CX no es igual a 0 y la
bandera de cero esta limpia, CX cambia en decrementos de 1 y ocurre la ramificación. Si CX es 0 o
si la bandera de cero esta activada, no ocurre decremento o ramificación, y la ejecución continua
con la siguiente instrucción. Esta instrucción es funcionalmente equivalente a LOOPNE.

Ejemplo de codificación

LOOPNZ TEST LOOP

(LOOPNZ CICLO PRUEBA)

LOOPZ Loop While Zero

(Ciclo mientras es cero): Basándose en el Contenido de CX y en la bandera de cero, la ejecución del


programa se ramifica hacia la dirección del operando de destino. Si CX no es igual a 0 y la bandera
de 0 esta activada, CX cambia en decrementos de 1 y ocurre la ramificación. Si CX es 0 o la bandera
de cero esta limpia, no ocurre decremento o ramificación, y la ejecución continua con la siguiente
instrucción. Esta instrucción es funcionalmente equivalente a LOOPE.

Ejemplo de codificación

LOOPZ TEST . LOOP

(LOOPZ CICLO PRUEBA)

RET Return from Subroutine

(Volver de la subrutina): Al sacar a IP de la pila, RET transfiere el control del programa de vuelta al
punto en el que se emitió un CALL. Si CALL fuera una llamada a un procedimiento far, tanto CS
como IP serian sacados de la pila. Si RET tiene un valor de retorno especifico (2, en el ejemplo de
codificacion), la pila se ajusta segun ese número de bytes. En el ejemplo de codificación se
muestra que una palabra se descarta de la pila después de que IP o CS:IP hayan sido sacados.

FUNCIONES DE CONTROL DE BANDERAS Y PROCESADOR


CLC Clear Carry Flag

(Limpiar la bandera de acarreo): CLC limpia la bandera de acarreo del registro de banderas
poniendo la bandera en 0.

Bandera afectada

CF

CLD Clear Direction Flag

(Limpiar la bandera de dirección): CLD limpia la bandera de dirección del registro de banderas
poniendo la bandera en 0.

Bandera afectada

DF

CLI Clear Interrupt Flag

(Limpiar la bandera de interrupción): CLI limpia la bandera de interrupción del registro de


banderas poniendo la en 0. Mientras la bandera de interrupción este en cero, la UCP no
reconocerá interrupciones enmascarables.

Bandera afectada

IF

CMC

Complement Carry Flag

(Complementar la bandera de acarreo): CMC conmuta la bandera de acarreo del registro de


banderas a lo opuesto de la disposición actual de la bandera.

Bandera afectada

CF

ESC Escape
(Escapar): Esta instrucción proporciona un medio para que los coprocesadores (como el 8087 u
otros coprocesadores numéricos) tengan acceso a datos en el flujo de datos del microprocesador.
Cuando se encuentra, esta instrucción ocasiona que el microprocesador coloque el operando en el
canal de datos y ejecute un NOP internamente.

Ejemplos de codificación

ESC 6, TEMP

ESC 15, CL

HLT Halt

(Parar): HLT ocasiona que el microprocesador detenga la ejecución y deje los registros CS:IP
apuntando a la instrucción que sigue a HLT. Esta condición de parar se termina solo después de
que el sistema recibe una interrupción o se activa la línea de RESET.

LOCK Lock Bus

(Bloquear el canal): LOCK prohibe la interferencia desde otros coprocesadores durante la


ejecución de la siguiente instrucción emitida. LOCK es un prefijo que se debe usar con otras
operaciones.

Ejemplo de codificación

LOCK XLAT

STC Set Carry Flag

(Activar la bandera de acarreo): STC activa la bandera de acarreo sin importar la condición
presente de esta.

Bandera afectada

CF

STD Set Direction Flag

(Activar la bandera de dirección): STD activa la bandera de dirección sin importar la condición
presente de esta. Tal activación afecta las instrucciones de cadenas.

Bandera afectada
DF

STI Set Interrupt Flag

(Activar la bandera de interrupción): STI activa la bandera de interrupción sin importar la condición
presente de esta. Mientras se activa dicha bandera, la UCP responde a interrupciones
enmascarables.

Bandera afectada

IF

WAIT Wait

(Esperar): WAIT ocasiona que la UCP espere una interrupción externa en la línea de TEST antes de
continuar.

FUNCIONES DE MANIPULACIÓN DE CADENAS

CMPSB Compare Strings, Byte for Byte

(Comparar cadenas, byte por byte): CMPSB compara cadenas, byte por byte. DI(índice de
destino)y SI(índice de fuente) cambian en incrementos o decrementos de 1, dependiendo de la
disposición de la bandera de dirección. Normalmente, esta instrucción se usa con las instrucciones
REPE, REPNE, REPNZ o REPZ a fin de repetir la comparación para un máximo de CX número bytes.
Intel lista este mandato como CMPS, pero diversos ensambladores hacen las distinciones de byte
(CMPSB) y palabra (CMPSW). Esta instrucción afecta solo las banderas; no se hace ningún cambio
a los operandos.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

CMPSB ;Comparar cadenas

REPE CMPSB ;Repetir


CMPSW Compare Strings, Word for Word

(Comparar cadenas, palabra por palabra): CMPSW compara cadenas, palabra por palabra. DI y SI
cambian en incrementos o decrementos de 2, dependiendo de la disposición de la bandera de
dirección. Normalmente, esta instrucción se usa junto con las instrucciones REPE, REPNE, REPNZ o
REPZ a fin de repetir la comparación para un máximo de CX palabras. Intel lista este mandato
como CMPS, pero diversos ensambladores hacen las distinciones de byte (CMPSB) y palabra
(CMPSW). Esta instrucción solo afecta las banderas; no se hace ningún cambio a los operandos.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación:

CMPSW ; Comparar cadenas

REPE CMPSW ; Repetir el ciclo

LODSB Load a Bytefrom String into AL

(Cargar un byte de cadena en AL): Esta instrucción carga AL con el contenido de la dirección
apuntada por SI. Después SI cambia en incrementos o decrementos de 1, dependiendo de la
activación de la bandera de dirección. Intel lista este mandato como LODS; sin embargo, varios
ensambladores pueden hacer la distinción entre byte (LODSB) y palabra (LODSW).

LODSW Load a Wordfrom String into AX

(Cargar una palabra de cadena en AX): Esta instrucción carga AX con el contenido de la dirección
apuntada por SI. Después SI cambia en incrementos o decrementos de 2, dependiendo de la
activación de la bandera de dirección. Intel lista este mandato como LODS; sin embargo, varios
ensambladores pueden hacer la distinción entre byte (LODSB) y palabra (LODSW).

MOVSB Move String, Byte-by-Byte

(Transferir una cadena, byte por byte): MOVSB transfiere cadenas, byte por byte. Los valores de SI
y DI cambian en incrementos o decrementos de 1, dependiendo de la activación de la bandera de
dirección. Normalmente, esta instrucción se usa con la instrucción REP a fin de repetir la
transferencia para un máximo de bytes de CX. Intel lista este mandato como MOVS; sin embargo,
varios ensambladores hacen la distinción entre byte y palabra.
Ejemplos de codificación

MOVSB

REP MOSVB ; Repetir un ciclo de transferencia

MOVSW Move String, Word-by-Word

(Transferir una cadena, palabra por palabra) : MOVSW transfiere cadenas, palabra por palabra. Los
valores de SI y DI cambian en incrementos o decrementos de 2, dependiendo de la activación de la
bandera de dirección. Normalmente, esta instrucción se usa con la instrucción REP a fin de repetir
la transferencia para un máximo de palabras de CX. Intel lista este mandato como MOVS; sin
embargo, varios ensambladores hacen la distinción entre byte y palabra.

Ejemplos de codificación

MOVSW

REP MOVSW ;Repetir un ciclo de transferencia

REP Repeat

(Repetir): REP ocasiona que las instrucciones de manipulación de cadenas se repitan tantas veces
como se indique en CX.

Ejemplo de codificación

REP MOVSB

REPE Repeat if Equal

(Repetir si es igual): REPE ocasiona que las instrucciones de manipulación de cadenas se repitan
tantas veces como se indique en CX.

Cuando se usa con CMPSB, CMPSW, SCASB o SCASW, esta instrucción causa la repetición solo
mientras la bandera de cero esta activada. Esta instrucción es funcionalmente equivalente a REPZ.

Ejemplo de codificación

REPE CMPSW
REPNE Repeat if not Equal

(Repetir si no es igual): REPNE ocasiona que las instrucciones de manipulación de cadenas se


repitan el número de iteraciones especificas en CX. Cuando se usa con CMPSB, CMPSW, SCASB o
SCASW esta instrucción causa la repetición solo mientras la bandera de cero vale cero. Esta
instrucción es funcionalmente equivalente a REPNZ.

Ejemplo de codificación

REPNE CMPSW

REPNZ Repeat if Not Zero

(Repetir si no es cero): REPNZ ocasiona que instrucciones de manipulación de cadenas se repitan


el número de iteraciones especificadas en CX. Cuando se usa con CMPSB, CMPSW, SCASB o
SCASVW, esta instrucción causa la repetición solo cuando la bandera de cero esta limpia. Esta
instrucción es funcionalmente equivalente a REPNE.

Ejemplo de codificación

REPNZ CMPSW

REPZ Repeat if Zero

(Repetir si es cero): REPZ ocasiona que instrucciones de manipulación de cadenas se repitan tantas
veces como se indique en CX. Cuando se usa con CMPSB, CMPSW, SCASB o SCASW, esta
instrucción causa la repetición solo cuando la bandera de cero esta activada. Esta instrucción es
funcionalmente equivalente a REPE.

Ejemplo de codificación

REPZ CMPSW

SCASB Scan String for Byte

(Examinar una cadena por byte): SCASB resta el byte de cadena del operando de destino
(apuntado por DI)del valor de AL. No se almacena el resultado pero se actualizan las banderas.
Entonces el valor de DI cambia en incrementos o decrementos de 1, dependiendo de la activación
de la bandera de dirección.
Normalmente, esta instrucción se usa con las instrucciones REPE, REPNE, REPNZ o REPZ para
repetir el exámen un máximo de CX bytes, o hasta que SCASB encuentre una concordancia o una
diferencia. Intel lista este mandato como SCAS; sin embargo, varios ensambladores hacen las
distinciones entre byte y palabra.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

SCASB

REPNZ SCASB ; Repetir un ciclo de exámen

SCASW Scan String for Word

(Examinar una cadena por palabra): SCASW resta la palabra de cadena del operando de destino
(apuntado por DI) del valor de AX. No se almacena el resultado pero se actualizan las banderas.
Entonces el valor de DI cambia en incrementos o decrementos de 2, dependiendo de la activación
de la bandera de dirección.

Normalmente, esta instrucción se usa con las instrucciones REPE, REPNE, REPNZ o REPZ para
repetir el examen un máximo de CX bytes, o hasta que SCASW encuentre una concordancia o una
diferencia. Intel lista este mandato como SCAS; sin embargo, varios ensambladores hacen las
distinciones entre byte y palabra.

Banderas afectadas

OF, SF, ZF, AF, PF, CF

Ejemplos de codificación

SCASW

REPNZ SCASW ; Repetir un ciclo de examen

STOSB Store Byte in AL at String

(Almacenar el byte de AL en la cadena): Esta instrucción copia el contenido de AL en la dirección


de byte apuntada por DI. Entonces DI cambia en incrementos o decrementos de 1, dependiendo
de la activación de la bandera de dirección. Intel lista este mandato como STOS; sin embargo,
varios ensambladores hacen las distinciones entre byte y palabra.
STOSW Store Word in AX at String

(Almacenar palabra de AX en la cadena): Esta instrucción copia el contenido en AX en la dirección


de palabras apuntada por DI. Entonces DI cambia en incrementos o decrementos de 2,
dependiendo de la activación de la bandera de dirección. Intel lista este mandato como STOS; sin
embargo, varios ensambladores hacen las distinciones entre byte y palabra.

FUNCIONES DE TRANFERENCIA DE DATOS

IN Input from Port

(Entrada desde un puerto): IN carga un byte o una palabra de la dirección especifica del puerto de
E/S de hardware a AL o AX, respectivamente. Un número de puerto inferior a 256 puede
especificarse como una constante o una variable en el registro DX, pero un número de puerto
superior a 255 debe especificarse en el registro DX.

Ejemplos de codificación

IN AL, 64h

IN AX, DX

LAHF Load AH Register with Flags

(Cargar el registro AH con banderas): LAHF copia el byte de orden inferior del registro de banderas
en AH. Después de la ejecución de esta instrucción, los bits 7, 6, 4, 2 y 1 de AH son iguales a SF, ZF,
AF, PF y CF, respectivamente.

LDS Load DS Register

(Cargar el registro DS (segmento de datos): LDS realiza dos operaciones distintas: carga DS con la
dirección de segmento del operando fuente, y carga el operando de destino con la dirección de
desplazamiento del operando fuente.

Ejemplo de codificación

LDS SI, SOURCE_BUFFER

(LDS SI, BUFFER_FUENTE)


LEA Load Effective Address

(Cargar la dirección efectiva): LEA transfiere la dirección de desplazamiento del operando fuente al
operando de destino. E1 operando de destino debe ser un registro general de palabras.

Ejemplo de codificación

LEA AX, MESSAGE_l

(LEA AX, MENSAJE_l)

LES Load ES Register

(Cargar el registro ES (segmento extra)) : LES realiza dos operaciones distintas: carga ES con la
dirección de segmento del operando fuente, y carga el operando de destino con la dirección de
desplazamiento del operando fuente.

Ejemplo de codificación

LES DI, DEST_BUFFER

(LES DI, BUFFER_DEST)

MOV Move

(Transferir): MOV copia el contenido del operando fuente en el operando de destino. Ambos
operandos deben tener la misma longitud.

Ejemplos de codificación

MOV AX,BX ; AX=BX

MOV AX,WRDTMP ; AX=WRDTMP

MOV WRDSUM,BX ; WRDSUM=BX

MOV CL,57 ; CL=57

MOV DEC,10 ; DEC=10

MOV AX,TEMP[BX] ; Dirección indirecta


OUT Output to Port

(Salir a puerto): OUT envía un byte (AL) o palabra (AX) a la dirección de puerto de E/S de hardware
especificada. Un número de puerto menor que 256 puede especificarse como una constante o
como una variable en el registro DX. Sin embargo, un número de puerto mayor que 255 debe
especificarse en el registro DX.

Ejemplos de codificación

OUT AL, 64h

OUT AX, DX

POP Remove Data from Stack

(Quitar datos de la pila): POP quita una palabra de la pila y la sitúa en el operando de destino
deseado.

Ejemplos de codificación

POP AX

POP DS

POP HOLD REG

(POP GUARD REG)

POPF Remove Flags from Stack

(Quitar banderas de la pila): POPF quita una palabra de la pila y la sitúa en el registro de banderas.

Banderas afectadas

OF, DF, IF, TF, SF, ZF, AF, PF, CF

PUSH Place Data on Stack

(Colocar datos en la pila): PUSH coloca en la pila una copia del valor del operando.

Ejemplos de codificación
PUSH AX

PUSH DS

PUSH HOLD REG

(PUSH GUARD REG)

PUSHF Place Flags on stack

(Colocar banderas en la pila): PUSHF coloca en la pila una copia del registro de banderas.

SAHF Store AH into Flag Register

(Almacenar AH en el registro de banderas): SAHF copia el contenido de AH en el byte de orden


inferior del registro de banderas. Después de la ejecución de esta instrucción, SF, ZF, AF, PF y CF
son iguales a los bits 7, 6, 4, 2 y 1 de AH, respectivamente.

Banderas afectadas

SF, ZF, AF, PF, CF

XCHG Exchange

(Intercambiar): XCHG intercambia el contenido de los operandos fuente y de destino.

Ejemplos de codificación

XCHG AX,BX ;Intercambiar AX con BX

XCHG CL,CH ;Intercambiar CL con CH

XLAT Translate

(Traducir): Suponiendo que la dirección de desplazamiento de una tabla de traducción de 256


bytes esta contenida en BX, esta instrucción usa el valor en AL como un desplazamiento basado en
cero dentro de la tabla, y posteriormente carga AL con el valor de byte en el desplazamiento
calculado. Esta instrucción es útil para tablas de traducción.
CONCLUSIONES

En conclusión todas estas instrucciones son de gran ayuda a la hora de comprender de una
manera más a fondo el funcionamiento de este tipo de procesadores y para usar ciertos comandos
a la hora de programar el funcionamiento del microprocesador.

REFERENCIAS

http://ebadillo_computacion.tripod.com/ensamblador/8086_res.pdf

http://www.alpertron.com.ar/INST8088.HTM

http://www.virtual.unal.edu.co/cursos/ingenieria/2000477/lecciones/031201.htm

-----------------------

8088

8086

También podría gustarte