Está en la página 1de 43

UNIDAD I

Fundamentos.

1.1 Introducción al Lenguaje Ensamblador

Lenguaje de Bajo Nivel.


Se denomina lenguaje máquina a la serie de datos que la parte física de la computadora o
hardware, es capaz de interpretar. Una computadora digital o, mejor dicho, su parte
física, sólo distingue datos de tipo binario, es decir, constituidos por dos únicos valores a
los que se denomina valor 0 y valor 1 y que, físicamente, se materializan con tensiones
comprendidas entre 0 y 4.0 voltios y entre 4 y 5 voltios, respectivamente.

Para representar datos que contengan una información se utilizan una serie de unos y
ceros cuyo conjunto indica dicha información. La información que hace que el hardware de
la computadora realice una determinada actividad de llama instrucción. Por consiguiente
una instrucción es un conjunto de unos y ceros. Las instrucciones así formadas equivalen
a acciones elementales de la máquina, por lo que al conjunto de dichas instrucciones que
son interpretadas directamente por la máquina se denomina lenguaje máquina. El
lenguaje máquina fue el primero que empleo el hombre para la programación de las
primeras computadoras. Una instrucción en lenguaje máquina puede representarse de la
siguiente forma:

011011001010010011110110

Esta secuencia es fácilmente ejecutada por la computadora, pero es de difícil


interpretación, siendo aun más difícil la interpretación de un programa (conjunto de
instrucciones) escrito de esta forma. Esta dificultad hace que los errores sean frecuentes y
la corrección de los mismos costosa, cuando no imposible, al igual que la verificación y
modificación de los programas. La anterior secuencia de dígitos binarios (bits) puede
indicar a la computadora que:

«Traslade el contenido de la posición de memoria X a la posición de memoria Y»

Si lo vemos escrito de esta forma, lo entenderemos fácilmente, ya que está en nuestro


lenguaje natural, pero la máquina elemental será incapaz de entender nada. Vemos, pues,
que la forma de indicar a la máquina lo que debe hacer es totalmente diferente de la
indicar a un ser humano lo mismo, por lo que deben emplearse sistemas de traducción de
una forma a otra. Ya se ha dicho que en un principio el programador empleaba
directamente el lenguaje máquina. En este caso el traductor era el programador; pero
vimos también los problemas que esto causaba.

Con la práctica en el manejo de la máquina se cayó en la cuenta de que se podría utilizar


la propia máquina para ayudar en la traducción de estos programas. Es decir, que si a una
máquina elemental se le dotaba de un programa, también elemental, que tradujera un
número determinado de caracteres de caracteres alfabéticos en una secuencia de unos y
ceros, se podría escribir un programa constituido por una secuencia de grupos de
caracteres alfabéticos, en la que cada uno de los grupos indicaría una acción a realizar por
el ordenador y, una vez escrito el programa, sería la propia máquina la que pasaría los
grupos de caracteres a bits.

Las ventajas de esto son evidentes, ya que para el hombre resulta más fácil manipular
grupos de caracteres y la traducción se haría de manera automática. Por ejemplo, se
podría escribir:
TRASLADAR 11010110, 00011101
Esto indicaría que el contenido de la posición 11010110 había que pasarlo a la posición
00011101 si se sabe que al grupo alfabético TRASLADAR le corresponde la secuencia de
bits 11110101. La máquina traduciría la anterior instrucción como:

11110101 11010110 00011101

Al grupo alfabético se le denomina mnemotécnico, y existirá un mnemotécnico por cada


instrucción. Se le da este nombre porque sirve para recordar con mayor facilidad el
conjunto de instrucciones de una determinada máquina.

De esta forma aparecieron los lenguajes ensambladores (Assembler, en inglés). Poco a


poco, con el avance de la programación (Software), estas primeras y sencillas ayudas se
fueron haciendo más complejas, permitiendo que, además de los mnemotécnicos
correspondientes a la operación a realizar, se pudieran emplear otros para indicar, por
ejemplo, los operandos. La anterior instrucción se podría escribir de la siguiente forma:

TRASLADAR POS-A POS-B

Que nos resulta de más fácil comprensión. También se introdujo la posibilidad de indicar a
la computadora la dirección de un salto en la secuencia de ejecución de un programa
mediante la utilización de etiquetas.

A los programas que permiten pasar del programa escrito de esta manera (programa
fuente, en ensamblador) al lenguaje máquina también se les denomina normalmente
ensambladores. Estos traductores, como ya se ha dicho, se fueron complicando cada vez
más para que la labor del programador fuera más fácil, incluyendo los denominados
directivos del ensamblador, que son órdenes o informaciones que el programador da al
traductor, no instrucciones de lenguaje máquina.

Aun con todas estas sofisticaciones ayudas, el programador de lenguaje ensamblador


debe conocer perfectamente el sistema físico (Hardware) de la máquina con que trabaja,
pues aunque emplee mnemotécnicos, etiquetas, etc., éstas sirven para indicar una
posición de memoria determinada, un registro o cualquier otra parte de la máquina. Por
eso se dice que el lenguaje ensamblador es un lenguaje de bajo nivel, es decir, ligado con
el «hardware» concreto de una determinada máquina. Aquí radica la diferencia importante
con los lenguajes más complejos, llamados de alto nivel, como el Basic, Pascal, Cobol,
Ada, C++, Java, etc., ya que en éstos el programador no tiene porque reconocer el
«harware» de la máquina. Trabaja con variables, constantes e instrucciones simbólicas, y
es el traductor quien las transforma en las direcciones apropiadas.

1.1.1 Ventajas de los Lenguajes Ensambladores

El corazón de la computadora es el microprocesador, éste maneja las necesidades


aritméticas, de lógica y de control de la computadora. El microprocesador tiene su origen
en la década de los sesenta, cuando se diseño el circuito integrado (IC por sus siglas en
ingles) al combinar varios componentes electrónicos en un solo componente sobre un
“chip” de silicio.

Los fabricantes colocaron este diminuto chip en un dispositivo parecido a un ciempiés y lo


conectaron a un sistema en funcionamiento. A principios de los años setenta Intel
introdujo el chip 8008 el cual, instalado en una computadora terminal, acompaño a la
primera generación de microprocesadores. En 1974 el 8008 evoluciono en el 8080, un
popular microprocesador de la segunda generación para propósitos generales. En 1978
Intel produjo la tercera generación de procesadores 8086, para proporcionar alguna
compatibilidad con el 8080 y que representan un avance significativo de diseño.
Después, Intel desarrollo una variación del 8086 para ofrecer un diseño sencillo y
compatibilidad con los dispositivos de entrada/salida de ese momento. Este nuevo
procesador, el 8088, fue seleccionado por IBM para su computadora personal en 1981.
Una versión mejorada del 8088 es el 80188, y versiones mejoradas del 8086, son los
80186, 80286, 80386, 80486 y el Pentium, cada uno de ellos permite operaciones
adicionales y más procesamiento.

La variedad de microcomputadoras también ocasiono un renovado interés en el lenguaje


ensamblador, cuyo uso conlleva a diferentes ventajas:
• Un programa escrito en el lenguaje ensamblador requiere considerablemente
menos memoria y tiempo de ejecución que un programa escrito en los conocidos
lenguajes de alto nivel, como Pascal y C.
• El lenguaje ensamblador da a un programador la capacidad de realizar tareas muy
técnicas que serian difíciles, si no es que imposibles de realizar en un lenguaje de
alto nivel.
• El conocimiento del lenguaje ensamblador permite una comprensión de la
arquitectura de la maquina que ningún lenguaje de alto nivel puede ofrecer.

Aunque la mayoría de los especialistas en Software desarrolla aplicaciones en lenguajes de


alto nivel, que son más fáciles de escribir y de dar mantenimiento, una practica común es
recodificar en lenguaje ensamblador aquellas rutinas que han causado cuellos de botella
en el procesamiento. Los programas residentes y rutinas de servicio de interrupción casi
siempre son desarrollados en el lenguaje ensamblador.

Los lenguajes de alto nivel fueron diseñados para eliminar las particularidades de una
computadora especifica, mientras que un lenguaje ensamblador esta diseñado para una
computadora especifica, o, de manera más correcta, para una familia especifica de
microprocesadores.

A continuación se listan los requisitos para aprender el lenguaje ensamblador de la PC:


Tener acceso a una computadora personal de IBM (cualquier modelo) o una compatible y
estar familiarizados con su uso. Una copia de un programa ensamblador. Las versiones de
Microsoft son conocidas como MASM y Quick Assembler: TASM es de Borland y OPTASM
es de System.

Para el aprendizaje de lenguaje ensamblador no es necesario lo siguiente:


Conocimiento previo de un lenguaje de programación, aunque tenerlo puede ayudarle a
comprender algunos conceptos de programación más rápido.
Conocimiento previo de electrónica o circuitería.

1.1.2 Escalabilidad de los microprocesadores.

El microprocesador es uno de los logros más sobresalientes del siglo XX. Esas son
palabras atrevidas, y hace un cuarto de siglo tal afirmación habría parecido absurda. Pero
cada año, el microprocesador se acerca más al centro de nuestras vidas, forjándose un
sitio en el núcleo de una máquina tras otra. Su presencia ha comenzado a cambiar la
forma en que percibimos el mundo e incluso a nosotros mismos. Cada vez se hace más
difícil pasar por alto el microprocesador como otro simple producto en una larga línea de
innovaciones tecnológicas.

Ninguna otra invención en la historia se ha diseminado tan aprisa por todo el mundo o ha
tocado tan profundamente tantos aspectos de la existencia humana. Hoy existen casi
15,000 millones de microchips de alguna clase en uso (el equivalente de dos
computadoras poderosas para cada hombre, mujer y niño del planeta). De cara a esa
realidad, ¿quién puede dudar que el microprocesador no sólo está transformando los
productos que usamos, sino también nuestra forma de vivir y, por último, la forma en que
percibimos la realidad? No obstante que reconocemos la penetración del microprocesador
en nuestras vidas, ya estamos creciendo indiferentes a la presencia de esos miles de
máquinas diminutas que nos encontramos sin saberlo todos los días. Así que, antes de
que se integre de manera demasiado imperceptible en nuestra diaria existencia, es el
momento de celebrar al microprocesador y la revolución que ha originado, para apreciar el
milagro que es en realidad cada uno de esos chips de silicio diminutos y meditar acerca de
su significado para nuestras vidas y las de nuestros descendientes.

La unidad de procesamiento central (CPU) es donde se manipulan los datos. En una


microcomputadora, el CPU completo está contenido en un chip muy pequeño llamado
microprocesador. Todas las CPU tienen por lo menos dos partes básicas, la Unidad de
Control (UC) y la Unidad Aritmética y Lógica (ALU). Todos los recursos de la computadora
son administrados desde la UC, cuya función es coordinar todas las actividades de la
computadora. La unidad de control contiene las instrucciones de la CPU para llevar a cabo
comandos. El conjunto de instrucciones, que está incluido dentro de los circuitos de la
unidad de control, es una lista de todas las operaciones que realiza la CPU. Cada
instrucción en el conjunto de instrucciones es acompañada por un microcódigo, que son
instrucciones muy básicas que le dicen a la CPU cómo ejecutar las instrucciones. Cuando
la computadora corre un programa, busca los comandos del programa dentro del conjunto
de instrucciones de la CPU y las ejecuta en orden. Cuando la unidad de control encuentra
una instrucción que involucra aritmética o lógica, le pasa el control al segundo
componente de la CPU. La ALU incluye un grupo de registros, es decir, memoria
construida directamente en la CPU que se usa para guardar datos que están siendo
procesados por la instrucción actual.

La CPU de una computadora contiene la inteligencia de la máquina; es donde se realizan


los cálculos y las decisiones. El complejo procedimiento que transforma datos nuevos de
entrada en información útil de salida se llama procesamiento. Para llevar a cabo esta
transformación, la computadora usa dos componentes: el procesador y la memoria. El
procesador es el cerebro de la computadora, la parte que interpreta y ejecuta las
instrucciones. El procesador casi siempre se compone de varios circuitos integrados o
chips, estos están insertados en tarjetas de circuitos, módulos rígidos rectangulares con
circuitos que los unen a otros chips y a otras tarjetas de circuitos.
El microprocesador moderno contiene unos 20 millones de transistores y cada chip
terminado es el producto de procesos más complicados que los que se utilizaron en el
Proyecto Manhattan para construir la bomba atómica. Y no obstante, pese a un proceso de
manufactura extraordinariamente refinado, los microchips se producen en volumen a
razón de más de 1,000 millones de unidades por año. Para poner esta complejidad en
perspectiva, imagínese que dentro de cada microprocesador diminuto existe una
estructura tan compleja como una ciudad de tamaño mediano, incluidas todas sus líneas
de energía eléctrica, líneas telefónicas, líneas de drenaje, edificios, calles y casas. Ahora
imagine que en esa misma ciudad, millones de personas se desplazan a la velocidad de la
luz y con la sincronización perfecta en una danza de coreografía muy complicada. Y eso es
tan sólo un chip. De todas las estadísticas asombrosas que se utilizan para describir el
mundo del microprocesador, ninguna es más extraordinaria que ésta: el número total de
transistores que integran todos los microchips que se producirán en el mundo este año es
equivalente al número de gotas de lluvia que caerán en California durante ese mismo
periodo.

Avance Tecnológico de los procesadores.

En 1975 Intel decidió ponerse manos a la obra para construir su primer micro de 16 bits
que salió al mercado en 1978. Se trataba del 8086, que definió el inicio de su gama de
productos más famosa, la familia de microprocesadores x86. La longitud de los registros
del 8086 era de 16 bits (de ahí su denominación de 16 bits), había versiones que
funcionaban a 4.77 y 8 MHz, tenía un bus de datos de 16 bits y un bus de direcciones de
20 bits, lo que le permitía acceder a un máximo de memoria de 1 Mb según el cálculo 2
elevado a 20.

Seguidamente, en 1979, Intel sacó el 8088, que en contra de lo que podamos pensar no
es mejor que el 8086. La diferencia era sustancial; el bus de datos era de 8 bits (la
mitad). Este paso hacia atrás estuvo provocado por el estado de la industria de la época.
Utilizar un bus de datos de 16 bits suponía forzar al mercado a desarrollar para 16 bits lo
que implicaba un incremento en los costes de desarrollo de controladores de periféricos y
memorias. El síntoma fue que Intel se había adelantado a su época.

Los japoneses, aprovechando la ocasión fabricaron unos clónicos de los 8086 y 8088. Fue
NEC la que, por procedimientos de reingeniería, sacó el diseño de estos micros y creó sus
modelos V20 y V30, que incrementaban el rendimiento respecto a los de Intel en un 10–
30 por ciento. Intel demandó a NEC, pero perdió el juicio. La Justicia determinó que el
microcódigo del chip podía registrarse pero Intel no había marcado en el chip el símbolo
del copyright, con lo cual perdía los derechos de copia.

Intel fabricó variaciones de estos modelos, sacando al mercado los 80C86, 80C88, 80186
y 80188 cuyas modificaciones fueron el ahorro de energía en las versiones C para su
instalación en portátiles, y el rediseño interno para la optimización en las versiones 1.

En 1984 aparece el 80286 como base para una nueva generación de ordenadores de IBM,
el IBM AT (Advanced Technology). Supone un nuevo salto tecnológico. Además de
incrementar el bus de direcciones de 20 bits a 24, lo que permitía acceder hasta los 16 Mb
de RAM, se incrementaba la velocidad, llegando a ser hasta un 25 por ciento más rápidos
que los 8086 y 8088 originales. La novedad más importante que se introdujo fue la
gestión de memoria virtual. La memoria virtual es una extensión de memoria en disco (o
dispositivo de almacenamiento secundario) añadida a la memoria física instalada. Así, el
80286 es capaz de tratar hasta un total de 1 Gb, desglosado en 16 Mb de memoria física
más 1008 Mb de memoria virtual. La memoria virtual solamente la utilizan los programas
que están preparados para ello.
Aparece también un nuevo modo de operación del microprocesador. Aparte del modo real
(el normal de operación) que direcciona hasta 1 Mb de memoria física y asegura la
compatibilidad para aplicaciones diseñadas par los 8086/8088, se tiene el modo protegido
que no es compatible con estos programas desarrollados para los micros antes
mencionados. El modo protegido es el que permite acceder a los 1.008 Mb de memoria
virtual.

El 80286 trabaja en su arranque en modo real. El cambio a modo protegido, lo que se


conoce técnicamente como upshift, no es reversible (downshift), siendo necesario hacer
un reset del microprocesador para volver al modo real; sin duda un gran fallo de diseño.
El 80286 se presentó con velocidades de reloj de 2, 8, 10, 12, 16 y 20 MHz.

80386 DX y SX introducidos en 1985, el 80386 DX supera un nuevo escalón en el avance


tecnológico en microprocesadores. Se incorpora una nueva ampliación y surge el número
mágico, el 32. Los buses de datos y de direcciones se amplían hasta 32 líneas de datos,
ocurriendo lo mismo con el tamaño de los registros. Esta ampliación supone un
incremento en la memoria RAM física instalada. Puede direccionar 4 Gb de memoria física
(DX significa Double word eXternal) y 64 Tb de memoria virtual, una cifra que en la
actualidad está aún muy por encima de las posibilidades económicas de los usuarios.
Arranca en modo real, al igual que el 8086, e incorpora un nuevo modo de operación: el
modo real virtual del 8086, que permite tener varias sesiones 8086 trabajando
simultáneamente simulando una especie de pseudomultitarea.
BIT 0 1 2 3 4 5 6 7 8 9 10 11
BANDERA CF X PF X AF X ZF SF TF IF DF OF

En los microprocesadores anteriores la gestión de memoria se realizaba en segmentos de


16 Kb. Con el 80286 este tamaño de los segmentos de la memoria se hacían muy
pequeños y el programador tenía que trabajar más para adaptarse a una gran cantidad de
segmentos. El 80386 permite la definición de segmentos de memoria de tamaño variable.
Aparte, Intel corrigió la deficiencia del downshifting, pudiéndose realizar por software.
Otra de las innovaciones en la inclusión de una memoria cache interna en el chip
destinada a almacenar instrucciones provenientes de memoria sin necesidad de que la
unidad de ejecución intervenga. Intel comete un nuevo error en el diseño del micro que
genera inexactitudes en el cálculo de 32 bits, que se presentan en los micros lanzados al
mercado hasta mayo del 1987. Los modelos corregidos van etiquetados con una doble
sigma mayúscula o con el identificativo DX. Este error afectaba a las operaciones de
multiplicación de 32 bits. Ocurría bajo las siguientes circunstancias:
• Se usa la memoria virtual y se produce una demanda de página.
• El coprocesador matemático 80387 está instalado y en uso.
• Debe ocurrir una operación de acceso directo a memoria (DMA).
• El 80386 debe estar en estado de espera (Wait State).

Se detecta un segundo bug denominado POPAD bug. Su efecto es el vaciado del registro
acumulador EAX cuando se ejecuta una instrucción de acceso a memoria inmediatamente
después de la ejecución de la instrucción POPAD.

Aparecen variaciones que afectan al consumo de energía pensadas para portátiles, se


trataba de los 80386SL (Slow Low power) y 80386SLC (Slow Low power Cache), que es
propiedad de IBM aunque lo fabrique Intel. Las frecuencias de funcionamiento eran de 12,
20, 25 y 33 MHz.

El 80386SX (SX significa Simple word eXternal) tiene las mismas características que el
80386DX, salvo que el bus de direcciones externo se reduce a 16 bits. Introducido en
1988 daba la potencia de un 80386 a precio de un 80286. Durante mucho tiempo se
rumoreó que el P9 podría ser compatible con los zócalos 80286, pero al final no fue así. La
razón es que el 80286 multiplexa todos sus buses para conseguir con menos líneas el
mismo resultado (menor coste) El 80386SX sólo multiplexa el bus de direcciones. Las
frecuencias de funcionamiento eran de 16, 20, 25 y 33 MHz.

El 80486DX salió al mercado en 1989. La estructura interna hablando en términos


numéricos es igual a la de un 80386. El tamaño de los registros y de los buses es de 32
bits. Mantiene los tres modos de operación: real, protegido y real virtual. Las diferencias
reales con los 80386DX son que tiene un flag más, un estado de excepción más, 2 bits
más en la tabla de entrada de páginas, 6 instrucciones y los registros de control tienen
una longitud de 9 bits.

Se realizan también cambios en la arquitectura interna. Se crea un mayor número de


líneas hardware lo que implica un incremento en la velocidad. Se imponen reglas de
diseño más estrictas, lo que supone un reducción del tamaño del chip. Al reducirse el
tamaño se reduce también el consumo y consiguientemente la temperatura que alcanza el
chip, con lo cual lo podemos hacer funcionar a un mayor número de ciclos de reloj, lo que
supondrá la aparición de los Overdrives. Se incluye un coprocesador matemático interno
que dobla las prestaciones de un 80387 trabajando a la misma velocidad. Se logra un
diseño mejor y la comunicación entre el chip principal y el coprocesador matemático es
interna, lo que mejora la velocidad en las transferencias y unas sincronizaciones más
estrechas.

La memoria cache (8 Kb) del microprocesador está dividida en 4 caches de 2 Kb cada una.
Esto agiliza la ejecución de algunas aplicaciones. Si se asigna una memoria cache
secundaria (L2) el rendimiento del micro puede aumentar hasta un 30 por ciento más.
El 80486SX es igual que un 80486DX, sólo que el coprocesador matemático está
inhabilitado. El coprocesador matemático 80487SX es en realidad un 80486DX puro que
desactiva por completo el 80486SX, sin que podamos retirarlo de la placa. Las velocidades
a las que funcionan son de 25, 33, 40 y 50 MHz. Hay versión SL para portátiles.

80486DX2, 80486DX4, 80486SX2 son modelos de microprocesadores que en realidad son


iguales que sus hermanos menores. Internamente duplican la velocidad del reloj del
sistema. Es igual que revolucionar el motor de un coche para que corra más. Las
consecuencias son obvias: un sobrecalentamiento del micro con una reducción de
potencia. Por este motivo se recomienda utilizar un método de disipación de calor para
que el rendimiento no se vea reducido (laminillas disipadoras o ventiladores). Las
velocidades a las que trabajan son: 50, 66, 75 y 100 (sólo para el DX4) MHz para los DX2
y 40 y 50 MHz para los SX2.

Los 80486 tampoco están libres del pecado original. En el 80486 cuando el coprocesador
matemático detecta un error de límite del tamaño de segmento, algunas veces la CPU falla
al generar la excepción 13. Este error se genera bajo las siguientes condiciones:
• Segmento de datos de 64 Kb.
• Operandos de direccionamiento de 16 bits.
• Almacenar un valor de 8 bytes desde el coprocesador cuando la mitad está fuera de
los limites del limite del segmento.
• Un segundo bug aparece en el cálculo de la instrucción dedicada a calcular
arcotangentes.

Intel comenzó una nueva política con la salida de los microprocesadores con la
denominación Overdrive. Los Overdrive eran actualizaciones para los microprocesadores
instalados en los sistemas que dispusieran de un segundo zócalo para tal propósito. En
esta primera generación de Overdrives los chips disponían de un duplicador de frecuencia
interno y tenían un pin más, el número 169. Este pin se encargaba de inhabilitar el 80486
instalado en la placa dejando como único micro funcionando el Overdrive. No era posible
la retirada del micro anterior, puesto que el sistema dejaba de funcionar. La política de
actualización era buena, lo que no era tan bueno era la trampa para los usuarios. Si se
puede retirar el micro anterior se puede vender a usuarios que necesiten menos potencia,
salieron los primeros en 1991.

En la segunda generación de Overdrives se olvidó el pin 169, teniendo los 168 que los
hacían compatibles con los zócalos de los 80486. En estos casos la actualización es
sencillísima: quitar el que estaba y poner el nuevo en el mismo lugar.

La tercera generación de Overdrives trabaja con un consumo menor para reducir de este
modo su alta temperatura. El voltaje se reduce a 3.3 voltios de los 5 que necesitaban los
anteriores. Si vas a comprar un DX2 o DX4 fíjate bien qué voltaje utiliza la placa. Los
Overdrives etiquetados como tal funcionan a 5V, los etiquetados directamente como DX4,
sin disipador, funcionan a 3.3V.

La quinta generación de microprocesadores Intel tomó el nombre de Pentium. Aparecido


en marzo de 1993 en frecuencias de trabajo de 60 y 66 MHz llega a ser cinco veces más
potente que un 80486 a 33 MHz. Fabricados con un proceso BiCMOS de geometría de 8
micras y con una arquitectura superescalar, los microprocesadores Pentium se encuadran
en un concepto RISC (Reduced Instruction Set Computer). Mientras que el 80386 y el
80486 tienen una unidad de ejecución, el Pentium tiene dos, pudiendo ejecutar dos
instrucciones por ciclo de reloj con sus correspondientes cálculos, ya que también tiene
dos unidades aritméticas y lógicas (ALU). El 80386 tiene el concepto CISC (Complex
Instruction Set Computer) que ejecuta una instrucción en varios ciclos de reloj y el 80486
ejecuta una instrucción por ciclo de reloj (en términos medios).

Intel toma como modelo la estructura separada para la memoria cache interna del
microprocesador. Consta de dos bloques de 8 Kb, uno para las instrucciones y otro para
los datos que funcionan bajo una estructura de asociación de conjuntos bidireccional. Para
los extremadamente curiosos el algoritmo de sustitución de datos en la cache es el LRU
(Least Recently Used, el menos utilizado recientemente). El coprocesador matemático
incluido utiliza algoritmos mejorados y añade instrucciones de suma, multiplicación y
división de números en punto flotante integradas en el silicio, además de incorporar un
pipeline de 8 niveles para lograr ejecutar operaciones en punto flotante en un solo ciclo de
reloj. Se integran nuevos avances tecnológicos, además de los ya comentados, como por
ejemplo la predicción de ramificaciones, buses de datos internos de 256 bits, bus de datos
externo de 64 bits (que soporta transferencias de 258 Kbytes por segundo) y memorias
cache de escritura diferida.

La tecnología de bus PCI (Peripheral Component Interconnect "Interconexión de


Componentes Periféricos”) se presenta junto con el Pentium, que incorporaba una mejor
implementación del bus local. Permite tener hasta 10 conectores PCI en un primer nivel,
conectados al procesador a través de la circuitería controladora PCI (conexión no directa).

Intel apunta ahora hacia el mercado del entorno cliente/servidor. Con el Pentium se puede
construir un ordenador multiprocesador con 16 Pentium instalados, pudiendo actuar uno
de ellos como agente supervisor del sistema para entornos que requieran un estricto
control de errores (FRC Functional Redundancy Checking ). Aunque esto sirvió de poco en
un principio. La nueva y mejorada unidad de punto flotante cometía un error garrafal al
hacer una simple división. Recientemente han aparecido versiones del Pentium a 75, 90,
100 y 133 MHz, siendo el último, presentado el 23 de octubre, uno a 120 MHz diseñado
especialmente para ordenadores portátiles.

El 18 de septiembre de 1995 Intel anuncia la disponibilidad de un nuevo modelo


procesador de mejora Pentium Overdrive a 83 MHz (además del modelo a 63 MHz que ya
existía) que permite la actualización de los microprocesadores 80486 DX, DX2 y SX.
Compatible pin a pin con estos microprocesadores en Pentium Overdrive integra la
tecnología del Pentium en 3,3 voltios y 0′6 micras.

Aparte de ser como un Pentium genuino cabe destacar la presencia de una memoria cache
de 32 Kb, un regulador de tensión para reducir la tensión de 5 a 3,3 voltios, disipador y
ventilador integrado y una circuitería interna que incrementa en dos veces y media la
frecuencia del bus del sistema (33 MHz * 2′5 = 82′5 MHz). El incremento medio en las
prestaciones respecto a un 80486 a 66 MHz es de un 50 por ciento aunque en aplicaciones
puntuales (Auto CAD 13) puede ser de un 96 por ciento, lo que lo sitúa en las
prestaciones de un Pentium genuino a 75 MHz.

El Pentium Pro a 133 MHz, es el primer microprocesador de la tercera generación de la


gama Pentium. Está preparado específicamente para ejecutar aplicaciones compiladas y
desarrolladas para 32 bits. Algunas aplicaciones desarrolladas para entornos de 16 bits
tienen una reducción de rendimiento en su ejecución en sistemas basados en un Pentium
Pro respecto a los Pentium normales a 133 MHz. Perfectamente compatible con sus
hermanos menores incorpora nuevas mejoras, de las cuales destaca la ejecución
dinámica, tema al que dedicaremos un apartado especial y la inclusión de una memoria
cache secundaria integrada en el encapsulado del chip. Fabricado en una geometría de 0′6
micras, Intel está realizando sus desarrollos con vistas a reducirla a 0′35 micras como la
de los Pentium actuales a 133 MHz, lo que reducirá su temperatura y podrá elevarse la
frecuencia de reloj hasta los 200 MHz.

Este nuevo producto tiene un bus que ha sido diseñado para conectar varios Pentium Pro
en paralelo que soporta el protocolo MESI (Modified Exclusive Shared Invalid), es un
microprocesador de 32 bits que incorpora una instrucción más (mover datos
condicionalmente) que supone una mayor predicción de ramificaciones en la ejecución.
Tiene 21 millones de transistores, 5′5 millones en el núcleo y 15′5 millones en la memoria
cache secundaria. La CPU consta de dos chips colocados en cavidades independientes
conectadas internamente. El chip correspondiente a la memoria cache es más pequeño
que el del chip del núcleo, ya que la disposición de los transistores permite una mayor
concentración.

Intel luego trabajo en sus modelos P 55 C?, P68 y P7. El P 55 C, es una versión Lite del
Pentium Pro, presumiblemente compatible pin a pin con los zócalos de 80486 y fue
especialmente diseñado para ejecutar aplicaciones de Windows 95. El P68 y el P7
corresponden a un nuevo escalón, ya que son micros de 64 bits que se presentarán a lo
largo de 1997. El primero es el sucesor del Pentium Pro compatible con la familia x86,
mientras que el P7 es una coproducción de Intel y Hewlett-Packard que utilizará la
tecnología PA-RISC de HP.

http://www.intel.co.nz/espanol/

http://members.tripod.com/~alpertron/

1.1.3 Tipos de lenguajes ensambladores.

Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a sus características. Así podemos clasificarlos en:

Ensambladores Cruzados (Cross-Assembler).


Se denominan así los ensambladores que se utilizan en una computadora que posee un
procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa
objeto producido. El empleo de este tipo de traductores permite aprovechar el soporte de
medios físicos (discos, impresoras, pantallas, etc.), y de programación que ofrecen las
máquinas potentes para desarrollar programas que luego los van a ejecutar sistemas muy
especializados en determinados tipos de tareas.

Ensambladores Residentes.

Son aquellos que permanecen en la memoria principal de la computadora y cargan, para


su ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de
que se puede comprobar inmediatamente el programa sin necesidad de transportarlo de
un lugar a otro, como se hacía en cross-assembler, y sin necesidad de programas
simuladores.

Sin embargo, puede presentar problemas de espacio de memoria, ya que el traductor


ocupa espacio que no puede ser utilizado por el programador. Asimismo, también ocupará
memoria el programa fuente y el programa objeto. Esto obliga a tener un espacio de
memoria relativamente amplio. Es el indicado para desarrollos de pequeños sistemas de
control y sencillos automatismo empleando microprocesadores. La ventaja de estos
ensambladores es que permiten ejecutar inmediatamente el programa; la desventaja es
que deben mantenerse en la memoria principal tanto el ensamblador como el programa
fuente y el programa objeto.

Macroensambladores.

Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su


potencia, normalmente son programas robustos que no permanecen en memoria una vez
generado el programa objeto. Puede variar la complejidad de los mismos, dependiendo de
las posibilidades de definición y manipulación de las macroinstrucciones, pero
normalmente son programas bastantes complejos, por lo que suelen ser ensambladores
residentes.

Microensambladores.

Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo


de instrucciones, es decir, que el intérprete de las mismas interpretaba de igual forma un
determinado código de operación.

El programa que indica al intérprete de instrucciones de la CPU cómo debe actuar se


denomina microprograma. El programa que ayuda a realizar este microprograma se llama
microensamblador. Existen procesadores que permiten la modificación de sus
microprogramas, para lo cual se utilizan microensambladores.

Ensambladores de una fase.

Estos ensambladores leen una línea del programa fuente y la traducen directamente para
producir una instrucción en lenguaje máquina o la ejecuta si se trata de una
pseudoinstrucción. También va construyendo la tabla de símbolos a medida que van
apareciendo las definiciones de variables, etiquetas, etc.

Debido a su forma de traducción, estos ensambladores obligan a definir los símbolos antes
de ser empleados para que, cuando aparezca una referencia a un determinado símbolo en
una instrucción, se conozca la dirección de dicho símbolo y se pueda traducir de forma
correcta. Estos ensambladores son sencillos, baratos y ocupan poco espacio.

Ensambladores de dos fases.

Los ensambladores de dos fases se denominan así debido a que realizan la traducción en
dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de
símbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y
pueden ir traduciendo totalmente, puesto que conocen la totalidad de los símbolos
utilizados y las posiciones que se les ha asignado. Estos ensambladores son los más
utilizados en la actualidad.

1.1.4 Clasificación de Memorias.

Las memorias han evolucionado mucho desde los comienzos del mundo de la
computación. Conviene recordar los tipos de memorias de semiconductores empleadas
como memoria principal y unas ligeras pinceladas sobre cada una de ellas para enmarcar
las memorias flash dentro de su contexto.

Organizando estos tipos de memoria conviene destacar tres categorías si las clasificamos
en función de las operaciones que podemos realizar sobre ellas, es decir, memorias de
sólo lectura, memorias de sobre todo lectura y memorias de lectura y escritura.

Memorias de sólo lectura

• ROM: Se usan principalmente en microprogramación de sistemas. Los fabricantes las


suelen emplear cuando producen componentes de forma masiva. Es una memoria
solamente de lectura es totalmente inalterable sin esta memoria la maquina no arrancaría.
La memoria principal es la convencional que va de 0 a 640 kb. Cuando la máquina arranca
comienza a trabajar el disco y realiza un testeo, para lo cual necesita memoria, esta
memoria es la convencional (ROM) y está dentro del motherboard (en el BIOS). Apenas
arranca utiliza 300 kb, sigue cargando y llega a más o menos 540 kb donde se establece.
A medida de que comenzaron a haber software con más necesidad de memoria apareció
la llamada memoria expandida que iba de 640 kb a 1024 kb. Una vez que se utilizaba
toda la memoria convencional se utilizaba la expandida que utiliza la memoria RAM. A
medida que pasa el tiempo los 1024 kb eran escasos y se creo la memoria extendida que
va de 1024 kb a infinito que es la memoria RAM pura.

• PROM: (Programmable Read Only Memory): El proceso de escritura es eléctrico. Se


puede grabar posteriormente a la fabricación del chip, a diferencia de las anteriores que
se graba durante la fabricación. Permite una única grabación y es más cara que la ROM.
Es una memoria digital donde el valor de cada bit depende del estado de un fusible (o
antifusible), que puede ser quemado una sola vez. Por esto la memoria puede ser
programada (pueden ser escritos los datos) una sola vez a través de un dispositivo
especial, un programador PROM. Estas memorias son utilizadas para grabar datos
permanentes en cantidades menores a las ROMs, o cuando los datos deben cambiar en
muchos o todos los casos.

Memorias de sobre todo lectura

• EPROM (EPROM son las siglas de Erasable Programmable Read-Only Memory (ROM
borrable y programable). Es un tipo de chip de memoria ROM inventado por el ingeniero
Dov Frohman que retiene los datos cuando la fuente de energía se apaga. En otras
palabras, no es volátil.

Está formada por celdas de FAMOS (Floating Gate Avalanche-Injection Metal-Oxide


Semiconductor) o transistores de puerta flotante. Cada uno de ellos viene de fábrica sin
carga, por lo que es leído como un 1 (por eso una EPROM sin grabar se lee como FF en
todas sus celdas). Se programan mediante un dispositivo electrónico que proporciona
voltajes superiores a los normalmente utilizados en los circuitos electrónicos. Las celdas
que reciben carga se leen entonces como un 0. Una vez programada, una EPROM se
puede borrar solamente mediante exposición a una fuerte luz ultravioleta. Esto es debido
a que los fotones de la luz excitan a los electrones de las celdas provocando que se
descarguen. Las EPROMs se reconocen fácilmente por una ventana transparente en la
parte alta del encapsulado, a través de la cual se puede ver el chip de silicio y que admite
la luz ultravioleta durante el borrado.

• EEPROM son las siglas de Electrically-Erasable Programmable Read-Only Memory (ROM


programable y borrable eléctricamente), en español o castellano se suele referir al hablar
como E2PROM y en inglés “E-Squared-PROM”. Es un tipo de memoria ROM que puede ser
programado, borrado y reprogramado eléctricamente, a diferencia de la EPROM que ha de
borrarse mediante rayos ultravioletas. Aunque una EEPROM puede ser leída un número
ilimitado de veces, sólo puede ser borrada y reprogramada entre 100.000 y 1.000.000 de
veces.

• MEMORIA FLASH: Está basada en las memorias EEPROM pero permite el borrado bloque
a bloque y es más barata y densa. La memoria flash es una forma evolucionada de la
memoria EEPROM que permite que múltiples posiciones de memoria sean escritas o
borradas en una misma operación de programación mediante impulsos eléctricos, frente a
las anteriores que sólo permite escribir o borrar una única celda cada vez. Por ello, flash
permite funcionar a velocidades muy superiores cuando los sistemas emplean lectura y
escritura en diferentes puntos de esta memoria al mismo tiempo. Flash, como tipo de
EEPROM que es, contiene un array de celdas con un transistor evolucionado con dos
puertas en cada intersección. Tradicionalmente sólo almacenan un bit de información. Las
nuevas memorias flash, llamadas también dispositivos de celdas multi-nivel, pueden
almacenar más de un bit por celda variando el número de electrones que almacenan.

Cabe destacar que las memorias flash están subdividas en bloques (en ocasiones llamados
sectores) y por lo tanto, para el borrado, se limpian bloques enteros para agilizar el
proceso, ya que es la parte más lenta del proceso. Por esta razón, las memorias flash son
mucho más rápidas que las EEPROM convencionales, ya que borran byte a byte. No
obstante, para reescribir un dato es necesario limpiar el bloque primero para reescribir su
contenido después.

Memorias de Lectura/Escritura

• MEMORIA RAM o Memoria de acceso Aleatorio ( Random Access Memory ).Esta memoria
es como un escritorio al igual que los escritorios tienen cajones donde ordenan la
información, cuanto mas grande sea el escritorio (plano de apoyo) mas cajones voy a
tener de tal suerte que el micro va a perder menos tiempo en buscar y ordenar la
información

La importancia de esta memoria es tan grande que si esta ausente la PC NO ARRANCA,


Actúa como si estuviera muerta no hay sonido ni cursor en la pantalla ni luces que se
enciendan o apaguen. Para que sirve: Almacena las instrucciones que debe ejecutar el
micro en cada momento Este es el lugar físico donde debe trabajar el procesador cuando
abrimos un programa sus instrucciones se copian automáticamente en la memoria, y
cuando cerremos el programa todo se borrara. También copia los trabajos que estamos
haciendo en ese programa En la RAM se copian programas que coordinan el
funcionamiento de la PC: La primera parte de la Ram esta reservada para guardar las
instrucciones de los dispositivos electrónicos. En este lugar no se puede guardar nada ya
que lo utiliza el sistema para saber como manejar los dispositivos.

• DRAM (Dynamic Random Access Memory): Los datos se almacenan como en la carga de
un condensador. Tiende a descargarse y, por lo tanto, es necesario un proceso de refresco
periódico. Son más simples y baratas que las SRAM. Este tipo de memoria se utilizan des
los años 80 hasta ahora en toda las computadoras Esta memoria tiene una desventaja hay
que estimularla (Refresco) permanentemente porque se olvida de todo. Como se
estimula: requiere un procesador que ordene el envió de cargas eléctricas, a este tipo de
memorias se le conoce como memoria estáticas Otras de las desventajas de esta memoria
es que es lenta y la ventaja es que es barata. Obviamente al tener estas desventajas se le
incorporaron distintas tecnologías para mejorarlas.

• FPM DRAM. La ventaja de este memoria consiste en pedir permiso una sola vez u
llevarse varios datos consecutivos esto comenzó a usarse principios de os años noventa y
dio buenos resultados a estos módulos se los denominaron SIMM FPM DRAM y pueden
tener 30 o 72 pines y se la utiliza en las Pentium I lo que logro con esta tecnología es
agilizar el proceso de lectura, estas memorias ya no se utilizan mas.

• EDO DRAM Estas memorias aparecieron en 1995, y se hicieron muy populares ya que
estaban presentes en todas las Pentium I MMX y tenia la posibilidad de localizar un dato
mientras transfería otro, a diferencia de las anteriores que mientras transfería un dato se
bloqueaba. Estas EDO SIMM eran de 72 pines

• RDRAM. Es una memoria muy costosa y de compleja fabricación y la utilizan procesador


Pentim IV para arriba corre a velocidades de 800 Mhz sus módulos se denominan Rimm
de 141 pines y con un ancho de 16 bits, para llenar un banco de memoria de 64 bits hay
que instalar 4 memorias, es posible que estas memoria sean retiradas del mercado por
ser tan costosas

• SDRAM: Esta Memoria entro en el mercado en 1997, y mejoro la velocidad siendo su


ritmo de trabajo igual a la velocidad de Bus (FSB) es decir que tienen la capacidad de
trabajar a la misma velocidad de motherboard al que se conectan. Estos módulos de 168
Pines son conocidos como DIMM SDRAM PC 66 y 100, 133, obviamente si instalo una de
133, en un motherboard de 100 va a funcionar a 100Mhz.

• DDR SDRAM: En este caso se consiguió que pudiera realizar dos transferencia en una
pulsación o tic-tac de reloj, esta memoria pude alcanzar velocidades de 200 a 266Mhz,
Tiene una ventaja mas trabaja en sincronía con el bus del motherboard si este acelera la
memoria también pero tiene una desventaja son muy caras. Se conoce como DIMM DDR
SDRAM PC 1600 Y PC 2100.

• SRAM (Static Random Access Memory): Los datos se almacenan formando biestables,
por lo que no requiere refresco. Igual que DRAM es volátil. Son más rápidas que las DRAM
y más caras.

• MEMORIA CACHÉ o SRAM: La memoria caché trabaja igual que la memoria virtual,
tenemos caché en el procesador, en los discos y en el motherboard y nos guarda
direcciones de memoria. Si ejecutamos un programa en principio, lo cerramos y luego los
volvemos a ejecutar, la memoria caché nos guarda la ubicación (dirección) en el disco,
cuando lo ejecuté, y lo que hicimos con el programa. Es mucho más rápida cuando ya
usamos un programa
Tipos de memoria caché:

Cache L1: Esta dividido en dos bloques uno contiene las instrucciones y otro los datos y
cuando se habla de su capacidad de almacenamiento se dice que es de 2×16 Kb. El cache
L1 se encuentra dentro del interior del procesador y funciona a la misma velocidad que el
micro con capacidades que van desde 2×8 hasta 2×64Kb

Cache L2 interno y externo: La primeras memoria caché estaban ubicadas en el


motherboard luego se construyeron en el procesador, pero no dentro del cuerpo del
procesador por lo que es mas lento que el caché L1. La computadoras que tienen las tres
tecnologías de caché van a ser mas rápidas.

Cache L3: Algunos micro soportan un nivel de caché mas, el L3 que esta localizado en el
motherboard.

1.1.5 Unidades de entrada / salida.

Dispositivos de entrada
Son todos los elementos que permiten la unión del usuario con la unidad de
procesamiento central y la memoria.: Entre estos tenemos: Teclado, Mouse o Ratón y
Joysticks, Escáner o digitalizador de imágenes, Dispositivos ópticos, Micrófonos.

Teclado: Dispositivos de entrada que traducen los datos a una forma que la computadora
pueda interpretar, para luego procesarlos y almacenarlos.

Mouse y Joysticks: Dispositivos que convierten el movimiento físico en señales eléctricas


binarias y que la misma sea repetida en el monitor.

Escáner o digitalizador de imágenes: Están concebidos para interpretar caracteres,


combinación de caracteres, dibujos gráficos escritos a mano o en maquinas o impresoras
y traducirlos al lenguaje que la computadora entiende.

Dispositivos ópticos: entre estos tenemos, Lector de marcas o rastreador de marca óptica,
Digitalizador de imágenes (scanner), Cámara digital:

Digitalizador de audio: entre estos tenemos, Micrófonos

Dispositivos de salida
Estos dispositivos permiten al usuario ver los resultados de los cálculos o de las
manipulaciones de datos de la computadora. Los dispositivos de salida más comunes son:
el monitor, la impresora y el módem.

Monitor: sirve como dispositivo de salida para recibir mensajes del computador.

Impresora: seguro Una impresora permite obtener una copia dura o física de cualquier
información que pueda aparecer en pantalla. Hay dos grupos básicos que son: impresora
de Impacto y no impacto (tinta o laser) o de página.

Módem: dispositivo que sirve para enlaza dos ordenadores transformando las señales
digitales.

Dispositivos de Almacenamiento
Son todos los dispositivos que se utilizan para almacenar información de la computadora.
Disco Duro: es un disco rígido, con sensibilidad magnética, que gira continuamente a gran
velocidad dentro del chasis del computador

Disquettes 3 ½: Son disco de almacenamiento de alta densidad de 1,44 MB

Disco ópticos: Una unidad de disco óptico usa rayos láser en lugar de imanes para leer y
escribir la información en la superficie del disco.

Cintas Magnéticas: Utilizados por los grandes sistemas informáticos.

1.2 El microprocesador.

El microprocesador es un circuito integrado que contiene algunos o todos los elementos


necesarios para conformar una (o más) “unidad central de procesamiento” UCP, también
conocido como CPU (por sus siglas en inglés: Central Process Unit). En la actualidad este
componente electrónico está compuesto por millones de transistores, integrados en una
misma placa de silicio.

Se debe distinguir entre el concepto de Procesador, que es un concepto de Hardware, con


el concepto de CPU, que es un concepto lógico. Una CPU puede estar soportada por uno o
varios microprocesadores, y un microprocesador puede soportar una o varias CPU.
1. El microprocesador es la parte de la computadora diseñada para llevar acabo o
ejecutar los programas.
2. Ejecuta instrucciones que se le dan a la computadora a muy bajo nivel haciendo
operaciones lógicas simples, como sumar, restar, multiplicar y dividir.
3. Viene siendo el cerebro de la computadora, el motor, el corazón de esta máquina.’‘
4. Esta conformado por los siguientes elementos: Memoria, Unidad Aritmetica Logica
(ALU), Puertos de Entrada y Salida (Buses), La Unidad de Contro l(UC) y un reloj
que sincroniza su funcionamiento

1.2.1 Buses.

El Bus XT y el Bus ISA (AT)

El significado del acrónimo que nos indica su nombre es: Industrial Standard Arquitecture,
que traducido sería, Arquitectura Industrial Estandarizada. El primero al salir al mercado
comercial junto con el primer PC de IBM, fue el bus XT al 1980, funcionaba a la misma
velocidad que los microprocesadores de la época, los 8086 y 8088, a 4.77 MHz; y su
amplitud de banda era de 8 bits. De aquí que con el 8088 se compenetraran
perfectamente, pero con el 8086 (ancho de banda de 16 bits) ya no había tanta
compenetración y surgió el concepto y el hecho de los “cuellos de botella”.

Con la introducción del AT, apareció el nuevo bus de datos de 16 bits (ISA), y compatible
con su antecesor. También se amplió el bus de direcciones hasta 24 bits, la velocidad de
señales de frecuencia también se aumentó: de 4.77 MHz a 8.33 MHz. De nuevo nos
encontramos con un atasco de información entre la memoria y la CPU. A las tarjetas de
expansión incluso, se le asignaron una señal en estado de espera (wait state), el cual
daba más tiempo a las tarjetas lentas para enviar toda la información a la memoria.

MCA (Bus Micro Channel)


En sí no es ningún tipo de bus, más bien es un sistema de canalización, en el que los
datos no son enviadas hacia al receptor con una simple instrucción de direccionamiento si
no que es éste, el receptor, quién tiene que recogerlos. Para que esta tarea se lleve a
cabo, se ha de informar al receptor previamente con la dirección dónde están los datos a
recibir, y se le deja un camino (bus) libre para él, para que transporte los datos
libremente.

Surgió cuándo IBM trabajaba para crear una nueva tecnología de bus, la sacó con sus
ordenadores que incorporaban el PS/2, el MCA (Micro Channel Arquitecture) permitía una
transferencia de datos máxima de 20 Mb/s, por la nueva dirección de 32 bits, y el
aumento de velocidad a 10 MHz. IBM incluyó un circuito de control especial a cargo del
bus, que le permitía operar independientemente de la velocidad del bus y del tipo de
microprocesador.

Para permitir la conexión de más dispositivos, el MCA especifica interrupciones sensibles al


nivel, que resultan más fiables que el sistema de interrupciones del bus ISA, de esta
forma es posible compartir interrupciones. Esta estructura era completamente
incompatible con las tarjetas de expansión del tipo ISA, concretamente la diferencia que
tenían una respeto del otro se debía al tamaño de los conectores, más pequeños a las del
tipo MCA que las del tipo ISA.

EISA (Extended ISA)

Este bus es, tal y como nos indica su nombre (Enhanced Industrial Standard
Arquitecture), una extensión del primitivo bus ISA o AT. Tal y como hacía el MCA, su bus
de direcciones era de 32 bits basándose en la idea de controlar un bus desde el
microprocesador. Mantuvo la compatibilidad con las tarjetas de expansión de su antecesor
ISA, motivo por el cual tuvo que adoptar la velocidad de éste (8.33 MHz). Una de las
ventajas que presentaba fue la de que era un sistema abierto, varias compañías
contribuyeron a su desarrollo: AST, Compaq, Epson, Hewlett Packard, Olivetti, Tandy,
Wyse, y Zenith.

Fue el primer bus a poder operar con sistemas de multiproceso (integrar al sistema varios
buses dentro del sistema, cada uno con su procesador). Al igual que al MCA, incorporó un
chip, el ISP Sistema Periférico Integrado, encargado de controlar el tráfico de datos
señalando prioridades para cada posible punto de colisión o de bloqueo mediante reglas
de control de la especificación EISA.

Ni MCA ni EISA sustituyeron a su predecesor ISA, a pesar de sus ventajas, estos


representaban encarecer el coste del PC (a menudo más del 50%), y no ofrecían ninguna
mejora evidente en el rendimiento del sistema, y si se notaba alguna mejora, tampoco era
demasiado necesaria puesto que ningún dispositivo daba el máximo de sí, ni en el bus
ISA.

Local Bus

Vistos los resultados de los intentos fallidos para renovar y sustituir al bus ISA, surgió este
nuevo tipo de bus con un concepto de bus diferente a todos los otros existentes, su mayor
consolidación y aprovechamiento lo tuvo en el área de las tarjetas gráficas, que eran las
que más desfavorecidas quedaron con los anteriores buses y velocidades.

Vesa Local Bus

VL no se arriesgó a padecer otro intento fallido como los de EISA o MCA, y no quiso
sustituir al ISA, sino que lo complementó. Por lo tanto tenemos que para poseer un PC
con VL, éste también debe tener el bus ISA, y sus respectivas tarjetas de expansión, del
VL en cambio, tendremos una o dos ranuras de expansión, y son sólo estas las que son
conectadas con la CPU mediante un bus VL; de esta forma tenemos a cada sistema de bus
trabajando por su cuenta y sin estorbarse el uno al otro.

El VL es una expansión homogeneizada del bus local, que funcionaba a 32 bits pero podía
realizar operaciones de 16 bits. El comité VESA presentó la primera versión del VL-BUS en
agosto del 1992, y dado su completa integración y compenetración con el procesador
80486 se extendió rápidamente por el mercado.

Al presentar Intel su nuevo procesador Pentium de 64 bits, VESA empezó a trabajar en la


nueva versión de su bus, el VL-BUS 2.0. Esta nueva especificación comprende los 64 bits
posibles direccionables del procesador, y compatibilidad con la anterior versión de 32 bits,
su velocidad y la cantidad de ranuras de expansión se aumentó y se estableció en tres
ranuras funcionando a 40 MHz, y dos a 50 MHz.

PCI (Peripheral Components Interconnect)

Este modelo que hoy en día rige en los ordenadores convencionales, y es el más
extendido de todos, lo inventó Intel y significa: interconexión de los componentes
periféricos.

Con la llegada de este nuevo bus automatizado en todos sus procesos, el usuario ya no se
tendrá que preocupar más de controlar las direcciones de las tarjetas o de otorgar
interrupciones. Integra control propio de todo el relacionado con él: DMA, interrupciones,
direccionamiento de datos.

Es independiente de la CPU, puesto que entre estos dos dispositivos siempre habrá un
controlador del bus PCI, y da la posibilidad de poder instalarlo a sistemas no basados en
procesadores Intel. Las tarjetas de expansión se pueden acoplar a cualquier sistema, y
pueden ser intercambiadas como se quiera, tan solo los controladores de los dispositivos
tienen que ser ajustados al sistema anfitrión (host), es decir a la correspondiente CPU.

Su velocidad no depende de la de la CPU sino que está separada de ella por el controlador
del bus. Solución al problema del VL-BUS, dónde las tarjetas debían aceptar la máxima
frecuencia de la CPU o no podían funcionar.

El conector empleado es estilo Micro Channel de 124 pines (128 en caso de trabajar con
64 bits), aunque sólo se utilizan 47 de las conexiones (49 en el caso de tratarse de un
conector bus-master), la diferencia se adeuda a las conexiones de toma de tierra y de
alimentación.

PCI es la eliminación de un paso al microprocesador; en vez de disponer de su propio


reloj, el bus se adapta al empleado por el microprocesador y su circuitería, por lo tanto los
componentes del PCI están sincronizados con el procesador. El actual PCI opera con una
frecuencia de 20 a 33.3 MHz. Las tarjetas ISA no pueden ser instaladas en una ranura PCI
convencional, aunque existen equipos con un puente denominado «PCI-to-ISA-Bridge».
Consta de un chip que se conecta entre los diferentes slots ISA y el controlador del bus
PCI, su tarea es la de transportar las señales provenientes del bus PCI capo al bus ISA.

Su gran salida y aceptación fue en gran parte por su velocidad, así el hardware se podía
adaptar a la contínua evolución y el incremento de velocidad de los procesadores.

SCSI (Small Computer System Interface)

Se origina a principios de los años ochenta cuando el fabricante de discos desarrolló su


propio sistema de E/S nominada SASI (Shugart Asociates System Interface) que dado su
éxito y su gran aceptación comercial fue aprobado por ANSI al 1986.

SCSI no se conecta directamente a la CPU sino que utiliza de puente uno de los buses
anteriormente mencionados. Se podría definir como un subsistema de E/S inteligente,
cumplido y bidireccional. Un solo adaptador host SCSI puede controlar hasta 7 dispositivos
SCSI conectados con él.

Una de las ventajas del SCSI en frente a otros es que los dispositivos se direccionan
lógicamente en vez de físicamente, este sistema es útil por dos razones:

1. Elimina cualquier limitación que el conjunto PC-Bios pueda imponer a las unidades
de disco.

2. El direccionamiento lógico elimina la sobrecarga que podría tener el host al


maniobrar los aspectos físicos del dispositivo, el controlador SCSI lo controla.

Aunque varios dispositivos (hasta 7), pueden compartir un mismo adaptador SCSI, tan
sólo 2 de éstos pueden comunicarse sobre el mismo bus a la vez.

AGP (Accelerated Graphics Port)

Fue creada por Intel para dar pie a la creación de un nueve tipo de PC, al cual prestaron
especial atención a los gráficos y la conectividad. Basado en la especificación PCI 2.1 a 66
MHz, incluyó tres características para el aumento de su rendimiento: operaciones de
lectura/escritura en memoria con pipeline, demultiplexado de datos y direcciones al propio
bus, e incremento de la velocidad hasta los 100 MHz (el que supone una razón de
transferencia de más de 800 Mbytes/s, más de cuatro veces que el PCI).

En su caso, como es un bus especialmente dedicado a los gráficos, no tiene que compartir
con otros dispositivos el ancho de banda; otra característica de esta estructura es la de
que posibilita la compartición de la memoria principal por parte de la tarjeta gráfica
mediante un modelo denominado por Intel como DIME ( DIrect Memory Execute
-ejecución directa a memoria), la cual hace posible la obtención de mejores texturas en
juegos y aplicaciones 3D, al almacenar estas en la RAM del sistema y transferirlas cuando
las pidan otros dispositivos. Los buses de datos en la actualidad son de gran importancia
por lo que por medio de ellos, se nos hace posible la comunicación con cualquier tipo de
dispositivo.

1.2.2 Registros.

Los registros del procesador se emplean para controlar instrucciones en ejecución,


manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros
son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits
dependiendo del microprocesador que se emplee. Los registros son direccionables por
medio de una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a
izquierda (15,14,13…. 3,2,1,0), los registros están divididos en seis grupos los cuales
tienen un fin especifico. Los registros se dividen en:

• Registros de segmento
• Registros de apuntadores de instrucciones
• Registros apuntadores
• Registros de propósitos generales
• Registro índice
• Registro de bandera.

Registros de segmento

Un registro de segmento se utiliza para alinear en un limite de párrafo o dicho de otra


forma codifica la dirección de inicio de cada segmento y su dirección en un registro de
segmento supone cuatro bits 0 a su derecha.

Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para


direccionamientos conocidos como el segmento actual. Los registros de segmento son:

Registro CS.
El DOS almacena la dirección inicial del segmento de código de un programa en el registro
CS. Esta dirección de segmento, mas un valor de desplazamiento en el registro de
apuntador de instrucción (IP), indica la dirección de una instrucción que es buscada para
su ejecución. Para propósito de programación normal, no se necesita referenciar el
registro CS.

Registro DS.
La dirección inicial de un segmento de datos de programa es almacenada en el registro
DS. En términos sencillos, esta dirección, mas un valor de desplazamiento en una
instrucción, genera una referencia a la localidad de un byte especifico en el segmento de
datos.

Registro SS.
El registro SS permite la colocación en memoria de una pila, para almacenamiento
temporal de direcciones y datos. El DOS almacena la dirección de inicio del segmento de
pila de un programa en el registro SS. Esta dirección de segmento, más un valor de
desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual en la
pila que está siendo direccionada. Para propósitos de programación normal, no se necesita
referenciar el registro SS.

Registro ES
Algunas operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro
esta de segmento para manejar el direccionamiento de memoria. En este contexto, el
registro ES esta asociado con el registro DI (índice destino). Un programa que requiere el
uso del registro ES puede inicializarlo con una dirección apropiada.

Registros FS y GS.
Son registros extra de segmento en los procesadores 80386y posteriores a estos
procesadores.

Registro Apuntador de instrucciones.(IP)


El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de
dirección de la siguiente instrucción que se ejecuta. El registro IP esta asociado con el
registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de
código que se esta ejecutando actualmente.

En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para


encontrar la siguiente instrucción que será ejecutada el procesador combina las
direcciones en el CS y el IP así:
Segmento de dirección en el registro CS: 25A40H
Desplazamiento de dirección en el registro IP: + 412H
Dirección de la siguiente instrucción: 25E52H

Registros apuntadores.

Los registros apuntadores están asociados con el registro SS y permiten al procesador


acceder a datos en el segmento de pila los registros apuntadores son dos:

El registro SP
El apuntador de pila SP de 16 bits esta asociado con el registro SS y proporciona un valor
de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila.
El ejemplo siguiente el registro SS contiene la dirección de segmento 27B3[0]H y el SP el
desplazamiento 312H Para encontrar la palabra actual que esta siendo procesada en la
pila el microprocesador combina las direcciones en el SS y el SP:
Dirección de segmento en el registro SS: 27B30H
Desplazamiento en el registro SP: + 312H
Dirección en la Pila: 27E42H
27B3[0]H 312H
Dirección del segmento SS Desplazamiento del SP

Registro BP.
El registro BP de 16 bits facilita la referencia de parámetros, los cuales son datos y
direcciones transmitidos vía rápida.

Registros de propósitos generales.

Los registros de propósitos generales AX, BX, CX y DX son los caballos de batalla o las
herramientas del sistema. Son los únicos en el sentido de que se puede direccionarlos
como una palabra o como una parte de un byte. El último byte de la izquierda es la parte
“alta”, y el último byte de la derecha es la parte “baja” por ejemplo, el registro CX consta
de una parte CH (alta) y una parte CL (baja), y usted puede referirse a cualquier parte por
si nombre. Las instrucciones siguientes mueven ceros a los registros CX, CH y CL
respectivamente.
Mov CX, 00
Mov CH, 00
Mov CL, 00

Los procesadores 80386 y posteriores permiten el uso de todos registros de propósito


general, mas versiones de 32 bits; EAX, EBX y EDCX.

Registro AX.
El registro AX, el acumulador principal, es utilizado para operaciones que implican
entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para
multiplicar, dividir y traducir suponen el uso del AX. También, algunas operaciones
generan código más eficientes si se refiere al AX en lugar de los otros registros.

Registro BX.
Es conocido como el registro base ya que es el único registro de propósitos generales que
pueden ser unos índices para direccionamiento indexado. También es común emplear al
BX para cálculos.

Registro CX.
El CX es conocido como el registro contador. Puede contener un valor para controlar el
número de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la
derecha o hacia la izquierda. El CX también es usado para muchos cálculos.

Registro DX.
El DX es conocido como el registro de datos. Algunas operaciones de entrada/salida
requieren su uso, y las operaciones de multiplicación y división con cifras grandes suponen
al DX y al AX trabajando juntos. Puede usar los registros de propósitos para suma y resta
de cifras de 8, 16, 32 bits.

Registros índice

Los registros SI y DI están disponibles para direccionamientos indexados y para sumas y


restas. Que son las operaciones de punta.

Registro SI
El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas (de
caracteres). En este contexto, el SI está asociado con el registro DS. Los procesadores
80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el ESI.

Registro DI
El registro índice destino también es requerido por algunas operaciones con cadenas de
caracteres. En este contexto, el DI está asociado con el registro ES. Los procesadores
80386 y posteriores permiten el uso de un registro ampliado a 32 bits, el EDI.

Registro de banderas

Los registros de banderas sirven parar indicar el estado actual de la maquina y el


resultado del procesamiento, Cuando algunas instrucciones piden comparaciones o
cálculos aritméticos cambian el estado de las banderas.
Las banderas están en el registro de banderas en las siguientes posiciones:
BIT 0 1 2 3 4 5 6 7 8 9 10 11
BANDERA CF X PF X AF X ZF SF TF IF DF OF

OF (Overflow flag, desbordamiento).


Indica el desbordamiento de un bit de orden alto (mas a la izquierda) después de una
operación aritmética.

DF (Direction flag, Dirección).


Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas
de caracteres.

IF (Interruption flag, Interrupción).


Indica que una interrupción externa, como la entrada desde el teclado sea procesada o
ignorada.

TF (Trap flag, Trampa).


Examina el efecto de una instrucción sobre los registros y la memoria. Los programas
depuradores como DEBUG, activan esta bandera de manera que pueda avanzar en la
ejecución de una sola interrupción a un tiempo.

SF (Sign flag, Signo).


Contiene el signo resultante de una operación aritmética (0=positivo y 1= negativo).

ZF (Zero flag, Cero).


Indica el resultado de una operación aritmética o de comparación (0= resultado diferente
de cero y 1=resultado igual a cero).

AF (Auxiliary carry flag, Acarreo Auxiliar).


Contiene un acarreo externo del bit 3 en un dato de 8 bits, para aritmética especializada

PF (Parity flag, Paridad).


Indica paridad par o impar de una operación en datos de ocho bits de bajo orden (mas a
la derecha).

CF (Carry flag, Acarreo).


Contiene el acarreo de orden mas alto (mas a la izquierda) después de una operación
aritmética; también lleva el contenido del ultimo bit en una operación de corrimiento o
rotación.

1.2.3 Modos de direccionamiento


Las operaciones del microprocesador no solo contienen información acerca de la
operación a realizar, sino que también incluye las especificaciones para el tipo de
operandos a manipular y acerca de la posición de los mismos en la computadora. Los
modos mas importantes que se utilizan son:

• Direccionamiento Inmediato
• Direccionamiento de Registros
• Direccionamiento Directo
• Direccionamiento Indirecto de Registros
• Direccionamiento Relativo a Base
• Direccionamiento Indexado Directo
• Direccionamiento Indexado Base con Desplazamiento

Direccionamiento Inmediato

Un dato de 8 o 16 bits se especifica como parte de la instrucción.


MOV CH, 00H
MOV CL, 03H
Aquí el operando fuente está en modo inmediato y el destino en modo registro. O
también:
MOV CX, 0003H
El registro CH se pone a cero (00) y el registro AL se carga con 03H (0000 0011).
Al utilizar el modo de direccionamiento inmediato, todos los valores de los operandos
están con el signo extendido cuando es necesario. Esto significa que el bit mas
significativo del valor del operando es replicado para considerar el bit del operando
destino.

Direccionamiento de Registros

El valor del operando fuente ya ha sido almacenado en uno de los registros de memoria
interna del microprocesador. Este puede ser igualmente un dato de 8 o 16 bits y en algunos
microprocesadores hasta de mayor cantidad de bits. Especifica el operando fuente y el
operando destino. Los registros deben ser del mismo tamaño.
MOV DX, CX
MOV CL, DL.

Direccionamiento Directo

La dirección efectiva (EA) de 16 bits se toma directamente del campo de desplazamiento


de la instrucción. El desplazamiento se coloca en la localidad siguiente al código de
operación. Esta EA o desplazamiento es la distancia de la localidad de memoria al valor
actual en el segmento de datos (DS) en el cual el dato está colocado.
MOV CX, START
El operando del direccionamiento directo es el rotulo START y puede definirse como una
localidad de memoria usando las pseudoinstrucciones DB o DW. El microprocesador
almacena el byte de orden inferior en la direccion de memoria inferior y el byte de orden
superior en la direccion de memoria superior.

Direccionamiento Indirecto de Registros

En lugar de referenciar por un rotulo la direccion del operando fuente, el valor del
operando señalado por una direccion de desplazamiento almacenada en uno de los
registros siguientes: SI (Indice fuente), SI (Indice destino), BX (Registro base) o bajo
algunas circunstancias el BP (apuntador base).
La dirección efectiva EA está especificada en un registro apuntador o un registro índice. El
apuntador puede ser el registro base BX o el apuntador base BP; el registro índice puede
ser el Indice Fuente (SI) o el Indice Destino (DI).
MOV (DI),BX

Direccionamiento Relativo a Base (Basado)


La dirección efectiva de un operando al utilizar direccionamiento relativo a base se obtiene
de la suma del desplazamiento y contenido de un registro base (BX o BP), relativo al
segmento seleccionado. Este modo de direccionamiento es mas utilizado para acceder a
estructuras de datos complejas, como registros.
LEA BX,Mensaje1

Direccionamiento Indexado Directo


En este direccionamiento, la direccion del desplazamiento del operando, se calcula
sumando el desplazamiento a un registro indice (SI o DI) en el segmento seleccionado.
Este modo de direccionamiento se usa frecuentemente para acceder a elementos de un
arreglo estatico.. El valor del desplazamiento localiza el inicio del arreglo y el valor
almacenado en el registro indice selecciona un elemento simple en la estructura.
MOV SI,4
MOV AX,arreglo1[SI]

Direccionamiento Indexado Base con Desplazamiento


Con este direccionamiento, el operando se localiza en el segmwnto seleccionado en un
desplazamiento determinado por la suma de los contenidos del registro base, registro
indexado y, opcionalmente, un desplazamiento.

1.3 Interrupciones.

Son las peticiones generadas por algunos de los eventos que se llevan a cabo dentro del
sistema computacional, que pueden ser de hardware o de software.

1.3.1 Hardware.

Interrupciones internas de hardware

Las interrupciones internas son generadas por ciertos eventos que surgen durante la
ejecución de un programa. Este tipo de interrupciones son manejadas en su totalidad por
el hardware y no es posible modificarlas.

Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj
interno de la computadora, el hardware hace el llamado a esta interrupción varias veces
durante un segundo para mantener la hora actualizada.

Aunque no podemos manejar directamente esta interrupción (no podemos controlar por
software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora
para nuestro beneficio, por ejemplo para crear un “reloj virtual” actualizado
continuamente gracias al contador del reloj interno. Unicamente debemos escribir un
programa que lea el valor actual del contador y lo traduzca a un formato entendible para
el usuario.

Interrupciones externas de hardware

Las interrupciones externas las generan los dispositivos periféricos, como pueden ser:
teclado, impresoras, tarjetas de comunicaciones, etc. También son generadas por los
coprocesadores. No es posible desactivar a las interrupciones externas.

Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un


circuito integrado cuya función es exclusivamente manejar este tipo de interrupciones. El
circuito, llamado PIC 8259A, si es controlado por la UCP utilizando para tal control una
serie de vías de comunicación llamadas puertos.

Interrupción 10H

Llama a diversas funciones de video del BIOS.


Sintaxis:

INT 10H

Esta interrupción tiene diversas funciones, todas ellas nos sirven para controlar la entrada
y salida de video, la forma de acceso a cada una de las opciones es por medio del registro
AH. En este caso únicamente se verán algunas de las funciones de esta interrupción.

Funciones comunes de la interrupción 10H.

02H Selección de posición del cursor

09H Escribe atributo y caracter en el cursor

0AH Escribe caracter en la posición del cursor

0EH Escritura de caracteres en modo alfanumérico

Función 02H Se utiliza para posicionar el cursor en la pantalla dentro de las coordenadas
válidas de texto. No utiliza registros de retorno.

MOV AH,02H

BH = Página de video en la que se posicionará el cursor.

DH = Fila

DL = Columna

Las posiciones de localización del cursor son definidas por coordenadas iniciando en 0,0,
que corresponde a la esquina superior izquierda hasta 79,24 correspondientes a la
esquina inferior derecha. Tenemos entonces que los valores que pueden tomar los
registros DH y DL en modo de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79
respectivamente.

Función 09H Se utiliza para desplegar un caracter un determinado número de veces con
un atributo definido empezando en la posición actual del cursor. Tampoco utiliza registros
de retorno.

Registros de llamada:

MOV AH,09H

AL = Caracter a desplegar

BH = Página de video en donde se desplegará


BL = Atributo a usar

CX = Número de repeticiones.

Función 0AH Se utiliza para desplegar un caracter en la posición actual del cursor.
Tampoco utiliza registros de retorno.

MOV AH,0AH

AL = Caracter a desplegar

BH = Página en donde desplegar

BL = Color a usar (sólo en gráficos).

CX = Número de repeticiones

La única diferencia entre esta función y la anterior es que ésta no permite modificar los
atributos, simplemente usa los atributos actuales. Tampoco se altera la posición del cursor
con esta función.

Función 0EH Se utiliza para desplegar un caracter en la pantalla actualizando la posición


del cursor.

MOV AH,0AH

AL = Caracter a desplegar

BH = Página donde se desplegara el caracter

BL = Color a usar (solo en gráficos)

Interrupción 16H

Manejar la entrada/salida del teclado.

Sintaxis:

INT 16H

Veremos dos opciones de la interrupción 16H, estas opciones, al igual que las de otras
interrupciones, son llamadas utilizando el registro AH.

Funciones de la interrupción 16H


00H Lee un caracter de teclado

01H Lee estado del teclado

Función 00H Se utiliza para leer un caracter del teclado.

MOV AH,00H

Registros de retorno:

AH = código de barrido (scan code) del teclado

AL = Valor ASCII del caracter.

Cuando se utiliza esta interrupción se detiene la ejecución del programa hasta que se
introduzca un caracter desde el teclado, si la tecla presionada es un caracter ASCII su
valor será guardado en el registro AH, de lo contrario el código de barrido será guardado
en AL y AH contendrá el valor 00H.

El código de barrido fue creado para manejar las teclas que no tienen una representación
ASCII como [ALT], [CONTROL], las teclas de función, etc.

Función 01H Se utiliza para leer el estado del teclado.

MOV AH,01H

Registros de retorno:

Si la bandera de cero, ZF, está apagada significa que hay información en el buffer, si se
encuentra prendida es que no hay teclas pendientes. En caso de existir información el
registro AH contendrá el código de la tecla guardada en el buffer.

Interrupción 17H

Maneja la entrada/salida de la impresora.

Sintaxis:

INT 17H

Esta interrupción es utilizada para escribir caracteres a la impresora, inicializarla y leer su


estado.

Funciones de la interrupción 16H


00H Imprime un caracter ASCII

01H Inicializa la impresora

02H Proporciona el estado de la impresora

Función 00H Se utiliza para escribir un caracter a la impresora.

MOV AH,00H

AL = Caracter a imprimir

DX = Puerto a utilizar

Registros de retorno:

AH = Estado de la impresora.

El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, LPT3 = 2 …

El estado de la impresora se codifica bit por bit como sigue:

BIT 1/0 SIGNIFICADO

0 1 Se agotó el tiempo de espera

1-

2-

3 1 Error de entrada/salida

4 1 Impresora seleccionada

5 1 Papel agotado

6 1 Reconocimiento de comunicación

7 1 La impresora se encuentra libre

Los bits 1 y 2 no son relevantes. La mayoría de los BIOS únicamente soportan 3 puertos
paralelos aunque existen algunos que soportan 4.

Función 01H Se utiliza para inicializar un puerto de impresión.

MOV AH,01H
DX = Puerto a utilizar

Registros de retorno:

AH = Status de la impresora

El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, etc.

El estado de la impresora se codifica bit por bit como sigue:

BIT 1/0 SIGNIFICADO

0 1 Se agotó el tiempo de espera

1-

2-

3 1 Error de entrada/salida

4 1 Impresora seleccionada

5 1 Papel agotado

6 1 Reconocimiento de comunicación

7 1 La impresora se encuentra libre

Función 02H Se utiliza para obtener el estado de la impresora.

MOV AH,02H

DX = Puerto a utilizar

Registros de retorno:

AH = Status de la impresora.

El puerto a utilizar, definido en DX, se especifica así: LPT1 = 0, LPT2 = 1, etc.

El estado de la impresora se codifica bit por bit como sigue:

BIT 1/0 SIGNIFICADO

0 1 Se agotó el tiempo de espera

1-
2-

3 1 Error de entrada/salida

4 1 Impresora seleccionada

5 1 Papel agotado

6 1 Reconocimiento de comunicación

7 1 La impresora se encuentra libre

1.3.2 Software.

Las interrupciones de software pueden ser activadas directamente por el ensamblador


invocando al número de interrupción deseada con la instrucción INT. El uso de las
interrupciones nos ayuda en la creación de programas, utilizándolas nuestros programas
son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño
debido en gran parte a su menor tamaño.

Este tipo de interrupciones podemos separarlas en dos categorías: las interrupciones del
sistema operativo DOS y las interrupciones del BIOS.

La diferencia entre ambas es que las interrupciones del sistema operativo son más fáciles
de usar pero también son más lentas ya que estas interrupciones hacen uso del BIOS para
lograr su cometido, en cambio las interrupciones del BIOS son mucho más rápidas pero
tienen la desventaja que, como son parte del hardware son muy específicas y pueden
variar dependiendo incluso de la marca del fabricante del circuito.

La elección del tipo de interrupción a utilizar dependerá únicamente de las características


que le quiera dar a su programa: velocidad (utilizando las del BIOS) o portabilidad
(utilizando las del DOS).

Interrupción 21H

Llama a diversas funciones del DOS.

Sintaxis:

INT 21H

Nota: Cuando trabajamos en MASM es necesario especificar que el valor que estamos
utilizando es hexadecimal.
Esta interrupción tiene varias funciones, para acceder a cada una de ellas es necesario
que el registro AH se encuentre el número de función que se requiera al momento de
llamar a la interrupción.

Funciones de la interrupción 21H

02H Exhibe salida


09H Impresión de cadena (video)
40H Escritura en dispositivo/Archivo

Función 02H Se utiliza para desplegar un caracter en la pantalla.

MOV AH,02H

DL = Valor del caracter a desplegar.

Esta función nos despliega el caracter cuyo codigo hexagesimal corresponde al valor
almacenado en el registro DL, no se modifica ningún registro al utilizar este comando. Es
recomendado el uso de la función 40H de la misma interrupción en lugar de esta función.

Función 09H Se utiliza para desplegar una cadena de caracteres en la pantalla.

MOV AH,09H

DS:DX = Dirección de inicio de una cadena de caracteres

Esta función despliega los caracteres, uno a uno, desde la dirección indicada en el registro
DS:DX hasta encontrar un caracter $, que es interpretado como el final de la cadena. Se
recomienda utilizar la función 40H en lugar de esta función.

Función 40H Se utiliza para escribir a un dispositivo o a un archivo.

MOV AH,40H

BX = Vía de comunicación
CX = Cantidad de bytes a escribir
DS:DX = Dirección del inicio de los datos a escribir

Registros de retorno:

CF = 0 si no hubo error AX = Número de bytes escritos CF = 1 si hubo error AX = Código


de error. El uso de esta función para desplegar información en pantalla se realiza dándole
al registro BX el valor de 1 que es el valor preasignado al video por el sistema operativo
MS-DOS.

Función 01H Se utiliza para leer un caracter del teclado y desplegarlo.

MOV AH,01H
Registros de retorno:

AL = Caracter leído Con esta función es muy sencillo leer un caracter del teclado, el código
hexadecimal del caracter leído se guarda en el registro AL. En caso de que sea un caracter
extendido el registro AL contendrá el valor de 0 y será necesario llamar de nuevo a la
función para obtener el código de este caracter.

Función 0AH Se utiliza para leer un caracter del teclado y almacenarlos en un buffer.

MOV AH,0AH

DS:DX = Dirección del área de almacenamiento BYTE 0 = Cantidad de bytes en el área


BYTE 1 = Cantidad de bytes leídos desde BYTE 2 hasta BYTE 0 + 2 = caracteres leídos

Registros de retorno:

Ninguno Los caracteres son leídos y almacenados en un espacio predefinido de memoria.


La estructura de este espacio le indica que en el primer byte del mismo se indican cuantos
caracteres serán leídos. En el segundo byte se almacena el número de caracteres que ya
se leyeron, y del tercer byte en adelante se escriben los caracteres leídos.

Cuando se han almacenado todos los caracteres indicados menos uno la bocina suena y
cualquier caracter adicional es ignorado. Para terminar la captura de la cadena es
necesario darle [ENTER].

Función 3FH Se utiliza para leer información de un dispositivo o archivo.

MOV AH, 3FH

BX = Número asignado al dispositivo


CX = Número de bytes a procesar
DS:DX = Dirección del área de almacenamiento

Registros de retorno:

CF = 0 si no hay error y AX = número de bytes leidos. CF = 1 si hay error y AX contendra


el código del error.

Función 0FH Se utiliza para abrir archivo FCB.

MOV AH, 0FH

DS:DX = Apuntador a un FCB

Registros de retorno:

AL = 00H si no hubo problema, de lo contrario regresa FFH.


Función 14H Se utiliza para leer secuencialmente un archivo FCB.

MOV AH, 14H

DS:DX = Apuntador a un FCB ya abierto.

Registros de retorno:

AL = 0 si no hubo errores, de lo contrario se regresara el código correspondiente de error:


1 error al final del archivo, 2 error en la estructura del FCB y 3 error de lectura parcial.
Esta función lo que hace es que lee el siguiente bloque de información a partir de la
dirección dada por DS:DX, y actualiza este registro.

Función 15H Se utiliza para escribir secuencialmente un archivo FCB.

MOV AH, 15H

DS:DX = Apuntador a un FCB ya abierto

Registros de retorno:

AL = 00H si no hubo errores, de lo contrario contendrá el código del error: 1 disco lleno o
archivo de solo lectura, 2 error en la formación o especificación del FCB. La función 15H
después de escribir el registro al bloque actual actualiza el FCB.

Función 16H Se utiliza para crear un archivo FCB.

MOV AH, 16H

DS:DX = Apuntador a un FCB ya abierto

Registros de retorno:

AL = 00H si no hubo errores, de lo contrario contendrá el valor FFH Se basa en la


información proveída en un FCB para crear un archivo en el disco.

Algunas otras interrupciones se veran mas adelante como parte del resumen de
programación en ensamblador.

1.4 Estructura de un programa en ensamblador.

Un programa en lenguaje ensamblador estará formado por una secuencia de sentencias.


Cada sentencia ocupa una sola línea y tiene la siguiente estructura:

[etiqueta] [operacion] [operandos] [;comentarios]


Los cuatro campos de una sentencia son opcionales, si no aparece ninguno de ellos (una
línea en blanco) tendríamos una sentencia vacía.

Las sentencias se dividen en dos tipos:

* Instrucciones:

Estas sentencias representan órdenes al procesador y tras el proceso de compilación


generan código ejecutable.

* Directivas:

Estas sentencias dirigen el proceso de compilación o construcción del programa


ejecutable. No generan código ejecutable. Normalmente se utilizan para aumentar la
legibilidad del código fuente.

El fichero creado con todas las sentencias que constituyen un programa se denomina
fichero fuente. Este tipo de fichero tiene formato ASCII. Se recomienda que el fichero de
código fuente tenga por extensión .asm.

El fichero fuente se compila utilizando el programa ensamblador y un enlazador. Estos


programas ensamblador generará un nuevo fichero, denominado fichero ejecutable, de
igual nombre y de extensión .exe.

Este fichero tiene formato ASCII y contiene el código máquina de las instrucciones que
componen el programa, así como cierta información adicional para realizar la carga del
programa en la computadora del usuario.

Estructura de un fichero en lenguaje ensamblador

Los ficheros de código fuente escritos en lenguaje ensamblador se organizan en líneas.


Cada una de las líneas del fichero puede contener una directiva, una instrucción o ambas
cosas a la vez en los casos en que sea posible. El carácter separador de líneas es el
retorno de carro, por lo que una instrucción no podrá ocupar más de una línea en el
fichero fuente.

Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones.

La estructura a seguir se muestra a continuación:

UN EJEMPLO CLASICO:

En esta parte se describe lo que es el lenguaje ensamblador, no al ensamblador o al


proceso de ensamblado. Aquí se tratará todo lo concerniente con el lenguaje ensamblador
y el conjunto de directivas del Microsoft Macro Assembler v4.0. Si bien esto puede resultar
bastante extenso y complejo, aquí sólo se describirán las instrucciones y directivas
básicas.
Para comenzar veamos un pequeño ejemplo que ilustra el formato del programa fuente.
Este ejemplo está completamente desarrollado en lenguaje ensamblador que usa servicios
o funciones de MS-DOS (system calls) para imprimir el mensaje Hola mundo!! en pantalla.

; Programa clasico de ejemplo. Despliega una leyenda en pantalla.

STACK SEGMENT STACK ; Segmento de pila


DW 64 DUP (?) ; Define espacio en la pila

STACK ENDS

DATA SEGMENT ; Segmento de datos

SALUDO DB “Hola mundo!!”,13,10,”$” ; Cadena a desplegar

DATA ENDS

CODE SEGMENT ; Segmento de Codigo

ASSUME CS:CODE, DS:DATA, SS:STACK

INICIO: ; Punto de entrada al programa


MOV AX,DATA ; Pone direccion en AX
MOV DS,AX ; Pone la direccion en los
registros
MOV DX,OFFSET SALUDO ; Obtiene direccion del mensaje
MOV AH,09H ; Funcion: Visualizar cadena
INT 21H ; Servicio: Funciones alto nivel
DOS
MOV AH,4CH ; Funcion: Terminar
INT 21H
END INICIO ; Marca fin y define INICIO
CODE ENDS

La descripción del programa es como sigue:

1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar.

2.- La variable SALUDO en el segmento DATA, define la cadena a ser desplegada. El signo
de dólares al final de la cadena (denominado centinela) es requerido por la función de
visualización de la cadena de MS-DOS. La cadena incluye los códigos para carriage-return
y line-feed.

3.- La etiqueta INICIO en el segmento de código marca el inicio de las instrucciones del
programa.
4.- La declaración DW en el segmento de pila define el espacio para ser usado por el stack
del programa.

5.- La declaración ASSUME indica que registros de segmento se asociarán con las
etiquetas declaradas en las definiciones de segmentos.

6.- Las primeras dos instrucciones cargan la dirección del segmento de datos en el
registro DS. Estas instrucciones no son necesarias para los segmentos de código y stack
puesto que la dirección del segmento de código siempre es cargada en el registro CS y la
dirección de la declaración del stack segment es automáticamente cargada en el registro
SS.

7.- Las últimas dos instrucciones del segmento CODE usa la función 4CH de MS-DOS para
regresar el control al sistema operativo. Existen muchas otras formas de hacer esto, pero
ésta es la más recomendada.

8.- La directiva END indica el final del código fuente y especifica a INICIO como punto de
arranque.

EL FORMATO DEL ENSAMBLADOR.

De acuerdo a las convenciones y notación seguidas en el manual del Microsoft Macro


Assembler, y que usaremos nosotros también, tenemos:
Notación Significado
Negritas Comandos, símbolos y parámetros a ser usados
como se muestra
Itálicas Todo aquello que debe ser reemplazado por el
usuario
[ ] Indican un parámetro opcional
,,, Denota un parámetros que puede repetirse varias
veces
¦ Separa dos valores mutuamente excluyentes
letra chica Usada para ejemplos. Código y lo que aparece en
pantalla.
Cada programa en lenguaje ensamblador es creado a partir de un archivo fuente de
código ensamblador. Estos son archivos de texto que contienen todas las declaraciones de
datos e instrucciones que componen al programa y que se agrupan en áreas o secciones,
cada una con un propósito especial.

En cuanto a la estructura, todos los archivos fuente tienen la misma forma: cero o más
segmentos de programa seguidos por una directiva END. No hay una regla sobre la
estructura u orden que deben seguir las diversas secciones o áreas en la creación del
código fuente de un programa en ensamblador. Sin embargo la mayoría de los programas
tiene un segmento de datos, un segmento de código y un segmento de stack, los cuales
pueden ser puestos en cualquier lugar.

Para la definición de datos y declaración de instrucciones y operandos el MASM reconoce


el conjunto de caracteres formado por letras mayúsculas, letras minúsculas (excluyendo
caracteres acentuados, ñ, Ñ), números, y los símbolos: ? @ _ $ : . [ ] ( ) ‹ › { } + - / * &
%!´~¦\=#ˆ;,“‘

La declaración de números requiere tener presente ciertas consideraciones. En el MASM


un entero se refiere a un número entero: combinación de dígitos hexadecimales, octales,
decimales o binarios, más una raíz opcional. La raíz se especifica con B, Q u O, D, o H. El
ensamblador usará siempre la raíz decimal por defecto, si se omite la especificación de la
raíz (la cual se puede cambiar con la directiva .RADIX). Así nosotros podemos especificar
un entero de la siguiente manera: dígitos, dígitosB, dígitosQ o dígitosO, dígitosD, dígitosH.
Si una D o B aparecen al final de un número, éstas siempre se considerarán un indicador
de raíz, e.g. 11B será tratado como 112 (310), mientras que si se trata del número 11B16
debe introducirse como 11BH.

Las cadenas de carácter y constantes alfanuméricas son formadas como ´caracteres´ o


“caracteres” . Para referencias simbólicas se utilizan cadenas especiales denominadas
nombres. Los nombres son cadenas de caracteres que no se entrecomillan y que deben
comenzar con una A..Z ¦ a..z ¦ _ ¦ $ ¦ @ los caracteres restantes pueden ser cualquiera de
los permitidos, y solamente los 31 primeros caracteres son reconocidos.

DIRECTIVAS.

El MASM posee un conjunto de instrucciones que no pertenecen al lenguaje ensamblador


propiamente sino que son instrucciones que únicamente son reconocidas por el
ensamblador y que han sido agregadas para facilitar la tarea de ensamblado, tanto para el
programador como para el programa que lo lleva a cabo. Dichas instrucciones son
denominadas directivas. En general, las directivas son usadas para especificar la
organización de memoria, realizar ensamblado condicional, definir macros, entrada,
salida, control de archivos, listados, cross-reference, direcciones e información acerca de
la estructura de un programa y las declaraciones de datos. El apéndice D proporciona una
lista completa de estas directivas.

* Conjunto de instrucciones.- Dentro de las directivas más importantes, tenemos las


que establecen el conjunto de instrucciones a soportar para un microprocesador en
especial:

.8086(defecto).- Activa las instrucciones para el 8086 y 8088 e inhibe las del 80186 y
80286.

.8087(defecto).- Activa instrucciones para el 8087 y desactiva las del 80287.

.186.- Activa las instrucciones del 80186.

.286c.- Activa instrucciones del 80286 en modo no protegido.

.286p.- Activa instrucciones del 80286 en modo protegido y no protegido.

.287.- Activa las instrucciones para el 80287.


* Declaración de segmentos.- En lo que respecta a la estructura del programa
tenemos las directivas SEGMENT y ENDS que marcan el inicio y final de un segmento del
programa. Un segmento de programa es una colección de instrucciones y/o datos cuyas
direcciones son todas relativas para el mismo registro de segmento. Su sintaxis es:
nombre SEGMENT [alineación] [combinación] [´clase´]

nombre ENDS

El nombre del segmento es dado por nombre, y debe ser único. Segmentos con el mismo
nombre se tratan como un mismo segmento. Las opciones alineación, combinación, y
clase proporcionan información al LINK sobre cómo ajustar los segmentos. Para alineación
tenemos los siguientes valores: byte (usa cualquier byte de dirección), word (usa
cualquier palabra de dirección, 2 bytes/word), para (usa direcciones de párrafos, 16
bytes/párrafo, deafult), y page (usa direcciones de página, 256 bytes/page), combinación
define cómo se combinarán los segmentos con el mismo nombre. Puede asumir valores
de: public (concatena todos los segmentos en uno solo), stack (igual al anterior, pero con
direcciones relativas al registro SS, common (crea segmentos sobrepuestos colocando el
inicio de todos en una misma dirección), memory (indica al LINK tratar los segmentos
igual que MASM con public, at address (direccionamiento relativo a address). Clase indica
el tipo de segmento, señalados con cualquier nombre. Cabe señalar que en la definición
está permitido el anidar segmentos, pero no se permite de ninguna manera el
sobreponerlos.

* Fin de código fuente.- Otra directiva importante es la que indica el final de un


módulo. Al alcanzarla el ensamblador ignorará cualquier otra declaración que siga a ésta.
Su sintaxis es:
END [expresión]

la opción expresión permite definir la dirección en la cual el programa iniciará.

* Asignación de segmentos.- La directiva ASSUME permite indicar cuales serán los


valores por defecto que asumirán los registros de segmento. Existen dos formas de hacer
esto:
ASSUME registrosegmento:nombre,,,

ASSUME NOTHING ;NOTHING cancela valores previos.

* Etiquetas.- Las etiquetas son declaradas


nombre:

donde nombre constituye una cadena de caracteres.

* Declaración de datos.- Estos se declaran según el tipo, mediante la regla


[nombre] directiva valor,,,

donde directiva puede ser DB (bytes), DW (palabras), DD (palabra doble), DQ (palabra


cuádruple), DT (diez bytes). También pueden usarse las directivas LABEL (crea etiquetas
de instrucciones o datos), EQU (crea símbolos de igualdad) , y el símbolo = ( asigna
absolutos) para declarar símbolos. Estos tienen la siguiente sintaxis:
nombre = expresión
nombre EQU expresión
nombre LABEL tipo

donde tipo puede ser BYTE, WORD, DWORD, QWORD, TBYTE, NEAR, FAR.

* Declaración de estructuras.- Para la declaración de estructuras de datos se emplea la


directiva STRUC. Su sintaxis es:
nombre STRUC
campos
nombre ENDS

El segmento de código (CS) contiene las instrucciones de maquina que son ejecutadas por
lo común la primera instrucción ejecutable esta en el inicio del segmento, y el sistema
operativo enlaza a esa localidad para iniciar la ejecución del programa. Como su nombre
indica, el registro del CS direcciona el segmento de código. Si su área de código requiere
más de 64K, su programa puede necesitar definir mas de un segmento de código.

1.4.4 Instrucciones del programa.

Lista Alfabética de Instrucciones

ACALL Absolute Call

ADD Add Accumulator

ADDC Add Accumulator with Carry

AJMP Absolute Jump

ANL Logical AND for byte variables

ANL bit Logical AND for bit variables

CJNE Compare and Jump if Not Equal

CLR A Clear Accumulator

CLR bit Clear bit

CPL A Complement Accumulator


CPL bit Complement bit

DA Decimal Adjust of Accumulator

DEC Decrement Register

DIV Divide Accumulator by B

DJNZ Decrement

Register and Jump if Not Zero

INC Increment Register

JB Jump if Bit Set

JBC Jump if Bit Set and Clear Bit

JC Jump if Carry Set

JMP @ Jump indirect to Address

JNB Jump if Bit Not Set

JNC Jump if Carry Not Set

JNZ Jump if Accumulator Not Zero

JZ Jump if Accumulator Zero

LCALL Long Call

LJMP Long Jump

MOV Move byte variable

MOV bit Move bit

MOVC Move Code Memory

MOVX Move External Memory

MUL Multiply Accumulator by B

NOP No Operation
ORL Logical OR for byte variables

ORL bit Logical OR for bit variables

POP Pop From Stack

PUSH Push Onto Stack

RET Return From Subroutine

RETI Return From Interrupt

RL Rotate Accumulator Left

RLC Rotate Accumulator Left Through Carry

RR Rotate Accumulator Right

RRC Rotate Accumulator Right Through Carry

SETB Set Bit

SJMP Short Jump

SUBB Subtract From Accumulator With Borrow

SWAP Swap Accumulator Nibbles

XCH Exchange Bytes

XCHD Exchange Digits

XRL Exclusive OR

?? Undefined Instruction

1.4.5 Directivas.

Las directivas: son órdenes para el ensamblador y no tienen traducción a código máquina,
las directivas son similares a las instrucciones, pero a diferencia de estas las directivas son
propias del lenguaje ensamblador e independientes del microcontrolador que se utilice.
Las directivas representan algunas características del lenguaje ensamblador, se utilizan
para especificar el procesador empleado así como la configuración de este, también para
asignar locaciones de memoria, entre otras cosas.
1.5 Procedimiento de ensamble, enlace y ejecución.

Proceso de Ensamble

Un ensamblador es el programa que convierte un listado de código fuente en código


objeto, y este luego al lenguaje máquina (el que finalmente interpretará el procesador) en
el que sólo le faltan las referencias a rutinas externas. El código fuente es un fichero que
contiene la secuencia de instrucciones en lenguaje ensamblador que forma el programa,
así como ciertas directivas o comandos para el propio ensamblador, que ha sido creado
utilizando un editor de texto. El código ejecutable consta del código en lenguaje máquina
y de la información necesaria para enlazarlo con otros módulos objeto.

Enlace y Ejecución

Al construir un programa algunos de sus módulos pueden colocarse en el mismo módulo


fuente y ensamblarse juntos, otros pueden estar en módulos diferentes y ser ensamblados
separadamente. Si se ensamblan por separado, el módulo principal, que contiene la
primera instrucción que se va a ejecutar, debe acabar con una sentencia END que indique
el punto de entrada al programa, y cada uno de los otros módulos deben terminar con una
sentencia END sin ningún operando. En cualquier caso, los módulos objeto resultantes,
algunos de los cuales pueden estar agrupados en librerías, deben ser enlazados para
formar el módulo de carga, antes de que se pueda ejecutar el programa. Además de dar
como salida el módulo de carga, el linker o enlazador imprime un mapa de memoria que
indica donde serán cargados los módulos objeto en la memoria. Después de crearse el
módulo de carga, éste es cargado por el cargador en la memoria del ordenador y
comienza la ejecución.

Independientemente del sistema, la combinación linker/cargador debe crear todos los


segmentos y asignaciones de dirección necesarios para permitirle al programa funcionar
correctamente. En concreto, esta combinación debe:

• Encontrar los módulos que van a ser enlazados

• Construir el módulo de carga asignando las posiciones de todos los segmentos de todos
los módulos objeto que se están enlazando.

• Rellenar todos los desplazamientos de segmento que no pudieron ser determinados por
el ensamblador.

• Rellenar todas las direcciones de los segmentos.

• Cargar el programa para su ejecución.

1.6 Entorno de programación.


Ensamblador

A partir de los fuentes obtenidos de un editor, los fuentes se envían al Ensamblador el


cual, traduce los nemotécnicos del lenguaje ensamblador al código objeto de la maquina.
Y crea un fichero especial de listado de variables y procedimientos. Por último el Linker
toma todos los ficheros objeto y con la información sobre las direcciones de memoria para
las variables y procedimientos que contiene el fichero Listado, crea el fichero ejecutable
final.

Normalmente en el proceso de ensamblado bastan con 2 pasos para determinar todas las
direcciones, por ejemplo:

Jmp etiq

etiq:

En este caso, cuando el ensamblador no puede determinar la dirección de etiq, ya que


ésta está definida más adelante, con lo que debe dejar un espacio y dar una segunda
pasada para determinar exactamente el dirección de memoria a la que debe saltar.

Por lo tanto, en el 1er paso se utiliza una variable denominada “contador de posición” ($).
A medida que se analiza el programa, se va incrementando dicha variable en función de
los bytes que necesita cada sentencia.

También podría gustarte