Documente Academic
Documente Profesional
Documente Cultură
INTRODUCCIÓN.
El texto se enfoca completamente hacia las computadoras que operan con procesadores
de la familia x86 de Intel y, considerando que el ensamblador basa su funcionamiento en
los recursos internos del procesador, los ejemplos descritos no son compatibles con
ninguna otra arquitectura.
Se estructura la información en forma de unidades para permitir el fácil acceso a cada uno
de los típicos y facilitar el seguimiento del texto.
UNIDAD I.
FUNDAMENTOS
1.1 INTRODUCCIÓN.
1.1.1 Generalidades del lenguaje ensamblador.
1.1.2 Escalabilidad de los microprocesadores
1.1.3 Tipos de lenguajes ensambladores
1.1.4 Clasificación de memorias
1.1.5 Unidades de entrada/salida
1.2 EL MICROPROCESADOR.
1.2.1 Buses
1.2.2 Registros
1.2.3 Modos de direccionamiento
1.3 INTERRUPCIONES.
1.3.1 Hardware
1.3.2 Software
1.1 INTRODUCCIÓN.
1.1.1 Generalidades del lenguaje ensamblador.
Depende del programa a desarrollar. Si el programa debe controlar en gran medida los
componentes internos de la computadora o debe ser lo suficientemente veloz, entonces
es recomendable utilizarlo. Si se requiere un sistema grande y no se dispone de mucho
tiempo para entregarlo, entonces es mejor juntar un lenguaje de alto nivel con
ensamblador (las funciones básicas del programa realizarlas en ensamblador, y el
programa en general codificarlo con el lenguaje de alto nivel).
• Eficiencia de tamaño.-
tamaño Un programa en ensamblador no ocupa mucho espacio en
memoria porque no tiene que cargan librerías y demás como son los lenguajes de
alto nivel
• Flexibilidad .- Es flexible porque todo lo que puede hacerse con una máquina,
puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto
nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de
la máquina. O sea que en lenguaje ensamblador se pueden hacer tareas
específicas que en un lenguaje de alto nivel no se pueden llevar acabo porque
tienen ciertas limitantes que no se lo permite.
• Programas fuentes
fuentes grandes .- Por las mismas razones que aumenta el tiempo,
crecen los programas fuentes; simplemente requerimos más instrucciones
primitivas para describir procesos equivalentes. Esto es una desventaja porque
dificulta el mantenimiento de los programas, y nuevamente reduce la productividad
de los programadores.
• Falta de portabilidad.-
portabilidad Porque para cada máquina existe un lenguaje ensamblador;
por ello, evidentemente no es una selección apropiada de lenguaje cuando
deseamos codificar en una máquina y luego llevar los programas a otros sistemas
operativos o modelos de computadoras.
El uso del lenguaje ensamblador no es para la gente común y corriente, sino 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. Algunas de estas características son:
• Los programas objeto generados a traés 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.
Introducción.
El microprocesador es uno de los logros más sobresalientes del siglo XX. Esas son
palabras atrevidas, y hace un cuarto de siglo tal afirmación habría parecido absurda. Pero
cada año, el microprocesador se acerca más al centro de nuestras vidas, forjándose un
sitio en el núcleo de una máquina tras otra. Su presencia ha comenzado a cambiar la
forma en que percibimos el mundo e incluso a nosotros mismos. Cada vez se hace más
difícil pasar por alto el microprocesador como otro simple producto en una larga línea de
innovaciones tecnológicas.
Ninguna otra invención en la historia se ha diseminado tan aprisa por todo el mundo o ha
tocado tan profundamente tantos aspectos de la existencia humana. Hoy existen casi
15,000 millones de microchips de alguna clase en uso (el equivalente de dos
computadoras poderosas para cada hombre, mujer y niño del planeta). De cara a esa
realidad, ¿quién puede dudar que el microprocesador no sólo esta transformando los
productos que usamos, sino también nuestra forma de vivir y, por último, la forma en que
percibimos la realidad?
¿Que es un microprocesador?
El mapa de la figura 1.1, mostrada al final de esta sección, muestra los sucesos
importantes de éstas dos tecnologías que se desarrollaron en las últimas cinco décadas.
Las dos tecnologías iniciaron su desarrollo desde la segunda guerra mundial; en este
tiempo los científicos desarrollaron computadoras especialmente para uso militar.
Después de la guerra, a mediados del año de 1940 la computadora digital fue
desarrollada para propósitos científicos y civiles.
En los años 50's, aparecen las primeras computadoras digitales de propósito general.
Éstas usaban tubos al vacío (bulbos) como componentes electrónicos activos. Tarjetas o
módulos de tubos al vacío fueron usados para construir circuitos lógicos básicos tales
como compuertas lógicas y flip-flops (celda donde se almacena un bit). Ensamblando
compuertas y flip-flops en módulos, los científicos construyeron la computadora (la lógica
de control, circuitos de memoria, etc.). Los bulbos también formaron parte de la
construcción de máquinas para la comunicación con las computadoras. Para el estudio de
los circuitos digitales, en la construcción de un circuito sumador simple se requiere de
algunas compuertas lógicas.
La tecnología de los circuitos de estado sólido evolucionó en la década de los años 50's.
El uso del material silicio de bajo costo y con métodos de producción masiva, hicieron al
transistor ser el más usado para el diseño de circuitos. Por lo tanto el diseño de la
computadora digital fue un gran avance del cambio para remplazar al tubo al vacío (bulbo)
por el transistor a finales de los años 50's.
A mediados de los años 60's se producen las familias de lógica digital, dispositivos en
escala SSI y MSI que corresponden a pequeña y mediana escala de integración de
componentes en los circuitos de fabricación. A finales de los años 60's y principios de los
años 70's surgieron los LSI (gran escala de integración). La tecnología LSI fue haciendo
posible más y más circuitos digitales en un circuito integrado. Pero pocos circuitos LSI
fueron producidos, los dispositivos de memoria fueron un buen ejemplo.
El Microprocesador.
2. La memoria caché: es una memoria ultrarrápida que emplea el micro para tener a
mano ciertos datos que prediciblemente serán utilizados en las siguientes
operaciones sin tener que acudir a la memoria RAM reduciendo el tiempo de
espera. Por ejemplo: en una biblioteca, en lugar de estar buscando cierto libro a
través de un banco de ficheros de papel se utiliza las computadora, y gracias a la
memoria caché, obtiene de manera rápida la información. Todos los micros
compatibles con PC poseen la llamada caché interna de primer nivel o L1; es decir,
la que está más cerca del micro, tanto que está encapsulada junto a él. Los micros
más modernos (Pentium III Coppermine, Athlon Thunderbird, etc.) incluyen también
en su interior otro nivel de caché, más grande aunque algo menos rápida, la caché
de segundo nivel o L2.
4. Los registros: son básicamente un tipo de memoria pequeña con fines especiales
que el micro tiene disponible para algunos usos particulares. Hay varios grupos de
registros en cada procesador. Un grupo de registros esta diseñado para control del
programador y hay otros que no son diseñados para ser controlados por el
procesador pero que CPU los utiliza en algunas operaciones en total son treinta y
dos registros.
M. D. O. H. Sonia Alvarado Mares
10
Lenguaje Ensamblador
Microprocesadores Antiguos.
Tal como está el mundo, podríamos decir que cualquiera que tenga más de un mes en el
mercado. De todas formas, aquí vamos a suponer antiguo a todo micro que no sea un
Pentium o similar (K5, K6, 6x86, Celeron...)
8088 / 8086.
En 1975 Intel decidió ponerse manos a la obra para construir su primer micro de 16 bits
que salió al mercado en 1978. Se trataba del 8086, que definió el inicio de su gama de
productos más famosa, la familia de microprocesadores x86.
La longitud de los registros del 8086 era de 16 bits (de ahí su denominación de 16 bits),
había versiones que funcionaban a 4.77 y 8 MHz, tenía un bus de datos de 16 bits y un
bus de direcciones de 20 bits, lo que le permitía acceder a un máximo de memoria de 1
Mb según el cálculo 2 elevado a 20.
8088.
Seguidamente, en 1979, Intel sacó el 8088, que en contra de lo que podamos pensar no
es mejor que el 8086. La diferencia era sustancial; el bus de datos era de 8 bits (la mitad).
Este paso hacia atrás estuvo provocado por el estado de la industria de la época. Utilizar
un bus de datos de 16 bits suponía forzar al mercado a desarrollar para 16 bits lo que
implicaba un incremento en los costes de desarrollo de controladores de periféricos y
memorias. El síntoma fue que Intel se había adelantado a su época.
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.
Aparece también un nuevo modo de operación del microprocesador. Aparte del modo real
(el normal de operación) que direcciona hasta 1 Mb de memoria física y asegura la
compatibilidad para aplicaciones diseñadas par los 8086/8088, se tiene el modo protegido
que no es compatible con estos programas desarrollados para los micros antes
mencionados. El modo protegido es el que permite acceder a los 1.008 Mb de memoria
virtual.
80386 DX y SX.
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.
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.
80386 SX .
(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
Los 80486 tampoco están libres del pecado original. En el 80486 cuando el coprocesador
matemático detecta un error de límite del tamaño de segmento, algunas veces la CPU
falla al generar la excepción 13. Este error se genera bajo las siguientes condiciones:
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. Si se puede retirar el micro anterior se puede
vender a usuarios que necesiten menos potencia, no siendo tan gravosa la inversión de
más de 80.000 pesetas que costaban cuando salieron los primeros en 1991.
En la segunda generación de Overdrives se olvidó el pin 169, teniendo los 168 que los
hacían compatibles con los zócalos de los 80486. En estos casos la actualización es
sencillísima: quitar el que estaba y poner el nuevo en el mismo lugar.
La tercera generación de Overdrives trabaja con un consumo menor para reducir de este
modo su alta temperatura. El voltaje se reduce a 3.3 voltios de los 5 que necesitaban los
anteriores. Si vas a comprar un DX2 o DX4 fíjate bien qué voltaje utiliza vuestra placa. los
Overdrives etiquetados como tal funcionan a 5V, los etiquetados directamente como DX4,
sin disipador, funcionan a 3.3V.
Microprocesadores Modernos.
Pentium MMX.
Es un micro propio de la filosofía Intel. Con un gran chip como el Pentium Pro ya en el
mercado, y a 3 meses escasos de sacar el Pentium II, decidió estirar un poco más la
tecnología ya obsoleta del Pentium clásico en vez de ofrecer esas nuevas soluciones a un
precio razonable.
Así que se inventó un nuevo conjunto de instrucciones para micro, que para ser modernos
tuvieran que ver con el rendimiento de las aplicaciones multimedia, y las llamó MMX
(MultiMedia eXtensions). Prometían que el nuevo Pentium, con las MMX y el doble de
caché (32 KB), podía tener ¡hasta un 60% más de rendimiento!!
¿La ventaja del chip, entonces? Que su precio final acaba siendo igual que si no fuera
MMX. Además, consume y se calienta menos por tener voltaje reducido para el núcleo del
chip (2,8 V). Por cierto, el modelo a 233 MHz (66 MHz en placa por 3,5) está tan
estrangulado por ese "cuello de botella" que rinde poco más que el 200 (66 por 3).
Pentium II.
¿El nuevo super-extra-chip? Pues no del todo. En realidad, se trata del viejo Pentium Pro,
jubilado antes de tiempo, con algunos cambios (no todos para mejor) y en una nueva y
fantástica presentación, el cartucho SEC: una cajita negra superchula que en vez de a un
zócalo se conecta a una ranura llamada Slot 1.
• optimizado para MMX (no sirve de mucho, pero hay que estar en la onda, chicos);
• nuevo encapsulado y conector a la placa (para eliminar a la competencia, como
veremos);
• rendimiento de 16 bits mejorado (ahora sí es mejor que un Pentium en Windows 95,
pero a costa de desaprovecharlo; lo suyo son 32 bits puros);
• caché secundaria encapsulada junto al chip (semi-interna, como si dijéramos), pero
a la mitad de la velocidad de éste (un retroceso desde el Pro, que iba a la misma
velocidad; abarata los costes de fabricación).
Vamos, un chip "Pro 2.0", con muchas luces y algunas sombras. La mayor sombra, su
método de conexión, el "Slot 1"; Intel lo patentó, lo que es algo así como patentar un
enchufe cuadrado en vez de uno redondo. El caso es que la jugada buscaba conseguir
que los PC fueran todos marca Intel; ¡y decían que los sistemas propietarios eran cosa de
Apple!
Eso sí, durante bastante tiempo fue el mejor chip del mercado, especialmente desde que
se dejó de fabricar el Pro.
AMD K6.
Un chip meritorio, mucho mejor que el K5. Incluía la "magia" MMX, aparte de un diseño
interno increíblemente innovador y una caché interna de 64 KB (no hace demasiado, ese
tamaño lo tenían las cachés externas; casi da miedo).
Se "pincha" en un zócalo de Pentium normal (un socket 7, para ser precisos) y la caché
secundaria la tiene en la placa base, a la manera clásica. Pese a esto, su rendimiento es
muy bueno: mejor que un MMX y sólo algo peor que un II, siempre que se pruebe en
Windows 95 (NT es terreno abonado para el Pentium II).
Aunque es algo peor en cuanto a cálculos de coma flotante (CAD y juegos), para oficina
es la opción a elegir en todo el mundo... excepto España. Aquí nos ha encantado lo de
"Intel Pentium Inside", y la gente no compra nada sin esta frase, por lo que casi nadie lo
vende y mucho menos a los precios ridículos de lugares como EEUU o Alemania. Oferta y
demanda, como todo; no basta con una buena idea, hay que convencer. De todas formas,
hasta IBM lo usa en algunos de sus equipos; por algo será.
Nada que añadir a lo dicho sobre el 6x86 clásico y el K6 de AMD; pues eso, un chip muy
bueno para trabajo de oficinas, que incluye MMX y que nunca debe elegirse para CAD o
juegos (peor que los AMD).
Muy poco recomendable, rendimiento mucho más bajo que el de Pentium II, casi idéntico
al del Pentium MMX.
Consiste en una revisión del K6, con un núcleo similar pero añadiéndole capacidades 3D
en lo que AMD llama la tecnología 3DNow! (algo así como un MMX para 3D). Además,
generalmente trabaja con un bus de 100 MHz hacia caché y memoria, lo que le hace
rendir igual que un Pentium II en casi todas las condiciones e incluso mucho mejor que
éste cuando se trata de juegos 3D modernos (ya que necesitan estar optimizados para
este chip o bien usar las DirectX 6 de Microsoft).
Pentium III.
Pentium 4.
Pentium M.
El Pentium M representa un cambio radical para Intel, ya que no es una versión de bajo
consumo del Pentium 4, sino una versión fuertemente modificada del diseño del Pentium
III (que a su vez es una modificación del Pentium Pro).
M. D. O. H. Sonia Alvarado Mares
17
Lenguaje Ensamblador
• Pentium M Banias
• Pentium M Dothan
• Pentium M Dothan (SonomaPentium M Yonah (Core Solo y Core Duo)
Pentium D.
Los procesadores Pentium D fueron introducidos por Intel en el verano de 2005 Intel
Developer Forum. Un chip Pentium D consiste básicamente en dos procesadores Pentium
4 (de núcleo Prescott) en una única pieza de silicio con un proceso de fabricación de 90
nm. El nombre en clave del Pentium D antes de su lanzamiento era "Smithfield". Incluye
una tecnología DRM (Digital Rights Management) para hacer posible un sistema de
protección anticopia de la mano de Microsoft.
Este microprocesador implementa 2Mb de caché compartida para ambos núcleos más un
bus frontal de 667Mhz; además implementa un nuevo juego de instrucciones para
multimedia (SSE3) y mejoras para las SSE y SSE2, sin embargo, el desempeño con
enteros es ligeramente inferior debido a su caché con mayor latencia.
Core 2 Quad o Core Quad son la nueva serie de procesadores de Intel de 4 núcleos (no
confundir con Core 2 Extreme) que salió al mercado en el primer trimestre del 2007. Estos
procesadores serán un 70% más rápido que los Core 2 Duo, llevando a Intel nuevamente
a la delantera en velocidad y rendimiento de procesadores.
Ancho
Fecha de Velocidad Número de Memoria Memoria Breve
Procesador de
presentación de reloj transistores direccionable virtual descripción
bus
Primer chip
2.300 (10 con
4004 15/11/71 108 KHz. 4 bits 640 byte
micras) manipulación
aritmética
Manipulación
8008 1/4/72 108 KHz. 8 bits 3.500 16 KBytes
Datos/texto
10 veces las
(6 micras)
8080 1/4/74 2 MHz. 8 bits 6.000 64 KBytes
prestaciones
del 8008
Idéntico al
5 MHz. 8086 excepto
8088 1/6/79 8 bits 29.000 en su bus
8 MHz. externo de 8
bits
8 MHz. De 3 a 6
134.000 1 veces las
80286 1/2/82 10 MHz. 16 Bits 16 Megabytes
(1.5 micras) Gigabyte prestaciones
12 MHz. del 8086
Primer chip
16 MHz. x86 capaz de
Microprocesador 20 MHz. 275.000 64 manejar
17/10/85 32 Bits 4 Gigabytes
Intel 386 DX® 25 MHz. (1 micra) Terabytes juegos de
33 MHz. datos de 32
bits
Bus capaz de
direccionar 16
Microprocesador 16 MHz. 275.000 64 bits
16/6/88 16 Bits 4 gigabytes
Intel 386 SX® 20 MHz. (1 micra) Terabytes procesando
32bits a bajo
coste
Ancho
Fecha de Velocidad Número de Memoria Memoria Breve
Procesador de bus
presentación de reloj transistores direccionable virtual descripción
Bus capaz de
direccionar 16
Microprocesador 16 MHz. 275.000 64 bits
16/6/88 16 Bits 4 gigabytes
Intel 386 SX® 20 MHz. (1 micra) Terabytes procesando
32bits a bajo
coste
Idéntico en
16 MHz. diseño al Intel
Microprocesador 20 MHz. 1.185.000 64 486DX, pero
22/4/91 32 Bits 4 Gigabytes
Intel 486 SX® 25 MHz. (0.8 micras) Terabytes sin
33 MHz. coprocesador
matemático
60 MHz.
66 MHz.
75 MHz. Arquitectura
90 MHz. escalable.
Procesador 100 MHz. 3,1 millones 64 Hasta 5
22/3/93 32 Bits 4 Gigabytes veces las
Pentium® 120 MHz. (0.8 micras) Terabytes prestaciones
133 MHz. del 486 DX a
150 MHz. 33 MHz.
166 MHz.
200 MHz.
Arquitectura
150 MHz. de ejecución
Procesador 5,5 millones 64 dinámica con
27/3/95 180 MHz. 64 Bits 4 Gigabytes
PentiumPro® (0.32 micras) Terabytes procesador
200 MHz. de altas
prestaciones
Procesador 7/5/97 233 MHz. 64 Bits 7,5 millones 4 Gigabytes 64 S.E.C., MMX,
PentiumII® 266 MHz. (0.32 micras) Terabytes Doble Bus
Indep.,
300 MHz.
Ejecución
Dinámica
Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos
clasificarlos de acuerdo a características. Así podemos clasificarlos en:
Se denominan así los ensambladores que se utilizan en una computadora que posee un
procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa
objeto producido.
Ensambladores Residentes.
Macroensambladores.
Microensambladores.
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.
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.
Las memorias han evolucionado mucho desde los comienzos del mundo de la
computación. Conviene recordar los tipos de memorias de semiconductores empleadas
como memoria principal y unas ligeras pinceladas sobre cada una de ellas para enmarcar
las memorias flash dentro de su contexto.
Jerarquía de memoria.
Memoria central o principal. En este nivel residen los programas y los datos. La CPU
lee y escribe datos en él aunque con menos frecuencia que en los niveles anteriores.
Tiene un tiempo de acceso relativamente rápido y gran capacidad.
usan estas memorias para apoyo de la memoria central en caso de que ésta sea
insuficiente (memoria virtual). Estas memorias suelen tener gran capacidad pero pueden
llegar a tener un tiempo de acceso muy lento. Dentro de ellas también se pueden
establecer varios niveles de jerarquía.
Categorías de memorias.
Las memorias se clasifican, por la tecnología empleada y, además según la forma en que
se puede modificar su contenido.
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.
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 ROM´s, o cuando los datos deben cambiar en
muchos o todos los casos.
(sólo lectura) se refiere a que, a diferencia de otras memorias, los datos no pueden ser
cambiados (al menos por el usuario final).
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.
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 IC, 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 Reunón de Aparatos
Electrónicos de la IEEE de 1984. Intel vió el potencial de la invención y en 1988 lanzó 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 arreglo
M. D. O. H. Sonia Alvarado Mares
25
Lenguaje Ensamblador
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.
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.
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 costo 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 costo 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 ms 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.
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.
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 memorias se utilizan desde los años 80 hasta ahora en todas 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 los años noventa
y dió 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 se 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 tenían 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
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 la tarjeta madre a la que se conectan.
Es tos módulos de 168 Pines son conocidos como DIMM SDRAM PC 66 y 100, 133,
obviamente si instalo una de 133, en una tarjeta madre 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 de la tarjeta madre, si este acelera
la memoria también pero tiene una desventaja son muy caras. Se conoce como DIMM
DDR SDRAM PC 1600 Y PC 2100.
SRAM (Static Random Access Memory). Los datos se almacenan formando biestables,
por lo que no requiere refresco. Igual que DRAM es volátil. Son más rápidas que las
DRAM y más caras.
Memoria Caché o SRAM. La memoria caché trabaja igual que la memoria virtual,
tenemos caché en el procesador, en los discos y en el la tarjeta madre y nos guarda
direcciones de memoria.
• Caché L1:
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 caché 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 L3:
L3 Algunos micro soportan un nivel de caché mas el L3 que esta localizado
en la tarjeta madre. EL AMD 6k-3 soporta este caché.
Vamos a señalar las funciones que debe realizar un computador para ejecutar trabajos de
entrada/salida:
Para la realización de una operación de E/S se deben efectuar las siguientes funciones:
Dispositivos externos.
Una de las funciones básicas del ordenador es comunicarse con los dispositivos
exteriores, es decir, el ordenador debe ser capaz de enviar y recibir datos desde estos
dispositivos. Sin esta función, el ordenador no sería operativo porque sus cálculos no
serían visibles desde el exterior.
Existe una gran variedad de dispositivos que pueden comunicarse con un ordenador,
desde los dispositivos clásicos (terminales, impresoras, discos, cintas, etc.) hasta
convertidores A/D y D/A para aplicaciones de medida y control de procesos. De todos los
posibles periféricos, algunos son de lectura, otros de escritura y otros de lectura y
escritura (es importante resaltar que este hecho siempre se mira desde el punto de vista
del proceso). Por otra parte, existen periféricos de almacenamiento también llamados
memorias auxiliares o masivas.
La mayoría de los periféricos están compuestos por una parte mecánica y otra parte
electrónica. Estas partes suelen separarse claramente para dar una mayor modularidad. A
la componente electrónica del periférico se le suele denominar controlador del dispositivo
o, también, adaptador del dispositivo. Si el dispositivo no tiene parte mecánica (como, por
ejemplo, la pantalla de un terminal), el controlador estará formado por la parte digital del
circuito. Frecuentemente los controladores de los dispositivos están alojados en una placa
de circuito impreso diferenciada del resto del periférico. En este caso es bastante habitual
que un mismo controlador pueda dar servicio a dispositivos de características similares.
El principal problema planteado por los periféricos es su gran variedad que también afecta
a las velocidades de transmisión. Por tanto, el mayor inconveniente que encontramos en
los periféricos es la diferencia entre sus velocidades de transmisión y la diferencia entre
éstas y la velocidad de operación del ordenador.
Dispositivos de entrada.
entrada.
Otros dispositivos de entrada son los lápices ópticos, que transmiten información gráfica
desde tabletas electrónicas hasta el ordenador; joysticks y el ratón, que convierte el
movimiento físico en movimiento dentro de una pantalla de ordenador; los escáneres
luminosos, que leen palabras o símbolos de una página impresa y los traducen a
configuraciones electrónicas que el ordenador puede manipular y almacenar; y los
Dispositivos de Entrada/Salida.
Entrada/Salida.
Los dispositivos de almacenamiento externo más frecuentes son los disquetes y los
discos duros, aunque la mayoría de los grandes sistemas informáticos utiliza bancos de
unidades de almacenamiento en cinta magnética. Los discos flexibles pueden contener,
según sea el sistema, desde varios centenares de miles de bytes hasta bastante más de
un millón de bytes de datos. Los discos duros no pueden extraerse de los receptáculos de
la unidad de disco, que contienen los dispositivos electrónicos para leer y escribir datos
sobre la superficie magnética de los discos y pueden almacenar desde varios millones de
bytes hasta algunos centenares de millones. La tecnología de CD-ROM, que emplea las
mismas técnicas láser utilizadas para crear los discos compactos (CD) de audio, permiten
capacidades de almacenamiento del orden de varios cientos de megabytes (millones de
bytes) de datos. También hay que añadir los recientemente aparecidos DVD que permiten
almacenar más de 4 Gb de información.
Dispositivos de salida.
salida.
Estos dispositivos permiten al usuario ver los resultados de los cálculos o de las
manipulaciones de datos de la computadora.
1.2 EL MICROPROCESADOR.
1.2.1 Buses.
Esto que en le teoría parece tan fácil es bastante mas complicado en la práctica, ya que
aparte de los bus de datos y de direcciones existen también casi dos docenas más de
líneas de señal en la comunicación entre la CPU y la memoria, a las cuales también se
acude. Todas las tarjetas del bus escuchan, y se tendrá que encontrar en primer lugar una
tarjeta que mediante el envío de una señal adecuada indique a la CPU que es
responsable de la dirección que se ha introducido. Las demás tarjetas se despreocupan
del resto de la comunicación y quedan a la espera del próximo ciclo de transporte de
datos que quizás les incumba a ellas.
Este mismo concepto es también la razón por la cual al utilizar tarjetas de ampliación en
un PC surgen problemas una y otra vez, si hay dos tarjetas que reclaman para ellas el
mismo campo de dirección o campos de dirección que se solapan entre ellos.
Los datos en si no se mandan al bus de direcciones sino al bus de datos. El bus XT tenía
solo 8 bits con lo cual sólo podía transportar 1 byte a la vez. Si la CPU quería depositar el
contenido de un registro de 16 bits o por valor de 16 bits, tenía que desdoblarlos en dos
bytes y efectuar la transferencia de datos uno detrás de otro.
De todas maneras para los fabricantes de tarjetas de ampliación, cuyos productos deben
atenderse a este protocolo, es de una importancia básica la regulación del tiempo de las
señales del bus, para poder trabajar de forma inmejorable con el PC. Pero precisamente
este protocolo no ha sido nunca publicado por lBM con lo que se obliga a los fabricantes a
medir las señales con la ayuda de tarjetas ya existentes e imitarlas. Por lo tanto no es de
extrañar que se pusieran en juego tolerancias que dejaron algunas tarjetas totalmente
eliminadas.
Estructuras de interconexión.
interconexión.
Existen dos organizaciones físicas de operaciones E/S que tienen que ver con los buses
que son: Bus único y Bus dedicado.
La primera gran diferencia entre estas dos tipos de estructuras es que el bus único no
permite un controlador DMA (todo se controla desde la CPU), mientras que el bus
dedicado si que soporta este controlador.
El bus dedicado trata a la memoria de manera distinta que a los periféricos (utiliza un bus
especial) al contrario que el bus único que los considera a ambos como posiciones de
memoria (incluso equipara las operaciones E/S con las de lectura/escritura en memoria).
Este bus especial que utiliza el bus dedicado tiene 4 componentes fundamentales:
La mayor ventaja del bus único es su simplicidad de estructura que le hace ser más
económico, pero no permite que se realice a la vez transferencia de información entre la
memoria y el procesador y entre los periféricos y el procesador.
Por otro lado el bus dedicado es mucho más flexible y permite transferencias simultáneas.
Por contra su estructura es más compleja y por tanto sus costes son mayores.
TIPOS DE BUSES.
BUSES.
Ahora vamos a ver los distintos tipos de buses que se han ido desarrollando y los que se
emplean en la actualidad.
Cuando en 1980 IBM fabricó su primer PC, este contaba con un bus de expansión
conocido como XT que funcionaba a la misma velocidad que los procesadores Intel 8086
y 8088 (4.77 Mhz). El ancho de banda de este bus (8 bits) con el procesador 8088
formaba un tandem perfecto, pero la ampliación del bus de datos en el 8086 a 16 bits dejo
en entredicho este tipo de bus (aparecieron los famosos cuellos de botella).
No tan solo se amplió el bus de datos sino que también se amplió el bus de direcciones,
concretamente hasta 24 bits, de manera que este se podía dirigir al AT con memoria de
16 MB. Además también se aumentó la velocidad de cada una de las señales de
frecuencia, de manera que toda la circulación de bus se desarrollaba más rápidamente.
De 4.77 Mhz en el XT se pasó a 8.33 Mhz. Como consecuencia el bus forma un cuello de
botella por el cual no pueden transferirse nunca los datos entre la memoria y la CPU lo
suficientemente rápido. En los discos duros modernos por ejemplo, la relación (ratio) de
transferencia de datos ya es superior al ratio del bus.
Vistas las limitaciones que tenía el diseño del bus ISA en IBM se trabajó en un nueva
tecnología de bus que comercializó con su gama de ordenadores PS/2. El diseño MCA
(Micro Channel Arquitecture) permitía una ruta de datos de 32 bits, más ancha, y una
velocidad de reloj ligeramente más elevada de 10 Mhz, con una velocidad de
transferencia máxima de 20 Mbps frente a los 8 Mbps del bus ISA.
Pero lo que es más importante el novedoso diseño de bus de IBM incluyó un circuito de
control especial a cargo del bus, que le permitía operar independientemente de la
velocidad e incluso del tipo del microprocesador del sistema.
Bajo MCA, la CPU no es más que uno de los posibles dispositivos dominantes del bus a
los que se puede acceder para gestionar transferencias. La circuitería de control, llamada
CAP (punto de decisión central), se enlaza con un proceso denominado control del bus
para determinar y responder a las prioridades de cada uno de los dispositivos que
dominan el bus.
Las señales del bus estaban reorganizadas de forma que se introducía una señal de tierra
cada 4 conectores. De esta forma se ayudaba a reducir las interferencias.
El principal rival del bus MCA fue el bus EISA, también basado en la idea de controlar el
bus desde el microprocesador y ensanchar la ruta de datos hasta 32 bits. Sin embargo
EISA mantuvo compatibilidad con las tarjetas de expansión ISA ya existentes lo cual le
M. D. O. H. Sonia Alvarado Mares
36
Lenguaje Ensamblador
obligo a funcionar a una velocidad de 8 Mhz (exactamente 8.33). Esta limitación fue la que
adjudico el papel de estándar a esta arquitectura, ya que los usuarios no veían factible
cambiar sus antiguas tarjetas ISA por otras nuevas que en realidad no podían aprovechar
al 100%.
Su mayor ventaja con respecto al bus MCA es que EISA era un sistema abierto, ya que
fue desarrollado por la mayoría de fabricantes de ordenadores compatibles PC que no
aceptaron el monopolio que intentó ejercer IBM. Estos fabricantes fueron: AST, Compaq,
Epson, Hewlett Packard, NEC, Olivetti, Tandy, Wyse y Zenith.
En una máquina EISA, puede haber al mismo tiempo hasta 6 buses principales con
diferentes procesadores centrales y con sus correspondientes tarjetas auxiliares.
En este bus hay un chip que se encarga de controlar el tráfico de datos señalando
prioridades para cada posible punto de colisión o bloqueo mediante las reglas de control
de la especificación EISA. Este chip recibe el nombre de Chip del Sistema Periférico
Integrado (ISP). Este chip actúa en la CPU como un controlador del tráfico de datos.
El motivo para que ni MCA ni EISA hayan sustituido por completo a ISA es muy sencillo:
Estas alternativas aumentaban el coste del PC (incluso más del 50%) y no ofrecían
ninguna mejora evidente en el rendimiento del sistema. Es más, en el momento en que se
presentaron estos buses (1987-1988) esta superioridad en el rendimiento no resultaba
excesivamente necesaria: muy pocos dispositivos llegaban a los límites del rendimiento
del bus ISA ordinario.
Local Bus.
Teniendo en cuenta las mencionadas limitaciones del bus AT y la infalibilidad de los buses
EISA y MCA para asentarse en el mercado, en estos años se han ideado otros conceptos
de bus. Se inició con el llamado Vesa Local Bus (VL-Bus), que fue concebido y propagado
independientemente por el Comité VESA, que se propuso el definir estándares en el
ámbito de las tarjetas gráficas y así por primera vez y realmente tuviera poco que ver con
el diseño del bus del PC. Fueron y son todavía las tarjetas gráficas quienes sufren la
menor velocidad del bus AT. Por eso surgió, en el Comité VESA, la propuesta para un bus
más rápido que fue el VESA Local Bus.
Al contrario que con el EISA, MCA y PCI, el bus VL no sustituye al bus ISA sino que lo
complementa. Un PC con bus VL dispone para ello de un bus ISA y de las
correspondientes ranuras (slots) para tarjetas de ampliación. Además, en un PC con bus
VL puede haber, sin embargo, una, dos o incluso tres ranuras de expansión, para la
colocación de tarjetas concebidas para el bus VL, casi siempre gráficos. Solamente estos
slots están conectados con la CPU a través de un bus VL, de tal manera que las otras
ranuras permanecen sin ser molestadas y las tarjetas ISA pueden hacer su servicio sin
inconvenientes.
El VL es una expansión homogeneizada de bus local, que funciona a 32 bits, pero que
puede realizar operaciones a 16 bits.
VESA presentó la primera versión del estándar VL-BUS en agosto de 1992. La aceptación
por parte del mercado fue inmediata. Fiel a sus orígenes, el VL-BUS se acerca mucho al
diseño del procesador 80486. De hecho presenta las mismas necesidades de señal de
dicho chip, exceptuando unas cuantas menos estrictas destinadas a mantener la
compatibilidad con los 386.
La nueva especificación define una interface de 64 bits pero que mantienen toda
compatibilidad con la actual especificación VL-BUS. La nueva especificación 2.0 redefine
además la cantidad máxima de ranuras VL-BUYS que se permiten en un sistema sencillo.
Ahora consta de hasta tres ranuras a 40 Mhz y dos a 50 Mhz, siempre que el sistema
utilice un diseño de baja capacitancia.
En el nombre del bus VL queda de manifiesto que se trata de un bus local. De forma
distinta al bus ISA éste se acopla directamente en la CPU. Esto le proporciona por un lado
una mejora substancial de la frecuencia de reloj (de la CPU) y hace que dependa de las
líneas de control de la CPU y del reloj. A estas desventajas hay que añadirle que no en
todos los puntos están bien resueltas las especificaciones del comité VESA, hecho que a
la larga le llevará a que el éxito del bus VL se vea empañado por ello. En sistemas 486
económicos se podía encontrar a menudo, pero su mejor momento ya ha pasado.
Visto lo anterior, se puede ver que el bus del futuro es claramente el PCI de Intel. PCI
significa: interconexión de los componentes periféricos (Peripheral Component
Interconnect) y presenta un moderno bus que no sólo está meditado para no tener la
relación del bus ISA en relación a la frecuencia de reloj o su capacidad sino que también
la sincronización con las tarjetas de ampliación en relación a sus direcciones de puerto,
canales DMA e interrupciones, se ha automatizado finalmente de tal manera que el
usuario no deberá preocuparse más por ello.
El bus PCI es independiente de la CPU, ya que entre la CPU y el bus PCI se instalará
siempre un controlador de bus PCI, lo que facilita en gran medida el trabajo de los
diseñadores de placas. Por ello también será posible instalarlo en sistemas que no estén
basados en el procesador Intel si no que pueden usar otros, como por ejemplo, un
procesador Alpha de DEC. También los procesadores PowerMacintosh de Apple se
suministran en la actualidad con bus PCI.
Las tarjetas de expansión PCI trabajan eficientemente en todos los sistemas y pueden ser
intercambiadas de la manera que se desee. Solamente los controladores de dispositivo
deben naturalmente ser ajustados al sistema anfitrión (host) es decir a su correspondiente
CPU.
Como vemos el bus PCI no depende del reloj de la CPU, porque está separado de ella
por el controlador del bus. Si se instalara una CPU más rápida en su ordenador no
debería preocuparse porque las tarjetas de expansión instaladas no pudieran soportar las
frecuencias de reloj superiores, pues con la separación del bus PCI de la CPU éstas no
son influidas por esas frecuencias de reloj. Así se ha evitado desde el primer momento
este problema y defecto del bus VL.
El bus PCI emplea un conector estilo Micro Channel de 124 pines (188 en caso de una
implementación de 64 bits) pero únicamente 47 de estas conexiones se emplean en una
tarjeta de expansión (49 en caso de que se trate de un adaptador bus-master); la
diferencia se debe a la incorporación de una línea de alimentación y otra de tierra. Cada
una de las señales activas del bus PCI está bien junto o frente a una señal de
alimentación o de tierra, una técnica que minimiza la radiación.
El límite práctico en la cantidad de conectores para buses PCI es de tres; como ocurre
con el VL, más conectores aumentarían la capacitancia del bus y las operaciones a
máxima velocidad resultarían menos fiables.
A pesar que de que las tarjetas ISA no pueden ser instaladas en una ranura PCI, no
debería renunciarse a la posibilidad de inserción de una tarjeta ISA. Así pues, a menudo
se puede encontrar en un equipo con bus PCI la interfaz «puente» llamada «PCI-To-ISA-
Bridge». Se trata de un chip que se conecta entre los distintos slots ISA y el controlador
del bus PCI. Su tarea consiste en transponer las señales provenientes del bus PCI al bus
ISA. De esta manera pueden seguir siendo utilizadas las tarjetas ISA al amparo del bus
PCI.
A pesar de que el bus PCI es el presente, sigue habiendo buses y tarjetas de expansión
ISA ya que no todas las tarjetas de expansión requieren las ratios de transferencia que
permite el bus PCI. Sin embargo las tarjetas gráficas, tarjetas SCSI y tarjetas de red se
han decantando cada vez más fuertemente hacia el bus PCI. La ventaja de la velocidad
de este sistema de bus es que este hardware puede participar del continuo incremento de
velocidad de los procesadores.
1.2.2 Registros.
La ventaja de esta división fue el ahorro de esfuerzo necesario para producir el 8088. Sólo
una mitad del 8086 (el BIU) tuvo que rediseñarse para producir el 8088.
Usándolo se produce (en general) una instrucción que ocupa un byte menos que si
se utilizaran otros registros de uso general. Su parte más baja, AL, también tiene
esta propiedad. El último registro mencionado es el equivalente al acumulador de
los procesadores anteriores (8080 y 8085). Además hay instrucciones como DAA;
DAS; AAA; AAS; AAM; AAD; LAHF; SAHF; CBW; IN y OUT que trabajan con AX o
con uno de sus dos bytes (AH o AL). También se utiliza este registro (junto con DX
a veces) en multiplicaciones y divisiones.
Aunque es un registro de uso general, debe utilizarse sólo como puntero de pila, la
cual sirve para almacenar las direcciones de retorno de subrutinas y los datos
temporarios (mediante las instrucciones PUSH y POP). Al introducir (push) un
valor en la pila a este registro se le resta dos, mientras que al extraer (pop) un
valor de la pila este a registro se le suma dos.
Es la encargada de realizar las operaciones aritméticas (suma, suma con "arrastre", resta,
resta con "préstamo" y comparaciones) y lógicas (AND, OR, XOR y TEST). Las
operaciones pueden ser de 16 bits o de 8 bits.
Indicadores (flags
(flags).
).
Hay nueve indicadores de un bit en este registro de 16 bits. Los cuatro bits más
significativos están indefinidos, mientras que hay tres bits con valores determinados: los
bits 5 y 3 siempre valen cero y el bit 1 siempre vale uno (esto también ocurría en los
procesadores anteriores).
• CF (Carry Flag, bit 0): Si vale 1, indica que hubo "arrastre" (en caso de suma)
hacia, o "préstamo" (en caso de resta) desde el bit de orden más significativo del
resultado. Este indicador es usado por instrucciones que suman o restan números
que ocupan varios bytes. Las instrucciones de rotación pueden aislar un bit de la
memoria o de un registro poniéndolo en el CF.
• PF (Parity Flag, bit 2): Si vale uno, el resultado tiene paridad par, es decir, un
número par de bits a 1. Este indicador se puede utilizar para detectar errores en
transmisiones.
• AF (Auxiliary carry Flag, bit 4): Si vale 1, indica que hubo "arrastre" o "préstamo"
del nibble (cuatro bits) menos significativo al nibble más significativo. Este indicador
se usa con las instrucciones de ajuste decimal.
• ZF (Zero Flag, bit 6): Si este indicador vale 1, el resultado de la operación es cero.
• SF (Sign Flag, bit 7): Refleja el bit más significativo del resultado. Como los
números negativos se representan en la notación de complemento a dos, este bit
representa el signo: 0 si es positivo, 1 si es negativo. (de -128 a 127 para números
con signo y sin signo de 0 a 255)
• TF (Trap Flag, bit 8): Si vale 1, el procesador está en modo paso a paso. En este
modo, la CPU automáticamente genera una interrupción interna después de cada
instrucción, permitiendo inspeccionar los resultados del programa a medida que se
ejecuta instrucción por instrucción.
• DF (Direction Flag, bit 10): Si vale 1, las instrucciones con cadenas sufrirán "auto-
decremento", esto es, se procesarán las cadenas desde las direcciones más altas
de memoria hacia las más bajas. Si vale 0, habrá "auto-incremento", lo que quiere
decir que las cadenas se procesarán de "izquierda a derecha".
Cola de instrucciones.
Almacena las instrucciones para ser ejecutadas. La cola se carga cuando el bus está
desocupado, de esta manera se logra una mayor eficiencia del mismo. La cola del 8086
tiene 6 bytes y se carga de a dos bytes por vez (debido al tamaño del bus de datos),
mientras que el del 8088 tiene cuatro bytes. Esta estructura tiene rendimiento óptimo
cuando no se realizan saltos, ya que en este caso habría que vaciar la cola (porque no se
van a ejecutar las instrucciones que van después del salto) y volverla a cargar con
El programador puede acceder a cinco registros de 16 bits cada uno, siendo cuatro de
ellos registros de segmento y el restante el puntero de instrucción (IP).
Los registros anteriores son primordiales para generar la dirección de 20 bits que se
pondrá en el bus de direcciones de la CPU. Cualquier operación que accede la memoria
usará forzosamente uno de estos registros.
El cometido de este bloque es poder unir los bloques anteriormente mencionados con el
mundo exterior, es decir, la memoria y los periféricos.
El 8088 tiene un bus de datos externo reducido de 8 bits. La razón para ello era prever la
continuidad entre el 8086 y los antiguos procesadores de 8 bits, como el 8080 y el 8085.
Teniendo el mismo tamaño del bus (así como similares requerimientos de control y
tiempo), el 8088, que es internamente un procesador de 16 bits, puede reemplazar a los
microprocesadores ya nombrados en un sistema ya existente.
El 8088 tiene muchas señales en común con el 8085, particularmente las asociadas con
la forma en que los datos y las direcciones están multiplexadas, aunque el 8088 no
produce sus propias señales de reloj como lo hace el 8085 (necesita un chip de soporte
llamado 8284, que es diferente del 8224 que necesitaba el microprocesador 8080). El
8088 y el 8085 siguen el mismo esquema de compartir los terminales correspondientes a
los 8 bits más bajos del bus de direcciones con los 8 bits del bus de datos, de manera que
se ahorran 8 terminales para otras funciones del microprocesador. El 8086 comparte los
16 bits del bus de datos con los 16 más bajos del bus de direcciones.
El 8085 y el 8088 pueden, de hecho, dirigir directamente los mismos chips controladores
de periféricos. Las investigaciones de hardware para sistemas basados en el 8080 o el
8085 son, en su mayoría, aplicables al 8088. En todo lo recién explicado se basó el éxito
del 8088.
Introducción.
Introducción.
Aef. = f(x).
Direccionamiento implícito.
• El acceso a los registros es muy rápido, por tanto el direccionamiento por registro
debe usarse en las variables que se usen con más frecuencia para evitar accesos
a memoria que son más lentos, un ejemplo muy típico del uso de este
direccionamiento son los índices de los bucles.
Direccionamiento indirecto.
Este direccionamiento es útil cuando se trabaja con punteros ya que los punteros son
variables que contienen las direcciones de los operandos, no los operandos mismos.
Ejemplo: MOV AX, [SI], esta instrucción toma el contenido del registro SI como una
localidad de memoria, accesa dicha localidad, obtiene el valor que se encuentra en ella y
lo mueve al registro AX.
Direccionamiento relativo.
Hay algunos modos de direccionamiento en que se hace uso de una propiedad muy
generalizada de los programas denominada localidad de referencia, esta propiedad
consiste en que las direcciones referenciadas por los programas no suelen alejarse
mucho unas de otras y, por tanto, suelen estar concentradas en una parte de la memoria.
Estas consideraciones nos llevan a la conclusión de que no es necesario utilizar todos los
bits de la dirección de memoria en el campo de operando, basta utilizar los bits precisos
para cubrir la parte de memoria donde estén incluidas las direcciones a las que el
programa hace referencia. Esto puede hacerse tomando como referencia un punto de la
memoria y tomando como campo de operando la diferencia entre ese punto y la dirección
efectiva del operando. La dirección que se toma como punto de referencia puede residir
en un registro de la CPU y, por tanto, sumando el contenido de ese registro con el campo
de operando obtendremos la dirección efectiva. Hay varios direccionamientos basados en
esta técnica que reciben diferentes nombres dependiendo de cuál sea el registro en el
que radica la dirección tomada como referencia. Todos ellos podrían catalogarse como
direccionamientos relativos a un registro.
efectiva del operando se calculará sumando el contenido del registro base con el campo
de operando.
Direccionamiento indexado
Este modo es útil para manejar vectores y matrices como se veía en el apartado anterior.
También se puede utilizar para extraer datos de pilas (que crezcan hacia direcciones
bajas) ya que, si el registro sobre el que se aplica este modo es el apuntador de pila,
después de la operación el apuntador señalará al siguiente elemento de la pila.
En este modo para obtener la dirección del operando hay que decrementar un registro en
el tamaño del operando; el nuevo contenido del registro después de efectuar esa
operación, es la dirección del operando.
1.3 INTERRUPCIONES.
Por otro lado, las interrupciones de software en realidad no interrumpen algo sino más
bien son una variante de las rutinas, las cuales pueden invocarse a voluntad y son
controladas por el programa en forma síncrona (o sea que se conoce todo lo relacionado
con su ejecución, pues el programa controla el momento y la manera en que son
invocadas) mediante la secuencia de instrucciones Call y Ret. Sin embargo, para
interrupciones de software mediante la instrucción Int num de la interrupción (pero siguen
siendo operaciones síncronas).
Cuando la CPU está lista para atender a quien la interrumpió, pasa el control a una rutina
llamada Manejador de interrupciones. Esta rutina define la causa de la interrupción,
proporciona el servicio solicitado y regresa el control a la CPU para que ésta pueda
proseguir con lo que estaba haciendo antes.
Como ya se dijo, la mayoría de las interrupciones son causadas por eventos externos a la
CPU, como por ejemplo:
Para que puedan dar un servicio adecuado a las interrupciones, la mayoría de los
procesadores usan diferentes niveles de interrupción. Para cada nivel existe una
M. D. O. H. Sonia Alvarado Mares
52
Lenguaje Ensamblador
Enseguida usa el número de 8 bits puesto en el bus del sistema por quien intenta
interrumpir a la CPU, y calcula la dirección en formato segmento:desplazamiento del
manejador que se encuentra en memoria baja ( # de interrupción * 4).
Una vez teniendo la dirección del vector, le pasa el control a éste y la ejecución continúa
en este punto. Al recibir el control, el manejador, habilita las interrupciones, guarda los
registros que va a usar, procesa la interrupción y finalmente restaura el contenido original
de las banderas y de los registros CS e IP mediante la instrucción Iret.
Algunos dispositivos, los que están canalizados por el PIC, necesitan mandarle una señal
de Fin de interrupción (End Of Interrupt, EOI) al mismo PIC mediante su puerto de control.
Esto tiene como propósito indicarle al circuito que ya se terminó de procesar la
interrupción y que todo está bien.
1.3.1 Hardware.
Las interrupciones internas son generadas por ciertos eventos que surgen durante la
ejecución de un programa.
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.
Estas interrupciones en su mayoría son generadas por los periféricos y/o por los
coprocesadores. Estos dispositivos pueden estar conectados a la patilla NMI o INTR de la
CPU. La patilla NMI está reservada para eventos drásticos como pueden ser una falla en
la fuente de poder o algún error de paridad en la memoria. Su nombre, externa, que es
una interrupción no enmascarable; es decir, que no se puede deshabilitar.
Las interrupciones que utilizan la patilla INTR pueden controlarse mediante dos
instrucciones de la CPU llamadas Sti (set interrupt) y Cli (clear interrupt). La asignación de
dispositivos a niveles específicos de interrupción es realizada por el fabricante. Estas
asignaciones son físicas y no pueden alterarse mediante el software.
1.3.2 Software.
Las interrupciones de software pueden ser activadas directamente por el ensamblador
invocando al número de interrupción deseada con la instrucción INT.
Este tipo de interrupciones podemos separarlas en dos categorías: las interrupciones del
sistema operativo DOS y las interrupciones del BIOS.
La diferencia entre ambas es que las interrupciones del sistema operativo son más fáciles
de usar pero también son más lentas ya que estas interrupciones hacen uso del BIOS
para lograr su cometido, en cambio las interrupciones del BIOS son mucho más rápidas
pero tienen la desventaja que, como son parte del hardware son muy específicas y
pueden variar dependiendo incluso de la marca del fabricante del circuito.
El formato interno.
El formato interno de una línea de código se puede resumir en cuatro partes. La etiqueta /
variable / constante (puede definirse o no, y si se define debe estar seguida por
separadores, ya sea uno o más espacios o tabuladores). El nombre nemónico / directiva,
que puede equiparse con el verbo o la acción por realizar, seguido de uno o más
separadores (espacios o tabuladores). El operando, que generalmente se divide en dos
(aunque existen instrucciones que sólo opera con uno): el destino (que será el depósito
del algún resultado) y la fuente de la información (el originador de la “acción”). El destino y
la fuente (si existe ésta) deben estar separados por una coma. Finalmente tenemos el
comentario, que siempre va precedido por el símbolo “;” (debe estar separado del
operando por uno o más espacios o tabuladores, y puede existir o no).
El formato externo.
El formato externo está formado por varios comandos clave que permiten establecer el
entorno operativo del programa. Entre ellos tenemos uno que define el modelo de
memoria (básicamente establece cuáles y cuántos segmentos se van a usar), los
diferentes segmentos que contendrá el código, los datos y la pila, así como el comienzo y
final del programa. Ahora bien, existen dos maneras de definir el programa: en la primera
se usan directivas simplificadas y en la segunda no se usan. Las directivas simplificadas
ayudan a esclarecer ciertos comandos crípticos del programa, permitiendo que sean más
legibles, y se incluyeron en las versiones del MASM 5.0 y posteriores.
Como ya dijimos, un programa contiene cuatros segmentos, los cuales ala hora de
definirlos no necesariamente deben estar en un orden determinado. De hecho el
segmento extra (ES) no se define como parte del programa, solamente se hace referencia
a él en otro de los segmentos, regularmente en el segmento de código.
Un segmento inicia en un límite de párrafo, que es una dirección por lo común divisible
entre el 16 decimal, o el 10 hexadecimal. Suponga que un segmento de datos inicia en la
localidad de memoria 045F0H. Ya que en este y todos los demás casos el último dígito
hexadecimal de la derecha es cero, los diseñadores de computadoras decidieron que
sería innecesario almacenar el dígito cero en el registro del segmento. Así, 045F0H se
almacena como 045F, con el cero de la extrema derecha sobreentendido.
Desplazamiento de segmentos.
En un programa, todas las localidades de memoria están referidas a una dirección inicial
de segmento. La distancia en bytes desde la dirección del segmento se define como el
desplazamiento (offset). Un desplazamiento de dos bytes (16 bits) puede estar en el
rango de 0000H hasta FFFFH, o bien, desde cero hasta 65,535. Así, el primer byte del
segmento de código tiene un desplazamiento 00, el segundo byte tiene un
desplazamiento 01, etc., hasta el desplazamiento 65535. Para referir cualquier dirección
de memoria en un segmento, el procesador, el procesador combina la dirección del
segmento en un registro de segmento con un valor de desplazamiento.
Por tanto, la localidad real de memoria del byte referido por la instrucción es 04622H:
Note que un programa tiene uno o más segmentos, los cuales pueden iniciar casi en
cualquier lugar de memoria, variar en tamaño y estar en cualquier orden.
[nombre] Dn expresión
Nombre. Un programa que hace referencia a un elemento de dato lo hace por medio de
un nombre. Por otro lado, el nombre de un elemento es opcional, indicado por los
corchetes. La sección anterior “Instrucciones”, proporciona las reglas para la formación de
los nombres.
Directivas (Dn). Las directivas que definen elementos de datos son DB (byte), DW
(palabra), DD (palabra doble), DF (palabra larga), DQ (palabra cuádruple) y DT (diez
bytes), cada una indica de manera explícita la longitud del elemento definido.
Puede usar con libertad este valor inicializado en su programa y aun puede cambiar el
contenido de VAR2.
Una expresión puede contener varios valores constantes separados por comas y limitados
sólo por la longitud de la línea, como sigue:
El tercer ejemplo genera cuatro copias del dígito 8 (8888) y duplica el valor tres veces,
produciendo un total de doce 8.
Una expresión puede definir e inicializar una cadena de caracteres o una constante
numérica.
Cadenas de caracteres.
Las cadenas de caracteres son usadas para datos descriptivos como nombres de
personas y títulos de páginas. La cadena está definida dentro de apóstrofos, como ´PC´, o
dentro de comillas, como “PC”. El ensamblador traduce las cadenas de caracteres en
código objeto en formato ASCII normal.
Extrañamente, DB es el único formato que define una cadena de caracteres que excede a
dos caracteres y los almacena en la secuencia normal de izquierda a derecha. En
consecuencia, DB es el formato convencional para la definición de datos de caracteres de
cualquier longitud. Un ejemplo es
DB ´Cadena de caracteres´
Constantes numéricas.
Las constantes numéricas son usadas para definir valores aritméticos y direcciones de
memoria. Las constantes no están definidas entre comillas, pero van seguidas por un
M. D. O. H. Sonia Alvarado Mares
60
Lenguaje Ensamblador
especificador de base opcional, tal como H en el valor hexadecimal 12H. Para la mayoría
de las directivas de definición de datos, el ensamblador convierte constantes numéricas
definidas a hexadecimal y almacena los bytes generados en código objeto en orden
inverso –de derecha a izquierda. A continuación están los diferentes formatos nuericos.
Decimal.
El formato decimal permite definir con los dígitos decimales 0 a 9, seguidos de manera
opcional por el especificador de base D, tal como 125 o 125D. Aunque el ensamblador
permite que usted defina valores en formato decimal, como una conveniencia al codificar,
él convierte sus valores decimales a código objeto binario y los representa en
hexadecimal. Por ejemplo, una definición del decimal 125 se convirtió en 7D hexadecimal.
Hexadecimal.
Binario.
El formato binario permite definir con los dígitos binarios 0 y 1, seguidos por el
especificador de base B. El uso normal del formato binario es para distinguir valores en
las instrucciones de manejo de bits AND, OR, XOR y TEST.
Ya que el ensamblador convierte todos los valores numéricos a binarios ( y los representa
en hexadecimal), las definiciones de 12, C hex y 1100 binario general el mismo valor :
0000 1100 binario o 0C hex, dependiendo de cómo vea el contenido del byte.
Cómo las letras D y B actúan tanto como especificadotes de base como dígitos
hexadecimales, pueden causar alguna confusión. Como solución, MASM 6.0 introdujo el
uso de la T (por ten, diez) y la Y (por binary, binario) como especificadores de base para
decimal y binario, respectivamente.
Real.
Identificadores.
El primer carácter de un identificador debe ser una letra o un carácter especial, excepto el
punto. Ya que el ensamblador utiliza algunos símbolos especiales en palabras que inician
con el símbolo @, debe evitar usarlo en sus definiciones.
ADD AX, BX
MOV REGSAVE, AX
el ensamblador puede reconocer el nombre REGSAVE sólo si se define en algún lugar del
programa.
Los programas .COM y .EXE, requieren un área del programa reservada como una pila
(stack). El propósito de la pila es mantener un espacio para el almacenamiento temporal
de direcciones y datos.
El DOS define de manera automática la pila para un programa .COM, mientras que para
un programa .EXE usted debe definir en forma explícita la pila. Cada elemento de dato en
la pila es una palabra (dos bytes). El registro SS, como es inicializado por el DOS,
contiene la dirección del inicio de la pila. Inicialmente, el SP contiene el tamaño de la pila,
un valor que apunta al byte que está pasando el final de la pila. La pila difiere de otros
segmentos en su método de almacenar los datos: empieza en la localidad más alta y
almacena los datos hacia abajo por la memoria.
Note que las instrucciones POP son codificadas en secuencia inversa a la instrucción
PUSH. Así el ejemplo
El segmento de código (CS) contiene las instrucciones de máquina que son ejecutadas.
Por lo común, la primera instrucción ejecutable está en el inicio del segmento, y el sistema
operativo enlaza a esa localidad para iniciar la ejecución del programa. Como su nombre
indica, el registro del CS direcciona el segmento de código. Si su área de código requiere
más de 64 K, su programa puede necesitar definir más de un segmento de código.
Palabras reservadas.
Ciertas palabras en lenguaje ensamblador están reservadas para sus propósitos propios,
y son usadas sólo bajo condiciones especiales. Por categorías las palabras reservadas
incluyen
• instrucciones, como MOV y ADD, que son operaciones que la computadora puede
ejecutar;
• directivas, como END o SEGMENT, que se emplean para proporcionar comandos
al ensamblador;
• operadores, como FAR y SIZE, que se utilizan en expresiones; y
• símbolos predefinidos, como @Data y @Model, que regresan información a su
programa.
• Si se utiliza el punto «.» éste debe colocarse como primer carácter de la etiqueta.
Las etiquetas son de tipo NEAR cuando el campo de etiqueta finaliza con dos puntos (:);
esto es, se considera cercana: quiere esto decir que cuando realizamos una llamada
sobre dicha etiqueta el ensamblador considera que está dentro del mismo segmento de
código (llamadas intrasegmento) y el procesador sólo carga el puntero de instrucciones
IP. Téngase en cuenta que hablamos de instrucciones; las etiquetas empleadas antes de
las directivas, como las directivas de definición de datos por ejemplo, no llevan los dos
puntos y sin embargo son cercanas.
Las etiquetas son de tipo FAR si el campo de etiqueta no termina con los dos puntos: en
estas etiquetas la instrucción a la que apunta no se encuentra en el mismo segmento de
código sino en otro. Cuando es referenciada en una transferencia de control se carga el
puntero de instrucciones IP y el segmento de código CS (llamadas intersegmento).
Campo operandos. Indica cuales son los datos implicados en la operación. Puede haber
0, 1 ó 2; en el caso de que sean dos al 1º se le llama destino y al 2º -separado por una
coma- fuente.
mov ax, es:[di] --> ax destino
es:[di] origen
Campo comentarios. Cuando en una línea hay un punto y coma (;) todo lo que sigue en
la línea es un comentario que realiza aclaraciones sobre lo que se está haciendo en ese
programa, resulta de gran utilidad de cara a realizar futuras modificaciones al mismo.
1.4.5 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.-
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.-
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:
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.
END [expresión]
Asignación de segmentos.-
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
Etiquetas.-
Etiquetas. Las etiquetas son declaradas
nombre:
Declaración de datos.-
datos.- Estos se declaran según el tipo, mediante la regla
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.-
estructuras Para la declaración de estructuras de datos se emplea la
directiva STRUC. Su sintaxis es:
nombre STRUC
campos
nombre ENDS
Será usted muy afortunado si su programa actúa sin errores la primera vez; la mayoría de
los programas requieren una cuarta etapa que consiste en corregir y depurar los errores.
EDICIÓN.
EDICIÓN.
Los archivos fuente de código ensamblador deben estar en formato ASCII standard. Se
puede usar cualquier editor de texto, el compilador (ensamblador) es el MASM y el
enlazador es el programa LINK. Al utilizar el editor de texto para crear un archivo, se esta
formando el archivo fuente (archivo que contiene todas las instrucciones en el formato del
ensamblador). La extensión usada en ensamblador para el archivo fuente es .ASM. Este
archivo es traducido por el MASM, generando así un archivo intermedio en formato OBJ.
El formato OBJ es conocido como formato intermedio porque aún no es ejecutable. El
enlazador (linker) combina uno o más archivos .OBJ para generar el archivo ejecutable,
cuya extensión es .EXE (también puede ser .COM, dependiendo de la forma en que se
ensambló).
Para esto puede usarse cualquier editor que permita crear archivos sin formato, por
ejemplo: Edlin, Edit, Write, El editor del Turbo Pascal, Works, Word, etcétera. Las
declaraciones pueden ser introducidas en mayúsculas y/o minúsculas. Una buena
práctica de programación es poner todas las palabras reservadas (directivas e
ENSAMBLADO.
Una vez creado el archivo fuente, es necesario que pase por el MASM para generar el
archivo intermedio (formato OBJ). El comando para ello es:
MASM archivo;
He aquí un ejemplo:
MASM prueba;
MASM pondrá entre corchetes la respuesta que considere correcta. La opción Source
listing (listado fuente) permite generar un archivo que contendrá línea por línea el código
de máquina (en notación hexadecimal) generado y la línea de su código fuente. También
contiene información adicional, por ejemplo los símbolos usados en el programa y los
diferentes segmentos. El nombre NUL.LST usado por MASM indica que usted no desea
dicho listado. La opción Cross-reference (referencias recíprocas) contiene información
sobre cada símbolo de su código fuente, mostrando el número de línea donde fue
declarado y todas las líneas que hacen referencia a él. De nuevo, el nombre NUL.CRF
indica que tampoco desea generar dicho listado.
MASM ofrece la opción de recibir parámetros desde la línea para comandos de MS-DOS.
Existen demasiados parámetros, los que se mencionan más adelante son sólo algunos
de ellos; sin embargo, es conveniente explicar cómo se pasan al MASM. Todo parámetro
pasado al MASM debe estar precedido por el símbolo “/”, seguido de la inicial del
parámetro (pueden repetirse uno o más parámetros en la línea para comandos. Una vez
especificados todos los parámetros, se incluye el nombre del archivo por ensamblar.
El MASM traduce (ensambla) el archivo de código fuente a otro de formato .OBJ. Sin
embargo, MS-DOS no puede ejecutar este último archivo. Primero es necesario pasar el
archivo .OBJ por otro proceso que definirá muchos detalles y generará el archivo
ejecutable; dicho proceso es realizado por el Enlazador. El comando para invocar al
Enlazador tiene similitud con el que se usa para invocar al MASM. Simplemente digite:
Para ampliar el concepto anterior, suponga que tiene dos archivos con extensión .OBJ:
prueba1.obj y prueba2.obj, y que además desea mezclar los dos archivos anteriores con
una biblioteca de gráfico llamada bibliogr.lib. Usando el enlazador para generar el
programa ejecutable, se utilizaría el siguiente comando:
Tome en cuenta que en la línea para comandos, el primer archivo siempre debe ser el
principal, es decir, el que controlará la secuencia de eventos. El objetivo de enlazar todos
los archivos .OBJ es poder generar un solo archivo ejecutable con la extensión .EXE. En
el ejemplo anterior se generaría el archivo PRUEBA1.EXE.
donde:
objeto.- Es el nombre para el archivo .OBJ
ejecutable.- Nombre del archivo .EXE
mapa.- Nombre del archivo mapa
librería.- Nombre del archivo biblioteca de rutinas
opciones.- Pueden ser:
EJECUCIÓN.
EJECUCIÓN.
El PSP (Programa Segment Prefix) es una estructura usada para controlar ciertos
aspectos del programa. Tiene una longitud de 256 bytes, y siempre está ubicado en los
primeros 256 bytes del segmento donde se carga el programa (forma parte del programa
en la memoria). En esta estructura se almacena información importante, por ejemplo la
tabla de entorno (Dónde se guarda la información sobre las variables de entorno).
Para la ejecución del programa simplemente basta teclear su nombre en el prompt de MS-
DOS y teclear ENTER. Con esto el programa será cargado en memoria y el sistema
procederá a ejecutarlo. El proceso completo para poder crear un programa ejecutable
con el Microsoft Macro Assembler se muestra abajo.
C:\DATA\PROGRAMS\ASM>masm main
Microsoft (R) Macro Assembler Version 4.00
Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved.
0 Warning Errors
0 Severe Errors
C:\DATA\PROGRAMS\ASM>masm task
Microsoft (R) Macro Assembler Version 4.00
Copyright (C) Microsoft Corp 1981, 1983, 1984, 1985. All rights reserved.
0 Warning Errors
0 Severe Errors
C:\DATA\PROGRAMS\ASM>link main+task
C:\DATA\PROGRAMS\ASM>main
Entrando a un submodulo....
.......saliendo del submodulo.
C:\DATA\PROGRAMS\ASM>
DEPURACIÓN.
DEPURACIÓN.
Para MS-DOS sólo existen dos tipo de archivos ejecutables los .COM y .EXE. Ambos
archivos difieren en algunas cosas. Primero, las ventajas de los .EXE son dobles, nos
permiten tener archivos reubicables y el uso de hasta cuatro segmentos (STACK, DATA,
EXTRA y CODE) de hasta 64KB cada uno. Un archivo .COM sólo puede tener un
segmento de 64KB, en el que se tiene tanto código como pila, y datos. La desventaja de
los .EXE es que agrega n 512 bytes como cabecera con información para la reubicación
del código. Un .COM no es reubicable, siempre inicia en la dirección 0100H.
Si nuestro programa no es muy grande 64KB son más que suficientes. Por lo que
conviene crearlo como .COM, para esto se cuenta con la utilería EXE2BIN.EXE que nos
proporciona el sistema operativo. y que nos permite crear .COM a partir de .EXE . Las
restricciones para esto son las siguientes: el archivo a convertir no debe estar empacado,
no debe tener segmento de stack, debe tener sólo segmento de código y su tamaño debe
ser menor a 64KB.
EL LENGUAJE DE MÁQUINA.
MÁQUINA.
C:\> debug
-e 100 BA 40 00 8E DA BB 72 00 C7 07 34 12 EA 00 00 FF FF
-rcx
:11
-n reset.com
-w
-q
C:\> reset.com
Haga la prueba creando un programa más grande, esta vez introduciéndolo a través de
dos líneas de programa. Para guardarlo indique la cantidad de 1C bytes al invocar el
comando rcx del debug y sálvelo con extensión .COM.
-e 100 1E 31 C0 50 BA 0C 01 B4 09 CD 21 C3 48 6F 6C 61 20 6D 75 6E 64 6F
-e 116 21 21 21 0D 0A 24
En lo que se refiere a las presentes notas, nos enfocaremos al Microsoft Macro Assembler
v4.0. Los programas ejemplo han sido desarrollados con éste y está garantizado su
funcionamiento. Estos mismo programas posiblemente funcionen con otros
ensambladores sin cambios o con cambios mínimos cuando utilizan directivas o
pseudoinstrucciones.
Los programas que componen el Macro Ensamblador Microsoft v4.0 son los siguientes:
El Microsoft Macro Assembler v4.0 crea código ejecutable para procesadores 8086,
8088, 80186, 80188, 80286, 8087 y 80287. Además es capaz de aprovechar las
instrucciones del 80286 en la creación de código protegido y no protegido.