Está en la página 1de 53

Lenguaje Ensamblador

Ingeniería Sistemas Computacionales

Unidad 1 Fundamentos Introducción Lenguaje Ensamblador


1.1.1 Uso Aplicaciones Lenguaje Ensamblador
1.1.2 Escalabilidad Microprocesadores
1.1.3 Tipos Lenguajes Ensambladores
1.1.4 Clasificación de Memorias
1.1.5 Unidades de Entrada Salida
1.2 Tipos de buses
1.2 El microprocesador
1.2.1 Microprocesador Buses
1.2.2 Microprocesador Registros
1.2.3 Microprocesador Modos Direccionamiento
1.3 Interrupciones Hardware
1.3.2 Interrupciones Software
1.4 Estructura Programa en Ensamblador
1.4.1 Data Segment
1.4.2 Stack Segment
1.4.3 Code Segment
1.4.4 Instrucciones del programa Ensamblador
1.4.5 Directivas Lenguaje Ensamblador
1.5 Procedimiento Ensamble Enlace y Ejecución
1.6 Entorno de programación lenguaje ensamblador

1.1.1 Uso Aplicaciones Lenguaje


Ensamblador
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir
programas informáticos, y constituye la representación más directa del código máquina
específico para cada arquitectura de microprocesador.

El uso del lenguaje ensamblador es para profesionistas en el área de computación que


están obligados a conocer este lenguaje, ya que proporciona una serie de características
que no se pueden encontrar en los lenguajes de alto nivel.

Características del Lenguaje ensamblador:


 Se puede acceder a cualquier localidad de la memoria ram sin ninguna
restricción.
 Se pueden programar virus, debido a que se tiene un acceso total a casi todo el
hardware de la computadora via interrupciones de software.
 Se pueden programar drivers de cualquier dispositivo.
 Se puede acceder directamente a los registros internos del cpu.
 Se puede acceder directamente a los dispositivos de entrada y/o salida.
 Los programas objeto generados a traves del ensamblador son mas veloces que
los generados en cualquier otro lenguaje, debido a que una instrucción en
ensamblador corresponde a una instrucción en lenguaje máquina.
La importancia del lenguaje
ensamblador radica principalmente
que se trabaja directamente con el
microprocesador; por lo cual se debe
de conocer el funcionamiento
interno de este, tiene la ventaja de
que en el se puede realizar cualquier
tipo de programas que en los
lenguajes de alto nivel no lo pueden
realizar. Otro punto sería que los
programas en ensamblador ocupan
menos espacio en memoria.
MEMORIA

2. PUERTOS PROGRAMALES
DE I/O

3. PERIFERICOS

4. MICROPROCESADOR

Procesador

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 y la unidad
aritmética lógica.
Todos los recursos de la computadora son administrados desde la unidad de control,
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ñado por un micro có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.
La unidad aritmético-lógico (ALU)es 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.

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.

Arquitectura de computadores

Una visión típica de una arquitectura de computadora como una serie de capas de abstracción:
hardware, firmware, ensamblador, kernel, sistema operativo y aplicaciones.
La arquitectura de computadoras es el diseño conceptual y la estructura operacional
fundamental de un sistema de computadora. Es decir, es un modelo y una descripción
funcional de los requerimientos y las implementaciones de diseño para varias partes de
una computadora, con especial interés en la forma en que la unidad central de proceso
(CPU) trabaja internamente y accede a las direcciones de memoria.

Un ordenador con esta arquitectura realiza o emula los siguientes pasos


secuencialmente:

1. Enciende el ordenador y obtiene la siguiente instrucción desde la memoria en la


dirección indicada por el contador de programa y la guarda en el registro de
instrucción.
2. Aumenta el contador de programa en la longitud de la instrucción para apuntar a la
siguiente.
3. Decodifica la instrucción mediante la unidad de control. Ésta se encarga de coordinar
el resto de componentes del ordenador para realizar una función determinada.
4. Se ejecuta la instrucción. Ésta puede cambiar el valor del contador del programa,
permitiendo así operaciones repetitivas. El contador puede cambiar también cuando
se cumpla una cierta condición aritmética, haciendo que el ordenador pueda 'tomar
decisiones', que pueden alcanzar cualquier grado de complejidad, mediante la
aritmética y lógica anteriores.
5. Vuelve al paso 2.

Tipos De Ensambladores
Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a características.

Ensambladores Cruzados (Cross-Assembler).


Los 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(1).
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 UCP 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, pero tiene el inconveniente
indicado(1).
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.

Microprocesadores
Avance Tecnológico de los procesadores.

En 1975 Intel decidió 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,

Se encuentra un error de diseño en el 8088 que afecta a la gestión de interrupciones y


al registro de pila SS (Stack Segment).
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.

80286 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 por 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 Introducido 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 (a ver quién instala 4.000 Megabytes de RAM, unos 20 millones de pesetas).
Arranca en modo real, al igual que el 80286, 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.
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.

80486DX 80486SX 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 son 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 Estos modelos de microprocesadores 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 limite 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.
Overdrives 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.
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 vuestra placa.
los Overdrives etiquetados como tal funcionan a 5V, los etiquetados directamente como
DX4, sin disipador, funcionan a 3.3V.

La familia Pentium
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. 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ético-lógicas (ALU). El 80386 (CISC) ejecuta un 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 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 (Functional Redundancy Checking ). Aunque esto sirvió de
poco en un principio. Seguro que recordáis el famoso bug de Pentium. La nueva y
mejorada unidad de punto flotante cometía un error garrafal al hacer una simple
división. La siguiente función escrita para Visual Basic detecta si un Pentium genera un
fallo de cálculo:
Function Pentium Test () As Double
Dim x As Double, y As Double, z As Double
x = 4195835#
y = 3145727#
z = x - (x / y) * y
Pentium Test = z
End Function
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.

Pentium Overdrive
¡Cómo no íbamos a disponer de una versión “light” del Pentium compatible pin a pin
con nuestros microprocesadores 80486DX y DX2!
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.

Pentium Pro
El Pentium Pro a 133 MHz, que fue presentado el día 3 de noviembre de 1995 en el
hotel Ritz de Madrid 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.
Intel ha puesto mucho esfuerzo en probar el Pentium Pro para intentar salvarse de los
numerosos bugs que manchan su gran prestigio. Intel nos ofreció participar en las
pruebas de sus Pentium Pro, petición a la cual respondimos afirmativamente, pero al
final, la drástica reducción de unidades nos hicieron quedar fuera de los elegidos (sólo
se probaron 100 unidades que estarían más que asignadas de las más de 10.000
peticiones que recibió Intel a través de Internet).
El Pentium Pro no es compatible con las placas que existen en el mercado. El motivo
principal es la inclusión de la memoria cache secundaria dentro del chip. Se utiliza un
bus interno que está optimizado para trabajar con las temporizaciones de conexión
directa, lo cual imposibilita la conexión de la memoria cache externa (a mi entender no
tiene la suficiente justificación, puesto que a nivel de SETUP la memoria cache
secundaria se puede desactivar e incluso anular retirando los integrados de sus zócalos.
El tema de la sincronización ya es otro cantar y probablemente sea el motivo real).
Este nuevo producto tiene un bus que ha sido diseñado para conectar varios Pentium
Pro en paralelo que soporta el protocolo MESI, 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.
Ejecución dinámica La ejecución dinámica es uno de los dos elementos clave en la
ganancia de prestaciones del Pentium Pro. Esta nueva forma de “pensar” del
microprocesador está basada en la combinación de tres técnicas: la predicción de
ramificaciones múltiples, el análisis del flujo de datos y la ejecución especulativa.
Predicción de ramificaciones múltiples.
El Pentium Pro utiliza un algoritmo de predicción de ramificaciones múltiples para
anticipar saltos en la ejecución del flujo de instrucciones. Predice dónde puede
encontrar en la memoria las siguientes instrucciones que debe ejecutar con una precisión
del 90%. Esto lo logra porque además de extraer instrucciones para su ejecución, se
adelanta y busca anticipadamente posibles nuevas instrucciones de programa.
Análisis del flujo de datos
El análisis del flujo de datos permite saber al microprocesador en qué orden óptimo
puede o debe ejecutar las instrucciones, ya que sabe la dependencia de unas respecto a
otras.
Ejecución especulativa
Cuando el Pentium Pro ejecuta instrucciones (5 por ciclo de reloj) utiliza la ejecución
especulativa. Esto significa que las instrucciones no se ejecutan en el mismo orden con
el que entran al microprocesador, sino que se ejecutan en un “orden desordenado”, lo
que paradójicamente hace que sea más eficaz.
En el paso final, todos esos datos desordenados generados por la predicción de
ramificaciones, se ordenan y se ensamblan esos paquetes de unidades de proceso para
montar el orden lógico en la secuencia de ejecución del programa.

Pentium II por Intel, “sólo” 300 Mhz.


El Pentium II es un microprocesador con arquitectura x86 diseñado por Intel,
introducido en el mercado el 7 de mayo de 1997. Está basado en una versión modificada
del núcleo P6, usado por primera vez en el Intel Pentium Pro.

Los cambios fundamentales respecto a éste último fueron mejorar el rendimiento en la


ejecución de código de 16 bits, añadir el conjunto de instrucciones MMX y eliminar la
memoria caché de segundo nivel del núcleo del procesador, colocándola en una tarjeta
de circuito impreso junto a éste.

El Pentium II se comercializó en versiones que funcionaban a una frecuencia de reloj de


entre 166 y 450 MHz. La velocidad de bus era originalmente de 66 MHz, pero en las
versiones a partir de los 333 MHz se aumentó a 100 MHz.

Poseía 32 KB de memoria caché de primer nivel repartida en 16 KB para datos y otros


16 KB para instrucciones. La caché de segundo nivel era de 512 KB y trabajaba a la
mitad de la frecuencia del procesador, al contrario que en el Pentium Pro, que
funcionaba a la misma frecuencia.

Como novedad respecto al resto de procesadores de la época, el Pentium II se


presentaba en un encapsulado SEC, con forma de cartucho. El cambio de formato de
encapsulado se hizo para mejorar la disipación de calor. Este cartucho se conecta a las
placas base de los equipos mediante una ranura Slot 1.

El Pentium II integra 7,5 millones de transistores.

El Pentium III es un microprocesador de arquitectura i686 fabricado por Intel; el cual


es una modificación del Pentium Pro. Fue lanzado el 26 de febrero de 1999.

Las primeras versiones eran muy similares al Pentium II, siendo la diferencia más
importante la introducción de las instrucciones SSE. Al igual que con el Pentium II,
existía una versión Celeron de bajo presupuesto y una versión Xeon para quienes
necesitaban de gran poder de cómputo. Esta línea ha sido eventualmente reemplazada
por el Pentium 4, aunque la línea Pentium M, para equipos portátiles, esta basada en el
Pentium III.

Existen tres versiones de Pentium III: Katmai, Coppermine y Tualatin.

Katmai [editar]

La primera versión era muy similar al Pentium II (usaba un proceso de fabricación de


250 nanómetros), con la introducción de SSE como principal diferencia. Además, se
había mejorado el controlador del caché L1, lo cual aumentaba ligeramente el
desempeño. Los primeros modelos tenían velocidades de 450 y 500 MHz. El 17 de
mayo de 1999 se introdujo el modelo de 550 MHz y el 2 de agosto del mismo año el de
600 MHz. Posteriormente (antes de la salida del Coppermine), salieron versiones de
133Mhz de Bus.

Coppermine [editar]

Esta versión tenía memoria caché L2 de 256 KB integrada, lo cual mejoró


significativamente el rendimiento en comparación con Katmai. Estaba construido con
un proceso de 180 nanómetros. El 25 de octubre de 1999, se empezaron a vender los
microprocesadores de 500, 533, 550, 600, 650, 667, 700 y 733 MHz. Entre diciembre de
1999 y mayo de 2000, Intel lanzó los modelos operando a 750, 800, 850, 866, 933 y
1000 MHz.junto con ambos slots

Una versión de 1,13 GHz fue introducida al mercado poco después, pero debió ser
cancelada por ser excesivamente inestable. El problema residía en que la memoria caché
integrada tenía problemas para trabajar a más de 1 GHz.

La primera generación de la consola Xbox usa este procesador en una versión más
estable de 733 Mhz, con 128KB de cache L2 acondicionado para un uso de la GPU Y
de acceso a sistema mucho más eficiente

Tualatin [editar]

La tercera y última versión fue en cierto modo una prueba del nuevo proceso de 130
nanómetros, aunque también se hicieron en 135 nanómetros. Es probable que si el
Pentium 4 hubiese estado listo antes, la serie Tualatin no habría visto la luz. Los
Tualatin tenían un buen desempeño, especialmente los modelos con 512 KB de caché
L2 (llamados Pentium III-S). La Serie III-S estaba enfocada al mercado de servidores.

Entre el 2001 y los primeros meses del 2002, Intel introdujo microprocesadores Tualatin
a velocidades de 1'13, 1'2, 1'26 y 1'4 GHz. Para evitar que la gama Pentium compitiese
con los Celeron, no se produjeron más allá de 1'4 GHz, aunque el diseño se usó luego
para hacer Pentium M de hasta 1'7 GHz.

El Nombre Tualatin surge del Valle Tualatin y el río Tualatin en Oregón

Xeon [editar]

Intel Xeon es la actual generación de microprocesadores Intel para servidores PC. El


primer procesador Xeon apareció en 1998 como Pentium II Xeon.

El Pentium II Xeon utilizaba tanto el chipset 440GX como el 450NX. En el año 2000, el
Pentium II Xeon fue reemplazado por el Pentium III Xeon.

En 2001, el Pentium III Xeon se reemplazó por el procesador Intel Xeon. El Xeon está
basado en la arquitectura NetBurst de Intel y es similar a la CPU Pentium 4.

El Pentium 4 es un microprocesador de séptima generación basado en la


arquitectura x86 y fabricado por Intel. Es el primer microprocesador con un diseño
completamente nuevo desde el Pentium Pro de 1995. El Pentium 4 original,
denominado Willamette, trabajaba a 1,4 y 1,5 GHz; y fue lanzado en noviembre de
2000.

Para la sorpresa de la industria informática, el Pentium 4 no mejoró el viejo diseño P6


según las dos tradicionales formas para medir el rendimiento: velocidad en el proceso
de enteros u operaciones de coma flotante. La estrategia de Intel fue sacrificar el
rendimiento de cada ciclo para obtener a cambio mayor cantidad de ciclos por segundo
y una mejora en las instrucciones SSE. Al igual que la Pentium II y la Pentium III, el
Pentium 4 se comercializa en una versión para equipos de bajo presupuesto (Celeron), y
una orientada a servidores de gama alta (Xeon).

Las distintas versiones son: Willamette, Northwood, Extreme Edition, Prescott y Cedar
Mill.

Las versiones actuales [editar]


Willamette [editar]

Willamette, la primera versión del Pentium 4, sufrió de importantes demoras durante el


diseño. De hecho, muchos expertos aseguran que los primeros modelos de 1,3 ; 1,4 y
1,5 GHz fueron lanzados prematuramente para evitar que se extienda demasiado el
lapso de demora de los Pentium 4. Además, los modelos más nuevos del AMD
Thunderbird tenían un rendimiento superior al Pentium III, pero la línea de producción
se encontraba al límite de su capacidad por el momento. Fueron fabricados utilizando un
proceso de 180 nm y utilizaban el Socket 423 para conectarse a la placa base.
A la hora de los exámenes de rendimiento, los Willamette fueron una decepción ya que
no podían superar claramente a los Thunderbird ni a los Pentium III de mayor
velocidad. Incluso la diferencia con la línea de bajo costo de AMD (Duron) no era
significante. Vendió una cantidad moderada de unidades.

En enero de 2001 un microprocesador más lento de 1,3 GHz fue añadido a la lista.

En la primer mitad del mismo año, salieron a la venta los modelos de 1,6, 1,7 y 1,8 GHz
notablemente superiores a los Pentium III. En agosto, los modelos de 1,9 y 2,0 GHz
vieron la luz.

El Willamette de 2,0 GHz fue el primer Pentium 4 que puso en duda el liderazgo en
rendimiento, que hasta ese momento estaba liderado indiscutiblemente por la línea
Thunderbird de AMD. Si bien algunos resultados arrojaban una leve diferencia a favor
de AMD, los analistas concluyeron que la diferencia no era significativa para decir que
un procesador era claramente superior al otro. Y salieron las primeras Placas con socket
478 y nucleo Willamette. Esto fue un gran paso para Intel, que hasta la salida del AMD
Athlon había sido el rey de la velocidad en los microprocesadores por 16 años en forma
casi ininterrumpida.

Northwood [editar]

En octubre de 2001, el Athlon XP reconquistó el liderazgo en la velocidad de los


procesadores, pero en enero de 2002 Intel lanzó al mercado los nuevos Northwood de
2,0 y 2,2 GHz. Esta nueva versión combina un incremento de 256 a 512 KB en la
memoria caché con la transición a la tecnología de producción de 130 nanómetros. Al
estar el microprocesador compuesto por transistores más pequeños, podía alcanzar
mayores velocidades y a la vez consumir menos energía. El nuevo procesador
funcionaba con el Socket 478, el cual se había visto en los últimos modelos de la serie
Willamette.

Con la serie Northwood, los Pentium 4 alcanzaron su madurez. La lucha por la cima del
rendimiento se mantuvo reñida, a medida que AMD introducía versiones más veloces
del Athlon XP. Sin embargo, la mayoría de los observadores concluyeron que el
Northwood más veloz siempre estaba ligeramente por encima de los modelos de AMD.
Esto se hizo notorio cuando el paso de AMD a la manufactura de 130 nanómetros fue
postergada. Los Pentium 4 entre 2,4 y 2,8 GHz fueron, claramente, los más veloces del
mercado.

Un Pentium 4 de 2,4 GHz fue introducido en abril de 2002, uno de 2,53 GHz en mayo
(que incluyó un aumento del FSB de 400 a 533 MHz). En agosto vieron la luz los
modelos de 2,6 y 2,8 GHz, y en noviembre la versión de 3,06 GHz.

El Procesador de 3,06 GHz soporta Hyper Threading, una tecnología originalmente


aparecida en los Xeon que permite al sistema operativo trabajar como si la máquina
tuviese dos procesadores.

En abril de 2003, Intel colocó en el mercado nuevas variantes, entre los 2,4 y 3,0 GHz,
cuya principal diferencia era que todos ellos incluían la tecnología Hyper-Threading y el
FSB era de 800 MHz. Supuestamente esto era para competir con la línea Hammer de
AMD, pero de momento solo la serie Opteron salió al mercado, la cual no estaba
destinada entonces a competir con los Pentium 4. Por otro lado, los AMD Athlon XP, a
pesar de su FSB aumentado de 333 a 400 MHz y las velocidades más altas no pudieron
alcanzar a los nuevos Pentium 4 de 3,0 y 3,2 GHz. La versión final de los Northwood,
de 3,4 GHz, fue introducida a principios de 2004.

Extreme Edition o Edición Extrema [editar]

En septiembre de 2003, Intel anunció la edición extrema (Extreme Edition) del Pentium
4, apenas sobre una semana antes del lanzamiento del Athlon 64, y el Athlon 64 FX. El
motivo del lanzamiento fue porque AMD alcanzó en velocidad de nuevo a Intel, por
ello fueron apodados Emergency Edition. El diseño era idéntico al Pentium 4 (hasta el
punto de que funcionaría en las mismas placas base), pero se diferenciaba por tener 2
MB adicionales de Memoria caché L3. Compartió la misma tecnología Gallatin del
Xeon MP, aunque con un Socket 478 (a diferencia del Socket 603 de los Xeon MP) y
poseía un FSB de 800MHz, dos veces más grande que el del Xeon MP. Una versión
para Socket LGA775 también fue producida.

Mientras que Intel mantuvo que la Extreme Edition estaba apuntada a los jugadores de
videojuegos, algunos tomaron esta nueva versión como un intento de desviar la atención
del lanzamiento de los Athlon 64. Otros criticaron a Intel por mezclar la línea Xeon
(especialmente orientada a servidores) con sus procesadores para usuarios individuales,
pero poco se criticó cuando AMD hizo lo mismo con el Athlon 64 FX.

El efecto de la memoria adicional tuvo resultados variados. En las aplicaciones de


ofimática, la demora ocasionada por el mayor tamaño de la memoria caché hacía que
los Extreme Edition fuesen menos veloces que los Northwood. Sin embargo, el área
donde se destacó fue en la codificación multimedia, que superaba con creces a la
velocidad de los anteriores Pentium 4 y a toda la línea de AMD.

Prescott [editar]

A principios de febrero de 2004, Intel introdujo una nueva versión de Pentium 4


denominada 'Prescott'. Primero se utilizó en su manufactura un proceso de fabricación
de 90 nm y luego se cambió a 65nm; además se hicieron significativos cambios en la
arquitectura del microprocesador, por lo cual muchos pensaron que Intel lo
promocionaría como Pentium 5. A pesar de que un Prescott funcionando a la misma
velocidad que un Northwood rinde menos, la renovada arquitectura del Prescott permite
alcanzar mayores velocidades y el overclock es más viable. El modelo de 3,8 GHz es el
más veloz de los que hasta ahora han entrado en el mercado.

Su diferencia con los anteriores es que éstos poseen 1Mb ó 2Mb de caché L2 y 16Kb de
caché L1 (el doble que los Northwood), Prevención de Ejecución, SpeedStep, C1E
State, un Hyper-Threading mejorado, instrucciones SSE3, manejo de 64 bits, también
recibió unas mejoras en el sistema de predicción de datos, y tiene un pipeline de 31
etapas, que por cierto, fue unos de los mayores errores de dicho núcleo. Además, los
primeros Prescott producían un 60% más de calor que un Northwood a la misma
velocidad, y por ese motivo muchos lo criticaron con dureza. Se experimentó con un
cambio en el tipo de zócalo (de Socket 478 a LGA 775) lo cual incrementó en un 10%
el consumo de energía del microprocesador, pero al ser más efectivo el sistema de
refrigeración de este zócalo, la temperatura final bajó algunos grados. En posteriores
revisiones del procesador los ingenieros de Intel esperaban reducir las temperaturas,
pero esto nunca ocurrió fuera salvo a bajas velocidades. El procesador genera unos 130
W de calor, o TDP.

Finalmente, los problemas térmicos fueron tan severos, que Intel decidió abandonar la
arquitectura Prescott por completo, y los intentos de hacer correr por encima de los 4
GHz fueron abandonados, como un gasto inútil de recursos internos. También lo
concerniente a las críticas mostradas en casos extremos de llevar al procesador Prescott
a los 5,2 GHz para emparejarlo al Athlon FX-55 que funcionaba a 2,6GHz (*).
Considerando una fanfarronada de Intel el lanzamiento de la arquitectura Pentium 4
diseñada para operar a 10 GHz, esto puede ser visto como uno de los más significativos,
ciertamiente el más público, déficit de ingeniería en la historia de Intel.

Según se dice el Pentium M es ahora la referencia interna para el equipo diseñadores de


Intel, y el desarrollo del P4 ha sido esencialmente abandonado. Hasta este punto el
pequeño equipo de diseño Israelí que produce el Pentium M, tiene ahora que tomar otro
proyecto mucho más grande.

¿Por qué el fin de Prescott ha terminado en tal desastre? Puede ser atribuido a las
políticas internas de Intel. El departamento de mercadeo quería siempre velocidades de
procesador más altas, para diferenciar sus productos de AMD. Los procesadores se
diseñaban por las necesidades de mercadeo, en vez de las necesidades de la arquitectura.
Fueron carreras construidas sobre el concepto de la velocidad del procesador, la
terminación del proyecto P4 finalmente vino y tuvo consecuencias para muchos
miembros del equipo de dirección de la división.

Los Prescott con Socket LGA775 usan el nuevo sistema de puntaje, y están clasificados
en la serie 5XX. El más rápido es el 570J, funcionando a 3,8 GHz. Los planes para
microprocesadores de 4 o más GHz fueron cancelados y se les dio prioridad a los
proyectos para fabricar procesadores dobles; en gran medida debido a los problemas de
consumo energía y producción de calor de los modelos Prescott.

El procesador 570J también fue el primero en introducir la tecnología EDB, la cual es


idéntica a la más temprana NX de AMD. El objetivo es prevenir la ejecución de algunos
tipos de código maligno.

Cedar Mill [editar]

Está basado en el núcleo Prescott y únicamente se encuentra disponible en LGA775


para Pentium 4 de 64 bits. Aunque la serie 5 para LGA775 era una conversión del
socket 478, los nuevos núcleos Cedar Mill, estaban basados en el Prescott y poseía las
mismas instrucciones que éste y una nueva para procesar a 64 bits, excepto porque se
calentaban bastante menos.

Intel Core 2 Quad es una serie de procesadores de Intel con 4 núcleos, lanzados el 2 de
Noviembre de 2006, asegurando ser un 65% más rápidos que los Core 2 Duo
disponibles en ese entonces. Para poder crear este procesador se tuvo que incluir 2
núcleos Conroe bajo un mismo empaque y comunicarlos mediante el Bus del Sistema,
para así totalizar 4 núcleos reales, a diferencia del AMD Phenom X4 que se jacta de ser
un procesador monolítico.

Inicialmente estos procesadores fueron producidos con el proceso de manufactura de 65


nanómetros (núcleo Kentsfield), con frecuencias que van desde los 2.4 Ghz hasta los 3
Ghz y con un FSB de entre 1066 y 1333 Mhz y una memoria caché L2 de 8 MB (2x4
MB) Posteriormente, se redujo el proceso productivo a 45 nanómetros, creando el
núcleo Yorkfield que, al igual que su antecesor, corresponde a 2 núcleos Wolfdale bajo
el mismo empaque. Sus frecuencias van desde los 2.53 Ghz hasta los 3.2 Ghz, su FSB
va desde los 1333 hasta los 1600 Mhz y su caché L2 es de 12 MB (2x6 MB). Como
medida económica el modelo Q9300 posee solamente 6 MB (2x3 MB) de caché L2 a
diferencia de sus pares de mayor frecuencia.

Aunque inicialmente el Core 2 Quad fue lanzado exclusivamente en los mercados


desktop y server, debido principalmente a su alto consumo de energía (desde los 95W
en ese entonces). Con el paso al proceso productivo de 45 nanómetros y la introducción
del núcleo Penryn, Intel tiene planeado introducir un modelo Quad Core para el
mercado móvil en conjunto con la plataforma móvil Centrino 2. El modelo, conocido
como QX9300, tendría una frecuencia de 2.53 Ghz, un bus de 1066 Mhz y una caché L2
de 12 MB (2x6 MB), con un consumo energético de sólo 45 W, menos de la mitad en
comparación a un modelo desktop tradicional.

Modelos [editar]

Tecnologia Nombre Front


Mult Cache Fecha de
de del Frecuencia Side Cache L2 TDP Socket
. L1 salida
fabricacion modelo Bus

Core 2 105
1066 4×32 8MB LGA
65 nm Quad 2,40 GHz 9x / 95 07/01/2007
MT/s kb (2x4MB) 775
Q6600 W

Core 2 130
1066 2×32 LGA
65 nm Quad 2,67 GHz 10 x 8 Mb /95 14/11/2006
MT/s kb 775
Q(X)6700 W

Core 2
1066 2×32 130 LGA
65 nm Quad 2,93 GHz 11 x 8 Mb 09/04/2007
MT/s kb W 775
QX6800
Core 2
1333 2×32 130 LGA
65 nm Quad 3,00 GHz 9x 8 Mb 16/06/2007
MT/s kb W 775
QX6850

Core 2
1333 2×32 LGA
45 nm Quad 2.33 GHz 7x 4MB -W xx/xx/2008
MT/s kb 775
Q8200

Core 2
1333 2×32 95 LGA
45 nm Quad 2.50 GHz 7.5 x 6MB 10/03/2008
MT/s kb W 775
Q9300

Core 2
1333 2×32 95 LGA
45 nm Quad 2,66 GHz 8x 12 Mb 25/03/2008
MT/s kb W 775
Q9400

Core 2
1333 2×32 95 LGA
45 nm Quad 2,83 GHz 8.5 x 12 Mb 25/03/2008
MT/s kb W 775
Q9550

Core 2
1333 2×32 130 LGA
45 nm Quad 3,00 GHz 9x 12 Mb 11/11/2007
MT/s kb W 775
QX9650

Core 2
1600 2×32 136 LGA
45 nm Quad 3,20 GHz 8x 12 Mb Q1 2008
MT/s kb W 775
QX9770

Core 2
1600 2*32 136 LGA
50 nm Quad 3,40 GHz 9x 16 Mb Q1 2009
MT/s kb W 775
QX9771

El AMD Quad Core es un microprocesador con tecnología de cuatro núcleos diseñado


por la empresa AMD (acrónimo Advanced Micro Devices Inc.). Constituye el primer
procesador de esta empresa con dicha tecnología. Saldrá al mercado en los próximos
meses. Estará disponible en las siguientes versiones:
Barcelona [editar]

Barcelona será un procesador de 4 núcleos para servidores que rondará velocidades de


reloj desde los 1,7Ghz hasta los 2Ghz. Con este procesador AMD renueva la lista de
procesadores para servidores. Estará disponible para socket AM2.[1]

Características del procesador

 512 Kb L2 Cache
 DDR2 10,7 Gb/s
 2Mb L3 Cache

Phenom [editar]

Phenom es una versión de 4 núcleos (aunque también hay algunos Phenom de 2 y 3


núcleos) para sobremesa que va dirigida a entusiastas y usuarios exigentes. Se pueden
encontrar Phenom con núcleos Agena o Kuma. Pretende ser la competencia de los Core
2 Duo y de los Quad 2 Cores, de Intel.

Características del procesador

 2.4 - 2.6 GHz.

 125W TDP

 256KB Caché L1 (por núcleo)

 2MB Caché L2 (por núcleo)

 2MB Caché L3 (Compartida)

 Socket 1207+ ó 1207.

Intel® Atom™' es el nombre de una línea de microprocesadores x86 de Intel,


anteriormente denominados Silverthorne/Diamondville. Están diseñados para un
proceso de fabricación de 45 nm CMOS y destinados a utilizarse en Mobile
Internet Devices (MID, por sus siglas en inglés), Ultra-portátiles, Teléfonos
inteligentes, y otros portátiles de baja potencia y aplicaciones. Intel anunció los
nuevos procesadores el 2 de marzo de 2008.

 Descripción [editar]

 Antes de su anuncio se especulaba con un procesador de Intel que compitiese


con los Geode de AMD actualmente empleado en el proyecto OLPC. El 15 de
octubre de 2007 Intel confirmó que estaba trabajando en un nuevo procesador
para PC Ultra-portátiles de nombre en clave Diamondville.

 Silverthorne se venderá bajo el nombre Centrino® Atom (TM), mientras que


Diamondville se venderá como Atom (TM). Los procesadores Intel® Atom
(TM) son hasta el momento los que ofrecen un menor consumo de energía (0,6-
2,5 W) y gracias a su proceso de fabricación de 45 nm permite un diminuto
tamaño de 25 mm2, además se confirmó que incorporan el galardonado conjunto
de instrucciones de sus predecesores Intel Core 2 Duo.

Clasificación De Memorias
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
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 mother (en
el bios). Apenas arranca utiliza 300 kb, sigue testeando y llega a mas o menos 540 kb
donde se planta. A medida de que comenzaron a haber soft 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.
Pequeñas PROM han venido utilizándose como generadores de funciones, normalmente
en conjunción con un multiplexor. A veces se preferían a las ROM porque son
bipolares, habitulamente Schottky, consiguiendo mayores velocidades. Una PROM
común se encuentra con todos los bits en valor 1 como valor por defecto de fábrica; el
quemado de cada fusible, cambia el valor del correspondiente bit a 0. La programación
se realiza aplicando pulsos de altos voltajes que no se encuentran durante operaciones
normales (12 a 21 voltios). El término Read-only (sólo lectura) se refiere a que, a
diferencia de otras memorias, los datos no pueden ser cambiados (al menos por el
usuario final).
Memorias de sobre todo lectura
• EPROM (EPROM son las siglas de Erasable Programmable Read-Only Memory
(ROM borrable 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, es no 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.
• EEPRO Mson 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 E PROM 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. Estos dispositivos suelen
comunicarse mediante protocolos como I C, SPI y Microwire. En otras ocasiones se
integra dentro de chips como microcontroladores y DSPs para lograr una mayor rapidez.
La memoria flash es una forma avanzada de EEPROM creadas por Dr. Fujio Masuoka
mientras trabajaba para Toshiba in 1984 y fueron presentadas en la Reunion de
Aparatos Electrónicos de la IEEE de 1984. Intel vio el potencial de la invención y en
1988 lanzo el primer chip comercial del tipo NOR.
• 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.
Estas memorias están basada en el transistor FAMOS (Floating Gate Avalanche-
Injection Metal Oxide Semiconductor) que es, esencialmente un transistor NMOS con
un conductor (basado en un óxido metálico) adicional entre la puerta de control (CG –
Control Gate) y los terminales fuente/drenador contenidos en otra puerta (FG – Floating
Gate) o bien que rodea a FG y es quien contiene los electrones que almacenan la
información.
o Memoria flash de tipo NOR: Cuando los electrones se encuentran en FG, modifican
(prácticamente anulan) el campo eléctrico que generaría CG en caso de estar activo.
De esta forma, dependiendo de si la celda está a 1 ó a 0, el campo eléctrico de la celda
existe o no. Entonces, cuando se lee la celda poniendo un determinado voltaje en CG, la
corriente eléctrica fluye o no en función del voltaje almacenado en la celda. La
presencia/ausencia de corriente se detecta e interpreta como un 1 ó un 0, reproduciendo
así el dato almacenado. En los dispositivos de celda multi-nivel, se detecta la intensidad
de la corriente para controlar el número de electrones almacenados en FG e
interpretarlos adecuadamente.
Para programar una celda de tipo NOR (asignar un valor determinado) se permite el
paso de la corriente desde el terminal fuente al terminal sumidero, entonces se coloca en
CG un voltaje alto para absorber los electrones y retenerlos en el campo eléctrico que
genera. Este proceso se llama hot-electron injection. Para borrar (poner a “1”, el estado
natural del transistor) el contenido de una celda, expulsar estos electrones, se emplea la
técnica de Fowler-Nordheim tunnelling, un proceso de tunelado mecánico – cuántico.
Esto es, aplicar un voltaje inverso bastante alto al empleado para atraer a los electrones,
convirtiendo al transistor en una pistola de electrones que permite, abriendo el terminal
sumidero, que los electrones abandonen el mismo. Este proceso es el que provoca el
deterioro de las celdas, al aplicar sobre un conductor tan delgado un voltaje tan alto.
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.
o Memorias flash de tipo NAND: Basadas en puertas lógicas NAND funcionan de
forma ligeramente diferente: usan un túnel de inyección para la escritura y para el
borrado un túnel de ‘soltado’.
Las memorias basadas en NAND tienen, además de la evidente base en otro tipo de
puertas, un coste bastante inferior, unas diez veces de más resistencia a las operaciones
pero sólo permiten acceso secuencial (más orientado a dispositivos de almacenamiento
masivo), frente a las memorias flash basadas en NOR que permiten lectura de acceso
aleatorio. Sin embargo, han sido las NAND las que han permitido la expansión de este
tipo de memoria, ya que el mecanismo de borrado es más sencillo (aunque también se
borre por bloques) lo que ha proporcionado una base más rentable para la creación de
dispositivos de tipo tarjeta de memoria.
Comparación de memorias flash basadas en NOR y NAND Para comparar estos tipos
de memoria se consideran los diferentes aspectos de las memorias tradicionalmente
valorados. La densidad de almacenamiento de los chips es actualmente bastante mayor
en las memorias NAND. El coste de NOR es mucho mayor. El acceso NOR es aleatorio
para lectura y orientado a bloques para su modificación. Sin embargo, NAND ofrece tan
solo acceso directo para los bloques y lectura secuencial dentro de los mismos. En la
escritura de NOR podemos llegar a modificar un solo bit. Esto destaca con la limitada
reprogramación de las NAND que deben modificar bloques o palabras completas. La
velocidad de lectura es muy superior en NOR (50–100 ns) frente a NAND (10 µs de la
búsqueda de la página + 50 ns por byte). La velocidad de escritura para NOR es de 5 µs
por byte frente a 200 µs por página en NAND. La velocidad de borrado para NOR es de
1 s por bloque de 64 KB frente a los 2 ms por bloque de 16 KB en NAND. La fiabilidad
de los dispositivos basados en NOR es realmente muy alta, es relativamente inmune a la
corrupción de datos y tampoco tiene bloques erróneos frente a la escasa fiabilidad de los
sistemas NAND que requieren corrección de datos y existe la posibilidad de que queden
bloques marcados como erróneos e inservibles. En resumen, los sistemas basados en
NAND son más baratos y rápidos pero carecen de una fiabilidad que los haga eficiente,
lo que demuestra la necesidad imperiosa de un buen sistema de archivos. Dependiendo
de qué sea lo que se busque, merecerá la pena decantarse por uno u otro tipo.
Memorias de Lectura/Escritura (RAM)
• MEMORIA RAM o Memoria e acceso Aleatorio ( Random Acces
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 ( volatizara ) 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 lo 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 el 95, 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 de 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 anho de 16 bits, para llenar un banco de
memoria de 64 bits hay que instalar 4 memorias
• SDRAM: Esta Memoria entro en el mercado en los años 97, 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 mother 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 mother 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 mother 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 require 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 mother 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

Existen 3 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
mother luego se construyeron en el procesador, pero no dentro del dado del procesador
por lo que es mas lento que el caché L1, mientras que el externo lo encontramos el
mother. 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 mother. EL AMD 6k-3 soporta este caché.

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, los hay de
forma: Teclado alfanumérico y para perfoverificación:
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
2. DISPOSITIVOS DE SALIDA
Estos dispositivos permiten al usuario ver los resultados de los cálculos o de las
manipulaciones de datos de la computadora. El dispositivo de salida más común es el
monitor, impresora, 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 o de página.
Módem: , dispositivo que sirve para enlaza dos ordenadores transformando las señales
digitales.

1.2 MICROPROCESADOR
Esta conformado por los siguientes elementos: Memoria, Unidad Aritmetica Logica
(ALU), Puertos de Entrada y Salida (Buses), La Unidad de Control(UC) y un reloj que
sincroniza su funcionamiento
1.2.1 Tipos De Buses
El bus es una serie de cables mediante los cuales pueden cargarse datos en la memoria y desde
allí transportarse a la CPU

Bus de Datos

Mueve los datos entre los dispositivos del hardware de Entrada como el teclado, el
ratón, micrófono, etc.; de salida como la Impresora, el Monitor; y de Almacenamiento
como el Disco Duro, el Disquete o la Memoria-Flash.

Estas transferencias que se dan a través del Bus de Datos son gobernadas por varios
dispositivos y métodos, de los cuales el Controlador PCI, ("Peripheral Component
Interconnect", Interconexión de componentes Periféricos), es uno de los principales. Su
trabajo equivale, simplificando mucho el asunto, a una central de semáforos para el
tráfico en las calles de una ciudad.

Bus de direcciones

El Bus de Direcciones, por otra parte, está vinculado al bloque de Control de la CPU
para tomar y colocar datos en el Sub-sistema de Memoria durante la ejecución de los
procesos de cómputo.
Para el Bus de Direcciones, el "ancho de canal" explica así mismo la cantidad de
ubicaciones o Direcciones diferentes que el microprocesador puede alcanzar. Esa
cantidad de ubicaciones resulta de elevar el 2 a la 32ª potencia. "2" porque son dos las
señales binarias, los bits 1 y 0; y "32ª potencia" porque las 32 pistas del Bus de
Direcciones son, en un instante dado, un conjunto de 32 bits. Nos sirve para calcular la
capacidad de memoria en el CPU.

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 viñeta, que es una dirección de memoria. Los bits, por
conveniencia, se numeran de derecha a izquierda (15,14,13…. 3,2,1,0),

Registro de Instrucciones
Registro Apuntador de Instrucciones
Cristal Registros Auxiliares

R Banderas
E
Unidad
de Unidad Aritmetica
L
y Logica
O Control
(ALU)
J

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 Sistema Operativo 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 apuntado de instrucción (IP), indica la
dirección de una instrucción que es buscada para sí 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
bytes especifico en el segmento de datos.
Registro SS El registro permite la colocación en memoria de una pila, para
almacenamiento temporal de direcciones y datos.
El Sistema Operativo 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).
Un programa que requiere el uso del registro ES puede inicializarlo con una
dirección apropiada.
Registro FS y Son registros extra de segmento en los procesadores 80386y posteriores a
GS 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 procesados 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
accesar datos en el segmento de pila los registros.
Tipos de apuntadores son dos:

registro SP El apuntador de pila IP 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 PP: 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 lapida.

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 ultimo byte de la izquierda es la parte “alta”, y el ultimo 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 su nombre.

Registros 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 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 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 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.

Registro í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 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 bandera.
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: bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Las banderas más comunes son las siguientes:

OF (Over flow flag, Indica el desbordamiento de un bit de orden alto (mas a la izquierda)
desbordamiento). después de una operación aritmética
DF (Direction flag, Designa la dirección hacia la izquierda o hacia la derecha para mover
Direccion). o comparar cadenas de caracteres.
IF (Interruption flag, Indica que una interrupción externa, como la entrada desde el teclado
Interrupcion) 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, Zero). 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, Contiene un acarreo externo del bit 3 en un dato de 8 bits, para
Acarreo auxiliar). 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, Contiene el acarreo de orden más alto (mas a la izquierda) después
Acarreo). de una operación aritmética; también lleva el contenido del último
bit en una operación de corrimiento o rotación.

Nada más empezar toca hacer un acto de fuerza de voluntad, por renunciar a la mayor parte de
nuestra memoria RAM, funciones MMX, direccionamiento de 32 bits.. Lo primero que vamos a
ver es una descripción de los registros del primer bicho de la familia, el 8086 (aunque un 80286
es básicamente idéntico en este aspecto), pues Intel y los demás fabricantes han puesto
cuidado en que todos ellos se puedan comportar como él. Es un micro de 16 bits, y como
habrás adivinado sus registros son de 16 bits. Helos aquí:

Registros de datos AX BX CX DX
Punteros de pila SP BP
Registros índice DI SI
Registros de segmento CS DS ES SS
Registro de flags

Los registros de datos, como su nombre indica, contienen generalmente datos. (Sí, lo sé, no
parecen gran cosa, pero es lo que hay) A veces se les llama "de propósito general", y la verdad
es que es un nombre más apropiado, si bien un poco más largo. Aunque tiene distinto nombre
cada uno de ellos, cuentan básicamente con la misma funcionalidad, con algunas excepciones.
Determinadas operaciones -por ejemplo la multiplicación- exigen que los operandos estén en
registros específicos. En ese caso no quedarán más narices que usar esos concretamente.

AX es a menudo llamado acumulador, más por motivos históricos que por otra cosa.
BX se puede usar como registro base en algunos modos de direccionamiento, es decir,
para apuntar a posiciones de memoria con él.
CX es usado por algunas instrucciones como contador (en ciclos, rotaciones..)
DX o registro de datos; a veces se usa junto con AX en esas instrucciones especiales
mencionadas.

Cada registro de estos está dividido a su vez en dos registros de 8 bits, que pueden ser leídos
o escrito de manera independiente:
AX = AH | AL          BX = BH | BL
CX = CH | CL          DX = DH | DL

Si AX contiene 00FFh, AH=00h (su parte alta) y AL=FFh (su parte baja); si lo incrementamos
en 1, AX pasa a valer 0100h (lógicamente), y con ello AH=01h, AL=00h. Si en lugar de
incrementar en 1 AX lo hacemos con AL (byte inferior), AH se quedará como estaba y AL será
FFh+01h=00h, es decir, AX=0000h (vamos, que cuando se manipula una parte del registro la
otra no se ve afectada en absoluto) Ah, por si alguno lo dudaba, H viene de high y L de low.

Uno puede mover los datos de unos registros a otros con prácticamente total libertad. También
podremos realizar operaciones sobre ellos, como sumar el contenido de BX y DX para guardar
el resultado en DX, y cosas así. La primera restricción al respecto (y bastante razonable) es
que los operandos tendrán que ser del mismo tamaño (no podremos sumar BX con DH, por
ejemplo).

Para explicar los registros que hacen referencia a memoria hay que contar brevemente qué es
la segmentación.

Uno puede pensar que lo lógico y maravilloso para apuntar a una dirección de memoria es
colocar dicha dirección en un registro, y ale, que apunte. Eso está muy bien para registros
grandes pero da la casualidad de que con 16 bits tenemos 2^16=64k posiciones. Hombre, en
aquellos tiempos estaba muy bien para según qué cosas, y aquí tampoco vamos a manejar
mucha más memoria, pero tampoco es plan. La solución por la que optó Intel fue usar dos
registros de 16 bits (cosa que seguramente ya imaginabas), pero no dispuestos
consecutivamente, como podría pensarse:

Segmento: Desplazamiento:
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx <- Dirección de 32 bits

De esta manera -que, repito, no es la que se usa realmente- se podrían recorrer 2^32
posiciones de memoria. Con el registro llamado de segmento apuntamos al "bloque", esto es,
las líneas de mayor peso, y con el de desplazamiento nos movemos dentro de 64k. El
problema reside en que si nuestra estructura de datos se encuentra al final de uno de estos
bloques (un vector, por ejemplo), y queremos recorrerla linealmente, lo podremos hacer así
solamente hasta llegar a la posición FFFFh del segmento apuntado, pues para seguir
avanzando es necesario incrementar el registro de segmento en 1 llegados a ese punto (y
continuar ya normalmente incrementando el desplazamiento desde 0000h). Resulta que, para
más inri, una característica más que deseable -por no decir imprescindible- de un programa es
que sea reubicable, es decir, que lo podamos cargar en cualquier zona de la memoria,
principalmente porque el sistema operativo nos lo coloca donde puede, y cada vez en un sitio
distinto. No hace falta pensar mucho para ver que, por este camino, mal vamos.

Intel dispuso los registros de la siguiente manera:

Segmento: xxxxxxxxxxxxxxxx0000
+
Desplazamiento (u offset) 0000xxxxxxxxxxxxxxxx
-----------------------------------
Dirección de 20 bits xxxxxxxxxxxxxxxxxxxx

Así pues para obtener la dirección real se multiplica el registro de segmento por 16, y se suma
al de desplazamiento (esto lógicamente no lo tenemos que hacer nosotros, hay un circuitillo por
ahí para eso) Existen además parejas segmento-offset que apuntan a la misma posición de
memoria (no podría ser de otro modo, si estamos recorriendo 2^20 posiciones con 32 bits). De
la manera propuesta ahora, cuando queremos manejar una estructura de no más de 64k (esto
nos lo limitan los registros que son de 16 bits, con lo que no hay más vuelta de hoja), podremos
apuntar con el registro de desplazamiento al bloque donde lo ubicaremos (alineado en un
múltiplo de 16 bytes, claro) y nos moveremos por dentro de este segmento alterando el offset.

Recordemos además que todo procesador de esta familia que funcione en modo real (o virtual)
se comporta como un 8086 más o menos rápido en cuanto a direccionamiento de memoria, por
lo que bajo MSDOS siempre estaremos limitados de esta manera.

De la suma de segmento y offset puede suceder que, para segmentos altos, exista un bit de
carry a 1. Los 286 y superiores pueden aprovechar esto para acceder a la llamada "memoria
alta", 64k situados por encima de los 2^20=1024k iniciales. No será nuestro caso, pues nos
limitaremos a manejar la memoria a la vieja usanza. De hecho únicamente poblaremos los
primeros 640k (la famosa memoria convencional) pues en las posiciones de los segmentos
A000h y superiores se mapea la memoria de vídeo, la expandida... Pero bueno, de momento
con 640k vamos sobrados.

Ahora casi todos los registros cobran ya sentido; los registros de segmento apuntan al
segmento, y los de índice indican el desplazamiento dentro del segmento. Los registros de
índice se pueden usar como registros de datos sin problemas para sumas, movimiento de
datos... no así los de segmento, que tienen fuertes limitaciones. Cuando se diga "un registro"
como operando de una instrucción, eso incluye en principio cualquier registro menos los de
segmento.

El par CS:IP indica la dirección de memoria donde está la instrucción que se ejecuta. Los
nombres vienen de Code Segment e Instruction Pointer. A esta parejita sólo la modifican las
instrucciones de salto, así que podemos olvidarnos -un poco- de ella. Cada vez que se ejecuta
una instrucción, el contador IP se incrementa para apuntar al código de la operación siguiente;
las instrucciones de salto cargan CS:IP con la dirección adonde queremos saltar, para que se
ejecute el código a partir de ahí.

SS:SP apuntan a la pila. Como en todo micro que se precie, tenemos una pila adonde echar los
valores de los registros que queremos preservar para luego, las direcciones de retorno de las
subrutinas.. La pila crece hacia abajo, es decir, cuando metemos algo en la pila el puntero de
pila se decrementa, y cuando lo sacamos se incrementa. Siempre se meten valores de 16 bits.
Significan Stack Segment y Stack Pointer, claro. Por lo general SS no se toca, y SP quizá pero
poquito, ya que hay instrucciones específicas para manejar la pila que alteran SP
indirectamente. Digamos que uno dice "tiro esto a la pila" o "saco lo primero que haya en la pila
y lo meto aquí" y el micro modifica SP en consecuencia. BP es un puntero Base, para indicar
también desplazamiento, que se usa en algunos modos de direccionamiento y especialmente
cuando se manejan subrutinas. La pila se estudiará en mayor profundidad en el tema VI.

DS y ES son registros de segmento adicionales, el primero llamado de datos (Data) y el


segundo Extra. Con ellos apuntaremos a los segmentos donde tengamos nuestros datos (ya
que del código se encarga CS), esto es, nuestras variables. Estos los manipularemos mucho
más que los anteriores cuando programemos en modo real.

DI y SI son registros índice, es decir, sirven para indicar el offset dentro de un segmento.
Acabarás harto de tanto usarlos. En las instrucciones de cadena DI se asocia por defecto a DS,
y SI a ES.

Aunque el sistema de segmentación pueda parecer muy engorroso (bueno, es que a este nivel
realmente lo es, y mucho) en realidad es vital. El modo protegido del 386+ (386+ por "386 y
superiores") emplea segmentación, pero aprovechando 32 bits. En entornos multitarea hay que
estructurar cada programa con su(s) bloque(s) de código y de memoria, cada uno con su nivel
de acceso (por ejemplo si estás guarreando con la memoria te interesa que sólo enredes con la
de tu programa, para no sobreescribir otros procesos en curso por accidente, o parte del
sistema operativo incluso); lo que sucede es que ahora es una mierda porque esta
segmentación es muy limitada. Sirva esto para evitar la cantinela segmentación=mala que le
puede haber pasado a uno por la cabeza a estas alturas de película. Tras este pequeño
paréntesis, sigamos.
El registro de flags está formado por varios bits cada uno con significado propio, que son
modificados por las operaciones que realizamos:

Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Flag -- -- -- -- OF DF IF TF SF ZF -- AF -- PF -- CF

Aunque es un registro de 16 bits sólo algunos de ellos tienen significado. Los otros adquieren
valores indeterminados, y se dice que son bits reservados; un programa no debe tocarlos, pues
aunque un equipo dado puede que no los use, otros micros podrían manipularlos internamente,
con resultados impredecibles.

 CF Carry Flag o indicador de acarreo. Normalmente indica si "nos llevamos algo"


despues de haber sumado o restado.
 OF Overflow Flag o indicador de desbordamiento. Si después de una operación el
resultado no cabe en el tamaño del registro, se pone a 1.
 ZF Zero Flag o indicador de cero. Si el resultado da 0 se pone a 1.
 SF Sign Flag o indicador de signo. Si el resultado es negativo se pone a 1.
 PF Parity Flag o indicador de paridad. Con algunas operaciones lógicas o aritméticas
se pone a 1 si el resultado es par.
 AF Auxiliary Flag o indicador auxiliar. Se usa para operaciones BCD (si es que éstas
valen para algo)
 DF Direction Flag o indicador de dirección. Se usa en operaciones llamadas "de
cadena", indicando el sentido (ascendente o descendente) en que se recorre la
memoria. (Este flag es más divertido de lo que parece.)
 IF Interrupt Flag o indicador de interrupciones. Cuando se pone a 1 se permiten las
interrupciones, a 0 se ignoran; se dice que se enmascaran. Hay no obstante algunas
muy especiales que pasan del flag; por ejemplo, si arrancas (físicamente, me refiero;
coger con la mano y zás!) una tarjeta de RAM con el trasto encendido, la interrupción
que salta -alerta roja, inmersión, inmersión, auuuuu- pasa de este flag olímpicamente
(algo así no se puede pasar por alto bajo ninguna circunstancia).
 TF Trap Flag o indicador de trampa (para ejecución paso a paso, como en los
depuradores; podemos olvidarnos de él)

No conviene aturullarse demasiado a cuenta de los flags, pues a medida que se vayan viendo
las instrucciones que los usen se irán comentando con más calma. Resumen: es un registro
que contiene 1) indicadores de los resultados de algunas operaciones y 2) modificadores del
comportamiento del procesador.

Microprocesador Modos
Direccionamiento
Se llama "modo de direccionamiento" a una forma de especificarle una dirección al micro para
que acceda a algún dato, como cuando hemos dicho MOV DX,[ES:0]. Decirle al procesador
directamente la dirección, en este caso offset 0, es efectivamente un modo de
direccionamiento, aunque no demasiado flexible, porque debemos saber la posición exacta del
dato en el momento de hacer el programa. Veamos todos los modos de direccionamiento que
permite este micro, sin más que poner el offset dentro de []:

Nombre Offset Segmento por defecto


Absoluto Valor inmediato DS
Indirecto con base BX+x DS
BP+x SS
Indirecto con índice DI+x DS
SI+x DS
Ind. con base e índice BX+DI+x DS
BX+SI+x DS
BP+DI+x SS
BP+SI+x SS

Por x queremos decir un número en complemento a dos de 8 o 16 bits, es decir, los


comprendidos entre -128 y 127 o -32768 y 32767.

Supongamos que tenemos una cadena de caracteres en el segmento indicado por ES, offset
100h, y queremos mover un carácter cuya posición viene indicada por el registro BP, a AL. El
offset del carácter sería BP+100h; como el segmento por defecto para ese modo de
direccionamiento es SS, es necesario un prefijo de segmento. La instrucción sería:

MOV AL,[ES:BP+100h]

Observando un poco la tabla podemos darnos cuenta de que todos emplean por defecto el
registro de segmento DS excepto los que usan BP, que se refieren a SS. En general no es
buena idea usar prefijos de segmento, pues las instrucciones que los usan se codifican en más
bytes y por tanto son más lentas. Así si hemos de referirnos a DS usaremos otros registros
distintos de BP siempre que sea posible.

La instrucción MOV tiene ciertas limitaciones. No admite cualquier pareja de operandos. Sin
embargo esto obedece a reglas muy sencillas:

1. No se puede mover de memoria a memoria


2. No se pueden cargar registros de segmento en direccionamiento inmediato
3. No se puede mover a CS

Las dos primeras reglas obligan a pasar por un registro intermedio de datos en caso de tener
que hacer esas operaciones. La tercera es bastante obvia, pues si se pudiera hacer eso
estaríamos haciendo que el contador de instrucción apuntase a sabe Dios dónde.

Otra regla fundamental de otro tipo -y que también da sus dolores de cabeza- es que cuando
se mueven datos de o hacia memoria se sigue la "ordenación Intel", que no es más que una
manera de tocar las narices: los datos se guardan al revés. Me explico. Si yo hiciera

MOV AX,1234h

MOV [DS:0],AX

uno podría pensar que ahora la posición DS:0 contiene 12h y DS:1 34h. Pues no. Es
exactamente al revés. Cuando se almacena algo en memoria, se copia a la posición señalada
la parte baja y luego, en la posición siguiente, la parte alta. Lo gracioso del asunto (y más que
nada porque si no fuera así Intel tocaría bastante más abajo de las narices) es que cuando se
trae un dato de memoria a registros se repite la jugada, de tal manera que al repetir el
movimiento en sentido contrario, tenga en el registro el mismo dato que tenía al principio. Pero
la cosa no se detiene ahí. Tras

MOV EAX,12345678h
MOV [ES:0124h],EAX

la memoria contendría algo así como:

Segmento Offset: Contenido:


ES 0124h 78h
0125h 56h
0126h 34h
0127h 12h

Vamos, que lo que digo para palabras lo digo para palabras dobles. ¿Divertido, eh?

Uno se puede preguntar además: ¿por qué no hacer "MOV [ES:0124h],12345678h"? Se puede,
claro, pero no así (bueno, en este caso concreto tal vez, pero como norma general, no). El
ensamblador no puede saber el tamaño que tiene el operando inmediato, así que no sabe
cuantos bytes tiene que escribir. Si tú haces "MOV AX,8", está bien claro que tiene que meter
un "8" en 16 bits, porque es el tamaño que tiene AX, pero cuando el destino es una posición de
memoria, no sabe si poner 08h, 0008h, 00000008h.. Hay que especificar si es un byte, un
word, o double word con lo que se conocen como typecast:

MOV BYTE [DI],0h ;DI es un puntero a byte

MOV WORD [DI],0 ; puntero a Word

MOV DWORD [DI],0h ; puntero a double Word

Cada una de ellas pone a cero 1,2 ó 4 bytes a partir de la dirección apuntada por DS:DI. Una
última nota a cuento de estas cosas. Si se especifica por ejemplo "MOV AX,[DS:0]" la
instrucción se codificará sin el prefijo de segmento, pues no hace falta al ser el registro por
defecto. Esto es común a todas las instrucciones que empleen este modo de direccionamiento,
y aunque es raro indicar al ensamblador direcciones de memoria mediante valores inmediatos,
conviene tenerlo en cuenta: especificar un segmento que ya es el segmento por defecto para
ese direccionamiento, no altera la codificación final de la instrucción.

0
3.a sin
involucrar al
registro base
BP
D. R. = (DS*10)
+ DIRECCION
EFECTIVA

3.b
involucrando al
registro base
BP
D. R. = (SS*10)
+ DIRECCION
EFECTIVA

3.c sin
involucrar
registros
D. R. = (DS*10)
CONSTANTE

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. Únicamente 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 vias de comunicación llamadas puertos.
interrupción 10H
Propósito: Llamar 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 tutorial unicamente veremos 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
Uso:
Posiciona el cursor en la pantalla dentro de las coordenadas válidas de texto.
Registros de llamada:
AH = 02H BH = Página de video en la que se posicionará el cursor. DH = Fila DL =
Columna
Registros de retorno:
Ninguno. 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
Uso:
Desplegar un caracter un determinado número de veces con un atributo definido
empezando en la posición actual del cursor.
Registros de llamada:
AH = 09H AL = Caracter a desplegar BH = Página de video en donde se desplegará BL
= Atributo a usar Número de repeticiones.
Registros de retorno:
Ninguno Esta función despliega un caracter el número de veces especificado en CX
pero sin cambiar la posición del cursor en la pantalla.
Función 0AH
Uso:
Desplegar un caracter en la posición actual del cursor.
Registros de llamada:
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
Registros de retorno:
Ninguno. 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
Uso:
Deplegar un caracter en la pantalla actualizando la posición del cursor.
Registros de llamada:
AH = 0EH AL = Caracter a desplegar BH = Página donde se desplegara el caracter BL
= Color a usar (solo en gráficos)
Registros de retorno:
Ninguno
Interrupción 16H
Propósito: 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
Uso:
Leer un caracter del teclado.
Registros de llamada:
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 fué creado para manejar las teclas que no tienen una representación
ASCII como [ALT], [CONTROL], las teclas de función, etc.
Función 01H
Uso:
Leer estado del teclado.
Registros de llamada:
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
Propósito: Manejar 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
Uso:
Escribir un caracter a la impresora.
Registros de llamada:
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 mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen
algunos que soportan 4.
Función 01H
Uso:
Inicializar un puerto de impresión.
Registros de llamada:
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 Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen
algunos que soportan 4.
Función 02H
Uso:
Obtener el estado de la impresora.
Registros de llamada:
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 Los bits 1 y 2 no son relevantes.
La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen
algunos que soportan 4.

Interrupciones de 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, utilizandolas
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 categorias: 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á unicamente de las
caracteristicas que le quiera dar a su programa: velocidad (utilizando las del BIOS) o
portabilidad (utilizando las del DOS).
Interrupción 21H Propósito: Llamar 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 accesar a cada una de ellas es necesario
que el el registro AH se encuentre el número de función que se requiera al momento de
llamar a la interrupción.
Funciones para desplegar información al video.
02H Exhibe salida 09H Impresión de cadena (video) 40H Escritura en
dispositivo/Archivo
StrongFunción 02H Uso:
Despliega un caracter a la pantalla.
Registros de llamada:
AH = 02H DL = Valor del caracter a desplegar.
Registros de retorno:
Ninguno
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.
EmphasizedFunción 09H
Uso:
Despliega una cadena de carateres en la pantalla.
Registros de llamada:
AH = 09H DS:DX = Dirección de inicio de una cadena de caracteres
Registros de retorno:
Ninguno.
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.
EmphasizedFunción 40H
Uso:
Escribir a un dispositivo o a un archivo.
Registros de llamada:
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
dandole al registro BX el valor de 1 que es el valor preasignado al video por el sistema
operativo MS-DOS.
EmphasizedFunción 01H
Uso:
Leer un caracter del teclado y desplegarlo.
Registros de llamada:
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 contendra el valor de 0 y será necesario llamar de
nuevo a la función para obtener el código de este caracter.
EmphasizedFunción 0AH
Uso:
Leer caracteres del teclado y almacenarlos en un buffer.
Registros de llamada:
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].
EmphasizedFunción 3FH
Uso:
Leer información de un dispositivo o archivo.
Registros de llamada:
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
Uso:
Abrir archivo FCB
Registros de llamada:
AH = 0FH DS:DX = Apuntador a un FCB
Registros de retorno:
AL = 00H si no hubo problema, de lo contrario regresa 0FFH EmphasizedFunción 14H
Uso:
Leer secuencialmente un archivo FCB.
Registros de llamada:
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.
EmphasizedFunción 15H
Uso:
Escribir secuencialmente a un archivo FCB
Registros de llamada:
AH = 15H DS:DX = Apuntador a un FCB ya abierto
Registros de retorno:
AL = 00H si no hubo errores, de lo contrario contendra 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.
EmphasizedFunción 16H
Uso:
Crear un archivo FCB.
Registros de llamada:
AH = 16H DS:DX = Apuntador a un FCB ya abierto.
Registros de retorno:
AL = 00H si no hubo errores, de lo contrario contendra el valor 0FFH Se basa en la
información proveida en un FCB para crear un archivo en el disco.
EmphasizedFunción 21H
Uso:
Leer en forma aleatoria un archivo FCB.
Registros de llamada:
AH = 21H DS:DX = Apuntador a un FCB ya abierto.
Registros de retorno:
A = 00H si no hubo error, de lo contrario AH contendra el código del error: 1 si es fin
de archivo, 2 si existe error de especificación de FCB y 3 si se leyó un registro parcial o
el apuntador del archivo se encuentra al final del mismo. Esta función lee el registro
especificado por los campos del bloque actual y registro actual de un FCB abierto y
coloca la información en el DTA (área de transferencia de disco o Disk Transfer Area).
EmphasizedFunción 22H
Uso:
Escribir en forma aleatoria en un archivo FCB.
Registros de llamada:
AH = 22H DS:DX = Apuntador a un FCB abierto.
Registros de retorno:
AL = 00H si no hubo error, de lo contrario contendrá el código del error: 1 si el disco
está lleno o es archivo de solo lectura y 2 si hay error en la especificación de FCB.
Escribe el registro especificado por los campos del bloque actual y registro actual de un
FCB abierto. Escribe dicha información a partir del contenido del DTA (área de
transferencia de disco).
EmphasizedFunción 3CH
Uso:
Crear un archivo si no existe o dejarlo en longitud 0 si existe. (Handle)
Registros de llamada:
AH = 3CH CH = Atributo de archivo DS:DX = Apuntador a una especificaión ASCIIZ
Registros de retorno:
CF = 0 y AX el número asignado al handle si no hay error, en caso de haberlo CF será 1
y AX contendra el código de error: 3 ruta no encontrada, 4 no hay handles disponibles
para asignar y 5 acceso negado. Esta función sustituye a la 16H. El nombre del archivo
es especificado en una cadena ASCIIZ, la cual tiene como característica la de ser una
cadena de bytes convencional terminada con un caracter 0.
El archivo creado contendra los atributos definidos en el registro CX en la siguiente
forma:
Valor Atributos 00H Normal 02H Escondido 04H Sistema 06H Escondido y de sistema
El archivo se crea con los permisos de lectura y escritura. No es posible crear directorios
utilizando esta función.
EmphasizedFunción 3DH
Uso:
Abre un archivo y regrese un handle
Registros de llamada:
AH = 3DH AL = modo de acceso DS:DX = Apuntador a una especificación ASCIIZ
Registros de retorno:
CF = 0 y AX = número de handle si no hay errores, de lo contrario CF = 1 y AX =
código de error: 01H si no es válida la función, 02H si no se encontró el archivo, 03H si
no se encontr´o la ruta, 04H si no hay handles disponibles, 05H en caso de acceso
negado, y 0CH si el código de acceso no es válido. El handle regresado es de 16 bits.
El código de acceso se especifica en la siguiente forma:
BITS 7 6 5 4 3 2 1 . . . . 0 0 0 Solo lectura . . . . 0 0 1 Solo escritura . . . . 0 1 0
Lectura/Escritura . . . X . . . RESERVADO
EmphasizedFunción 3EH
Uso:
Cerrar archivo (Handle).
Registros de llamada:
AH = 3EH BX = Handle asignado
Registros de retorno:
CF = 0 si no hubo errores, en caso contrario CF será 1 y AX contendrá el código de
error: 06H si el handle es inválido. Esta función actualiza el archivo y libera o deja
disponible el handle que estaba utilizando.
EmphasizedFunción 3FH
Uso:
Leer de un archivo abierto una cantdad definida de bytes y los almacena en un buffer
específico.
Registros de llamada:
AH = 3FH BX = Handle asignado CX = Cantidad de bytes a leer DS:DX = Apuntador a
un área de trabajo.
Registros de retorno:
CF = 0 y AX = número de bytes leidos si no hubo error, en caso contrario CF = 1 y AX
= código de error: 05H si acceso negado y 06H si no es válido el handle.
EmphasizedFunción 40H
Uso:
Escribe a un archivo ya abierto una cierta cantidad de bytes a partir del buffer
designado.
Registros de llamada:
AH = 40H BX = Handle asignado CX = Cantidad de bytes a escribir. DS:DX =
Apuntador al buffer de datos.
Registros de retorno:
CF = 0 y AX = número de bytes escritos si no hay errores, en caso de existir CF = 1 y
AX = código del error: 05H si el acceso es negado y 06H si el handle es inválido.
EmphasizedFunción 42H
Uso:
Mover apuntador al archivo (Handle)
Registros de llamada:
AH = 42H AL = método utilizado BX = Handle asignado CX = La parte más
significativa del offset DX = La parte menos significativa del offset
Registros de retorno:
CF = 0 y DX:AX = la nueva posición del apuntador. En caso de error CF será 1 y AX =
código de error: 01H si la función no es válida y 06H si el handle no es válido. El
método utilizado se configura como sigue:
Valor de AL Método 00H A partir del principio del archivo 01H A partir de la posición
actual 02H A partir del final del archivo

Estructura 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 .ens.
El fichero fuente se compila utilizando el programa ensamblador. El programa
ensamblador generará un nuevo fichero, denominado fichero ejecutable, de igual
nombre y de extensión .eje.
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 el simulador del computador elemental.
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:
escala EQU 1000 ;Definición de constantes simbólicas
ORIGEN 7F40h ;Definición del origen de carga del programa
INICIO ini ;Definición de la etiqueta que marca la
;primera instrucción a ejecutar del programa
.PILA 100h ;Definición de la pila
.DATOS ;Definición de los datos del programa
dato1 VALOR 12h

.CODIGO ;Definición del código del programa
INI: MOV R5, R4

FIN
De todas las secciones posibles que pueden formar parte de una programa en lenguaje
ensamblador, sólo será obligatoria la sección de definición del código del programa.
Todas las demás secciones serán opcionales pudiendo estar presentes o no. Si aparece
alguna de las secciones del esquema, tendrá que estar colocada en el orden indicado.

Data Segment
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
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
CODE ENDS
END INICIO ; Marca fin y define INICIO
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 START 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 cargado 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 START como
punto de arranque.
2.- 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. Las sentencias en ensamblador tienen la
siguiente sintaxis:
[nombre] mnemónico [operandos] [;comentarios]
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
(210), mientras que si se trata del número 11B16 debe introducirse como 11Bh.
Para los números reales tenemos al designador R, que sólo puede ser usado con
números hexadecimales de 8, 16, ó 20 dígitos de la forma dígitosR. También puede
usarse una de las directivas DD, DQ, y DT con el formato
[+¦-]dígitos.dígitos[E[+¦-]igitos].
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.
3.- 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

Stack Segment
En términos sencillos, la pila contiene los datos y direcciones que usted necesita guardar
temporalmente o para uso de sus “llamadas” subrutinas. El registro de segmento de la
pila (SS) direcciona el segmento de la pila.

Code Segment
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 mas de 64K, su programa puede necesitar definir mas de un segmento de
código..

Directivas Lenguaje Ensamblador


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.

Procedimiento Ensamble Enlace Y


Ejecucion
1.5 Procedimiento Ensamble Enlace y Ejecución
Proceso de ensamblaje
Un ensamblador es el programa que convierte un listado de código fuente en código
objeto, es decir, 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 objeto 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.

Entorno De Programacion Lenguaje


Ensamblador
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. Por ejemplo: $ .CODE comi: mov
ax, @data mov ds, ax mov cx, cont (3 bytes) (2 bytes) (5 bytes) 035 fuente 3 Editor
fuente 2 fuente 1 Ensamblador obj 3 obj 2 obj 1 Linker Listado Práctica 1: Introducción
a la programación en ensamblador 2 repetir: dec cx … (1 byte) 9 10 Para cada segmento
se inicializa el contador de posición. Ejemplo $ .DATA NUM db −29 VECTOR db 100
DUP ? CONT dw 5 … 01 101 103 Para cada símbolo (variable, constante, etiqueta), se
determina su $, su tipo, su nombre de segmento. Con esta información, ensamblador
construye la TABLA DE SIMBOLOS en esta primera pasada. Luego sólo hay que
buscar en esa tabla para determinar la dirección de cada etiqueta, constante o variable.
El 2º paso comienza cuando se detecta END. Ayudado por las directivas y por los
nemotécnicos de las instrucciones se comienza a general el código máquina. Ejemplo:
MOV CX, CONT 1º comprobar si el tipo de fuente y destino coinciden 2º comprobar si
CONT está en el segmento de datos 3º sustituir CONT por su desplazamiento, que en
este caso es 101. No siempre es tan simple: - Pueden existir expresiones aritméticas
(que se calculan en este segundo paso). Ejemplo: VAR1 EQU VAR2 + 10 En principio
el ensamblador usa valores por defecto. Pero en todo caso, si 2 pasadas no fueran
suficientes da un “Phase error”, Puede indicarle al ensamblador que de más pasadas. -
Otra dificultad aparece con las llamas instrucciones “relocalizables”, por ejemplo: JMP
ETIQ Con ETIQ en otro segmento. Estos valores son se sabe pues no tienen que ver el
contador $ (que equivale a un desplazamiento) sino que hay que tener en cuenta es
segmento en el que está. Por lo tanto no se conocerá el valor correcto hasta que el
programa sea colocado en memoria. Para ello los ejecutables .EXE disponen de una
cabecera con “información de relocalización” donde se indican las instrucciones
relocalizables, y poder completar el código una vez situado el programa en memoria.

También podría gustarte