Академический Документы
Профессиональный Документы
Культура Документы
Introducción…………………………………………………………………………..2
Conclusión…………………………………………………………………………...13
Referencias…………………………………………………………………………..14
Conjunto de instrucciones………………………………………………………..21
Conclusión…………………………………………………………………………...43
Referencias…………………………………………………………………………..44
INTRODUCCIÓN
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.
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.
• Resistencias
• Diodos
• Condensadores
• Conexiones
• Millones de transistores
• ALU: unidad aritmético-lógica que hace cálculos con números y toma decisiones lógicas.
• Bus: transportan información digital (en bits) a través del chip y de la computadora.
• 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.
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.
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.
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.
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.
Son muchas las tecnologías que han permitido este gran crecimiento en las capacidades de los
microprocesadores, estas son algunas:
• Multiprocesador.
• Multinúcleo.
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.
[pic]
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.
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.
[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)
7. A9 (Bus de direcciones)
8. A8 (Bus de direcciones)
23. /TEST
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)
31. HOLD (Indica que otro integrado quiere adueñarse del control de los buses, generalmente se
usa para DMA o acceso directo a memoria).
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)
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.
[pic]
Los 40 pines del 8086 en modo MÁXIMO tienen las siguientes funciones:
1. GND (Masa)
23. /TEST
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.
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.
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)
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
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).
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 |
Aquellas instrucciones que realizan operaciones aritméticas con los operandos, como suma, resta,
etc. Alteran las banderas de estado.
|Instrucción |Función |
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 |
|Instrucción |Función |
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.
|Instrucción |Función |
Instrucciones de salto
• 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 |
|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.
|
• 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 |
Estas instrucciones permiten activar interrupciones o acceder a servicios del sistema o de la ROM-
BIOS.
|Instrucción |Función |
|Instrucción |Función |
|LAHF |Cargar las banderas en AH. |
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 |
• 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 |
En este apartado se encuentran aquellas instrucciones que alteran el contenido del registro de
banderas, o que afectan al funcionamiento básico del procesador.
Son instrucciones utilizadas para comunicar la CPU con el bus y con otros procesadores.
|Instrucción |Función |
CONJUNTO DE INSTRUCCIONES
FUNCIONES ARITMETICAS
(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).
(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:
(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
AF (no definida),
CF (no definida).
(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).
Banderas afectadas
Ejemplos de codificación
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
Ejemplos de codificación
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
Ejemplos de codificación
(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.
(Ajuste decimal para suma): DAA corrige el resultado (AL) de una operación anterior de suma
decimal codificada en binario (BCD).
Banderas afectadas
(Ajuste decimal para resta): DAS corrige el resultado (AL) de una operación anterior de resta
decimal codificada en binario (BCD).
Banderas afectadas
DEC Decrement
Banderas afectadas
Ejemplos de codificación
DEC AX
DEC SUM
DEC CL
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
Ejemplos de codificación
DIV BX ;AX=DX:AX/BX
DIV WRDTMP ;AX=DX:AX/WRDTMP
Banderas afectadas
Ejemplos de codificación
IDIV BX ;AX=DX:AX/BX
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
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
Ejemplos de codificación
INC AX
INC SUM
INC CL
MUL Multiply
Banderas afectadas
ZF (no definida),
AF (no definida),
PF (no definida).
Ejemplos de codificación
MUL BX ;DX:AX=AX*BX
(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
Ejemplos de codificación
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
Ejemplos de codificación
(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
Ejemplos de codificación
AND AX, BX ;
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
AF (no definida)
Ejemplos de codificación
OR AL, BL
OR AL, l0000000b
OR DX, TEMP
OR AX, CX
(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
(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
(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
(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
AF (no definida)
Ejemplos de codificación
SAL AX,1
SAL BL,3
SAL TEMP,CL
(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
Ejemplos de codificación
SAR AX,1
SAR BL,3
SAR TEMP,CL
(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
AF (no definida)
Ejemplos de codificación
SHL AX,1
SHL BL,3
SHL TEMP,CL
(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
AF (no definida)
Ejemplos de codificación
SHR AX,l
SHR BL,3
(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
AF (no definida)
Ejemplos de codificación
TEST AX,BX;
TEST CL,OOOOllllb ;
(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
Ejemplos de codificación
XOR AX,BX;
XOR CL,OOOllllb ;
La ejecución continua entonces en la recién cargada dirección CS:IP hasta que se encuentre RET.
Ejemplos de codificación
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
(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.
Banderas afectadas
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)
(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
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
(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
Ejemplo de codificación
JC NEXT_STEP
(JC SIGUIENTE_PASO)
(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
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
JG Jump if Greater
JG NEXT_STEP
(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
Ejemplo de codificación
JL NEXT_STEP
(JL SIGUIENTE_PASO)
(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.
Ejemplo de codificación
JLE NEXT_STEP
(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 AX ;Dirección en AX
Ejemplo de codificación
JNA NEXT_STEP
(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)
Ejemplo de codificación
JNB NEXT_STEP
(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)
Ejemplo de codificación
JNC NEXT_STEP
(JNC SIGUIENTE_PASO)
Ejemplo de codificación
JNE NEXT_STEP
(JNE SIGUIENTE_PASO)
(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)
(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)
(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)
Ejemplo de codificación
JNLE NEXT_STEP
(JNLE SIGUIENTE_PASO)
Ejemplo de codificación
JNO NEXT_STEP
(JNO SIGUIENTE_PASO)
Ejemplo de codificación
JNP NEXT_STEP
(JNP SIGUIENTE_PASO)
(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
Ejemplo de codificación
JO NEXT_STEP
(JO SIGUIENTE_PASO)
JP Jump on Parity
Ejemplo de codificación
JP NEXT_STEP
(JP SIGUIENTE_PASO)
(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)
(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
Ejemplo de codificación
Ejemplo de codificación
Ejemplo de codificación
Ejemplo de codificación
(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.
(Limpiar la bandera de acarreo): CLC limpia la bandera de acarreo del registro de banderas
poniendo la bandera en 0.
Bandera afectada
CF
(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
Bandera afectada
IF
CMC
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.
Ejemplo de codificación
LOCK XLAT
(Activar la bandera de acarreo): STC activa la bandera de acarreo sin importar la condición
presente de esta.
Bandera afectada
CF
(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
(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.
(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
Ejemplos de codificación
(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
Ejemplos de codificación:
(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).
(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).
(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
(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 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
(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
Ejemplo de codificación
REPNE CMPSW
Ejemplo de codificación
REPNZ CMPSW
(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
(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
Ejemplos de codificación
SCASB
(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
Ejemplos de codificación
SCASW
(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
(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.
(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
(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
(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
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
(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 AX, DX
(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
(Quitar banderas de la pila): POPF quita una palabra de la pila y la sitúa en el registro de banderas.
Banderas afectadas
(Colocar datos en la pila): PUSH coloca en la pila una copia del valor del operando.
Ejemplos de codificación
PUSH AX
PUSH DS
(Colocar banderas en la pila): PUSHF coloca en la pila una copia del registro de banderas.
Banderas afectadas
XCHG Exchange
Ejemplos de codificación
XLAT Translate
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