Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2. PUERTOS PROGRAMALES
DE I/O
3. PERIFERICOS
4. MICROPROCESADOR
Procesador
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.
Tipos De Ensambladores
Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a características.
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,
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.
La familia Pentium
La quinta generación de microprocesadores Intel tomó el nombre de
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.
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.
Katmai [editar]
Coppermine [editar]
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.
Xeon [editar]
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.
Las distintas versiones son: Willamette, Northwood, Extreme Edition, Prescott y Cedar
Mill.
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]
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.
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.
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.
Prescott [editar]
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.
¿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.
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.
Modelos [editar]
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
512 Kb L2 Cache
DDR2 10,7 Gb/s
2Mb L3 Cache
Phenom [editar]
125W TDP
Descripción [editar]
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
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
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.
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 índice.
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.
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.
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.
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 []:
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:
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
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:
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 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
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..