Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Informatica II Manual de Catedra
Informatica II Manual de Catedra
MANUAL DE CATEDRA
INFORMÁTICA II
DOCENTES
AÑO 2011
INDICE GENERAL
1
Tipos de Instrucciones ____________________________________________________ 136
Flujo De Control _________________________________________________________ 149
CONCLUSIÓN ___________________________________________________________ 163
BOLILLA III: ARQUITECTURA DEL PROCESADOR ____________________________ 164
INDICE _________________________________________________________________ 165
INTRODUCCIÓN ________________________________________________________ 166
ARQUITECTURA DEL PROCESADOR _____________________________________ 167
ESTRUCTURA GENERAL _______________________________________________ 167
DESCRIPCIÓN DE LOS COMPONENTES DE UN PROCESADOR ______________ 167
Microprocesadores _______________________________________________________ 170
EJECUCIÓN DE LAS INSTRUCCIONES ____________________________________ 171
ORGANIZACIÓN DE LA CPU ____________________________________________ 172
LA UNIDAD ARITMÉTICA Y LÓGICA ____________________________________ 174
LA UNIDAD DE CONTROL ______________________________________________ 176
FASE DE BÚSQUEDA DE LA INSTRUCCIÓN _______________________________ 177
FASE DE BÚSQUEDA O ALMACENAMIENTO DEL OPERANDO______________ 177
FASE DE PREPARACIÓN DE LA SIGUIENTE INSTRUCCIÓN _________________ 179
INSTRUCCIÓN DE RUPTURA DE SECUENCIA _____________________________ 179
EL CANAL ____________________________________________________________ 180
LAS UNIDADES PERIFÉRICAS ___________________________________________ 181
INTERRUPCIONES _____________________________________________________ 181
CONCLUSIÓN ___________________________________________________________ 184
BOLILLA IV: MEMORIA ____________________________________________________ 185
INDICE _________________________________________________________________ 186
INTRODUCCIÓN ________________________________________________________ 187
MEMoRia _______________________________________________________________ 188
DIRECCIONES DE MEMORIA ____________________________________________ 189
ORDENAMIENTO DE BYTES ____________________________________________ 190
CÓDIGOS CORRECTORES DE ERRORES __________________________________ 191
CLASIFICACIÓN Y ORGANIZACIÓN DE LAS MEMORIAS ___________________ 191
PARáMETROS y CARACTERíSTICAS MáS IMPORTANTES DE UNA MEMORIA 192
CONCLUSIÓN ___________________________________________________________ 209
BOLILLA V: EL NIVEL DEL LENGUAJE ENSAMBLADOR ______________________ 210
INDICE _________________________________________________________________ 211
INTRODUCCIÓN ________________________________________________________ 212
EL NIVEL DEL LENGUAJE ENSAMBLADOR_______________________________ 213
INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR _________________________ 214
EL PROCESO DE ENSAMBLAJE __________________________________________ 219
MACrOS_______________________________________________________________ 227
MONTAJE (LINKING) y CARGA __________________________________________ 230
CONCLUSIÓN ___________________________________________________________ 240
BOLILLA VI (Parte 1): PERIFÉRICOS _________________________________________ 241
2
INDICE _________________________________________________________________ 242
INTRODUCCIÓN ________________________________________________________ 244
PERIFÉRICOS ___________________________________________________________ 245
RESEÑA HISTÓRICA ___________________________________________________ 245
INTRODUCCIóN________________________________________________________ 245
PERlFERICOS DE ENTRADA: ____________________________________________ 246
PERIFERICOS DE SALIDA: ______________________________________________ 257
PERIFERICOS DE COMUNICACION.. _____________________________________ 259
CONCLUSIóN __________________________________________________________ 261
CONCLUSIÓN ___________________________________________________________ 262
BOLILLA VI (PARTE 2): TÉCNICAS Y DISPOSITIVOS DE ENTRADA SALIDA _____ 263
INDICE _________________________________________________________________ 264
INTRODUCCIÓN ________________________________________________________ 265
TECNICAS Y DISPOSITIVOS DE ENTRADA / SALIDA (Input / Ouput) _________ 266
Dispositivos de fichas y de banda perforada ___________________________________ 266
Dispositivos de soporte magnético ___________________________________________ 270
Impresoras _____________________________________________________________ 270
Plotter _________________________________________________________________ 277
La pantalla _____________________________________________________________ 278
Terminales _____________________________________________________________ 279
Procesos de comunicación para la transmisión de datos a distancia _________________ 281
Otros periféricos _________________________________________________________ 281
Técnicas de entrada/salida (input/output) ______________________________________ 282
GLOSARIO ____________________________________________________________ 287
CONCLUSIÓN ___________________________________________________________ 289
CONCLUSIÓN FINAL ________________________________________________290
BIBLIOGRAFÍA _______________________________________________________291
3
BOLILLA I: LA
COMPUTADORA
4
INDICE
5
INTRODUCCIÓN
6
APUNTES DE CATEDRA
LA COMPUTADORA
CONCEPTO:
Máquina capaz de realizar y controlar a gran velocidad cálculos y procesos
complicados que requieren una toma rápida de decisiones mediante la aplicación
sistemática de criterios preestablecidos.
La computadora se la relaciona a un cerebro electrónico, teniendo en cuenta que debe
ser programada para cada tarea que se requiera.
La computadora puede recibir diversos nombres. El término computadora procede del
inglés (computer) y significa máquina de computar o calcular. Del término francés
ordinateur procede la denominación de Ordenador que se refiere a la tarea de poner en
orden la información. Son dos perspectivas distintas y complementarias. También recibe el
nombre de cerebro electrónico.
FUNCIONES Y ACCIONES:
La computadora tiene una estructura mecánica que permite realizar operaciones a
gran velocidad, la celeridad con que elabora sus cálculos es sorprendente. La velocidad
operativa se mide en millones de operaciones por segundo.
Además de la actividad de realizar cálculos numéricos, realiza otro tipo de tarea que
consiste en el manejo de los Procesos. La computadora trata diversas informaciones, las
ordena y combina apropiadamente según las indicaciones de un programa. Por ej.: la
realización de un censo de la población, la confección de la nómina o el tratamiento de
texto.
Los cálculos y procesos que lleva a cabo la computadora son complicados en el sentido
que resultan prolijos, largos y que exigen una gran precisión, y suponen por ello un gran
esfuerzo por parte del hombre. La ventaja de la máquina a este respecto es que ni sienten ,
ni padecen.
Como resultado de estas características, la computadora ofrece unas posibilidades
enormes para la realización de procesos que, de otro modo no serían factibles (por su
duración), ni tampoco rentables (requerirían concurso de muchas personas). Aporta un alto
nivel de fiabilidad por su precisión y su control, a la vez que permite eludir tareas repetitivas
al ser humano; tareas en las que la máquina se muestra incansable e insensible y que, por
el contrario, generan fatiga en el hombre.
COMPUTADORA Y CIRCUITOS:
7
Una computadora en el fondo no es más que un circuito electrónico muy complejo. Lo
que llamamos corriente eléctrica es, efectivamente, una corriente de cargas eléctricas que
pasa a través de una circuito de la misma manera que el agua circula por las tuberías.
Quizás el circuito más sencillo sea una lámpara enchufada a la corriente eléctrica. La
lámpara es una resistencia, al pasar la corriente, la resistencia se calienta hasta que
empieza a emitir luz.
Ahora bien, un circuito eléctrico puede ser sencillo como el recién descrito, o
sumamente complejo como el que hace funcionar a una supercomputadora. Además de las
resistencias, otros componentes de los circuitos son los condensadores y las inductancias.
Un condensador sirve para acumular carga eléctrica hasta un límite a partir del cual ya no
deja pasar más corriente. Una inductancia es una bobina, un cable enrollado sobre un
núcleo de metal. La inductancia es sensible a las variaciones de corriente eléctrica. Con
resistencias, condensadores e inductancias se fabrican, por ejemplo, los sintonizadores
radiofónicos.
Los circuitos electrónicos en lugar de cable eléctrico utilizan una fina capa de metal
sobre un soporte de silicio. Sobre la capa metálica se conectan los distintos componentes,
esto es un circuito impreso.
El elemento que más ha influido en el desarrollo de las computadoras es el transistor.
Un transistor es una combinación de metales semiconductores. Los semiconductores son
materiales con una estructura atómica particular. Los átomos que los componen están
organizados en una estructura cristalina. El transistor es el resultado de la unión especial de
tres semiconductores. Un transistor permite, por una parte, amplificar y hacer más intensa
una corriente eléctrica, por otra, se comporta como un interruptor, en función de la cantidad
de corriente eléctrica que recibe se cierra o se abre. A base de combinar transistores se
consiguen circuitos capaces de realizar funciones complejas, como sumar números binarios.
Las computadoras no son más que grandes manojos de transistores combinados muy
hábilmente; y una moderna necesita millones de transistores conectados para realizar todas
sus funciones. La conexión de tantísimos elementos sería físicamente imposible si no fuera
por los circuitos integrados. Un circuito integrado es una superposición de finísimas capas
de material semiconductor en las que se recortan y unen los transistores mediante
complicados procesos de alta tecnología. El resultado es una pieza llamada Chip, que en una
superficie de escasos milímetros cuadrados contiene millones de transistores.
HARDWARE Y SOFTWARE:
La computadora presenta dos aspectos íntimamente relacionados: el hardware y el
software. La palabra inglesa hardware se refiere a aquella parte “dura” o material. El
término software designa aquella otra parte “blanda” o lógica. Así pues, etimológicamente,
la computadora se compone de una parte dura y de una parte blanda. Estas expresiones
han de entenderse metafóricamente. Significan que existen unos elementos materiales o
tangibles, los que forman el llamado soporte físico del procesamiento de la información
como los circuitos, los aparatos y terminales y también unos elementos intangibles de
programación, que se designan como soporte lógico.
Software:
Conjunto de Instrucciones de programa de computador que dirige la operación del
hardware.
Un conjunto de instrucciones para una tarea específica se llama Rutina.
Un conjunto completo de instrucciones para ejecutar un conjunto de tareas
relacionadas se llama PROGRAMA.
8
Hardware:
Es el conjunto de elementos físicos (máquinas y circuitos) y puede ser comparado con
la fuerza; el hardware difícilmente puede ser modificado, y abarca todos los componentes
materiales de la propia computadora, sean mecánicos, eléctricos o electrónicos, así como
las unidades periféricas, sean teclados, impresoras, monitores, etc..
Unidad de Control:
La unidad de control realiza la función de dirección central. Interpreta las instrucciones
del programa, que le indica las acciones que ha de realizar, y asigna las tareas a las
distintas partes del conjunto.
Unidad aritmético-lógica:
Es la parte donde se realizan todos los procesos, a través de las indicaciones de la
unidad de control. Realiza operaciones matemáticas ( suma, resta, producto, división, etc.),
o de relación lógica ( >, <, =, and, or, ), con los datos suministrados.
La reunión de la unidad de control y de la unidad aritmético-lógica forma un conjunto
mayor que se denomina Unidad Central de Proceso de Datos, más conocida con las siglas
inglesa de Central Processing Unit, CPU. La CPU es la encargada de desarrollar las
actividades fundamentales que realiza una computadora.
Memoria:(Memoria Central)
La memoria es el almacén donde se registran y quedan a disposición de la CPU los
datos y programas. La memoria consiste en millones de pequeños circuitos que sólo
memorizan dos tipos físicos de información: si pasa corriente o si no pasa. Cada impulso
eléctrico implica la memorización del dígito uno y la interrupción de la corriente determina
la memorización de un cero. Toda la codificación juega con un sistema binario, que puede
ejemplificarse dependiendo del dispositivo físico tomado como modelo, de varias maneras:
abierto/cerrado, conectado/desconectado, 1/0. El sistema binario se distingue del que
utilizamos normalmente, que es decimal o de base diez.
Periféricos:
Los periféricos son elementos que forman parte del sistema físico del equipo y que
cumplen funciones adicionales, pero necesarias. Existen muchos tipos de periféricos, los
fundamentales son el teclado, el monitor la unidad lectora de disco, la impresora , el ratón o
mouse, el escáner, y el modem ( modelador y demodelador de frecuencia), entre otros.
Núcleo de la computadora:
El núcleo de la computadora está compuesto por la CPU y la memoria. La CPU como
ya dijimos comprende la unidad de control (UC) y la unidad aritmético-lógica(UAL). La
memoria es de dos tipos: ROM y RAM; la memoria ROM (siglas que corresponden a la
expresión inglesa Read Only Memory, es decir, memoria de sólo lectura), no puede
alterarse, viene prefijada físicamente por el fabricante, contiene los programas necesarios
(englobados en la expresión sistema operativo), para que la máquina sepa cómo tiene que
operar con los programas y los datos que se le introduzcan, y pueda relacionar los
lenguajes de alto nivel (escrito por el programador), con el lenguaje máquina (código
binario).
La memoria RAM (siglas de la expresión inglesa Random Access Memory, o sea,
memoria de acceso aleatorio), es la que el usuario puede utilizar libremente.
La memoria ROM es fija, es decir, se conserva en toda circunstancia, mientras que la
RAM es volátil y, cuando se desconecta el aparato, la información que contiene desaparece(
por eso antes de apagar la máquina hay que guardar o grabar la información en el
dispositivo físico correspondiente) . La memoria ROM puede imaginarse como una caja
cerrada con una tapa de cristal, a ella sólo se tiene acceso para leer o ver que contiene. Por
el contrario la memoria RAM es como un casillero de hotel (o celdas), en el que se depositan
9
llaves, cartas u otras cosas. Se tiene acceso a él y se puede cambiar la disposición y los
tipos de cosas que contiene.
La estructura interna de la computadora realiza la función del tratamiento y
conservación de la información. Los periféricos que se acoplan proveen dos etapas más, que
anteceden y suceden a la etapa central. A través de los periféricos se produce la entrada y
la salida de información, por ello se conocen también con el nombre de dispositivos de
entrada y salida o de E/S. Estas tres fases reúnen la labor desarrollada por las
computadoras.
UC Instruccione
Unidad
Memoria
Datos Central de
Central Proceso
UAL Resultados
Unidades Periféricas
BUSES DE COMPUTADORAS:
Un bus es una ruta eléctrica común entre múltiples dispositivos. Un ejemplo común es
el Bus del Sistema presente en toda microcomputadora, el cuál consiste de 50 a 100
alambres de cobres paralelos grabados en al tarjeta matriz, con conectores espaciados a
intervalos regulares para conectar tarjetas de memoria y de entrada/salida. Dentro de la
misma pastilla del microprocesador puede haber varios buses para conectar sus
componentes internos, como se ilustra en la siguiente figura:
10
Registros
Buses
ALU
Bus Local
Coprocesador
Los Buses son los ilustrados por las líneas con Flechas.
Debido a que las señales binarias que emiten los dispositivos no son lo
suficientemente fuertes para activar el Bus, en especial si éste es relativamente largo tiene
muchos o tiene muchos dispositivos conectados. Por esto la mayoría de los dispositivos
maestros se conectan al bus a través de una pastilla denominada manejador del bus, que es
en esencia un amplificador digital. En forma similar los dispositivos esclavos, se conectan
11
por medio de un receptor del bus. Para los dispositivos que pueden actuar ya sea como
maestros o esclavos, se utiliza una pastilla combinada llamada transmisor-receptor del bus.
Un Bus tiene lineas de direcciones de datos y de control, sin embargo no es necesario
que haya una correspondencia de 1 a 1 entre las señales de ambos. Por ejemplo a algunos
microprocesadores tienen tres patas que codifican las operaciones que se están realizando,
como lectura o escritura de la memoria o de entrada/salida. Por su parte, un bus típico
tendrá una línea para lectura de memoria, otra para escritura de memoria, una tercera para
lectura de E/S, una cuarta para escritura de E/S y así sucesivamente. Por lo tanto, se
requiere de una pastilla decodificadora entre la CPU y dicho Bus para convertir la señal
codificada de tres bits en señales separadas que puedan ser manejadas por las líneas del
bus. Hay aspectos relevantes a tener en cuenta en el diseño de buses tales como: la
sincronización del bus, el mecanismo de arbitraje, el manejo de interrupciones, y el manejo
de errores. Todos ellos tienen un gran impacto en la velocidad y en la amplitud de banda del
Bus.
Con esto debe quedar claro las ventajas de los buses asíncronos, pero el hecho de que
la mayoría de los buses son síncronos por la razón de que es más fácil construir sistemas
síncronos. La CPU solo activa sus señales y la memoria sólo reacciona a éstas.
12
Arbitraje del bus:
Sabemos en forma tácita que solo hay un Bus maestro, la CPU. Pero también las
pastillas de E/S pueden actuar como maestros para lecturas y escrituras de memoria así
como para provocar interrupciones. Asimismo, los coprocesadores pueden convertirse en
maestros del bus. ¿Qué sucede si dos o más dispositivos desean actuar como bus maestros
al mismo tiempo?, las respuesta para evitar el caos, es el mecanismo de arbitraje del bus.
Este mecanismo puede Centralizado o Descentralizado. En el primer caso un solo árbitro del
bus determina qué dispositivo tiene acceso. El bus contiene una línea de solicitud que puede
ser activada por uno o varios dispositivos en cualquier momento. No hay forma de que el
árbitro sepa cuántos dispositivos han solicitado el bus. Lo único que distingue es : existen
solicitud(es) y no existen solicitud(es).
Cuando el árbitro recibe una solicitud para el bus, autoriza su uso activando la línea de
respuesta del bus. Dicha línea está conectada en serie a través de todos los dispositivos de
E/S, como en una serie de foquitos de navidad. Cuando el dispositivo que se encuentra
físicamente más cerca del árbitro recibe la señal, verifica si fue él quien hizo la solicitud, en
cuyo caso hace uso del bus y evita que la señal se siga propagando. Si este dispositivo no
fue quien originó la solicitud, la señal se propaga al siguiente dispositivo en la línea, el que
actúa en la misma forma y así sucesivamente hasta que un dispositivo acepte la señal y
haga uso del bus. A este esquema se lo denomina encadenamiento margarita, y tiene la
prioridad de que los dispositivos, poseen, en efecto, prioridades asignadas dependiendo de
qué tan cerca se encuentren del árbitro. El dispositivo más cercano tiene la prioridad más
alta.
Al fin de evitar las prioridades implícitas basadas en la distancia del árbitro, algunos
buses tienen múltiples niveles de prioridad. Para cada nivel existe una línea de solicitud y
una línea de respuesta. En la práctica los buses tienen 4,8 o 16 niveles. Cada dispositivo
está conectado a algunos de los niveles de solicitud del bus, con aquellos que tienen
tiempos más críticos conectados a las líneas con prioridades más altas.
1 2 3 4
Dispositivos de E/S
En muchos sistemas, la CPU puede también competir por el bus, pero se le asigna la
prioridad más baja y sólo puede ocupar el bus cuando nadie más lo usa. Aquí la idea es que
la CPU puede esperar mientras que los dispositivos de entrada/salida deben obtener el uso
del bus rápido o pierden los datos que están recibiendo; girando los discos a altas
velocidades no pueden esperar.
Cuando se utiliza el arbitraje del bus descentralizado no existe un árbitro, por ejemplo,
un bus tiene 16 líneas priorizadas de Solicitud del bus, este diseño limita el número de
dispositivos a 16. Cuando alguno de ellos necesita el bus, activa su línea de solicitud. Todos
los dispositivos monitorean todas las líneas de solicitud, de modo que al final de cada ciclo
de bus, cada dispositivo sabe si tiene la prioridad más alta y de ahí, se podrá usar el bus
durante el ciclo siguiente. Este método, comparado con el centralizado requiere de un
mayor número de líneas de bus, pero evita el costo potencial del árbitro.
13
Manejo de interrupciones:
Cuando la CPU instruye a algún dispositivo de E/S para que haga algo, por lo general
esperar una interrupción cuando termine el trabajo. La señal de interrupción indica que
requiere del Bus. Para evitar que los dispositivos quieran enviar una interrupción al mismo
tiempo se asigna prioridades a los dispositivos, y se usa un árbitro centralizado para dar
prioridad a aquellos que tengan los tiempos más críticos. Existen en el mercado pastillas
estándar para el control de las interrupciones y su uso está muy extendido. Las IBM-PC,
PC/AT, y todo sus clones (IBM-PC compatibles) usan una pastilla Intel 8259A.
En las entradas de Solicitud de Interrupción, se pueden conectar en forma directa
hasta 8 pastillas controladoras de E/S. Cuando alguno de estos dispositivos desea realizar
una interrupción, activa su línea de la señal INT (INTerrupción), la cual maneja
directamente la pata de interrupción de la CPU. Cuando esta última está en disposición de
manejar la interrupción, envía un impulso a la 8259A en INTA (INTerrupción Recibida). En
este punto, la pastilla controladora deberá especificar qué dispositivo causó la interrupción,
colocando el número de éste en el bus de datos. Entonces, para encontrar la dirección del
procedimiento a ejecutar para atender esa interrupción el hardware de la CPU utiliza dicho
número como índice en una tabla de apuntadores denominados vectores de interrupción.
Dentro de la pastilla existen varios registros (por ej.: RD(lectura), WR(de escritura),
CS(selección de pastilla),), en donde la CPU puede leer o escribir. Una vez que el software
ha manejado la interrupción y está lista para la siguiente, escribe una clave especial en uno
de los Registros, lo que provoca que la pastilla 8259A desactive INTR, a menos que tenga
otra interrupción pendiente.
CANALES DE E/S
Canales o Procesadores de E/S: con éste dispositivo se quiere lograr la independencia
total con las operaciones de E/S sin que intervenga la CPU.
Lo gestiona independientemente: reconoce por si solo cuál es la dirección y cuál es el
periférico y tiene un buffer que puede convertir la disparidad de capacidad de trasferencia.
Se la conoce también como procesador esclavo.
Características: el canal tiene su juego de instrucción propio y son auténticos
procesadores (menos potentes que el procesador central).
Funciones:
• Puede seleccionar periféricos por si solo.
• Puede controlar esos periféricos (comienza o finaliza la operación)
• Puede seleccionar áreas de memoria donde ocurrirán las operaciones de E/S.
• Tiene la posibilidad de conversión de datos cuando existe disparidad de buses.
14
TECNOLOGÍA DE CANALES:
1. De conexión en serie: con procesador de E/S puede atender a varios periféricos, pero de a uno por
vez.
Placa controladora
Procesador de
E/S 1 P1 P2 P3
Procesador de
E/S 2
P1 P2 P3
Es mucho más barata pero más problemática, que la matriz de conexión dinámica,
puesto que no se puede comunicar con dos periféricos que están colgados al mismo
procesador de E/S, aunque los otros procesadores de E/S estén libres.
2. Matríz de Conexiones Dinámicas: cualquier canal puede atender a cualquier periférico que están
conectados a todos los canales. Su problema es que se adapta mal al crecimiento, ya que si se
añadiera un periférico a un procesador de E/S se tendría que rediseñar la lógica dela matriz, ya que
cambiaria la dimensión.
Canal 1
Bus
Canal 2
Canal 3
P1 P2 P3
TIPOS DE CANALES:
Multiplexor:
Es de velocidad baja por atiende a todos los periféricos. Reparte su tiempo entre los
periféricos que están conectados a él, tiene la posibilidad de hacer un ensamblado o
desensamblado de datos. Para realizar operaciones de E/S cada subcanal debe tener un
conjunto de registros:
• UN BUFFER DE DATOS: permite almacenar los datos hasta que son transmitidos.
• UN REGISTRO DE DIRECCIONES DE MEMORIA: apunta a la memoria.
15
• UN REGISTRO DE ESTADO: permite conocer el estado de la transferencia.
Selector
Atiende a un solo periférico por vez. Accede a memoria solo para depositar datos
tiene:
• UN REGISTRO DE DIRECCIÓN: que le indica de donde se deben leer o escribir los datos.
• UN CONTADOR DE PALABRAS: que llegará a valer 0 cuándo termine la transmisión.
• UN REG.DIR.PC RIFE: que contiene la identidad del periférico que intervendrá en la operación
de E/S.
• UN REG.DE ENSAMBLADO que chequea la entrada de datos.
• UN REG.DE DESENSAMBLADO que chequea errores de la salida de datos.
Spoll:
(operaciones periféricas simultáneas en línea). El problema surge cuándo varios
usuarios quieren hacer uso de la impresora. Por ejemplo al mismo tiempo, entonces tiene
que utilizarse un dispositivo Dasd (dispositivo de almacenaje de acceso directo), que tiene
la capacidad de leer y almacenar datos grandes y de mucho trabajo y, además tienen la
particularidad de ser compartido. Como sería una mala inversión asignarle un impresora
para cada usuario se buscó la manera de que cada una misma impresora éstos pueden
imprimir sus trabajos, sin necesidad de esperar que otro usuario que está utilizando el
servicio lo desocupe. Para ello el sistema forma una cola de impresiones, es decir, que éste
sistema hace una administración independiente de la impresora. Aquí se comienza a hacer
operaciones del tipo virtual (el spoll permite la impresión simultánea), de manera que
aparenta una multiprogramación , a todo éste procedimiento se llama Spoll.
Dispositivo DASD: son dispositivos de almacenaje de acceso directo, que se utilizan para leer o
escribir datos de muchos trabajos. En él leen o escriben muchos usuarios.
Ej.:
Periféricos (imp.,discos duros)
SEVER
Usuario 3
Usuario 1 Usuario 2 Us. 4
16
SISTEMA OPERATIVO
Introducción:
Ya sabemos que una computadora sin el Software es una masa metálica sin utilidad.
Con el software puede almacenar, procesar, y recuperar información. El Software para
computadora se clasifica en dos clases:
• Programas del Sistema o Software de Base: Controla las operaciones de la
computadora en sí.
• Programas de Aplicación o Software de Aplicación: Los cuales resuelven problemas
para los usuarios.
El programa fundamental de todos los programas del Sistemas es el Sistema
Operativo (SO), que controla todos los recursos de la computadora
Y proporciona la base sobre la cuál pueden escribirse los programas de aplicación.
Un sistema de computación moderno consta de uno o más procesadores, memoria
principal ( o memoria central), relojes, terminales, dispositivos de E/S, discos, etc., en fin
un Sistema complejo. Si cada programador tuviera que preocuparse por la forma de
funcionamiento de las unidades de disco y con las docenas de cosas que podrían salir mal,
es poco probable que pudieran escribirse muchos programas.
Para proteger a los programadores de la complejidad del Hardware se colocó un nivel
del Software por encima del Hardware con el fín de controlar todas las partes del Sistema y
presentar al usuario una interfáz o MAQUINA VIRTUAL que facilite la comprensión del
programa. Este nivel del Software se llama SO.
En la figura siguiente vemos: En la parte inferior se encuentra el Hardware, el cuál
consta de varias capas, la más baja contiene los dispositivos físicos conformados por chips,
cables, tubos de rayos catódicos, y otros dispositivos físicos similares. La forma de
construirlos y el responsable está a cargo del Ingeniero.Electrónico.
17
proporcione juntos. El SO es esa parte del Software de Base que se ejecuta en modo central
o modo de supervisión. Está protegido contra la alteración por parte del usuario por el
Hardware (Ahora), . Los compiladores y editores se ejecutan en modo usuario. Si un usuario
no necesita utilizar un compilador particular, él está en libertad de escribir el suyo propio si
lo desea, pero no tiene la libertad de escribir su propio Controlador de Interrupciones del
disco, qué es parte del SO y que está protegido por el Hardware contra los intentos de
escritura.
Por último sobre los programas del Sistema se encuentran los programas de
Aplicación. Estos son escritos por l9s usuarios para resolver problemas particulares, como el
procesamiento de datos comerciales, juegos, o cálculos de Ingenieria, etc.
18
CONCLUSIÓN
19
BOLILLA II (Parte 1): EL NIVEL
DE LOGICA DIGITAL
20
INDICE
21
INTRODUCCIÓN
22
APUNTES DE CATEDRA
CARRERA: LICENCIATURA E INGENIERIA EN SISTEMAS DE INFORMACIÓN
Cátedra: INFORMÁTICA II
Profesor: Marcelo Martinez – Claudia Cesarini – Fernando Sanchez
AÑO: 2011
Compuertas
Un circuito digital es aquel en el que están presentes dos valores lógicos. Por
convención, una señal entre 0 y 1 volt representa un valor (por ejemplo, el 0 binario) y una
entre 2 y 5 volts representa el otro (por ejemplo, el 1 binario). No se permiten voltajes
fuera de esos dos rangos. Unos pequeños dispositivos electrónicos, denominados
compuertas, pueden calcular varias funciones de estas señales de dos valores. Las
compuertas forman la base material con que se
construyen las computadoras digitales. Los detalles de cómo funcionan por dentro las
compuertas están fuera del alcance de este libro, ya que pertenecen a un nivel inferior al 0,
el nivel de dispositivo. Sin embargo, se dará un breve vistazo a la idea básica de suyo
sencilla. Toda la lógica digital moderna descansa en el hecho de que se puede hacer
funcionar un transistor como si fuera un conmutador binario muy rápido. En la figura 3-1(a)
aparece un transistor bipolar (el círculo) que forma parte de un circuito sencillo. Este
transistor tiene tres conexiones con el mundo exterior: el colector, la base y el emisor.
Cuando el voltaje de entrada Ve está por debajo de cierto valor crítico, el transistor se corta,
actuando como una resistencia infinita, y hace que la salida del circuito, Vs , tome un valor
prácticamente igual a Vcc, un voltaje regulado por fuera, por lo común de + 5 volts. Cuando
Ve exceda del valor critico, el transistor conmutará, actuando como un conductor perfecto y
haciendo que Vs tome el valor de tierra (por convención, 0 volts).
23
Lo importante es darse cuenta de que, cuando Ve está alto, Vs está bajo y viceversa. El
circuito es por tanto un inversor, que convierte el 0 lógico en 1 lógico y el 1 lógico en 0
lógico. La resistencia es necesaria para limitar la corriente que fluye por el transistor. El
tiempo necesario para conmutar de un estado a otro suele ser de unos pocos
nanosegundos.
En la figura 3-1 (b) se han puesto dos transistores en serie. Si las tensiones V1 y V2
fueran altas simultáneamente, ambos transistores conducirían y Vs bajaría. Si cualquiera de
las entradas estuviera con la tensión baja, el transistor correspondiente se cortaría y la
salida quedaría alta. En otras palabras, Vs estará baja si tanto V1 como V2 están altas.
En la figura 3-1(c) los dos transistores se conectan en paralelo, en lugar de conectarse
en serie. En esta configuración, si alguna de las salidas es alta, el transistor correspondiente
conducirá y llevará la salida hacia tierra. Si ambas entradas estuvieran bajas, la salida
permanecería alta.
Estos tres circuitos, o sus equivalentes, forman las tres compuertas más simples. Se
denominan compuertas NOT, NAND y NOR respectivamente. Las compuertas NOT se suelen
denominar inversores. Si se adopta la convención de
que "alto" (Vcc volts) es el 1 lógico y "bajo" (tierra) el 0 lógico, se puede expresar el
valor de salida en función de los de entrada. Los símbolos convencionales utilizados para
dibujar estas tres compuertas se muestran en la figura 3-2(a)-(c), junto con el
comportamiento funcional de cada circuito.
24
entradas, aunque en la práctica no suelen tener más de ocho.
Algebra booleana
25
M = f (A, B, C). Es la función mayoría; es decir, es 0 si la mayoría de sus entradas es 0, y 1
si la mayoría es 1. Aunque todas las funciones booleanas pueden especificarse dando su
tabla de verdad, a medida que el número de variables crece esta notación se hace más y
más engorrosa. Por ello, se suele usar otro tipo de notación.
Para entender cómo se origina esta otra notación, obsérvese que cualquier función
booleana puede especificarse diciendo qué combinaciones de las variables de entrada dan el
valor 1. En la función de la figura 3-3(a), hay cuatro combinaciones que hacen que M valga
1. Por convención se pone una barra sobre la variable de entrada cuyo valor sea 0. La
ausencia de la barra significará que vale 1. Además, se usa la multiplicación implícita o el
punto para significar Y o AND y el símbolo + para significar O u OR. Así, por ejemplo, ABC
significa que A = 1, B = 0 y C = 1. También, AB + BC significa que A = 1 y B = 0, o que B
= 1 y C = 0. Las cuatro filas de la figura 3-3(a) que producen 1 en sus salidas son: ABC,
ABC, ABC y ABC. La función M es cierta si se cumple cualquiera de esas condiciones, por lo
que se puede escribir
M = ABC + ABC + ABC + ABC
como una forma compacta de dar la tabla de verdad. Así, una función de n variables
puede describirse como una "suma" de, como máximo, 2n términos "producto" de n
variables. Esta formulación, es muy importante, como se verá en seguida, debido a que
lleva en forma directa a su realización usando compuertas ordinarias.
26
27
Aunque se ha mostrado cómo realizar cualquier función booleana con compuertas
AND, OR y NOT, suele ser preferible realizar los circuitos con un solo tipo de compuerta.
Afortunadamente es muy fácil convertir los circuitos generados por el algoritmo anterior en
otros con sólo compuertas NAND o NOR. Para hacer esa conversión, lo único que se
necesita es una forma de realizar las funciones NOT, AND y OR empleando un único tipo de
compuerta. La fila de arriba de la figura 3-4 muestra como se pueden realizar las tres
funciones exclusivamente con compuertas NAND, mientras que la fila de abajo indica cómo
hacerlo con compuertas NOR. (Estas son formas directas, pero no son las únicas
posibilidades; véase la figura 3-5.)
Una forma de implementar una función booleana usando sólo compuertas NAND y
NOR consiste en seguir primero el procedimiento señalado anteriormente para construirla
con compuertas NOT, AND y OR. Luego, se procede a reemplazar las compuertas de
entrada múltiple con circuitos equivalentes, utilizando compuertas de dos entradas. Por
ejemplo, A + B + C + D puede calcularse como (A+B)+(C+D), usando tres compuertas O
de dos entradas. Finalmente, se sustituyen las compuertas NOT, AND y OR por los circuitos
de la figura 3-4.
Aunque este procedimiento no da lugar a circuitos óptimos, en el sentido de un
mínimo número de compuertas, sí muestra que siempre es posible una solución. Se dice
que las compuertas NAND y las NOR son completas porque a partir de ellas puede
generarse cualquier función booleana. Ningún otro tipo de compuertas tiene esa propiedad,
siendo ésta una razón más por la que se prefieren como elemento básico en la construcción
de circuitos.
28
He aquí un ejemplo de cómo puede usarse el álgebra de Boole: considérese el circuito
y la tabla de verdad para AB + AC, que se muestran en la figura 3-5(a). Aunque aún no se
ha hablado de ello, muchas de las reglas del álgebra ordinaria se conservan en el álgebra de
Boole. En particular, AB + AC puede escribirse como A (B + C), utilizando la propiedad
distributiva. En la figura 3-5(b) aparece el circuito y la tabla de verdad de A(B + C). Como
dos funciones son equivalentes si y sólo si dan la misma salida para todas las entradas
posibles, es fácil ver en las tablas de verdad de la figura 3-5 que A(B + C) es equivalente a
AB+AC. Además de la equivalencia, el circuito de la figura 3-5(b) es claramente mejor que
el de la figura 3-5(a) porque contiene menos compuertas.
En general, un diseñador puede representar un circuito como una función booleana y
aplicar después el álgebra de Boole a esta representación para tratar de encontrar una
equivalente más simple, que servirá para construir el nuevo circuito.
Para aplicar este método necesitamos algunas identidades del álgebra de Boole. La
figura 3-6 muestra las más importantes. Es interesante constatar que cada propiedad tiene
dos formas duales. Se puede producir una forma a partir de la otra intercambiando AND y
OR, y también 0 y 1. Todas las propiedades se pueden demostrar construyendo sus tablas
de verdad. Exceptuadas las leyes de Morgan, la propiedad de absorción y la forma AND de
la propiedad distributiva, las demás pueden obtenerse por intuición. La ley de Morgan se
extiende a más variables; por ejemplo, ABC = A + B + C.
La ley de Morgan sugiere una notación alternativa. En la figura 3- 7(a) se muestra la
forma AND, indicándose la inversión tanto en las entradas como en la salida, por medio de
burbujas de inversión. Así, una compuerta OR con las entradas invertidas es equivalente a
una compuerta NAND. En la figura 3- 7(b), a partir de la forma dual de la ley de Morgan,
vemos que una compuerta NOR puede dibujarse como una compuerta y con sus entradas
negadas. Negando ambas formas de la ley de Morgan llegamos a las figuras 3- 7(c) y (d),
que muestran representaciones equivalentes de las compuertas AND y OR. Existen símbolos
análogos de la ley de de Morgan con variables múltiples (por ejemplo, una compuerta NANO
de n entradas se convierte en una OR con n entradas negadas).
29
Usando las identidades de la figura 3-7 y las análogas para las compuertas de varias
entradas, se hace mucho más fácil convertir la representación de la suma de productos de
la tabla de verdad en una forma con sólo compuertas NANO o sólo compuertas NOR. Para
ilustrar lo anterior consideremos la función OR EXCLUSIVO de la figura 3-8(a). El circuito
como suma de productos se muestra en la figura 3-8(b). Para convertirlo a forma NAND,
deben dibujarse dos burbujas de inversión en cada una de las líneas que conectan las
compuertas ANO con la compuerta OR, como se muestra en la figura 3-8(c). Finalmente,
usando la figura 3- 7(a), llegamos a la figura 3-8(d). Las variables A y B pueden generarse
a partir de A y B usando compuertas NAND o NOR con sus entradas conectadas entre sí.
Nótese que las burbujas de inversión pueden moverse por una línea a voluntad; por
ejemplo, de las salidas de las compuertas de entrada de la figura 3-8(d) a las entradas de la
compuerta de salida.
Antes de dar por terminado el tema de la equivalencia entre circuitos, se demostrará
el hecho sorprendente de que una misma compuerta física puede calcular funciones
diferentes conforme a las convenciones utilizadas. En la figura 3-9(a) se muestra la salida
de cierta compuerta, F, para diferentes combinaciones de entrada. Tanto las entradas como
las salidas se dan en volts. Si adoptamos la convención de que 0 volts es un 0 lógico y de
que 5 volts es un 1 lógico, denominado lógica positiva, obtendremos la tabla de verdad de
la figura 3-9(b) y la función AND. Por el contrario, si adoptamos la convención de lógica
negativa, es decir, aquella en que 0 volts representan el 1 lógico y 5 volts el 0 lógico, la
tabla de verdad que obtendremos será la de la figura 3-9(c), correspondiente a la función
OR.
30
Por tanto, la convención empleada para asignar valores lógicos a las tensiones es de
suma importancia. En adelante, si no se dice lo contrario utilizaremos lógica positiva, de
modo que los términos 1 lógico, cierto y alto serán sinónimos, así como 0 lógico, falso y
bajo.
31
CIRCUITOS DIGITALES BÁSICOS
En las secciones anteriores se vio cómo realizar tablas de verdad por medio de
circuitos con compuertas individuales. Actualmente ya no se construyen los circuitos
compuerta por compuerta, aunque antaño fue práctica común. Hoy día, los elementos
básicos son módulos que contienen cierto número de compuertas. En las secciones
siguientes se examinarán esos elementos básicos en detalle y se verán cómo se usan y
cómo pueden construirse a partir de compuertas individuales.
Circuitos integrados
32
pastilla necesita alimentación (por lo general 5 volts, denotada Vcc) y tierra, que son
compartidas por todas las compuertas. Generalmente la cápsula tiene una muesca cerca de
la pata 1, con lo que se facilita su identificación. Para evitar que los diagramas de circuitos
se enmarañen, normalmente no se muestran ni la alimentación ni la tierra ni las
compuertas no utilizadas.
La figura 3-11 muestra otras pastillas SSI comunes. Pertenecen a la serie 7400, de
tecnología TTL, desarrollada por Texas Instruments y producida por muchos fabricantes de
semiconductores. Se utilizan principalmente para construir circuitos sencillos que no podrían
realizarse de otra manera. El circuito de la figura 3-3(b) podría construirse con una 7404,
dos 7411 y una 7432. En la serie 7400 no hay compuertas OR de cuatro entradas, pero
puede obtenerse la misma función haciendo el OR de dos entradas por un lado, el OR de las
otras dos por el otro y, de nuevo, haciendo el OR de los dos resultados anteriores. Esto
puede representarse simbólicamente por la expresión A + B + C + D = (A + B)+(C + D), es
decir, A y B hacen el OR juntos al igual que C y D por su parte, y estas dos sumas hacen el
OR también a su vez. Si el circuito de la figura 3-3(b) se construyera realmente de esta
manera, el circuito impreso donde se montaran debería tener pistas metálicas conectando
las patas apropiadas. Algunas compuertas no se usarían. La pastilla 7486 contiene una
compuerta que no se ha mostrado hasta ahora; es la puerta OR EXCLUSIVO, que es
equivalente al circuito de la figura 3-8.
33
Para nuestros propósitos, todas las compuertas serán ideales, en el sentido de que la
salida aparece en el mismo momento en que se aplican las entradas. En realidad, las
pastillas tienen un retardo de compuerta finito, que incluye el tiempo de propagación de la
señal a través del circuito y el tiempo de conmutación. Los retardos suelen durar de 1 a 20
nanoseg. En los esquemas suelen verse números como 74S00, 74LOO, 74HOO y 74LSOO.
Representan pastillas funcionalmente equivalentes, pero con diferentes compromisos de
retardo, potencia y precio. La serie 74COO es de pastillas CMOS funcionalmente
equivalentes a las de la serie 7400, de tecnología TTL.
Hoy día es posible poner casi un millón de compuertas en una pastilla. Como todo
34
circuito puede construirse con puertas NAND, cabría pensar que un fabricante puede
fabricar una pastilla muy general con el equivalente a 250 000 pastillas como la 7400. Por
desgracia, dicha pastilla necesitaría 3 000 002 patas. Con el espaciado ordinario de 2.5 mm
entre patas, la pastilla debería medir cerca de 3.2 kilómetros, algo muy difícil de vender.
Está claro que, para poder aprovechar la tecnología, hay que diseñar circuitos cuyo cociente
de compuertas/patas sea muy alto. En las secciones siguientes examinaremos algunos
circuitos MSI sencillos que combinan internamente cierto número de compuertas para
obtener una función útil con sólo unas pocas conexiones externas (patas). Después
examinaremos dos aplicaciones que requieren miles de compuertas (LSI) con sólo 20 a 40
patas: memorias y microprocesadores. La línea divisoria entre los circuitos LSI y los VLSI es
vaga, pero una pastilla VLSI clásica puede tener un microprocesador grande, algo de
memoria en una u otra forma, y quizá, una unidad de propósito específico, como la unidad
aritmética de punto flotante.
Circuitos combinacionales
Multiplexores
35
El circuito de la figura 3-12 es un candidato ideal para realizarlo como pastilla MSI,
como se ilustra en la figura 3-13(a). Dicha pastilla tiene ocho entradas de datos, tres de
control y una salida. Añadiendo la alimentación y la tierra, la pastilla se puede montar en un
chip de 14 patas. Con ella se puede realizar el circuito de la figura 3-3(b), como se muestra
en la figura 3-13(b). Para cada combinación de A, B y C, se selecciona una de las líneas de
datos de entrada, que está conectada a la alimentación (1 lógico) o a la tierra (0 lógico). El
algoritmo de conexión de las entradas es trivial: la entrada Di se conecta al valor que indica
la fila i de la tabla de verdad. En la figura 3-3(a), las filas 0, 1, 2, y 4 son 0, por lo que las
entradas correspondientes se conectan a tierra; las restantes son 1 y se conectan al 1
lógico. De esta manera se puede realizar cualquier tabla de verdad de tres variables,
usando la pastilla de la figura 3-13(a).
36
Ya se vio cómo se puede usar una pastilla multiplexora para seleccionar una entrada
entre varias y para realizar una tabla de verdad. Otra de sus aplicaciones es la de
convertidor de paralelo a serie. Si se pone un dato de 8 bits en las líneas de entrada y se
van variando las líneas de control en forma secuencial desde 000 hasta 111 (en binario),
aparecerán en la salida los 8 bits de la entrada en serie. El uso típico de un convertidor de
paralelo a serie es en un teclado, donde cada vez que se pulsa una tecla, se genera un
número de 7 u 8 bits que debe enviarse en serie por una línea telefónica.
El circuito MSI de la figura 3-13(a) tiene ocho entradas de datos. También los hay en
el mercado de 16, así como pastillas con dos multiplexores independientes de cuatro
entradas o con cuatro de dos. Algunos de ellos proporcionan la salida seleccionada y su
complemento, y algunos tienen también una entrada adicional que fuerza la salida a 0,
independientemente de las entradas (esto es, una pata de habilitación o deshabilitación).
El inverso del multiplexor es el demultiplexor, que encamina una única entrada a una
de las 2n salidas posibles, según sean los valores de n líneas de control. Si el valor binario
situado en las líneas de control es k, se selecciona la salida k.
Decodificadores
Otro ejemplo de pastilla MSI es un circuito que toma un número de n bits como
entrada y los usa para seleccionar (es decir, para poner a 1) exactamente una de sus 2n
salidas posibles. Este circuito se llama un decodificador y la figura 3-14 ilustra uno de ellos
para n = 3.
37
A fin de ver en qué casos puede ser útil un decodificador, imaginemos una memoria
de ocho pastillas de 8K cada una. La pastilla 0 tiene las direcciones 0 a 8191, la 1 tiene
desde 8192 hasta 16383, y así sucesivamente. Cuando se presenta una dirección a la
memoria, se usan sus tres bits más significativos para seleccionar una de las ocho pastillas.
Si se usa el circuito de la figura 3-14, esos tres bits son las entradas A, B y C. Según sean
ellas, exactamente una de las ocho salidas, Do, ..., D7, se hace 1, y las otras permanecen a
0. Cada una de las salidas activa una de las ocho pastillas de memoria. Como únicamente
una de las salidas se pone al, sólo se selecciona una pastilla.
El funcionamiento del circuito de la figura 3-14 es muy simple. Cada compuerta AND
tiene tres entradas, de las cuales la primera es A o A, la segunda es B o B, y la tercera C o
C. Por tanto, cada compuerta se activa (da salida 1) con una sola de las combinaciones de
entrada posibles: Do con ABC, Di con ABC, y así sucesivamente.
En el mercado hay pastillas decodificadoras de 4 a 16, de 3 a 8 y dobles de 2 a 4 (es
decir, dos decodificadores de 2 a 4 en la misma pastilla). Además, son comunes los
decodificadores de 4 a lO, para decodificar números decimales codificados en binario.
38
Comparadores
Otra pastilla MSI muy útil es el comparador, que compara dos palabras de entrada. El
comparador sencillo de la figura 3-15 toma dos entradas, A y B, cada una de 4 bits, y
produce un I1si son iguales y 0 si son distintas. El circuito está basado en la compuerta OR
EXCLUSIVO, que da 0 si las entradas son iguales y 1 si son distintas. Si las dos palabras son
iguales, las cuatro compuertas OR EXCLUSIVO deben dar 0. Después se pueden pasar estas
cuatro salidas por una compuerta OR, que dará 0 si las palabras son iguales y 1 si son
diferentes. En nuestro ejemplo hemos usado una compuerta NOR en la etapa final para
invertir el sentido de la comparación:1 significa igual y 0 desigual. Las pastillas disponibles
comercialmente no sólo tienen salidas para A = E, sino también para A<B y para A>B.
39
Estos 1200 fusibles vienen intactos de fábrica. Para programar la matriz, el usuario
funde los fusibles que desee aplicando una tensión alta a la pastilla.
La parte de salida del circuito consta de 6 compuertas OR de 50 entradas,
correspondientes a las salidas de las 50 compuertas AND. Aquí hay también otra matriz,
esta vez de 50 x 6, por medio de la cual el usuario determina qué conexiones realizar. La
pastilla tiene 12 patas de entrada y 6 de salida, además de la alimentación y la tierra, lo
que hace un total de 20 patas.
Para ilustrar con un ejemplo el uso de una PLA, consideremos una vez más el circuito
de la figura 3-3(b). Tiene tres entradas, cuatro compuertas AND, una compuerta OR y tres
inversores. Nuestra PLA puede calcular esta función con sólo hacer las conexiones internas
apropiadas, usando tres de sus 12 entradas, cuatro de sus 50 compuertas AND y una de sus
6 compuertas OR. (Las cuatro compuertas AND deben calcular ABC, ABC, ABC, y ABC,
respectivamente, mientras que la compuerta OR debe tomar estos cuatro términos para
calcular la salida.) De hecho, se puede usar la misma PLA para que calcule simultáneamente
hasta cuatro funciones de complejidad similar. Para funciones sencillas, el número está
limitado por el número de variables de entrada. Para las más complicadas, la limitación
dependerá probablemente del número de compuertas AND u OR.
Aunque las PLA programables descritas todavía están en uso para muchas
40
aplicaciones, en otras son preferibles las PLA hechas "a medida" para cierto cliente (para
aplicaciones de gran volumen) y fabricadas bajo las especificaciones del cliente. Estas PLA
son más baratas que las programables.
Ahora podemos comparar los tres métodos que ya hemos visto y que sirven para
implementar la tabla de verdad de la figura 3-3(a). Usando componentes SSI, necesitamos
cuatro pastillas. También nos bastaría una pastilla multiplexora MSI, como se muestra en la
figura 3-13(b). Por último, podríamos usar la cuarta parte de una pastilla PLA.
Evidentemente, si se necesitan muchas funciones, el método más eficiente de los tres es la
PLA. Para circuitos simples, es preferible utilizar pastillas más baratas como las SSI o las
MSI.
Circuitos aritméticos
Registros de corrimiento
Para ver cómo funciona, obsérvense los pares de compuertas AND para todos los bits
excepto los de los bordes. Cuando C = 1, se abre la compuerta derecha de cada par,
pasando el bit correspondiente a su salida. Como la compuerta AND derecha está conectada
a la entrada de la compuerta OR de su derecha, se obtiene un desplazamiento a la derecha.
Cuando C = 0, el que se abre es el miembro de la izquierda del par de compuertas AND,
efectuándose un desplazamiento a la izquierda.
41
Sumadores
42
Para construir un sumador de, digamos, palabras de 16 bits, es necesario repetir 16
veces el circuito de la figura 3-19(b). El acarreo de salida de uno de ellos se usa como
acarreo de entrada del siguiente. El acarreo de entrada al de la derecha se deja conectado a
0. Este tipo de sumador se llama sumador con propagación de acarreo, debido a que en el
último de los casos; sumar 1 a 111...111 (binario), no puede obtenerse el resultado hasta
que el acarreo se haya propagado desde el bit de la derecha al de la izquierda. También
existen sumadores que no tienen este retardo y, por tanto, son más rápidos.
La mayoría de las computadoras tienen un circuito único para realizar, al menos, las
operaciones AND, OR y suma de dos palabras de máquina. Uno de estos circuitos para
procesar dos palabras de n bits suele construirse a partir de n circuitos idénticos, cada uno
de los cuales procesa el par de bits de mismo peso de cada una de las palabras de entrada.
La figura 3-20 es un ejemplo de uno de esos circuitos, denominado Unidad Aritmética y
Lógica o ALU. Puede calcular una de las cuatro funciones siguientes: A AND B, A OR B, B, o
A + B, según las líneas de selección de función, F0 y F1, que contengan (en binario) 00, 01,
10 o 11, respectivamente.
La esquina inferior izquierda de nuestra ALU contiene un decodificador de 2 bits que
genera las líneas de habilitación para las cuatro operaciones a partir de F0 y F1. La esquina
superior izquierda tiene la lógica para calcular A AND B, A OR B y B, pero a lo sumo uno de
estos resultados puede pasar a la compuerta OR final, dependiendo de las líneas de
habilitación que vienen del decodificador. Como sólo una de las salidas del decodificador
estará a 1, sólo se permitirá el paso a través de una de las compuertas AND que están
conectadas a la puerta OR; las tres restantes darán 0, independientemente de A y B.
La esquina inferior derecha tiene un sumador completo para calcular la suma de A y B,
teniendo en cuenta los acarreos, porque es probable que varios de, estos circuitos se
conecten en paralelo para realizar las operaciones sobre la palabra completa. Existen
circuitos como el de la figura 3-20, y se les conoce como rebanadas de un bit. Con estos
circuitos el diseñador puede construir ALU del tamaño deseado.
La figura 3-21 muestra un ALU de 1 bit. Existen circuitos que contienen módulos de 8
bits para simplificar el diseño y reducir el número de circuitos. Para construir un ALU de 32
bits se pueden conectar cuatro de estos circuitos.
Relojes
43
En una computadora pueden suceder muchas cosas durante un solo ciclo de reloj. Si
tuvieran que realizarse esos eventos en un orden especifico, sería necesario dividir el ciclo
de reloj en subciclos. Un método bastante común de obtener una resolución más fina que la
del reloj básico consiste en conectar a la línea del reloj un circuito con un retardo conocido,
generando así un segundo reloj desfasado respecto al principal, como se muestra en la
figura 3-22(a). El diagrama de tiempos o cronograma de la figura 3-22(b) proporciona
cuatro referencias de tiempo para eventos discretos:
1. Flanco de subida de REL1
2. Flanco de bajada de REL1
3. Flanco de subida de REL2
4. Flanco de bajada de REL2
44
Puede obtenerse la secuencia de sucesos deseada asociándolos a los diversos flancos.
Si se necesitaran más de cuatro referencias de tiempo durante un ciclo, se podrían añadir
más líneas con retardos diferentes.
En algunos circuitos uno se interesa más por los intervalos de tiempo que por
instantes discretos de tiempo. Por ejemplo, puede permitirse que un evento suceda cada
vez que REL1 esté alto, en lugar de que ocurra precisamente en el flanco de subida. Otro
evento puede ocurrir sólo cuando REL2 esté alto. Si se necesitan más de dos intervalos,
pueden proporcionarse más líneas de reloj, o los estados altos de ambos relojes pueden
traslaparse parcialmente en el tiempo. En este último caso se pueden distinguir cuatro
diferentes intervalos: REL1 Y REL2 , REL1 Y REL2, REL1 Y REL2 y REL1 Y REL2.
Como nota al margen, probablemente debamos puntualizar que la figuras 3-22(a)-(b)
están realmente algo simplificadas. Los relojes reales son simétricos, con la duración del
intervalo alto igual a la del intervalo bajo, como la señal A en la figura 3-22(c). Para generar
un tren de impulsos asimétricos, se desplaza el reloj básico por medio de un circuito de
retardo, obteniéndose B. Al final se pasan A y B por una compuerta AND para obtener REL.
Esta es la señal mostrada como REL1 en la figura 3-22(b). REL2 puede generarse
retrasando REL1.
MEMORIA
Biestables
Para crear una memoria de un bit, es necesario un circuito que "recuerde" sus valores
de entrada anteriores. Un circuito así puede construirse con dos compuertas NOR, como se
ve en la figura 3-23(a). Se pueden construir circuitos análogos con compuertas NAND. No
los mencionaremos en adelante, ya que son conceptualmente idénticos a las versiones NOR.
El circuito de la figura 3-23(a) se llama biestable SR. Tiene dos entradas, S, para
ponerlo a 1, y R, para ponerlo a 0. También tiene dos salidas, Q y Q, que son
45
complementarias, como veremos en breve. En contraste con los circuitos combinacionales,
las salidas del biestable no están determinadas únicamente por los valores instantáneos de
las entradas.
Para ver cómo sucede esto, supongamos que S y R están en 0, lo cual ocurre casi
siempre. Supongamos que, además, Q = 0. Como Q está realimentada a la compuerta NOR
de arriba, ésta tiene ambas entradas a 0, por lo que su salida, Q(negado), está a 1. Este 1
es realimentado a la puerta de abajo, que tiene entradas 1 y 0, obteniéndose Q = 0. Este
estado es, por lo menos, consistente y es el dibujado en la figura 3-23(a).
Imaginemos ahora que Q no es 0 sino 1, estando todavía R y S a 0. La compuerta
superior tiene 1 y 0 como entradas y una salida, Q (negado), de 0, que es realimentada a la
compuerta inferior. Este estado, que se muestra en la figura 3-23(b), también es
consistente. Un estado con ambas salidas a 0 es inconsistente, porque forzaría a ambas
compuertas a tener dos ceros como entradas; de ser cierto esto, produciría unos y no ceros
como salidas. De modo similar, es imposible que ambas salidas sean iguales a 1, porque
forzaría las entradas a 0 y 1, obteniéndose 0 y no 1. Nuestra conclusión es simple: si R = S
= 0, el biestable tiene dos estados estables, que llamaremos 0 o 1, dependiendo de Q.
Examinemos ahora el efecto de las entradas en el estado del biestable. Supongamos
que S se hace 1 mientras Q = 0. Las entradas a la compuerta superior son 0 y 1, forzando
una salida de 0. Este cambio hace que ambas entradas de la compuerta inferior sean 0,
forzando una salida de 1. Por tanto, el hacer S igual al 1 conmuta del estado 0 al 1. El poner
la entrada R a 1 cuando el estado es 0 no tiene efecto, ya que la salida de la compuerta
inferior es la misma con entradas 10 que con 11.
46
Bieslables SR sincronizados
Biestables D sincronizados
Flip-flops y registros
47
cuidado, pues en la literatura técnica a menudo se confunden los términos; muchos autores
usan flip-flop para referirse a biestables y viceversa.
Los símbolos utilizados normalmente para los biestables disparados por nivel y por
flanco se muestran en la figura 3-26. La figura 3-26(a) representa un biestable D accionado
por nivel, cuyo estado se guarda cuando el reloj, CK, es 1, mientras que el de la figura 3-
26(b) tiene en forma normal el reloj a 1 y hay que bajarlo a 0 momentáneamente para
tomar el estado de D, Las figuras 3-26(c) y (d) son flip-flops, distinguiéndose de los
anteriores por el símbolo puntiagudo de las entradas de reloj. La figura 3-26(c) cambia su
estado con el flanco de subida de reloj (transición de 0 a 1), mientras que la figura 3-26(d)
lo cambia con el de bajada (transición de 1 a 0). Muchos biestables tienen además la salida
Q y algunas entradas de Puesta a 1 y de Puesta a 0 o Borrado.
Registros
48
Organización de las memorias
49
Se necesita una lógica externa que ponga CS en alto para seleccionar la pastilla, así
como para poner RD a alto (1 lógico) para leer, o abajo (0 lógico) para escribir. Las dos
líneas de dirección deben ajustarse para que indiquen cuál de las cuatro palabras de tres
bits ha de leerse o escribirse. En una operación de lectura no se usan las líneas de datos de
entrada, pero en las de salida aparece la palabra seleccionada. En una escritura, en cambio,
no se usan las líneas de datos de salida, pero se recoge el dato de las de entrada y se
guarda en la posición de memoria seleccionada.
Examinemos ahora de cerca la figura 3-28 para ver cómo funciona. Las cuatro
compuertas AND de selección de palabra de la izquierda forman un decodificador. Los
inversores de sus entradas se han ubicado de manera que se habilite (salida en alto) cada
una de las compuertas con una dirección distinta. Cada compuerta alimenta una línea de
selección de palabra, la de arriba para la palabra 0, la siguiente hacia abajo para la 1, etc.
Cuando se seleccione la pastilla para escritura, la línea vertical etiquetada CS-RD estará en
alto, habilitando a una de las cuatro compuertas de escritura, según la línea de selección de
palabra que esté en alto. La salida de la compuerta de escritura mueve todas las señales CK
de la palabra seleccionada, cargando los datos de entrada en los flip-flops de la misma. Sólo
se escribe si CS está en alto y RD en bajo, y sólo en la palabra seleccionada por DIR0 y
DIR1; las restantes permanecen sin ser alteradas.
50
La lectura es similar a la escritura. La decodificación de direcciones es idéntica. Pero
ahora la línea CS • RD está en bajo, por lo que se deshabilitan todas las compuertas de
escritura y no se modifica ningún biestable. En cambio, la línea de selección de palabra
elegida habilita las compuertas AND conectadas a las salidas Q de la palabra seleccionada.
Por tanto, una palabra pasa sus datos a las compuertas OR de cuatro entradas de la parte
inferior de la figura, mientras que a las otras tres palabras les pasan ceros. En
consecuencia, la salida de las compuertas OR es idéntica al valor guardado en la palabra
seleccionada. Las tres palabras no seleccionadas no contribuyen a la salida.
Aunque podría haberse diseñado un circuito en que las salidas de las compuertas OR
se llevarán directamente a las líneas de salida, a veces eso causa problemas. En particular,
se ha señalado que las líneas de datos de entrada y de salida son diferentes, pero en las
memorias reales son las mismas. Si se hubieran conectado las compuertas OR a las líneas
de salida, la pastilla intentaría sacar datos, es decir, forzar cada línea a un valor especifico,
incluso en escritura, interfiriendo en esa forma con los datos de entrada. Por esta razón, es
deseable tener algún modo de conectar las compuertas OR con las líneas de datos de salida
51
en las lecturas, pero desconectarlas por completo en las escrituras. Lo que necesitamos es
un conmutador electrónico que pueda abrir o cerrar una conexión en unos pocos
nanosegundos.
Por fortuna tales conmutadores existen. La figura 3-29(a) muestra el símbolo de lo
que se llama un buffer no inversor. Tiene una entrada de dato, una salida de dato y una
entrada de control. Cuando la entrada de control está en alto, el buffer actúa como un hilo
eléctrico, como se ve en la figura 3-29(b). Cuando la entrada de control está a nivel bajo,
actúa como un circuito abierto, como se muestra en la figura 3-29(c); es como si alguien
hubiera desconectado la salida de datos del resto del circuito con cortacables. Sin embargo,
a diferencia de lo que ocurre con un cortacables, la conexión puede restaurarse en pocos
nanosegundos volviendo a poner la entrada de control a nivel alto.
La figura 3-29(d) muestra un buffer inversor, que actúa como un inversor normal
cuando el control está en alto y desconecta la salida cuando está en ba-jo. Ambos tipos de
buffers son dispositivos triestado, porque pueden dar 0, 1 o nada (circuito abierto). Los
buffers también amplifican las señales, por lo que pueden manejar muchas entradas a la
vez. Por esta razón, se les usa en circuitos, aunque no se necesiten sus propiedades de
conmutador.
Volviendo al circuito de memoria, podemos ahora entender para qué sirven los tres
buffers no inversores de las líneas de salida. Cuando CS, RD y OE estén en alto, la señal de
habilitación de salida también estará en alto, habilitando los buffers y poniendo una palabra
en las líneas de salida. Cuando cualquiera de las señales CS, RD, o OE esté en bajo, las
salidas de datos se desconectarán del resto del circuito.
52
byte seleccionado y ocho líneas para cargar y almacenar los datos. En la segunda, se
necesitan 18 líneas para direccionar el bit seleccionado, pero sólo una línea para sacar los
datos. En ambos casos se requiere de líneas para distinguir lecturas de escrituras y para la
selección de la pastilla. La línea OE representa la habilitación de salida; cuando tiene un
valor de 0, hay una salida presente, y cuando es 1, no la hay (v.g., la salida está
desconectada del circuito). La línea WE representa la habilitación de escritura. Las barras
colocadas sobre OE, WE y CS significan que la señal está activada en un estado de voltaje
bajo (0 lógico) en lugar de alto (1 lógico). Esta convención se verá en detalle más adelante.
Nótese que para construir una memoria con una palabra de memoria de 16 bits a
partir de pastillas de 256K x 1, se requiere de 16 pastillas en paralelo obteniendo una
capacidad total de por lo menos 512K bytes, mientras que usando pastillas de 32K x 8 sólo
se requiere de dos pastillas en paralelo y permite construir memorias tan pequeñas como de
64K bytes.
Las memorias que hemos estudiado hasta ahora pueden utilizarse para leer o escribir.
Se suelen denominar memorias vivas o RAM (siglas inglesas para memoria de acceso
aleatorio); este último nombre es bastante inadecuado puesto que todas las pastillas de
memoria son accesibles en forma aleatoria, pero el término ya se ha arraigado. Hay dos
variedades de memorias RAM: las estáticas y las dinámicas Las RAM estáticas se construyen
a partir de circuitos similares a nuestro biestable D básico. Tienen la propiedad de retener
su contenido tanto tiempo como estén conectadas a la fuente de alimentación, sean
segundos, minutos, horas o aun días.
Las RAM dinámicas, por el contrario, no usan circuitos biestables como los estudiados,
sino que están construidas como un conjunto de pequeños condensadores, que pueden
estar cargados o descargados. Como la carga eléctrica tiende a fugarse, cada bit de la RAM
dinámica debe refrescarse cada pocos milisegundos, para impedir la pérdida de su
información. Como el cuidado del refresco debe encomendarse a lógica externa, las RAM
dinámicas son más difíciles de interconectar que las estáticas, aunque en muchas
aplicaciones esta desventaja está compensada por su mayor capacidad. Algunas memorias
dinámicas tienen la lógica de refresco en la propia pastilla, dando así gran capacidad y
facilidad de conexión a los circuitos. Estas pastillas se denominan casi estatuas.
Las RAM no son los tarcos tipos de pastillas de memoria. En muchas aplicaciones,
53
como juguetes, electrodomésticos y automóviles, los programas, los programas y parte de
los datos deben permanecer aun cuando se desconecte la alimentación. Además, una vez
instalados, ni el programa ni esos datos van a cambiarse nunca. Estos requisitos llevaron al
desarrollo de las memorias fijas o ROM (siglas inglesas para memoria de sólo lectura), que
no pueden cambiarse de ninguna manera. Los datos se graban durante la fabricación de la
ROM, que consiste esencialmente en la exposición a la luz de un material fotosensible a
través de una máscara con la configuración deseada de bits. Después se disuelve la parte
expuesta a la luz (o la no expuesta) La única manera de cambiar un programa en ROM es
sustituir la pastilla por otra.
Las ROM son mucho más baratas quejas RAM cuando se piden en grandes cantidades,
para amortizar el precio de hacer la máscara. Sin embargo son inflexibles, ya que no
pueden cambiarse después de su fabricación y el plazo de entrega desde que se encargan
hasta que se reciben puede abarcar varias semanas. Para facilitar a las empresas el
desarrollo de productos basados en ROM se inventó otro tipo de memoria muerta
denominado PROM (ROM programable) Esta pastilla es como una ROM, excepto en que
puede programarse (una sola vez) reduciendo así el plazo en que pueden tenerse grabadas.
El siguiente avance en esta tinca fue la EPROM (PROM borrable), que no sólo puede
programarse sino también borrarse. Cuando la ventana de cuarzo de una EPROM se expone
a luz ultravioleta potente durante unos 15 minutos. todos sus bits se ponen a 1. Si se
espera hacer muchos cambios en el ciclo de diseños las EPROM son mucho más económicas
que las PROM porque pueden reutilizarse.
Aún mejores que las EPROM son las EEPROM (EPROM eléctricamente borrables)
también llamadas EAROM (ROM eléctricamente alterables), que pueden borrarse mediante
impulsos eléctricos, sin necesidad de que las introduzcan en un receptáculo especial para
exponerlas a luz ultravioleta. Las EEPROM difieren de las RAM en que el tiempo necesario
para grabar o borrar un byte es miles de veces mayor, a pasar de que los tiempos de
acceso en lectura de las ROM, PROM, EEPROM y RAM son similares (al máximo unas
centenas de nanosegundos).
MICROPROCESADORES Y BUSES
Microprocesadores
Para los fines de este libro, se usará el término "microprocesador" para denominar a
cualquier CPU contenida en una sola pastilla, aun cuando algunas de ellas tengan la
arquitectura y el poder de cómputo de pequeñas macrocomputadoras. Esta definición está
basada en el empacado de componentes, la que la hace apropiada para el nivel de la lógica
digital que se estudia.
Se decidió tratar las CPU de una sola pastilla por una buena razón: su relación con el
resto del sistema se encuentra bien definida. Una pastilla de microprocesador típica tiene
entre 40 y 132 patas, a través de las cuales se establece su relación con el mundo exterior.
Algunas patas envían señales de la CPU, otras aceptan señales del exterior y algunas
realizan ambas funciones. Si se entiende la función de cada una de las patas, se aprende
cómo interacciona la CPU con la memoria y los dispositivos de E/S al nivel de lógica digital.
Aunque lo que sigue se refiere específicamente a los microprocesadores, las ideas básicas
(por ejemplo, cómo la CPU hace referencia a la memoria, cómo se conectan los dispositivos
de E/S, etc.) también son válidas para las minicomputadoras y, en cierta medida, para las
macrocomputadoras, aunque de una manera algo diferente.
Las patas de una pastilla de microprocesador pueden dividirse en tres tipos: dirección,
54
datos y control. Estas, están conectadas a patas similares en las pastillas de memoria y de
entrada/salida por medio de un conjunto de alambres paralelos denominados bus. Para
extraer una instrucción, el microprocesador pone primero la dirección de memoria de dicha
instrucción en las patas de direccionamiento. En seguida (por lo general), activa la línea de
control para informar a la memoria que desea leer una palabra. La memoria responde
poniendo la palabra solicitada en las patas de datos del microprocesador y activando una
señal que indica que lo hizo. Cuando el microprocesador observa esta señal, acepta la
palabra y lleva a cabo la instrucción. La instrucción puede requerir a su vez leer o escribir
palabras de datos, en cuyo caso se repite todo el proceso para cada palabra adicional. Más
adelante se verá cómo funcionan la lectura y la escritura, pero, por el momento, lo
importante es entender que la CPU se comunica con la memoria y con los dispositivos
periféricos presentando y aceptando señales a través de sus patas. No es posible realizar
otro tipo de comunicación. Cabe hacer aquí una aclaración en cuanto a la terminología. En
algunas patas, una señal alta (+5 volts) provoca que se realice una acción; en otros, ésta
se produce por una señal baja. A fin de evitar confusiones, para indicar que una señal tiene
un valor para provocar alguna acción diremos que está activada (en vez de decir que tiene
un valor alto o bajo). De esta manera, en algunos casos activar las señales significa darles
un valor alto, mientras que para otras significa que tomen un valor bajo. Las patas que son
activadas cuando el valor es bajo se les asignan nombres con una barra encima. Así, WRITE
está activada alto, en tanto que WRITE está activada bajo. El término opuesto es
desactivado y se usa para indicar ausencia de acción. Cuando no ocurre ninguna acción en
particular, se dice que las patas están desactivadas o negadas.
Dos parámetros clave que determinan el desempeño de un microprocesador son el
número de patas de direccionamiento y el número de patas de datos. Una pastilla con m
patas de direccionamiento puede direccionar hasta 2m bytes de memoria. Valores comunes
para m son: 16, 20, 24 y 32. En forma similar, una pastilla con n patas de datos puede leer
o escribir en una sola operación palabras de memoria de n bits. Los valores comunes para n
son: 8, 16 y 32. Para leer una palabra de 32 bits, un microprocesador de 8 patas de datos
requiere de cuatro operaciones, mientras que uno con 32 patas lo puede hacer en una sola
operación. De ahí que este último sea mucho más rápido, aunque también invariablemente
más caro.
Además de las patas de dirección y datos, cada microprocesador tiene algunas patas
de control, las cuales sirven para regular los tiempos y el flujo de los datos desde y hacia el
microprocesador, así como otras varias funciones. Todo microprocesador tiene terminales
para alimentación (normalmente + 5 V), tierra física y para la señal de reloj (una onda
cuadrada); el resto de las patas varía mucho dependiendo de la pastilla. No obstante, las
patas de control pueden agruparse grosso modo en las siguientes categorías principales:
1. Control del bus
2. Interrupciones
3. Arbitraje del bus
4. Señalamiento al coprocesador
5. Estados
6. Varios
55
Para regular el tráfico en el bus, se necesitan las patas de arbitraje del bus, a fin de
evitar que dos dispositivos pretendan utilizarlo al mismo tiempo. Para los fines de arbitraje,
se considera a la CPU como un dispositivo.
Muchas pastillas están diseñadas para operar junto con coprocesadores, que en su
mayoría son unidades aritméticas de punto flotante, pero también pueden ser pastillas de
gráficos u otras. Para facilitar la comunicación entre el microprocesador y el coprocesador
se incluyen patas especiales para realizar y autorizar diversas solicitudes. Además de estas
señales, algunos microprocesadores tienen otras patas para funciones varias. Algunos de
éstos proporcionan o aceptan información sobre el estado del microprocesador, otros sirven
para reinicializar la computadora o para asegurar la compatibilidad con pastillas de E/S de
versiones anteriores.
Buses de computadora
Un bus es una ruta eléctrica común entre múltiples dispositivos. Un ejemplo común es
el bus del sistema presente en toda microcomputadora, el cual consiste de 50 a 100
alambres de cobre paralelos grabados en la tarjeta matriz, con conectores espaciados a
intervalos regulares para conectar tarjetas de memoria y de entrada/salida. Además, los
buses se pueden dedicar a fines especiales como conectar una pastilla de microprocesador a
uno ovarios coprocesadores o memorias locales. Más aún, dentro de la misma pastilla del
microprocesador puede haber varios buses para conectar sus componentes internos, como
se ilustra en la figura 3-32. En las publicaciones, los buses se dibujan en ocasiones como
flechas gruesas tal como en esta figura.
Mientras que dentro de la pastilla los diseñadores de microprocesadores tienen la
libertad de usar cualquier clase de bus, a efecto de que las tarjetas diseñadas por terceras
personas puedan conectarse al bus del sistema, debe haber reglas bien definidas del
funcionamiento de éste, las cuales deben ser obedecidas por todos los dispositivos
conectados al mismo.
Estas reglas se denominan protocolo del bus. Asimismo, debe haber especificaciones
mecánicas y eléctricas para que las tarjetas diseñadas por terceros se ajusten al gabinete
de tarjetas j tengan los conectores necesarios para acoplarse a la tarjeta matriz, tanto
físicamente como en términos de voltaje.
Una gran variedad de buses existen diseminados en el mundo de la computación.
Algunos de los más conocidos incluyendo ejemplos entre paréntesis son: Camac (física
nuclear), EISA (80386), Fastbus (física de alta energía), IBM PC y PC/AT (computadoras
personales), Massbus (PDP-11, VAX), Megabus (Honeywell), Microchannel (PS/2), Multibus I
(8086), Multibus II (80386), Nubus (Macintosh II), Omnibus (PDP-8), Qbus (LSI-ll ), S-I00
(Computadoras recreativas), SBI (VAX-11/780), Unibus (PDP-11), Versabus (Motorola) y
56
VME (680xO). Probablemente, éste sería un mundo si todos estos buses con excepción de
uno, desaparecieran. Por desgracia, la estandarización en esta área parece poco probable
en virtud de las inversiones existentes en todos estos sistemas incompatibles.
57
Estas pastillas de interfaz son a menudo dispositivos triestado, a fin de permitirles
flotar (desconectarse) cuando no son necesarios, o estar conectados de cierto modo
diferente llamado colector abierto, con el que se logra un efecto similar. Cuando dos o más
dispositivos en una línea de colector abierto activan la línea al mismo tiempo, el resultado
es el O-Booleano para todas las señales. A esta configuración se le conoce por lo regular
con el nombre de O-alambrado. En la mayoría de los buses algunas de las líneas son del
tipo triestado, mientras que otras que requieren de las propiedades del O-alambrado, son
del tipo colector abierto.
Como en un microprocesador, un bus también tiene líneas de direcciones, de datos y
de control, sin embargo no es necesario que haya una correspondencia de 1 al entre las
señales de ambos. Por ejemplo, algunos microprocesadores tienen tres patas que codifican
las operaciones que se están realizando, como lectura o escritura de la memoria o de
entrada/salida. Por su parte, un bus típico tendrá una línea para lectura de memoria, otra
para escritura de memoria, una tercera para lectura de E/S, una cuarta para escritura de
E/S y así sucesivamente. Por lo tanto, se requiere de una pastilla decodificadora entre la
CPU y dicho bus para convertir la señal codificada de tres bits en señales separadas, que
puedan ser manejadas por las líneas del bus.
Otros aspectos relevantes en el diseño de buses (además del número de direcciones y
líneas de datos) son: la sincronización del bus, el mecanismo de arbitraje, el manejo de
interrupciones y el manejo de errores. Todos ellos tienen un impacto significativo en la
velocidad y en la amplitud de banda del bus. En las secciones siguientes se abordarán estos
puntos con mayor detalle, comenzando por la sincronización.
Buses síncronos
Dependiendo de los ciclos de tiempo, los buses pueden clasificarse en dos distintas
categorías. Un bus síncrono tiene una línea manejada por un oscilador de cristal. La señal
de esta línea consiste en una onda cuadrada con una frecuencia que varía entre 5 y 50 MHz.
Todas las actividades del bus se realizan en un número entero de estos ciclos, denominados
ciclos del bus. El otro tipo de bus, el bus asíncrono no tiene un reloj maestro, la longitud de
los ciclos del bus puede ser cualquiera que se necesite y no se requiere sea la misma entre
cada par de dispositivos. Ambas categorías serán examinadas en su oportunidad, más
adelante.
58
Como un ejemplo de funcionamiento de un bus síncrono, considérense los diagramas
de tiempo de la figura 3-34(a), en el que se usará un reloj de 4 MHz, el cual da un ciclo del
bus de 250nseg. Se asumirá además. que la lectura de un byte de memoria toma tres ciclos
del bus. o sea un total de 750 nseg desde el inicio del ciclo T1 hasta el final del ciclo T3.
Nótese que ninguna de las líneas ascendentes o descendentes han sido dibujadas en forma
vertical en virtud de que ninguna señal eléctrica puede cambiar su valor en un tiempo de
cero. En el ejemplo se asume que toma 10 nseg cambiar una señal. Tanto las líneas de reloj
como de direcciones. datos, MREQ y RD se muestran en la misma escala de tiempo. El
comienzo de T1 se define por el flanco ascendente de reloj. Poco después de iniciado T1, la
CPU pone la dirección del byte deseado en las líneas de direcciones. Como la dirección no
consta de un solo valor. como en el caso del reloj no puede mostrarse con un solo trazo; en
cambio se presenta como dos líneas que se cruzan al momento en que la dirección cambia.
Más aún, el sombreado que precede al cruce, indica que su valor no es importante.
Utilizando esta misma convención de sombreado, podemos
observar que el contenido de las líneas de datos no es significativa hasta bien
adentrado T3.
MREQ y RD se activan una vez que las líneas de dirección han tenido tiempo para
asentar sus nuevos valores. MREQ indica que la memoria (y no un dispositivo de E/S) está
siendo accesada y RD se usa para distinguir las operaciones de lectura de las de escritura.
59
Para dar tiempo a la memoria para decodificar la dirección y poner los datos en el bus, no
sucede nada durante T2. En el flanco descendente del reloj. la CPU lee las líneas de datos y
almacena su valor en un registro interno. Una vez leídos los datos, la CPU desactiva MREQ y
RD. En caso necesario puede iniciarse otro ciclo de memoria en el siguiente flanco
ascendente del reloj.
En la especificación de tiempos de la figura 3-34(b), se muestra de manera más clara
el significado de los ocho símbolos que aparecen en el cronograma. TRDIR por ejemplo, en el
intervalo de tiempo, entre el flanco ascendente del reloj en T1 y el establecimiento de las
líneas de dirección. De acuerdo con la especificación de tiempos. TRDIR 110 nseg, lo que
significa que el fabricante de la pastilla garantiza que durante cualquier ciclo de lectura de
operandos, la CPU pondrá la dirección a ser leída dentro de los 110 nseg siguientes al punto
medio del flanco ascendente del reloj en T1.
En los diagramas de tiempos también se requiere que los datos estén disponibles por
lo menos 50 nseg antes del flanco descendente de T3, para darle tiempo de estabilizarse
antes de ser leídas por la CPU.
La combinación de las restricciones en TRDIR y TEDAT significa que, en el peor de los
casos. la memoria tendrá sólo 250 + 250 + 125 -110 -50 = 465 nseg desde el momento en
que aparecen las direcciones hasta que deba entregar el dato. Si la memoria no pudiera
responder tan rápido deberá activar ESPERA antes del flanco de bajada de T2, que es
cuando se muestrea.
Esta acción insertará estados de espera (ciclos extra del bus) hasta que la memoria
termine y desactive ESPERA.
La especificación de tiempo garantiza que la dirección estará presente al menos 60
nseg antes de que se active MREQ. Este tiempo puede ser importante si MREQ se conecta a
la selección del circuito de memoria, ya que algunas memorias requieren que la dirección
esté estable antes de su selección. Evidentemente, el diseñador del microcomputador no
deberá elegir un chip de memoria que requiera de establecimiento de 75 nseg antes de
MREQ .
La restricción en TRPM y en TLB significa que MREQ y RD deben activarse antes de 85
nseg después del flanco de bajada del reloj en T1. En el caso peor, la pastilla de memoria
tendrá sólo 250 + 250 - 85 - 50 = 365 nseg desde la activación de MREQ y RD hasta tener
el dato en el bus. Esta restricción se añade a la referente a la dirección.
TPMA y TLA dicen cuánto tardan en negarse MREQ y RD después de haberse muestreado
el dato. Finalmente, TMDAT dice cuánto tiempo debe mantener la memoria el dato en el bus
después de desactivar RD. Por lo que concierne a la CPU del ejemplo, la memoria puede
retirar los datos del bus tan pronto como se desactive RD; sin embargo, en algunos
microprocesadores los datos deben permanecer estables un poco más de tiempo.
Cabe señalar que la figura 3-34 representa una versión muy simplificada de las
restricciones reales en la especificación de tiempos. En la práctica, se señalan siempre
muchos más tiempos crítico. No obstante, muestra una buena imagen de como funciona un
bus síncrono.
Además de los ciclos de lectura (y escritura), algunos buses síncronos manejan
transferencias en bloque. Cuando se inicia la lectura de un bloque el bus maestro indica al
esclavo cuantos bytes van a transferirse, por ejemplo, poniendo el número de bytes en la
línea de datos durante T1. En vez de regresar sólo un byte, el bus esclavo envía un byte
durante cada ciclo hasta agotar el número indicado. En este ejemplo, la lectura de un
bloque de n bytes tomaría n + 2 ciclos en lugar de 3n.
Otra forma de hacer más rápido al bus consiste en acortar el ciclo. En el ejemplo, se
transfiere un byte cada 750 nseg con una amplitud de banda máxima de 1.33 Mbytes/seg.
Con un reloj de 8 MHz, el tiempo de ciclo se reduciría a la mitad y se podrían alcanzar 2.67
Mbytes/seg. Sin embargo, acortar el ciclo del bus puede conducir a problemas de ingeniería.
No todas las señales en las diversas líneas viajarían exactamente a la misma velocidad
creando un efecto llamado distorsión del bus. Resulta esencial que la distorsión y el tiempo
del ciclo sean comparables duraderamente a fin de evitar que los intervalos de tiempo
digitalizados terminen en un ciclo de tiempo análogo.
El último punto a tratar es si las señales de control deben activarse altas o bajas.
Corresponde a los diseñadores del bus determinar cuál es más conveniente, pero la elección
60
es, en esencia, arbitraria. Esta cuestión puede verse como el equivalente en el hardware, de
la elección de un programador para representar como ceros o unos a los bloques libres de
disco en un mapa de bits.
BUSES ASINCRONOS
Aun cuando es fácil trabajar con buses síncronos debido a sus intervalos de tiempo
discretos, también presentan algunos problemas. Por un lado, todo el trabajo se realiza en
múltiples enteros del reloj del bus. Si una CPU y una memoria particular son capaces de
completar una transferencia en 3.1 ciclos, deben ampliarla a 4.0 ya que los ciclos
fraccionados están prohibidos.
Peor aún, una vez que se ha seleccionado un ciclo de bus y se ha construido para éste
tanto la memoria como las tarjetas de entrada/salida, resulta difícil aprovechar las ventajas
de mejoras futuras de la tecnología. Suponga por ejemplo que algunos años después de
construido el sistema de la figura 3-34, aparecen nuevas CPU y memoria con ciclos de
tiempo de 100 nseg en vez de 250 nseg. Aun cuando pudieran usarse, correrían a la misma
velocidad que el anterior, ya que el protocolo del bus requiere que la memoria active las
líneas de datos justo antes del flanco descendente de T3.
Por otro lado, si un bus tiene conectado un grupo heterogéneo de dispositivos, algunos
rápidos y otros lentos, el bus debe ajustarse al más lento impidiendo que los más rápidos
utilicen todo su potencial.
Puede manejarse una tecnología mixta utilizando un bus asíncrono, esto es, un bus sin
reloj maestro, como el que se muestra en la figura 3-35. En vez de que todo esté
"amarrado" al reloj, cuando el bus maestro ha activado las señales de dirección, MREQ, RD
y cualquier otra que necesite, activa entonces una señal especial llamada SINM
(SINcronización Maestra). Cuando el dispositivo esclavo ve esta señal realiza su trabajo tan
rápido como puede, activando al terminar la señal SINE (SINcronización Esclava).
Tan pronto como el maestro ve activada la señal SINE sabe que los datos están
disponibles de modo que los almacena en un registro interno y desactiva las líneas de
direcciones lo mismo que MREQ, RD y SINM. A su vez, cuando el esclavo observa
desactivada la señal SINM, sabe que el ciclo se ha completado, así que desactiva SINE,
regresando a la situación original, con todas las señales desactivadas y aguardando el
siguiente ciclo.
En los cronogramas de buses asíncronos (y en ocasiones también en los de síncronos)
se utilizan flechas para indicar causa y efectos como en la figura 3-35. Activar SINM
ocasiona que se activen las líneas de datos, así como también provoca que el esclavo active
SINE. A su vez, activar esta última señal, conduce a desactivar las líneas de direcciones,
61
MREQ, RD y finalmente, desactivar SINM causa la desactivación de SINE, terminando así la
lectura.
Al conjunto de señales enlazadas de esta forma se le denomina sincronización
completa o bidireccional, cuya parte esencial consta de cuatro pasos:
1. Se activa SINM.
2. Se activa SINE en respuesta a SINM.
3. Se desactiva SINM en respuesta a SINE.
4. Se desactiva SINE en respuesta a la desactivación de SINM.
Hasta ahora hemos asumido en forma tácita que sólo hay un bus maestro: la CPU. En
realidad, también las pastillas de entrada/salida pueden actuar como maestros para lecturas
y escrituras de memoria así como para provocar interrupciones. Asimismo, los
coprocesadores pueden convertirse en maestros del bus. De ahí que surja la siguiente
pregunta: " ¿Qué sucede si dos o más dispositivos desean actuar como bus maestros al
mismo tiempo?" La respuesta es que para evitar el caos, se necesita de algún mecanismo
de arbitraje del bus.
Este tipo de mecanismo puede ser centralizado o descentralizado. Se verá primero el
arbitraje centralizado, que en forma sencilla se muestra en la figura 3-36(a). En este
esquema, un solo árbitro del bus determina qué dispositivo tiene acceso. Muchos
microprocesadores contienen el árbitro integrado en la pastilla de CPU, pero en sistemas de
minicomputadoras es a veces un dispositivo separado. El bus contiene una línea de solicitud
que puede ser activada por uno o más dispositivos en cualquier momento (funciona como
un O-alambrado). No hay forma de que el árbitro sepa cuántos dispositivos han solicitado el
bus. Las únicas categorías que pueden distinguirse son: existe(n) solicitud(es) y no existe
solicitud.
62
Cuando el árbitro recibe una solicitud para el bus, autoriza su uso activando la línea de
respuesta del bus. Dicha línea está conectada en serie a través de todos los dispositivos de
entrada/salida, como en una serie de foquitos de navidad. Cuando el dispositivo que se
encuentra físicamente más cerca del árbitro recibe la señal, verifica si fue él quien hizo la
solicitud, en cuyo caso hace uso del bus y evita que la señal se siga propagando. Si este
dispositivo no fue quien originó la solicitud, la señal se propaga al siguiente dispositivo en la
línea, el que actúa en la misma forma y así sucesivamente hasta que algún dispositivo
acepte la señal y haga uso del bus. A este esquema se le denomina encadenamiento
margarita, y tiene la propiedad de que los dispositivos poseen, en efecto, prioridades
asignadas dependiendo de qué tan cerca se encuentren del árbitro. El dispositivo más
cercano tiene la prioridad más alta.
A fin de evitar las prioridades implícitas basadas en la distancia del árbitro, algunos
buses tienen múltiples niveles de prioridad. Para cada nivel existe una línea de solicitud y
una línea de respuesta. El bus que se muestra en la figura 3-36(b) tiene dos niveles, 1 y 2
(en la práctica los buses tienen 4, 8 o 16 niveles). Cada dispositivo está conectado a alguno
de los niveles de solicitud del bus, con aquellos que tienen tiempos más críticos conectados
a las líneas con prioridades más altas. En la figura 3-36(b) los dispositivos 1 y 2 utilizan el
nivel de prioridad 1, mientras que los dispositivos 3, 4 y 5 usan prioridad 2.
Si varios niveles de prioridad solicitan el bus al mismo tiempo, el árbitro concede su
uso sólo al de prioridad más alta. Entre los dispositivos con la misma prioridad se utiliza el
encadenamiento margarita. En la figura 3-36(b), en caso de conflicto el dispositivo 3 supera
al 4, éste al 5 que a su vez supera al dispositivo 1. El dispositivo 2 tiene la prioridad más
baja porque se encuentra al final de la cadena con menor prioridad.
Al margen puede comentarse que técnicamente no es necesario conectar en serie la
línea de respuesta del nivel 2 a través de los dispositivos 1 y 2, ya que éstas no pueden
solicitar esta línea, pero por conveniencia en la implantación, resulta más fácil conectar
todas las líneas de respuesta a todos los dispositivos, en lugar de hacer conexiones
especiales que dependan de qué dispositivo tiene cuál prioridad.
Algunos árbitros tienen una tercera, línea que es activada por el dispositivo cuando
acepta una línea de respuesta y ocupa el bus. Tan pronto como se activa esta línea de
reconocimiento, pueden desactivarse las líneas de solicitud y de respuesta. Como resultado,
63
otros dispositivos pueden solicitar el bus mientras que el primero lo está utilizando. Cuando
termine la transferencia actual, el siguiente maestro del bus ya habrá sido seleccionado y
pueden iniciar su operación tan pronto como se desactive la línea de reconocimiento en el
momento que empieza la siguiente ronda de arbitraje. Este esquema requiere de una línea
extra de bus así como más componentes lógicos en los dispositivos, pero hace un uso más
eficiente de los ciclos del bus. Entre otras, las pastillas de Motorola y de la PDP-11 utilizan
este sistema.
En muchos sistemas, la CPU puede también competir por el bus, pero se le asigna la
prioridad más baja y sólo puede ocupar el bus cuando nadie más lo usa. Aquí la idea es que
la CPU puede esperar mientras que los dispositivos de entrada/salida deben obtener el uso
del bus rápido o pierden los datos que están recibiendo; los discos girando a altas
velocidades no pueden esperar .
Cuando se utiliza el arbitraje del bus descentralizado no existe un árbitro. Por ejemplo,
el bus SBI de la VAX tiene 16 líneas priorizadas de solicitud del bus; este diseño limita el
número de dispositivos a 16. Cuando alguno de ellos desea utilizar el bus, activa su línea de
solicitud. Todos los dispositivos monitorean todas las líneas de solicitud, de modo que al
final de cada ciclo de bus, cada dispositivo sabe si tiene la prioridad más alta y de ahí, si
podrá usar el bus durante el siguiente. Este método, comparado con el arbitraje
centralizado requiere de un mayor número de líneas de bus, pero evita el costo potencial
del árbitro.
Otro tipo de arbitraje del bus descentralizado se usa en el Multibus. Este esquema,
mostrado en la figura 3-37, sólo usa tres líneas sin importar cuantos dispositivos haya. La
primera línea del bus es una línea de O-alámbrico para solicitar el bus. La segunda
denominada BUSY es activada por el bus maestro correspondiente. La tercera se usa para el
arbitraje del bus y atraviesa todos los dispositivos mediante encadenamiento margarita. La
punta de esta cadena se conecta a la fuente de poder de 5 volts, manteniendo la línea
activa.
Cuando ningún dispositivo requiere del bus, la línea activa de arbitraje se propaga a
través de todos los dispositivos. Para hacer uso del bus, el dispositivo checa primero si éste
está ocioso y si la señal de arbitraje ENT que recibe está activa, si no lo está no puede
convertirse en maestro del bus. Sin embargo, si ENT está activa, el dispositivo desactiva
SAL que es la señal que requiere el resto de los dispositivos en la línea para desactivar ENT
y SAL. Al final, sólo un dispositivo tendrá activada ENT y desactivada SAL, con lo que se
convierte en maestro del bus, activa las líneas BUSY y SAL e inicia su transferencia.
Poniendo un poco de atención, se puede apreciar que el dispositivo colocado más
hacia la izquierda en la cadena que requiera el bus es el que lo obtiene. De ahí que este
esquema sea similar al arbitraje de encadenamiento margarita, con la excepción de que no
tiene árbitro, de modo que es más barato, rápido y no está sujeto a fallas del árbitro.
Además, el Multibus ofrece también arbitraje centralizado así que los diseñadores del
sistema pueden elegir.
Un último punto acerca del arbitraje se refiere a las operaciones de ciclo múltiples. En
sistemas de multiproceso, es una práctica común usar una palabra de memoria para
proteger estructuras de datos compartidos. Si esta palabra es 0, un procesador puede
asignarle el valor de 1 y utilizar la estructura de datos. Si la palabra ya tiene el valor 1, el
procesador deberá aguardar a que el procesador que esté usando la estructura termine
64
asignando a la palabra nuevamente el valor de 0.
En la siguiente secuencia de pasos se muestra una situación en donde las cosas no
salen bien:
1. El procesador A lee la palabra xy observa que tiene un valor de 0 (ciclo 0 del bus).
2. El procesador B lee la palabra xy observa que tiene un valor de 0 (ciclo 1 del bus).
3. El procesador A escribe un 1 en la palabra x (ciclo 2 del bus).
4. El procesador B escribe un 1 en la palabra x (ciclo 3 del bus).
Si esta secuencia ocurriera, habría dos procesadores pensando cada uno al mismo
tiempo que tiene acceso exclusivo a la estructura de datos compartida, originando un caos.
Para prevenir esta situación, algunas CPU tienen una instrucción que lee una palabra de
memoria y si es 0 le da el valor de 1. El problema con dicha instrucción es que requiere de
dos ciclos del bus, uno para leer y otro para escribir. Existe una pequeña pero real
posibilidad de que un segundo procesador se meta entre la lectura y la escritura causando
estragos.
La solución a este problema es agregar una línea extra al bus, LOCK, que pueda
activarse al inicio de dicha instrucción. Una vez activada, no permite a ningún otro
procesador convertirse en maestro del bus hasta que sea desactivada. Esta regla permite al
procesador original la posibilidad de realizar múltiples ciclos del bus sin interferencia. En los
buses que no tienen esta característica, resulta difícil construir un sistema de multiproceso
que funcione de manera correcta.
Manejo de interrupciones
Hasta ahora sólo se han abordado los ciclos ordinarios del bus, con un maestro que lee
o escribe en un esclavo. Otro uso importante del bus es el manejo de interrupciones.
Cuando la CPU instruye a algún dispositivo de entrada/salida para que haga algo, por lo
general espera una interrupción cuando termine el trabajo. La señal de interrupción indica
que requiere del bus.
Aquí se presenta el mismo tipo de problemas que con los ciclos del bus ordinario, ya
que es posible que varios dispositivos quieran enviar una interrupción al mismo tiempo. La
solución usual es asignar prioridades a los dispositivos, y usar un árbitro centralizado para
dar prioridad a aquellos que tengan los tiempos más críticos. Existen en el mercado pastillas
estándar para el control de interrupciones y su uso está muy extendido. Las IBM-PC, PC/ AT
, PS/2 y todo sus clones (IBM-PC compatibles) usan una pastilla Intel 8259A como la que se
ilustra en la figura 3-38.
En las entradas de Solicitud de Interrupción (SIx) de la 8259A, se pueden conectar en
forma directa hasta 8 pastillas controladoras de entrada/salida. Cuando alguno de estos
dispositivos desea realizar una interrupción, activa su línea de entrada. Cuando una o más
de estas líneas está activa, la 8259A activa a su vez la señal INT (INTerrupción), la cual
maneja directamente la pata de interrupción de la CPU. Cuando esta última está en
65
disposición de manejar la interrupción, envía un impulso ala 8259A en INT A (INTerrupción
Recibida). En este punto, la pastilla controladora deberá especificar qué dispositivo causó la
interrupción, colocando el número de éste en el bus de datos. Entonces, para encontrar la
dirección del procedimiento a ejecutar para atender esa interrupción, el hardware de la CPU
utiliza dicho número como índice en una tabla de apuntadores denominados vectores de
interrupción.
Dentro de la 8259A existen diversos registros en los cuales puede leer o escribir la
CPU usando ciclos ordinarios del bus y las patas A0, RD (Lectura), WR (Escritura) y CS
(Selección de Pastilla). Una vez que el software ha manejado la interrupción y está listo
para la siguiente, escribe una clave especial en unos de estos registros, lo que provoca que
la 8259A desactive INTR, a menos que tenga otra interrupción pendiente también puede
escribirse en estos registros para cambiar el modo de operación de la 8259A, enmascarar
una serie de interrupciones o habilitar otras características.
Cuando existen más de 8 dispositivos de E/S se puede encadenar varias pastillas
8259A. En el caso más extremo, cada una de las 8 entradas se pueden conectar a las
salidas de 8 pastillas 8259A, permitiendo hasta 64 dispositivos de E/S en una red de
interrupciones de dos etapas. La 8259A tiene varias patas para controlar el
encadenamiento, las cuales se han omitido en la figura para mayor simplicidad.
Aunque de ninguna manera hemos agotado el tema de diseño del bus, el material
anterior debe proporcionar los elementos suficientes para entender las bases de como
funcionan y su interacción con los microprocesadores. En las obras de Borrill, 1985 y
Gustavson, 1984 puede encontrarse más información al respecto.
Ahora se pasará de lo general a lo particular y se verán algunos ejemplos de
microprocesadores actuales y sus buses.
66
CONCLUSIÓN
67
BOLILLA II (Parte 2): EL
NIVEL DE
MICROPROGRAMACIÓN
68
INDICE
69
INTRODUCCIÓN
70
APUNTES DE CATEDRA
EL NIVEL DE MICROPROGRAMACIÓN
La frontera entre el hardware y el software no está bien definida y, además, varia
constantemente. Las primeras computadoras tenían instrucciones para hacer operaciones
aritméticas y booleanas, corrimientos, comparaciones, iteraciones y otras que eran
realizadas directamente por el hardware. Para cada instrucción había un circuito especifico
que la ejecutaba. En teoría al menos, se podía destornillar el panel trasero e identificar los
componentes electrónicos que realizaban la instrucción dividir, por ejemplo.
En una moderna computadora multinivel ya no es posible aislar los circuito de la
división porque no existen. Todas las instrucciones en el nivel de máquina convencional (por
ejemplo: aritméticas, booleanas, de miento, de comparación y de bucle) son realizadas
paso a paso por un intérprete que se ejecuta en el nivel de microprogramación. El
equivalente moderno de buscar los circuitos de la división es obtener un listado del
microprograma y examinar la porción que interpreta la instrucción de dividir .
Aunque los programas de cualquier nivel pueden ser ejecutados por un programa
intérprete que, a su vez, puede ser llevado a cabo por otro intérprete, esta jerarquía no
puede continuar indefinidamente. En el nivel inferior deberá haber una máquina física, con
circuitos integrados, fuentes de alimentación y otros objetos del hardware. Estos elementos
fueron el tema del capítulo precedente. En este capítulo estudiaremos cómo el
microprograma controla los componentes del hardware e interpreta el nivel de máquina
ordinaria (convencional). En el capítulo 8 se estudiará una clase de máquinas no
microprogramadas (las máquinas RlSC).
Como la arquitectura del nivel de microprogramación, denominada micro-
arquitectura, está definida por el hardware, suele ser primitiva y difícil de programar. Por
ejemplo, a menudo son importantes las consideraciones de tiempos. Esto llevó a Rocín
(1974) a definir la microprogramación como "el diseño de sistemas más o menos razonables
por medio de la interpretación sobre máquinas irracionales".
El nivel de microprogramación tiene una función específica: ejecutar intérpretes de
otras máquinas virtuales (más o menos razonables). El objetivo natural de diseño es la
obtención de una organización considerablemente optimizada para la extracción, examen y
ejecución de instrucciones del nivel de máquina convencional y, en algunos casos, de otras
más complejas. En este capítulo examinaremos los principios y soluciones intermedias que
hay que considerar en el diseño y organización de este nivel.
Empezaremos nuestro estudio del nivel de microprogramación revisando brevemente
los elementos básicos estudiados en el capítulo 3, ya que son parte de la arquitectura del
nivel de microprogramación y, por tanto, de interés para el microprogramador (persona que
escribe microprogramas, no un programador pequeño). Luego entraremos en el meollo del
tema, explicando de modo pormenorizado cómo pueden construirse instrucciones complejas
a partir de secuencias de instrucciones más primitivas. La explicación se apoyará en un
ejemplo desarrollado detalladamente. Después examinaremos los factores que deben
tenerse en cuenta al diseñar el nivel de microprogramación de una computadora, para
entender mejor por qué tiene determinada estructura. También se abordarán algunas
formas para mejorar el desempeño de la computadora. Por último, se examinará el nivel de
microprogramación de los dos ejemplos que se han venido usando, las familias lntel y
Motorola.
71
REPASO SOBRE EL NIVEL DE LÓGICA DIGITAL
El trabajo del microprogramador es escribir programas que controlen los registros,
buses, unidades aritméticas y lógicas, memorias y otros componentes del hardware de las
máquinas. En el capítulo anterior estudiamos estos dispositivos; ahora simplemente vamos
a revisarlos para tenerlos presentes. Después del repaso diremos algunas cosas sobre las
diferentes formas conceptuales de encapsular los componentes.
Registros
Un registro es un dispositivo capaz de almacenar información. El nivel de
microprogramación siempre dispone de registros para guardar la información que se
necesita en el procesamiento de la instrucción en curso de interpretación.
Desde el punto de vista conceptual, los registros son lo mismo que la memoria
principal; la diferencia estriba en que los registros están ubicados en el procesador mismo
y, por tanto, se puede acceder a ellos en lectura y escritura más rápidamente que a la
memoria principal, la cual suele estar fuera del chip (pastilla). Normalmente, las máquinas
mayores y más caras tienen un número mayor de registros que las más pequeñas y
económicas; éstas tienen que usar la memoria principal para guardar los resultados
intermedios. En algunas computadoras el nivel de microprogramación dispone de un grupo
de registros numerados desde 0, 1, 2..., hasta n-1 , denominado memoria local o memoria
de anotaciones.
Un registro puede caracterizarse por un único número, es decir, por cuántos bits
puede guardar. La figura 4-1 muestra un registro de 16 bits con la convención de
numeración de bits usada en este libro. La información que se guarda en un registro
permanece en él hasta que otra la reemplaza. El proceso de leer la información de un
registro no afecta a su contenido. En otras palabras, cuando se lee un registro, lo que se
hace es una copia de su contenido, dejando inalterado el original.
Nº de bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0
Buses
Un bus es un conjunto de alambres que se usan para transmitir señales en paralelo.
Por ejemplo, los buses se utilizan para permitir que el contenido de un registro se copie en
otro. A diferencia de los buses del sistema que se estudiaron en el capítulo 3, éstos sólo
conectan dos dispositivos, de modo que no hay necesidad de líneas de direcciones o líneas
extensivas de control. Por ¡o general son suficientes las n líneas de datos y una o dos de
control. Se emplean buses, pues la transmisión paralela de todos los bits a la vez, es mucho
más rápida que la transmisión serial bit por bit.
Un bus puede ser unidireccional o bidireccional. Un bus unidireccional puede transferir
información en un solo sentido; en cambio uno bidireccional puede transferirla en los dos
sentidos, pero no simultáneamente. Los unidireccionales suelen usarse para conectar dos
registros, uno de los cuales siempre es fuente y el otro siempre destino. Los bidireccionales
suelen usarse cuando hay una colección de registros, cualquiera de los cuales puede ser
fuente o destino.
Muchos dispositivos tienen la posibilidad de conectarse y desconectarse eléctricamente
de los buses a los que están conectados físicamente. Estas conexiones pueden abrirse y
cerrarse en cuestión de nanosegundos. Un bus cuyos dispositivos tengan esta propiedad se
llama bus triestado, porque cada línea puede estar a O, a 1o desconectada. Suele utilizarse
cuando hay muchos dispositivos que pueden suministrar información aun bus.
En la mayoría de las micro arquitecturas algunos registros están conectados a uno o
más buses de entrada ya uno o más de salida. La figura 4-2(a) muestra un esquema de
un registro de 8 bits conectado a un bus de entrada ya otro de salida. El registro consta de
ocho flip-flops del tipo D conectados, cada uno de ellos, al bus de salida por medio de un
72
buffer no inversor. Cada uno contiene 1 bit. El registro tiene dos señales de control CK
(reloj, que realmente quiere decir "carga registro") y DE (permiso de Salida), conectadas
ambas a todos los flip-flops. Normalmente ambas señales se hallan en su estado de reposo,
pero a veces pueden ser activadas, causando alguna acción.
Cuando CK están desactivada, el contenido del registro no es afectado por las señales
del bus. En cambio, cuando se activa, el registro se carga con el contenido del bus de
entrada. Cuando DE está desactivada, el registro está desconectado del bus de salida y
desaparece respecto a los restantes registros conectados. Cuando DE está activo, el
contenido de registro pasa al bus de salida. Si otro registro, R, tuviera su entrada conectada
al bus de salida de nuestro registro, podría transferirse información de éste a R. Para
hacerlo, hay que activar DE y mantenerlo activo tanto tiempo como sea necesario para que
la salida al bus se estabilice. Después se debe activar la línea CK de R, con lo que éste se
carga con lo que hay en el bus. En el nivel de microprogramación son frecuentes estas
operaciones de conexión de un registro a un bus para que otro lo lea, como veremos en
seguida. He aquí un segundo ejemplo de registros y buses: la figura 4-2(b) muestra un
registro de 16 bits con dos buses de salida, cada uno de ellos controlado por una señal DE
diferente.
73
Multiplexores y decodificadores
Los circuitos que tienen una o más líneas de entrada y que calculan uno o varios
valores de salida determinados únicamente por las entradas actuales se llaman circuitos
combinacionales. Dos de los más importantes son los multiplexores y los decodificadores.
Un multiplexor tiene 2" entradas de datos (líneas individuales o buses), una salida de datos
de la misma anchura que la entrada y una entrada de control de n bits que selecciona una
de las entradas y la encamina a la salida. La figura 4-3(a) muestra un multiplexor con dos
buses de entrada. La señal de control de un bit selecciona A o B como salida. La figura 3-12
muestra el circuito de un multiplexor de 8 entradas.
El inverso del multiplexor es el demultiplexor, que encamina su única entrada a una de
sus 2" salidas, según el valor que tengan sus n líneas de control.
Otro circuito combinacional importante es el decodificador, que tiene n líneas de
entrada y 2" de salida, numeradas desde O hasta 2"-1. Si el número que hay en las líneas
de entrada es k, entonces se pone a 1 la salida k, permaneciendo las demás a O. Un
decodificador tiene siempre una y una sola salida al, estando a 0 las restantes. La figura 4-
3(b) ilustra simbólicamente un decodificador de 4 a 16. La figura 3-14 muestra el circuito
de un decodificador de 3 a 8.
El inverso del decodificador es el codificador, que tiene 2n entradas y n salidas. Sólo
puede haber una línea de entrada a 1 y su número, en binario, aparece en la salida.
74
mayoría de las veces es necesaria una unidad específica. Este circuito puede desplazar su
entrada un bit a la izquierda o a la derecha, o también no realizar ningún registro de
corrimiento. La figura 4-4(b) muestra el símbolo que utilizaremos para registros de
corrimiento; la figura 3-17 muestra el circuito de un desplazador algo más sencillo.
Relojes
Los circuitos de las computadoras funcionan normalmente al ritmo de un reloj,
dispositivo que emite una secuencia periódica de impulsos. Estos impulsos definen los ciclos
de máquina. Durante cada ciclo tiene lugar alguna actividad básica, como la ejecución de
una microinstrucción. A menudo es útil dividir los ciclos en sub ciclos, para que las partes de
una microinstrucción puedan realizarse en un orden bien definido. Por ejemplo, las entradas
en la ALU deben estar disponibles y estabilizadas antes de que pueda almacenarse su
salida.
La figura 4-5(a) simboliza un reloj de cuatro salidas. La de arriba es la salida
principal; las otras tres se derivan de ella al someterla a distintos retardos. La salida
principal [línea superior de la figura 4-5(b) tiene un ancho de un cuarto de ciclo. Las otras
tres están retrasadas uno, dos y tres veces el ancho del impulso. El resultado es un circuito
que divide cada ciclo en cuatro sub ciclos idénticos. Para más detalles, véase la figura 3-21.
75
Memoria principal
Los procesadores deben ser capaces de leer y escribir en memoria. La mayoría de las
computadoras tienen un bus (conducto) de direcciones, otro de datos y otro de control para
la comunicación entre la CPU y la memoria. Para leer de la memoria, la CPU pone una
dirección en el bus de direcciones y ajusta adecuadamente las señales de control; por
ejemplo, activando la señal RD (lectura). Luego, la memoria pone el dato pedido en el bus
de datos. En algunas. computadoras la lectura y la escritura en memoria son síncronas; es
decir, la memoria debe responder dentro de un plazo fijo. En otras puede tomarse el tiempo
que quiera, señalizando por medio de una línea de control la presencia de datos cuando
termine.
Las escrituras en memoria se hacen en forma parecida. La CPU pone en el bus de
datos el dato a escribir y en el bus de direcciones la dirección donde se quiere guardar,
activando después WR (escritura). Una alternativa de tener las señales RD y WR sería tener
una señal MREQ, de petición a la memoria y otra RW , que distinga entre la lectura y la
escritura.
U n acceso a memoria es siempre considerablemente más largo que el que se necesita
para ejecutar una sola microinstrucción. En consecuencia, el microprograma debe mantener
los valores correctos en los buses de datos y direcciones durante varias microinstrucciones.
Para simplificar esta tarea, a menudo es conveniente tener dos registros, el MAR (Registro
de Dirección de Memoria) y el MBR (Registro de Intercambio de Memoria), a los que se
conectan los buses de direcciones y de datos, respectivamente. En este libro conviene
disponer los buses como se indica en la figura 4-6. Ambos registros se colocan entre la
CPU y el bus del sistema. El bus de direcciones es unidireccional en ambos lados y se carga
desde el lado de la CPU, activando la línea de control. Las líneas-del bus de direcciones del
sistema siempre están permitidas [o, posiblemente, sólo durante las lecturas y las
escrituras, lo que requiere una línea de permiso de salida conectada al OR lógico de RD y
WR (no mostrada en la figura)]. La línea de control del MBR hace que los datos se carguen
del bus "Entrada de datos", en el lado de la CPU. El bus "Salida de datos" está siempre
permitido.
El bus de datos del sistema es bidireccional, sacando el contenido del MBR cuando WR
está activa y cargándolo cuando se activa RD.
76
Encapsulado de los componentes
En las secciones precedentes hemos descrito varios circuitos que pueden combinarse
para formar una computadora. Se hallan disponibles en el comercio en formas
conceptualmente distintas. La más simple es la combinación en circuitos MSI (Integrados a
Escala Media), con componentes como un registro, una ALU, un registro de corrimiento,
etc., cada uno en una pastilla. Este método se encuentra en la figura 4-7(a). Debido ala
gran variedad de chips rápidos y de bajo precio disponibles en el mercado, muchas
computadoras se construyen conectando este tipo de componentes.
El principal inconveniente de construir computadoras con componentes MSI es el gran
número de componentes necesarios, que ocupan numerosas tarjetas de circuito impreso,
consumen mucha energía y disipan abundante calor . Otra técnica es usar pastillas de
rebanada de 1 bit. Cada pastilla de rodaja de bit tiene, por ejemplo, 1 bit de registros, ALU
y otros componentes. La figura 3-20 muestra el aspecto interno que presenta una rodaja de
ALU de 1 bit. Podríamos fácilmente extender su diseño para añadirle, por ejemplo, 16
registros de 1 bit, un registro de corrimiento de 1 bit y otros componentes de 1 bit de
ancho.
Tomando, por ejemplo, 32 de esas pastillas y poniéndolas una al lado de otra,
obtendríamos una máquina con 32 registros, una ALU, un registro de corrimiento, etc.,
todos de 32 bits.
En esta forma podríamos construir una máquina de 16 bits con solo 16 pastillas. Las
rebanadas de bit dan al diseñador la posibilidad de construir fácilmente una máquina de
cualquier longitud de palabra. También hay pastillas con rebanadas de 2 o 4 bits. La figura
4-7(b) muestra una máquina de 8 bits construida con 4 rebanadas de 2 bits. En general, la
utilización de rebanadas requiere menos pastillas y mucho menos tiempo de diseño que la
de circuito M SI, pero normalmente produce máquinas más lentas.
Una tercera forma de combinar los componentes consiste en poner el procesador
completo en una pastilla [véase la figura 4-7(c)]. A pesar de que reduce de modo
extraordinario el número de pastillas (a una sola), adolece de desventajas. Primero, la
tecnología necesaria para integrar un gran número de componentes en una pastilla es
diferente de la utilizada en los circuitos integrados de tipo MSI o en los de rebanada de 1 bit
y suele producir máquinas más lentas. Además, las técnicas de diseño y fabricación son
extraordinariamente complicadas y costosas. Por el contrario, cualquier competente
ingeniero en electrónica puede diseñar una computadora sencilla con pastillas MSI o de
rebanada de 1 bit sin demasiados problemas. Desde el punto de vista del fabricante, que
espera construir computadoras durante años, quizá merezca la pena dominar las
tecnologías necesarias para hacer procesadores en una pastilla. Sin embargo, seguramente
no le interesará a una empresa que necesite sólo una máquina de propósito específico. Así
pues, las opciones son: utilizar un procesador disponible en el comercio, contratar una
compañía especializada en el diseño y fabricación de una pastilla de propósito específico, o
construir el procesador con componentes M SI o de rodajas de bit.
77
UNA MICROARQUITECTURA TIPICA
Una vez estudiados todos los componentes básicos con los que se construye el nivel
de microprogramación, es el momento de ver cómo se interconectan. Como los principios
generales en esta área son pocos y dispersos, abordaremos el tema por medio de un
ejemplo detallado.
La ruta de datos
La ruta de datos es la parte de la CPU que contiene ala ALU, sus entradas y sus
salidas. La de nuestro ejemplo se muestra en la figura 4-8. Contiene 16 registros idénticos
de 16 bits, rotulados PC, AC, SP, etc. , que forman una memoria de anotaciones accesibles
solamente al nivel de microprogramación. Los registros rotulados O, + 1 y -1 se usarán
para guardar las constantes indicadas. En nuestros ejemplos sencillos el 0 nunca se usa,
pero probablemente se necesitará en una máquina más complicada; de todos modos los
hemos incluido porque disponíamos de más registros que los que podíamos utilizar. Los
restantes tienen nombre que explicaremos más adelante. Cada registro puede sacar su
contenido a uno de los buses A o B o a ambos y tomarlo de un tercero, C, como se muestra
en la figura.
78
Los buses A y B alimentan una ALU de 16 bits que puede realizar cuatro funciones: A
+ B, A AND B, A y NOT A. Las dos líneas de control de la ALU, F0 y F1, especifican la función
que se va a realizar. La ALU genera dos bits de estado derivados de su salida: N, que se
pone al cuando la salida de la ALU es negativa, y Z, que se pone al cuando dicha salida es
cero.
La salida de la ALU pasa por un registro de corrimiento que puede desplazarla un bit a
la izquierda o a la derecha, o bien no realizar ningún desplazamiento. Es posible desplazar
un registro, R, 2 bits a la izquierda, calculando R + R en la ALU y desplazando la suma un
bit más en el registro de corrimiento.
Ni el bus A ni el B están conectados directamente a ALU, sino que hay un par de
registros buffer (tampón) intermedios. Estos se necesitan porque la ALU es un circuito
79
combinacional, es decir, calcula continuamente la salida en función de las entradas y el
código de función. Si no los hubiera, habría problemas cuando se calcule, por ejemplo, A: =
A + B. A medida que A fuera cargándose, el valor del bus A empezaría a cambiar, lo que
haría que la salida de ALU y, por tanto, el bus C cambiaran también. En consecuencia se
guardaría un valor incorrecto en A. En otras palabras, en la asignación A: = A + B, el A del
lado derecho debe ser el valor original que A, no una extraña mezcla de bits del valor
anterior y reciente. Insertando registros buffer en los. buses A y B, podemos congelar los
valores originales de A y B al principio del ciclo, de modo que ALU se aislé de los cambios en
los buses a medida que el nuevo valor se vaya guardando en la memoria de anotaciones. La
carga de estos buffers está controlada por L0 y L1.
Vale la pena señalar que la solución (v .g. , insertar biestables al frente de la ALU) no
es la única. Si en vez de biestables, todos los registros son del tipo flip-flop, entonces es
también posible un desempeño de dos buses, cargando los operandos al inicio del ciclo en
los buses A y B y leyendo el resultado en uno de éstos más adelante en el ciclo. Los
intercambios entre los diseños de dos y tres buses abarcan complejidad, paralelismo y
cantidad de alambrado. Un tratamiento más detallado de estos aspectos está más allá del
alcance de este libro.
Para la comunicación con la memoria, hemos incluido en la micro arquitectura un MAR
y un MBR. El MAR puede cargarse a partir del registro de B, en paralelo con una operación
de la ALU. La línea M0 controla la carga del MAR. En las escrituras se puede cargar el MBR
con la salida del registro de corrimiento, en paralelo con el almacenamiento en la memoria
de anotaciones o en lugar de él M1 controla la carga del MBR a partir de la salida del registro
de corrimiento M2 y M3 controlan las lecturas y escrituras de memoria. En las primeras, los
datos leídos de la memoria pueden presentarse en la entrada izquierda de la ALU a través
del multiplexor A, representado en la figura 4-8 por Amux. La línea de control A0 determina
si el biestable A o el MBR se alimentan en la ALU. La micro arquitectura de la figura 4-8 es
similar ala de muchos de los circuitos comerciales de rebanadas de 1 bit disponibles.
Microinstrucciones
Para controlar la trayectoria de datos de la figura 4-8 se requiere de 61 señales. De
acuerdo a sus funciones, éstas se pueden dividir en nueve grupos que a continuación se
describen.
• 16 para controlar la carga del bus A a partir de registros internos.
• 16 para controlar la carga del bus B a partir de registros internos.
• 16 para controlar la carga de la memoria de anotaciones a partir del bus
C.
• 2 para controlar los registros de A y B. 2 para controlar la función de la
ALU.
• 2 para controlar al registro de corrimiento. 4 para controlar el MAR y el
MBR.
• 2 para indicar una lectura o una escritura en memoria.
• 1 para controlar el Amux.
Con los valores de las 61 señales podemos realizar un ciclo de nuestra ruta de datos.
Un ciclo consiste en vaciar los valores en los buses A y B, almacenarlos temporalmente en
los registros de A y B, en pasarlos a través de la ALU y el registro de corrimientos y en
almacenar el resultado en la memoria interna y en el MBR o en ambos. Además, puede
cargarse el MAR e iniciarse un ciclo de memoria. Como primera aproximación, podríamos
tener un registro de control de 61 bits, cada uno de ellos, para una señal de control. Un bit
a 1 significa que la señal está activada y uno a O que no lo está.
Sin embargo, podemos reducir en mucho el número de bits que necesitan para
controlar la ruta de datos, al precio de un pequeño incremento en la circuitería. Para
empezar, tenemos 16 bits para controlar la entrada al bus A, lo que permite 216
combinaciones de los registros. Desafortunadamente, sólo están permitidas 16: cada uno de
los 16 registros, excluyendo los demás. Por tanto, podemos codificar la información del bus
A en 4 bits y utilizar un decodificador para generar las 16 señales de control. Lo mismo vale
para el bus B.
80
Esta situación es algo diferente en el bus C. En principio, es posible tener
almacenamientos múltiples en la memoria de anotaciones, pero esta práctica es casi
siempre inútil y la mayoría de las máquinas no la permiten. Así pues, también podremos
codificar el control del bus C con 4 bits. Habiendo ahorrado 3 x 12 = 36 bits, necesitamos
ahora sólo 25 bits de control para activar la ruta de datos, L0 y L1 siempre se necesitan en
un momento determinado del ciclo de máquina, por lo que puede activarlos el reloj,
quedando 23 bits de control. Una señal adicional, no estrictamente necesaria pero a
menudo útil, es aquella que permite o inhibe el almacenamiento del bus C en la memoria
interna. En algunas situaciones sólo interesa generar las señales N y Z, pero no se desea
almacenar el resultado. Con este bit adicional que llamaremos ENC (habilita C), podemos
indicar que se almacene el bus C (ENC = 1) o no (ENC = O).
En este momento estamos en condiciones de controlar la ruta de datos con 24 bits.
Notamos ahora que RD puede usarse para cargar el MBR con el bus de datos del sistema y
WR para permitir la salida del MBR al mismo bus. Esta observación reduce a 22 el número
de señales de control independientes.
81
Cronología de las microinstrucciones
Aunque nuestra exposición de la forma en que una microinstrucción puede controlar la
ruta de datos durante un ciclo es casi completa, hemos olvidado un asunto importante: la
cronología. Un ciclo básico de ALU consiste en cargar los registros A y E, darle tiempo ala
ALU para realizar su trabajo y almacenar entonces el resultado. Es evidente que estos
sucesos deben tener lugar en esa secuencia. Si intentáramos almacenar el bus C en la
memoria de anotaciones antes de cargar los registros A y E, se guardaría basura en lugar
de datos útiles. Para obtener la secuencia correcta, introducimos un reloj de cuatro fases, es
decir, con cuatro sub ciclos, como el de la figura 4-5. He aquí los eventos clave durante
cada uno de los sub ciclos:
• Carga la siguiente microinstrucción a ejecutarse en un registro denominado MIR
(Registro de Microinstrucción).
• Salida del contenido de los registros a los buses A y E, y su captura por los
registros A y E.
• Cuando las entradas de la ALU están estabilizadas, hay que dar tiempo ala ALU y
al registro de corrimiento para que produzcan una salida estable y cargar el MAR
si es necesario.
• Ahora que la salida del registro de corrimiento está estabilizada, se almacena el
bus C en la memoria de anotaciones y en el MER si es necesario.
82
La parte más voluminosa e importante de la porción de control de la máquina es la
memoria de control. Es donde se guardan las microinstrucciones. En algunas máquinas es
una memoria de lectura solamente, en otras es de lectura y escritura. En nuestro ejemplo
las microinstrucciones serán de 32 bits y el espacio de direcciones de microinstrucción
constará de 256 palabras, por lo que la memoria de control ocupará un máximo de 256 x 32
= 8192 bits.
Como cualquier otra memoria, la de control necesita un MAR y un MBR. Llamaremos al
MAR el M PC (Contador de Microprograma), porque su única función es señalar la siguiente
instrucción que va a ejecutarse. El MBR será el MIR ya mencionado. Es importante darse
cuenta de que la memoria de control y la principal son completamente diferentes, teniendo
la primera el microprograma y la última el programa en nivel de máquina convencional.
En la figura 4-10 se observa que la memoria de control intenta continuamente copiar
la microinstrucción direccionada por el M PC al MIR. Sin embargo, el MIR solamente se
carga durante el primer sub ciclo, como indica la línea de trazos que lo conecta con el reloj.
Durante los otros tres sub ciclos no se altera, independientemente de lo que le suceda al
MPC.
Durante el segundo sub ciclo, el MIR se encuentra estabilizado y sus campos empiezan
a controlar la ruta de datos. En particular, los campos A y B hacen que los datos salgan a
los buses A y B. Los bloques "Decodificador de A " y "Decodificador de B" del diagrama
proporcionan la decodificación de 4 a 16 de cada campo, necesaria para activar las líneas
SAL1 y SAL2 de los registros [véase figura 4-2(b)]. El reloj activa los registros de A y de B
durante este sub- ciclo, proporcionando entradas estables a la ALU durante el resto del
83
ciclo. Mientras los datos salen a los buses A y B, la unidad de "Incremento" de la sección de
control calcula M PC + 1, en preparación de la carga de la siguiente microinstrucción en
secuencia, durante el ciclo siguiente. La ejecución de instrucciones se puede acelerar
traslapando estas dos operaciones.
En el tercer sub ciclo se les da a la ALU y al desplazador tiempo suficiente para que
produzcan resultados válidos. El campo de microinstrucción AMUX determina la entrada
izquierda a la ALU; la entrada derecha es siempre el tampón de B. Aunque la ALU es un
circuito combinacional, el tiempo que emplea en calcular la suma está determinado por el
tiempo de propagación de los acarreos, no por el retraso normal de las puertas. Mientras la
ALU y el desplazador están calculando, el MAR se carga con el contenido del bus B, si el
campo MAR de la microinstrucción está a 1.
Durante el cuarto y último sub ciclo, el bus C se puede almacenar en la memoria de
anotaciones y en el MBR, según los campos ENC y MBR. La caja rotulada "Decodificador de
C" toma ENC, la cuarta línea de reloj y el campo C de la microinstrucción como entrada y
genera las 16 señales de control. En su interior realiza una decodificación de 4 a 16 del
campo C y entonces hace el y lógico de sus salidas con el resultado de hacer el y lógico del
sub ciclo 4 con ENC. Por tanto, sólo se carga un registro de anotaciones si:
1. ENC= 1.
2. Es el sub ciclo 4.
3. El campo C selecciona el registro.
84
calcule la señal puede construirse con componentes SSI, como en la figura 3-3(b), o ser
parte de una PLA, como en la figura 3-16.
Para que nuestro ejemplo de máquina sea más realista, supondremos que un ciclo de
memoria principal dura más que una microinstrucción. En particular, si esta última
comienza una lectura de memoria poniendo RD al, también debe tener RD = 1 en la
siguiente que ejecute (que puede estar o no en la posición siguiente de la memoria de
control) .El dato no estará disponible hasta que hayan transcurrido dos microinstrucciones
después de iniciar la lectura. Si el microprograma no tuviera nada que hacer, deberá tener
sólo RD = 1, y se desperdiciará para cualquier trabajo útil. Del mismo modo una escritura
en memoria también requerirá dos microinstrucciones para completarse.
Pilas
Una macro arquitectura moderna debería diseñarse teniendo presentes las
necesidades de los lenguajes de alto nivel. Uno de los aspectos más importantes del diseño
es el direccionamiento. Para ilustrar el problema que vamos a resolver, consideremos el
programa Pascal de la figura 4-11(a). El programa principal inicializa dos vectores, x e y,
con valores tales que XK = k e YK = 2k + 1. Luego calcula su producto interno (también
llamado producto escalar). Siempre que necesite multiplicar dos números enteros, llama a
la función mulp. (Supóngase que el compilador es para una microcomputadora y sólo
realizará un subconjunto del Pascal que no incluye el operador de multiplicación.)
85
Los lenguajes con estructura de bloques, como el Pascal, suelen realizarse de modo
que, al salir de un procedimiento o función, se libere la memoria usada por las variables
locales. La forma más sencilla de hacerlo consiste en utilizar una estructura de datos
llamada pila. Una pila consta de bloque de memoria contigua, que contiene ciertos datos, y
de un apuntador a la pila (SP), que dice dónde está la cima de ese bloque. La base de la
pila está en una dirección fija que no interesa en adelante. La figura 4-12(a) ilustra una
pila que ocupa seis palabras de memoria. La base de la pila está en la dirección 4020 y la
cima, donde apunta SP, está en la 4015. Nuestras pilas crecerán desde1as direcciones altas
de memoria a las bajas, pero la otra alternativa también es buena.
Se definen varias operaciones en las pilas. Las dos más importantes son PUSH X y POP
y (desapila Y), PUSH avanza el apuntador de pila (decrementándolo en nuestro ejemplo) y
luego pone X en la posición de memoria a la que ahora apunta SP. PUSH incrementa el
tamaño de la pila en un elemento, POP Y, por el contrario, reduce el tamaño de la pila
86
guardando el último elemento en Y, eliminándolo de ella incrementando la dirección del
apuntador de pila. La figura 4-12(b) muestra el aspecto de la pila de la figura 4-12(a)
después de haber apilado una palabra que contiene un 5.
Otra operación que puede realizarse en una pila es avanzar el apuntador de pila sin
apilar ningún dato. Esto suele hacerse cuando se entra en un procedimiento o función, para
reservar espacio a las variables locales. La figura 4-13(a) muestra la asignación de
memoria durante la ejecución del programa principal de la figura 4-11. Hemos supuesto
arbitrariamente que la memoria consta de 4096 palabras de 16 bits y que las posiciones
desde la 4021 a la 4092 están utilizadas por el sistema operativo y, por tanto, no se pueden
usar para guardar variables, la variable k del programa Pascal se guarda en la dirección
4020 (todas las direcciones en decimal). El vector x requiere 20 palabras, de la 4000 ala
4019. El vector y empieza en la 3980 para y[l] y se extiende ala 3999 para y[20]. Mientras
el programa principal se ejecuta fuera de mulp, SP tiene el valor 3980, con lo cual indica
87
que esta dirección es la última de la pila.
Cuando el programa principal quiere llamar a mulp, primero apila los parámetros de la
llamada, 2yk;y luego ejecuta la instrucción de llamada, que apila la dirección de retorno, de
manera que mulp sepa dónde volver cuando termine. Cuando empieza mulp, SP tiene 3977.
Lo primero que hace es avanzar el apuntador de pila en 2 unidades, para reservar dos
palabras para sus variables locales, p y j. En este punto SP vale 3975, como muestra la
figura 4-13(b). Las cinco palabras de la cima de la pila constituyen la parte de pila
utilizada por mulp y se liberarán cuando termine. Las palabras 3979 y 3978 están rotuladas
como a y b, ya que son los nombres de los parámetros formales de mulp, pero, por
supuesto, contienen 2 y k respectivamente.
88
El juego de macroinstrucciones
Con este modo de direccionamiento en mente, ahora estamos listos para examinar la
arquitectura del Mac-1. Básicamente, consta de una memoria de 4096 palabras de 16 bits y
tres registros visibles al programador de nivel 2. Los registros son el contador del
programa, PC, el apuntador de pila, SP, y el acumulador, AC, que se usa para mover datos,
hacer aritmética y otros propósitos. Hay disponibles tres modos de direccionamiento:
directo, indirecto y local. Las instrucciones que usan direccionamiento directo contienen, en
sus 12 bits menos significativos, una dirección absoluta de memoria. Estas instrucciones son
útiles para accesar a las variables globales, como x en la figura 4-11. El direccionamiento
indirecto permite que el programador calcule una dirección de memoria, la ponga en AC y
lea o escriba la palabra direccionada. Esta forma de direccionamiento es muy general y se
89
utiliza para accesar a elementos de un vector, entre otras cosas. El direccionamiento local
especifica un desplazamiento respecto al SP y se utiliza para accesar a las variables locales,
como ya hemos visto. Estos tres modos combinados proporcionan un sistema de
direccionamiento simple pero adecuado. La figura 4-14 muestra el juego de instrucciones
del Mac-1. Cada instrucción contiene un código ya veces una dirección de memoria o una
constante. La primera columna de la codificación binaria de la instrucción; la segunda da su
nombre nemotécnico en lenguaje ensamblador; la tercera tiene su nombre completo, y la
cuarta describe la que hace mediante un fragmento en Pascal. En esos fragmentos m[x]
significa la palabra de memoria x. Así, LODD carga el acumulador con la palabra de
memoria especificada por sus 12 bits menos significativos. Su direccionamiento es, por
tanto, directo, mientras que el de LODL; que carga el acumulador con la palabra situada a
una distancia x por encima de SP, es local. LODD, STOD, ADDD y SUBD realizan las cuatro
operaciones básicas usando direccionamiento directo: LODL, STOL, ADDL y SUBL las
realizan con direccionamiento local.
90
sp 255)
91
MICROPROGRAMACIÓN: UN EJEMPLO
Habiendo especificado la micro arquitectura y la macro arquitectura en detalle, hemos
de abordar ahora el tema de la implementación de la segunda. ¿Qué aspecto tendrá un
programa que se ejecute en la primera e interprete la segunda? ¿Cómo funcionará? Antes
de contestar estas preguntas, debemos considerar cuidadosamente qué lenguaje elegimos
para microprograma .
Por ejemplo, donde and se refiere al "y booleano" e inv la inversión. Los
desplazamientos pueden representarse por las funciones desizq si son a la izquierda y
desder si son a la derecha, como en
tir : = desizq (tir + tir)
Que pone el tir en los buses A y E, realiza la suma y desplaza ésta a la izquierda 1 bit
antes de almacenarla de nuevo en el tir.
Los saltos incondicionales pueden representarse por sentencias goto y los
condicionales pueden examinar n o z. Por ejemplo:
if n then goto 27
Significa que se ha de pasar el tir por la ALU (código ALU = 2) para que se pueda
examinar su contenido" Nótese que el uso de alu significa que ENC = 0.
Para indicar las lecturas o escrituras en memoria, simplemente pondremos rd o wr en
el programa fuente. El orden de las distintas partes de una sentencia fuente es, en
principio, arbitrario, pero intentaremos colocarlas en el orden en que se ejecutan para
aumentar la legibilidad. La figura 4-15 ofrece algunos ejemplos de sentencias LMAN junto
92
con sus microinstrucciones correspondientes.
A C A
M O A M M E D
U N L S B A R W N D
Sentencia X D U H R R D D C C B A R
mar:=pc; rd 0 0 2 0 0 1 1 0 0 0 0 0 00
rd 0 0 2 0 0 0 1 0 0 0 0 0 00
ir:=mbr 1 0 2 0 0 0 0 0 1 3 0 0 00
pc:=pc + 1 0 0 0 0 0 0 0 0 1 0 6 0 00
mar:=ir; mbr:=ac; wr 0 0 2 0 1 1 0 1 0 0 3 1 00
alu:=tir; if n them gato 15 0 1 2 0 0 0 0 0 0 0 0 4 15
ac:=inv(mbr) 1 0 3 0 0 0 0 0 1 1 0 0 00
tir:= lshift (tir); if n then goto
0 1 2 2 0 0 0 0 1 4 0 4 25
25
alu:=ac; if z them gato 22 0 2 2 0 0 0 0 0 0 0 0 1 22
ac:= band (ir, amask); goto 0 0 3 1 0 0 0 0 0 1 1 8 3 00
sp:=sp + (-1); rd 0 0 0 0 0 0 1 0 1 2 2 7 00
tir:= lshift (ir + ir); if n then
0 1 0 2 0 0 0 0 1 4 3 3 69
goto 69
El ejemplo de microprograma
Hemos llegado finalmente al punto donde podemos engarzar todas las piezas. La
figura 4-16 es un microprograma que funciona en el Mic-1 e interpreta el Mac-1. Es un
programa sorprendentemente pequeño, que ocupa sólo 79 líneas. Ahora la elección de los
nombres de los registros de la figura 4-8 se hace evidente: PC, AC y SP se usan para
guardar los tres registros del Mac-1. IR es el registro de instrucción que contiene la
macroinstrucción en curso de ejecución. TIR es una copia temporal del IR, utilizada para
decodificar el código de operación. Los tres registros siguientes se utilizan para guardar las
constantes indicadas. AMASK es la máscara de direcciones, 007777 (octal), y se usa para
separar el código de operación y los bits de dirección. SMASK es la máscara de la pila
000377 (octal), que se utiliza en las instrucciones INSP y DESP para aislar el
desplazamiento de 8 bits. Los 6 registros restantes no tienen ninguna función asignada y
pueden usarse al arbitrio del microprogramador.
93
Como todos los intérpretes, el microprograma de la figura 4-16 tiene un bucle
principal que extrae, decodifica y ejecuta instrucciones del programa que interpreta, que en
este caso consiste en una serie de instrucciones de nivel 2. Su bucle principal comienza por
la línea O, donde empieza a extraer la macro- instrucción a la que apunta el PC. Mientras
espera que la instrucción llegue, incrementa el PC y sigue manteniendo activa la señal RD.
Cuando llega la instrucción, en la línea 2, la guarda en el IR y simultáneamente examina su
bit más significativo (el 15). Si es 1, la decodificación continúa en la línea 28 y, en caso
contrario, en la 3. Suponiendo, por el momento, que la instrucción es LODD, en la línea 3 se
examina el bit 14 y se carga el TIR con la instrucción original desplazada 2 bits a la
izquierda (un bit con el sumador y el otro con el registro de corrimiento). Nótese que el
estado N de la ALU está determinado por su salida, en la que el bit 14 es el más
significativo, ya que IR + IR desplaza el IR en lugar a la izquierda. La salida del registro de
corrimiento no afecta a los bits de estado de la ALU.
Todas las instrucciones que tengan 00 en sus dos bits más significativos llegarán a la
línea 4, donde se las examinará el bit 13, que mandará alas que empiecen por 000 a la
línea 5 ya las que empiecen por 001 a la línea 11. La línea 5 es un ejemplo de
94
microinstrucción con ENC = 0; solamente examina el TIR, pero no lo cambia. Según sea el
resultado de esta comprobación, se seleccionará el código de LODO o el de STOD.
Si es LOOD, el micro código deberá primero extraer la palabra direccionada
directamente, cargando los 12 bits menos significativos del IR en el MAR. En este caso, los
4 bits más significativos son cero, pero para STOD y otras micro- instrucciones no lo será.
Sin embargo, como el MAR sólo tiene 12 bits de anchura, los bits de código de operación no
afectarán a la lectura. En la línea 7 el microprograma no tiene nada que hacer y, por lo
tanto, sólo espera. Cuando llega la palabra, el microprograma la copia al AC y salta al
comienzo del bucle. STOD, AODD y SUBO son similares. Lo único que cabe mencionar es
cómo se realiza la resta. Usa la siguiente propiedad de la aritmética en complemento a dos:
x -y = x + (- y) = x + ( y + 1) = x + 1 + y
95
rutinas de ejecución.
Está claro que una proporción considerable del tiempo de ejecución de cada
microinstrucción está dedicado a decodificarla bit por bit. Esta observación señala que se
puede cargar el M PC bajo control del microprograma. En muchas computadoras existentes
la micro arquitectura tiene medios físicos para extraer los códigos de operación de las
macroinstrucciones y pasarlos al MPC, donde efectúa una operación de selección múltiple.
Por ejemplo, si pudiéramos desplazar el IR 9 bits a la derecha, borrar los 9 bits más
significativos y poner el número resultante en el MPC, podría seleccionar entre 128
localidades, de las posiciones O a 127. Cada una de esas palabras tendría la primera
microinstrucción de la macroinstrucción correspondiente. Aunque este método desperdicia
memoria de control, acelera en gran medida la máquina y, en la práctica, casi siempre se
usa algo parecido.
No hemos dicho nada de cómo se realiza la E/S. Ni tenemos que hacerlo. Utilizando
E/S por memoria, la CPU no es capaz de diferenciar entre direcciones de memoria
verdaderas y las de los registros de los dispositivos de E/S. El microprograma realiza las
lecturas y escrituras en las cuatro palabras superiores del espacio de direcciones como si lo
hiciera con otras cualesquiera.
Perspectivas
En este punto conviene detenerse un minuto para reflexionar sobre los fundamentos
de la microprogramación. La idea básica es comenzar con una máquina física muy sencilla.
La de nuestro ejemplo consta de poco más que un grupo de 22 registros, una pequeña
memoria ROM de control, un sumador mejorado, un incrementador, un registro de
corrimiento y algunos circuitos combinacionales para multiplexar, decodificar y
secuencializar. Con este material fuimos capaces de construir un intérprete programado que
llevara a cabo las instrucciones de la máquina de nivel 2. Con la ayuda de un compilador,
podemos traducir programas escritos en lenguajes de alto nivel a instrucciones de nivel 2 e
interpretar éstas una a una.
Si queremos ejecutar un programa escrito en un lenguaje de alto nivel, debemos
traducirlo primero al nivel 2 y luego interpretar las instrucciones resultantes. El nivel 2 sirve
de interfaz entre el compilador y el intérprete. Aunque, en principio, el compilador podría
generar directamente microcódigo, esto es complicado y desperdicia gran cantidad de
espacio. Cada una de nuestras macroinstrucciones ocupa una palabra de 16 bits, mientras
que el microcódigo correspondiente, excluyendo la lógica de decodificación de instrucciones,
requiere 4 microinstrucciones de 32 bits en promedio. Si compiláramos directamente a nivel
1, la memoria total necesaria se multiplicaría por ocho. Además, la memoria necesaria sería
memoria de escritura. para control, que es muchísimo más cara debido a su gran velocidad.
No conviene usar la memoria principal para el microcódigo, ya que obtendríamos una
máquina lenta.
A la luz de estos ejemplos concretos, se advertirá claramente por qué las máquinas se
diseñan como una serie de niveles. Se hace por razones de eficiencia y simplicidad, ya que
cada nivel se aplica a un nivel de abstracción distinto. El diseñador del nivel O se ocupa de
cómo ganar unos pocos nanosegundos en la ALU utilizando algún nuevo algoritmo que
reduzca el tiempo de propagación del acarreo. El microprogramador se interesa en como
hacer el máximo número de operaciones elementales con cada microinstrucción,
aprovechando en lo posible el paralelismo inherente al hardware. El diseñador del juego de
macroinstrucciones desea proporcionar al escritor de compilado res y al microprogramador
una interfaz con la que se puedan sentir a gusto y que, al mismo tiempo, sea eficiente. Sin
duda cada nivel tiene objetivos, problemas y técnicas diferentes y, en general, una forma
distinta de ver la máquina. Dividiendo el problema del diseño de la máquina en varios
subproblemas, podemos intentar dominar la complejidad intrínseca del diseño de una
computadora moderna.
96
EL DISEÑO DEL NIVEL DE MICROPROGRAMACIÓN
Como cualquier otra cosa en informática, el diseño de la micro arquitectura está lleno
de limitaciones. En las secciones siguientes veremos algunos de los temas de diseño y los
problemas que han de sopesarse.
97
Binario Nemotécnico Instrucción Significado
0001 ADD Suma r1:=r1 + r2
0001 AND Y booleano r1:=r1 Y r2
0010 MOVE Mueve registro r1:=r2
0011 compl. Complementa r1:=inv(r2)
0100 LSHIFT Desplaza a la izquierda r1:=desizq(r2)
0101 RSHIFT Desplaza a la derecha r1:=desder(r2)
GETMBR Almacena el MBR en r1:=rim
0110
registro
TEST Examina registro if r2 < 0 then n:=true; if r2 = 0
0111
then z:=true
1000 BEGRD Comienza lectura rdm:=r1; lec
1001 BEGWR Comienza escritura rdm:=r1; rim:=r2; esc
1010 CONRD Continua lectura Lec
1011 CONWR Continua escritura Esc
1100 (no usado)
1101 NJUMP Salta si N = 1 if n then goto r
1110 ZJUMP Salta si Z = 1 if z then goto r
1111 UJUMP Salta siempre goto r
r= 16 * r1 + r2
98
La caja AND hace el Y lógico de cada una de las 16 señales decodificadas con la señal
del reloj del sub ciclo 4 y con una señal que proviene de la decodificación de OP y que
equivale a la vieja señal ENC. El resultado es que las 16 señales que cargan datos en la
memoria interna se activan bajo las mismas condiciones que antes.
El bloque NZ es un registro de dos bits al que se le pueden hacer almacenar las
señales N y Z del ALU. Se necesita esta facilidad ya que en el nuevo diseño, el ALU trabaja
en una microinstrucción pero sólo puede verificar los bits de estado en la siguiente. Como la
ALU no tiene donde almacenar N y Z y éstas se obtienen de su salida en cada momento,
siendo N su bit más significativo y Z el O lógico de todos sus bits, ambas señales de estado
se perderían si no se guardan en alguna parte.
El elemento clave de la nueva micro arquitectura es el decodificador de OP. Esta caja
toma el campo de código de operación y produce señales para controlar la caja AND, la
lógica de microsecuenciamiento, NZ, Amux, la ALU, el registro de corrimiento, el MBR, el
MAR, RD y WR. La lógica de microsecuenciamiento, la ALU y el registro de corrimiento
requieren dos señales cada uno, que son idénticas a las del diseño anterior. En total, el
decodificador de OP genera 13 señales distintas basándose en los 4 bits más significativos
de la microinstrucción en curso.
Para cada uno de los 16 posibles códigos de operación de microinstrucción, el
diseñador de la máquina debe determinar cuál de las 13 señales que salen del decodificador
de OP está activa y cuál no. En efecto, se debe generar una matriz binaria de 16 x 13 que
dé el valor de cada línea de control para cada código de operación. La figura 4-19 muestra
esta matriz para el Mic-2. Las columnas están rotuladas con los nombres de las señales. Los
sufijos B y A significan Bajo y Alto, respectivamente, y se aplican sólo a los dispositivos con
dos líneas de control: la ALU, el registro de corrimiento y la lógica de microsecuenciamiento.
Para dar un ejemplo de un código de operación de microinstrucción, consideremos
99
BEGRD, que inicia una lectura en memoria. Usa la función 2 de la ALU (selección de bus A),
con lo que ALUH = 1 y ALUL = O. También carga el MAR y activa RD. Las demás señales de
control quedan inactivas. Ahora consideremos los saltos. Como hemos decidido que sean
compatibles con nuestra vieja lógica de microsecuenciamiento, el par MSLH MSLL debe ser
00 para no salto, 01 para salto si N, 10 para salto si Z y 11 para salto incondicional (la
compatibilidad ha alcanzado tales proporciones epidémicas, que incluso las máquinas
hipotéticas de los libros de texto son compatibles con sus predecesoras), NJUMP genera 01,
ZJUMP genera 10 y UJUMP general 11. Todos los demás códigos de operación generan 00.
Ahora viene la parte interesante. ¿Cómo construiremos un circuito de cuatro entradas
(los bits de código de operación) y trece salidas (las señales de control) que calcule la
función de la figura 4-19. Pues con el uso de una o varias PLA (o ROM). La figura 4-19 es
una forma algo peculiar de representar 13 tablas de verdad, una por columna, de cuatro
variables cada una, donde el número de fila define implícitamente el valor de las cuatro
variables. Entonces la cuestión de cómo construir el circuito se reduce a cómo implementar
una tabla de verdad. La mejor forma de hacerlo consiste en emplear una PLA de cuatro
entradas y 13 salidas. Si no la podemos conseguir, podemos usar tres 74S330, que son PLA
de 12 entradas y 6 salidas. Si denotamos los cuatro bits de código de operación con las
letras A a D, del más significativo al menos significativo, algunas de las salidas son:
ALUL = A B C D + A B C D = A B D
SHH = A B C D
MAR = A B C D + A B C D = A B C
MSLH = A B C D + A B C D = A B C
100
Habiendo rediseñado el hardware, necesitamos reescribir el microprograma. Lo
muestra la figura 4-20. Se han dejado las mismas etiquetas para que sea más fácil
comparar los dos microprogramas. También se ha conservado la sintaxis. Podíamos haberlo
escrito usando un lenguaje ensamblador típico (por ejemplo, con los códigos de operación
de la figura 4-17), pero hemos usado de nuevo LMAN porque es mucho más fácil de leer.
Nótese que las sentencias LMAN de la forma alu = reg usan la micr9instrucción TEST para
ajustar los bits N y Z. Asegúrese el lector de que entiende la diferencia entre el
microprograma en binario, tal como se carga en la memoria de control, y la versión en
lenguaje ensamblador que se da en el texto.
101
102
Aunque más largo, este microprograma es más simple que el anterior puesto que cada
línea sólo realiza una operación. En consecuencia, muchas líneas del original han tenido que
dividirse en dos, tres, e incluso cuatro líneas en éste. Otra causa que aumenta el número de
microinstrucciones es la ausencia de microinstrucciones de tres direcciones. Véase, por
ejemplo, las líneas 22 y 27 del primer microprograma.
El microprograma original usa 79 palabras de 32 bits, que dan un total de 2528 bits de
memoria de control. El segundo usa 160 palabras de 12 bits, que hacen un total de 1920
bits. La diferencia representa un ahorro de 240¡0 de memoria de control. En una
computadora integrada en una pastilla, también representa un ahorro de 24% en el espacio
de la pastilla (chip) ocupado por la memoria de control, lo que lo hace más barato y fácil de
fabricar. El precio que hay que pagar por la memoria de control más pequeña es que han de
ejecutarse más microinstrucciones por macroinstrucción. Normalmente, esto hace más
lenta la máquina. En consecuencia, las máquinas veloces y caras tienden a ser horizontales
y las más lentas y baratas, verticales. La existencia de microinstrucciones muy codificadas,
como las del Mic-2, plantea serios problemas conceptuales acerca de lo que es la
microprogramación. El juego de microinstrucciones de la figura 4-17 podría pasar casi por
el juego de instrucciones del lenguaje de máquina convencional de una micro-o
103
minicomputadora muy simple. La PDP-8, por ejemplo, es una minicomputadora con
palabras de 12 bits cuyas instrucciones no son mucho más potentes que éstas.
Considerando que el "significado" de las instrucciones está determinado por el hardware (la
PLA o circuito del decodificador de OP), se podría decir que el Mic-2 es realmente una
máquina no microprogramada en la que se ejecuta un intérprete para otra máquina. Si el
microprograma de la máquina vertical se guardara en la memoria principal (como sucede en
la IBM 370/145, por ejemplo), la distinción entre una máquina microprogramada muy
vertical y una cableada (no microprogramada) perdería aún más nitidez. Véase a Dasgupta
(1979) si se desea profundizar en los aspectos de codificación y paralelismo en el
microcódigo.
Nanoprogramación
Los diseños vistos hasta ahora tenían dos memorias: la central (utilizada para guardar
el programa de nivel 2) y la de control (utilizada para guardar el microprograma) .Con una
tercera memoria, la nanomemoria, se pueden realizar interesantes compromisos entre la
organización horizontal y la vertical. La nanoprogramación es apropiada cuando se repiten
varias veces muchas microinstrucciones. El microprograma de la figura 4-16 no tiene esa
propiedad. La microinstrucción más frecuente es la que sólo tiene lec y únicamente aparece
cinco veces.
La figura 4-21 ilustra el concepto de nanoprogramación. La parte (a) muestra un
microprograma de n microinstrucciones de w bits cada una. Se necesitan nw bits de
memoria de control en total para guardarlo. Supongamos que un estudio detallado del
microprograma muestra que sólo se usan m microinstrucciones diferentes de las 2W
posibles, siendo m<<n. Se podría utilizar una nanomemoria especial de m palabras de w
bits para guardar cada microinstrucción única. En el microprograma original se podría
reemplazar cada instrucción por su dirección en la nanomemoria. Como la nanomemoria
sólo contiene m palabras, la memoria de control necesaria tiene solamente log2 m
(redondeado al entero mayor) bits de anchura, como se muestra en la figura 4-21(b).
El precio que debe pagarse por el ahorro de memoria es una ejecución más lenta. La
104
máquina con la memoria de control de dos niveles funcionará con menor rapidez que la
original, debido a que el ciclo de extracción requiere ahora dos referencias a memoria, una
a la memoria de control y otra a la nanomemoria. Estas dos extracciones no pueden
traslaparse.
La nanoprogramación es verdaderamente eficaz cuando se usan mucho las mismas
microinstrucciones. Si se pudieran contar como iguales dos microinstrucciones casi iguales,
el microprograma contendría menos microinstrucciones distintas, pero más frecuentemente
usadas. Se puede variar la idea básica para permitir esto con sólo utilizar como parámetro
las palabras de la nanomemoria. Por ejemplo, dos microinstrucciones pueden diferir
solamente en un campo que diga qué registro ha de sacarse a cierto bus. Poniendo el
número del registro en la memoria de control, en lugar de ponerlo en la nanomemoria (es
decir, omitiendo el campo del registro de las nanoinstrucciones), las dos microinstrucciones
podrían apuntar a la misma nanopalabra. Cuando ésta se extraiga y se ponga en el registro
de microinstrucción, el campo de registro se tomará de la micromemoria y no de la
nanomemoria.
Naturalmente, con este mecanismo aumenta la anchura de la memoria de control, que
puede o no compensar la ganancia obtenida con una nanomemoria más pequeña.
105
flexibilidad de los microsaltos condicionales. Como ejemplo. considérese una
macroinstrucción OMITE SI MENOR. que compare el registro AC con una palabra de
memoria y salte a la siguiente macroinstrucción si AC es menor . Para realizar la
instrucción. se requiere restar la palabra de memoria de AC (o de una copia de éste). la que
puede dar como resultado un desbordamiento. como se ilustra en la figura 4-22.
Debido al desbordamiento potencial, no es posible decir. con sólo ver el bit de signo
del resultado. cual de los operandos era menor. En el cuarto ejemplo de la figura 4-22, AC
es menor que la palabra de memoria pero el resultado de la resta es positiva. La condición
correcta a probar es N O-EXCLUSIVO V. en donde V indica la presencia o ausencia de
desbordamiento. (El hardware asigna a V el valor de 1 siempre que el acarreo al bit de
signo difiera del acarreo del bit de signo.)
Fig. 4-22. algunos ejemplos de restas de números de 16 bits en complemento a 2 (octal). También se muestran
los bits N y D de cada resultado.
Dirección
Campo hacia
NZDA
DIR donde
salta
10000000 1001 10001001
10001000 1001 10001001
10001011 1001 10001011
10001011 1000 10001011
10001011 0000 10001011
10001111 0000 10001111
10001111 1100 10001111
10000000 1100 10001100
Con esta ayuda la instrucción OMITE SI MENOR sería mucho más fácil de interpretar.
Elegiríamos un campo ADDR que terminara en 0101, como 10000101 (binario), y
realizaríamos el salto. Las microinstrucciones situadas en 10001101 y 10000111 traerán el
caso AC < memoria y las situadas en 10000101 y 10001111 tratarán el caso contrario. No
se necesita ninguna decodificación adicional. También podríamos haber usado una dirección
de base terminada en 0000, en lugar de la que termina en 0101, pero estas direcciones
106
son muy valiosas, ya que son las únicas disponibles para saltos con 16 posibilidades. Por
tanto, no debe elegirse a la ligera.
Es claro que con este tipo de control del secuenciamiento de las microinstrucciones, la
tarea de situar las microinstrucciones en la memoria de control puede causar verdaderos
dolores de cabeza. La primera instrucción ejecutada después de un salto de 16 alternativas
debe tener un salto incondicional, ya que la palabra siguiente (excepto si es la última) se
utiliza como uno de los posibles destinos del salto. ¿A dónde debería saltar cada una de
estas microinstrucciones? Ciertamente no a una dirección de la forma xxxx0000, ya que son
demasiado valiosas, pero también podrían necesitarse tarde o temprano las demás, excepto
las de la forma xxxx1111. La decisión debe tomarse con cuidado, evitando agotar algún tipo
de dirección. Por ejemplo, una vez que se han agotado las direcciones pares, ya no es
posible verificar el bit de acarreo C, así que la selección de direcciones debe hacerse con
mucho cuidado.
Una forma más para acelerar la máquina consiste en conformar el hardware con varias
unidades funcionales y después unirlas para que trabajen en línea o en forma escalonada
(pipeline).* En la figura 2-5 se observó cómo funciona una computadora con cinco unidades
escalonadas. En la figura 4-24 se muestra que si la instrucción 1 se extrae en el ciclo 1, se
ejecutará en el ciclo 5. En forma parecida, si la instrucción 4 se extrae en el ciclo 8, se
decodifica en el 9, etc., se ejecutará en el ciclo 12. Bajo condiciones óptimas, en cada ciclo
de ahí en adelante se ejecuta una instrucción, dando un promedio de ejecución de una
instrucción por ciclo, en lugar de una cada cinco ciclos.
Ciclo
1 2 3 4 5 6 7 8 9 10 11
Extracción de 1 2 B 4 5 6 7 8 9
instrucciones
Decodificación de 1 2 B 4 5 6 7 8
instrucciones
Cálculo de direcciones 1 2 B 4 5 6 7
Extracción de operando 1 2 B 4 5 6
Ejecución 1 2 B 4 5
Desafortunadamente, hay estudios que han demostrado que alrededor del 30% de las
instrucciones son saltos y éstos hacen estragos en la línea de procesamiento. Los saltos
pueden clasificarse en tres categorías: incondicionales, condicionales e iterativos. Un salto
incondicional indica a la computadora que detenga la extracción de instrucciones en forma
consecutiva y se dirija a una dirección específica. Un salto condicional verifica una condición
y salta si ésta se cumple. Un ejemplo típico es una instrucción que checa un registro y salta
si éste contiene un valor de cero. En caso contrario, no se lleva a cabo el salto y el control
continúa en la secuencia actual.
Por lo general las instrucciones iterativas decrementan un contador de iteraciones y
saltan al inicio si el contador no es cero (v .g. todavía hay iteraciones por hacer). Estas
instrucciones son un caso especial importante de los saltos condicionales, ya que se sabe de
antemano, que casi siempre habrá ese salto.
Considérese lo que sucede en la línea de procesamiento (pipeline) de la figura 4-24
cuando se encuentra una instrucción (señalada como B) de salto condicional. La siguiente
instrucción a ejecutar debería ser la siguiente a la del salto, pero también podría ser la
dirección a la cual saltó, llamada blanco del salto. En virtud de que el extractor de
instrucciones no sabe cual sigue sino hasta que se ejecuta el salto, se demora y no puede
continuar hasta la ejecución de éste. En consecuencia la línea se vacía. Sólo después de que
termina el ciclo 7, se sabe qué instrucción sigue.
107
A la pérdida de cuatro ciclos causada de hecho por el salto se le denomina
penalización por salto. Resulta evidente que con un salto en una de cada tres instrucciones,
la disminución en el desempeño es sustancial.
Se han realizado una gran cantidad de investigaciones alrededor del problema de
recuperar algo de este desempeño (DeRosa y Levy, 1987; McFarljng y Hennessy, 1986;Hwu
y col. 1989 y, Lilja, 1988). Lo más sencillo consisté en esperar que el salto no se realice y
continuar procesando como si el salto fuera una simple instrucción aritmética. Si resulta que
en efecto, el salto no se realiza, no se ha "perdido nada. Si por el contrario el salto se
efectúa, se deben eliminar las instrucciones que estén actualmente en la línea y empezar de
nuevo.
Esta opción presenta sus propios problemas. En algunas máquinas, se puede
modificar un registro como el resultado intermedio de un cálculo de direcciones. Si una
instrucción eliminada modificó a uno o más registros, estos deben ser restaurados, lo que
significa que debe haber un mecanismo para grabar los valores originales. Resulta
instructivo hacer un modelo de la pérdida en el desempeño.
Sea Pj la probabilidad de que una instrucción sea un salto.
Sea P, la probabilidad de que el salto se realice.
Sea b la penalización por salto.
108
Los compiladores pueden ser de gran ayuda, por ejemplo, cuando el programador
escribe una iteración variando i desde 1 hasta 10, el compilador puede verificar i para ver si
es igual a lo, en vez de ver si es menor de II, de manera que el microprograma puede librar
la cuestión con una comparación en lugar de una resta. Para ocuparse de aquellos saltos
que no se pueden resolver en las primeras etapas, el compilador puede tratar de encontrar
algo útil para que la computadora trabaje, mientras espera que se ejecute el salto.
Considérese la declaración aritmética seguida de una comparación, de la figura 4-25(a).
Un compilador con una optimización hábil pudiera producir un código más parecido al de la
figura 4-25(b), el cual no está en lenguaje Pascal legal, pero muestra el orden de eventos.
Primero genera el código para hacer la comparación, luego hace la operación aritmética.
Después de que el salto ha ingresado en la línea de procesamiento, le siguen varias
instrucciones ordinarias, las cuales sin lugar a duda deben ejecutarse, así que no hay
necesidad de hacer ninguna predicción ni eliminación. Para usar esta técnica con
efectividad, los microprogramadores y los diseñadores de compilado res tuvieron que
trabajar en estrecha coordinación durante el diseño.
a := b + c; if b < c
if b < c a := b + c;
then then
declaración declaración
(a) (b)
109
será una no-operación con un salto condicional. Es decir, no hará nada excepto examinar
los bits de estado de la ALU, que se habían memorizado, y saltar. El precio a pagar por
programar en forma razonable es doblar la duración del salto, lo que no es muy deseable.
La única solución es conseguirse un frasco lleno de aspirinas y tratar de sacar el
máximo provecho de cada situación. Por ejemplo, el microprogramador podría hacer una
hipótesis de dónde suele saltar la microinstrucción y empezar a hacer el trabajo que
probablemente se necesite. Por desgracia, si el salto fuera a otra alternativa, sería necesario
eliminar parte de lo hecho.
He aquí un ejemplo sencillo: rescribimos las líneas 11 a 18 de la figura 4-16 para una
máquina con extracción y ejecución traslapadas de microinstrucciones. Los resultados se
muestran en la figura 4-26(a). En este ejemplo tenemos suerte, ya que después de
ejecutar la línea 11 sabemos que seguirá el código de ADDD o de SUBD, que empiezan por
la misma microinstrucción. Por tanto, basta poner la microinstrucción común en la línea 12
para ocupar la máquina mientras se realiza el salto.
Un ejemplo menos elegante es el de la figura 4-26(b). En la línea 52 sabemos que
vamos a entrar en la micro rutina de PSHI o en la de POPI, pero, lamentablemente no
empiezan por la misma microinstrucción. Supongamos, sin embargo, que un análisis
estadístico mostró que los programas del Mac-l usan PSHI muchas más veces que POPI.
Entonces podríamos proceder como se indica en la figura 4-24(b). Para PSHI todo va bien,
pero para POPI, cuando se llega a la línea 56, se ha iniciado una lectura en memoria de una
palabra incorrecta. Según los detalles específicos del hardware, puede ser posible o no "c"
abortar una lectura de memoria a medio realizar sin perturbar el funcionamiento. Si no
podemos abortarla, simplemente la terminamos y luego iniciamos la lectura correcta. En
este ejemplo POPI requiere 15 microinstrucciones en lugar de las 13 de la figura 4-16. Sin
embargo, si el uso del traslape reduce el tiempo básico de microinstrucción en 15%, incluso
POPI será más rápida que antes.
Fig. 4-26. (a) Un fragmento en lenguaje Pascal. (b) Como pudiera ser el
tratamiento por parte del compilador
110
Memoria caché
Por tradición, las CPU han sido siempre más rápidas que las memorias y aunque se
han desarrollado las segundas, los CPU también lo han hecho, manteniendo así el
desequilibrio. Lo que esto significa en la práctica es que después de que la CPU envía una
solicitud a la memoria, debe permanecer ociosa durante un tiempo sustancial, aguardando a
que la memoria responda. Como se ha visto, es común que la CPU establezca una lectura
de memoria durante un ciclo del bus y no obtenga los datos hasta dos o tres ciclos más
tarde, aun cuando no haya estados de espera.
En realidad, el problema no es de tecnología sino económico. Los ingenieros saben
como construir memorias tan rápidas como las CPU, pero son tan caras que equipar a una
computadora con un megabyte o más es impensable (excepto quizá para las
supercomputadoras, en las que prácticamente no hay límite y el precio no representa
objeción). De ahí que la elección se reduce a tener una pequeña cantidad de memoria o una
gran cantidad de memoria lenta. Lo preferible seria una gran cantidad de memoria a un
bajo precio.
De sumo interés son las técnicas conocidas para combinar estos tipos de memoria a
fin de obtener, a bajo precio, la velocidad de la memoria rápida y la capacidad de la
memoria lenta. A la memoria pequeña y rápida se le llama caché (del francés cacher que
significa esconder) y está bajo el control del microprograma. En seguida, se describirá cómo
se utilizan y funcionan estas memorias. Se puede encontrar más información en (Agarwall
op. cit., 1989; Farrens y Pleszkun, 1989; Kabakibo op. cit., 198.7;Kessler op. cLt..it'1989;
Pohm y Agarwall, 1983; Przybylski op. cit., 1989; Smith, 1982; y Wang op. cit., 1989).
Desde hace años es sabido que los programadores no accesan las memorias en forma
completamente aleatoria. Si una referencia a memoria dada, es ala dirección A. es común
que la siguiente referencia se realice en los alrededores de
A. Un ejemplo sencillo es un programa en sí, con excepción de los saltos y las
llamadas a procedimientos, las instrucciones se extraen de localidades de memoria
consecutivas. Es más, la mayoría del tiempo de ejecución del programa se emplea en
iteraciones, en las que un número limitado de instrucciones se ejecutan de manera repetida.
En forma parecida, es común que en un programa manejador de matrices se efectúen
muchas referencias a la misma matriz, antes de cambiar a otra actividad.
Se le llama principio de localidad a la observación de que las referencias a memoria
realizadas en un intervalo de tiempo corto, tienden a usar sólo una fracción de la memoria
total, y representa la base para todos los sistemas de memoria caché. La idea general es
que cuando un palabra es referenciada, se le trae de la memoria grande y lenta hacia la
caché, de modo que la siguiente vez que se utilice, se pueda accesar muy rápido. En la
figura 4-27 se ilustra una distribución común de la CPU, la memoria principal y la caché. Si
una palabra se lee o escribe k veces en un intervalo corto, la computadora necesitará de 1
referencia a la memoria lenta y k -1 referencias a la memoria rápida. Entre más grande es
k, mejor es el desempeño general.
111
al tiempo de acceso a la memoria principal y h a la proporción de aciertos, que es la
fracción de todas las referencias que pueden ser satisfechas fuera de la caché. En el
pequeño ejemplo del párrafo previo, h = (k -1)/ k, algunos autores definen también la
proporción de fallas como 1- h.
Con estas definiciones podemos calcular el tiempo medio de acceso de la siguiente
manera:
tiempo medio de acceso = c + (1- h)m
Al inicializar la computadora, todos los bits de Validez toman el valor O, para indicar
que ninguna entrada a la caché es válida. Suponga que la primera instrucción hace
referencia a la palabra de 32 bits que se encuentra en la dirección 0. El microprograma
checa todos los renglones de la caché buscando uno que sea válido y contenga el bloque
número 0. Al no encontrarlo, enviará una solicitud al bus para extraer de la memoria la
palabra 0. Si esta palabra se necesita de nuevo, la próxima vez será tomada de la caché,
eliminando la necesidad de una operación del bus.
Al correr el tiempo, más y más renglones de la caché se marcarán como válidos. Si el
programa completo y sus datos utilizan de 1024 palabras, todo el programa y sus datos
aparecerán en la caché y correrá a mayor velocidad, sin hacer ninguna referencia a la
112
memoria a través del bus. Si se necesita más de 1024 palabras, en algún momento la caché
estará llena y un renglón previo deberá descartarse para dar lugar a uno nuevo. En la
práctica, la decisión de cuál eliminar debe hacerse muy rápido (en nanosegundos). La VAX y
muchas otras máquinas seleccionan un renglón en forma aleatoria. En el capítulo 6 se
abordan otros algoritmos posibles bajo el título de memoria virtual, en donde ocurre el
mismo problema.
El aspecto que distingue a la memoria caché asociativa de los otros tipos, consiste en
que cada renglón contiene el número de bloque y su entrada. Cuando se presenta una
dirección de memoria, el microprograma debe calcular el número del bloque relevante
(fácil) y luego buscar ese número de bloque en la caché (difícil). A fin de evitar una
búsqueda lineal, la caché asociativa dispone de un hardware especial que puede comparar
cada entrada con el número de bloque dado en forma simultánea, en lugar de hacerlo en un
lazo de microprograma. Este tipo de hardware hace que dicha memoria sea cara.
Para reducir el costo, se inventó la memoria caché de mapeo directo. Este tipo evita la
búsqueda poniendo cada bloque en un renglón cuyo número se puede calcular fácilmente a
partir del número del bloque. Por ejemplo, el número de renglón puede ser el número de
bloque módulo el número de renglones. Con bloques de 4 bytes (una palabra) y 1024
renglones, el número de renglón que corresponde a la dirección A es igual a (A/4) módulo
1024. En el ejemplo de la figura 4-29 se puede observar que las palabras en las
direcciones 0,4096, 8192, etc., caen en el renglón 0; las palabras en las direcciones 4,4100,
8196, etc., se mapean al renglón 1 y así sucesivamente.
Mientras que las memorias caché de mapeo directo eliminan el problema de buscar,
crean por otro lado un nuevo problema; cómo indicar cuál de las muchas palabras que
corresponden al renglón lo está ocupando. En "efecto, se han creado 1024 clases de
equivalencia basada en los números de bloque módulo el tamaño de la caché. En el
ejemplo, el renglón 0 puede contener cualquiera de las palabras 0, 4096, 8192, etc. , la
forma de señalar cuál está en un momento dado en dicho renglón es poner parte de la
dirección en el campo etiqueta de la caché.
Este campo contiene aquella parte de la dirección que no puede calcularse a partir del
número de renglón.
Para hacer este punto más claro, considérese una instrucción en la dirección 8192 que
mueve la palabra ubicada en la dirección 4100 a la 12296. El número de bloque
correspondiente a la dirección 8192 se calcula dividiéndola entre 4 (tamaño del bloque del
ejemplo), para obtener 2084. En seguida, el número de renglón se calcula como 2048
módulo 1024, lo que es lo mismo que usar 10 bits de orden inferior de 2048. El número de
renglón es 0. Los 12 bits de orden superior contienen un 2, de modo que esa es la etiqueta.
La figura 4-29(a) muestra a la caché después de haber procesado las tres direcciones.
En la figura 4-29(b) se puede ver la dirección en forma separada. Los dos bits de
orden inferior son siempre 0 (ya que la caché trabaja con bloques enteros y éstos son
múltiplos del tamaño del bloque, 4 bytes en el ejemplo). En seguida está el número del
renglón (10 bits) y por último la etiqueta (12 bits). Es muy fácil construir hardware que
extraiga directamente el número de renglón y la etiqueta, de cualquier dirección de
memoria.
113
El hecho de que muchos bloques se mapeen en un mismo renglón puede causar
problemas. Supóngase que la instrucción moviera la dirección 4100 a la 12292 en lugar de
ala 12296; ambas direcciones se mapearían al renglón 1. Dependiendo de los detalles del
microprograma, la dirección que se calculara después permanecería en la caché, mientras
que la otra sería purgada. Esto no es un desastre en sí pero sí se degrada el desempeño de
la caché si muchas palabras de las utilizadas resulta que están en el mismo renglón. La
meta, después de todo, es mejorar el rendimiento.
La salida de esta dificultad consiste en expandir la caché de mapeo directo con más de
un registro por renglón. La PDP-11/70, por ejemplo, tenía dos registros por renglón. A la
memoria caché con varios registros por renglón se le denomina memoria caché asociativa
agrupada y se ilustra en la figura 4-30.
Tanto la caché asociativa como la de mapeo directo son de hecho, casos especiales de
la asociativa agrupada. Si se reduce el número de renglones a 1, todos los registros de la
caché estarán en el mismo renglón y habrá que distinguirlos sólo por sus etiquetas ya que
todos caen en la misma dirección. Este caso es sólo una caché asociativa. Si n = 1 se
regresa a una memoria caché de mapeo directo con un registro por renglón.
Las memorias caché asociativas y de mapeo directo tienen diferentes puntos fuertes y
débiles, la de mapeo directo es más sencilla, fácil de construir y tiene un tiempo de acceso
más rápido, ya que puede encontrar el renglón adecuado indexando en la caché con una
porción de la dirección como índice. Por otra parte, la caché asociativa tiene una mayor
proporción de aciertos para un número dado de renglones, pues nunca se presentan
conflictos. No se puede dar el caso de que k palabras importantes no puedan ubicarse
simultáneamente en la caché porque tuvieron la mala suerte de caer en el mismo renglón.
114
Cuando se diseña cualquier computadora real, se realiza siempre una intensa simulación de
la caché para observar el desempeño que se está adquiriendo ya que precio.
Además de determinar el número de renglones, los diseñadores deben también
seleccionar el tamaño del bloque. En los ejemplos, se ha utilizado (por simplicidad) una
palabra de 32 bits, pero también es posible y se usan con frecuencia 2, 4, 8, o más
palabras. Una ventaja de usar un tamaño grande de bloques es que hay menor gasto
general para extraer un bloque de ocho palabras que para ocho bloques de una palabra, en
especial si el bus permite transferencias en bloque. La desventaja es que puede no
necesitarse todas las palabras, así que algunas extracciones pueden desperdiciarse.
Otra parte importante en el diseño de la caché es cómo manejar las escrituras. Por lo
general se utilizan dos estrategias. En la primera denominada con escritura a memoria,
cuando una palabra se escribe en la caché de inmediato se escribe en la memoria. Este
enfoque asegura que los registros en la caché son siempre los mismos que los
correspondientes a la memoria.
La otra política de escritura llamada retrocopiado, no actualiza la memoria siempre
que cambia la caché, sino que sólo lo hace cuando un registro es eliminado de la caché para
dar lugar a que uno nuevo ocupe ese renglón. Cuando se utiliza el retrocopiado, es
necesario un bit en cada registro de la memoria caché que indique si éste ha cambiado
desde que se cargó en ésta. Al igual que en todos los demás aspectos de diseño de la
caché, existen aquí ciertas consideraciones. Es obvio que con escritura a memoria cause
más tráfico del bus que el retrocopiado. Por otra parte, si una CPU inicia una transferencia
de entrada / salida de memoria a disco y la memoria está incorrecta (porque palabras que
se modificaron recientemente aún no han sido copiadas a memoria desde la caché), se
escribirán datos incorrectos en el disco. Este problema se puede evitar, pero agrega
complejidad al sistema.
Si el porcentaje de lecturas es más alto que el de escrituras, puede resultar más
simple usar la caché con escritura a memoria y aceptar el tráfico del bus. Sin embargo, si
existen muchas escrituras, pudiera ser mejor utilizar el retrocopiado y hacer que el
microprograma explícitamente limpie la caché por completo antes de iniciar una operación
de E/S.
Otro aspecto de diseño relacionado con las escrituras, es qué hacer si una escritura
provoca una pérdida en la caché. Una estrategia consiste en extraer la palabra en la caché y
luego actualizarla, si se está usando caché con escritura a memoria. Una estrategia
diferente es escribir directamente a memoria, pero no extraer la palabra a la caché excepto
en lecturas. A este aspecto se le conoce con el nombre de política de asignación de
escrituras. Ambos métodos descritos se encuentran en uso.
Al mejorar la tecnología de los circuitos integrados, ha sido posible poner caches muy
rápidas, directamente en la pastilla de la CPU. Debido a la falta de área en la pastilla, estas
memorias son pequeñas, así que sería deseable tener dos niveles de caché, una en la
pastilla de la CPU y otra en la tarjeta. Si no se puede encontrar una palabra en la caché
integrada en la pastilla, se hace una solicitud ala caché en el nivel de tarjeta. Si falla, se
utiliza la memoria principal.
Considerando todo lo anterior, el uso de la memoria caché es una técnica importante
para incrementar el rendimiento de un sistema. Casi todas las computadoras de mediana y
gran escala utilizan alguna forma de esta técnica. Se puede encontrar información adicional
sobre el tema en (Hill, 1988; Przybylski op. cit., 1988; Short y Levy, 1988; y Smith, 1986,
1987).
115
CONCLUSIÓN
116
BOLILLA II (Parte 3): EL NIVEL
DE MAQUINA
CONVENCIONAL
117
INDICE
118
INTRODUCCIÓN
119
APUNTES DE CATEDRA
120
FORMATOS DE INSTRUCCIÓN
Código de operación
(a)
Código de operación Direccionamiento
(b)
Código de operación Direccionamiento 1 Direccionamiento 2
(c)
Fig. 5-17. Tres formatos típicos de instrucción: a) Instrucción sin
dirección. b) Instrucción con una dirección. c) Instrucción con dos
direcciones.
Palabra 1 Palabra 1
Direccionamiento Direccionamiento
0 Instrucción 0 Instrucción Instrucción Instrucción Instrucción
1 Instrucción 1 Instrucción Instrucción Instrucción Instrucción
2 Instrucción 2 Instrucción Instrucción Instrucción Instrucción
3 Instrucción 3 Instrucción Instrucción Instrucción Instrucción
(a) (b)
Direccionamiento Direccionamiento
0 Instrucción 0 Instrucción Instrucción Instrucción Instrucción
1 1 Instrucción Instrucción
Instrucción
2 2 Instrucción Instrucción Instrucción
3 Instrucción 3 Instrucción Instrucción Instrucción
4 4 Instrucción Instrucción Instrucción
5 Instrucción 5 Instrucción Instrucción
6 6 Instrucción
7 Instrucción 7 Instrucción Instrucción
(c) (d)
Fig. 5-18. Algunas relaciones posibles entre la longitud de la instrucción y la de la
palabra
121
Criterios de diseño de formatos de instrucción
122
la que admite la organización de 8 bits.
Este ejemplo demuestra que, para tener una mayor resolución de memoria, se debe
pagar el precio de direcciones más largas, lo que, en general, significa instrucciones más
largas. Lo decisivo será una organización de memoria en que cada bit sea direccionable
directamente (por ejemplo, en la Burroughs B1700), y en el otro extremo será una memoria
compuesta de palabras muy largas (por ejemplo, la serie Cyber de CDC tiene palabras de
60 bits).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
123
El código de operación 15 indica que el código de operación está contenido en los bits
8 a 15 en lugar de estar en los bits 12 a 15. Los bits 0 a 3 y 4 a 7 forman dos direcciones,
como es usual. Las 14 instrucciones de dos direcciones tienen todas 1111 en los cuatro bits
de la izquierda y números desde 0000 a 1101 en los bits 8 a 11. Las instrucciones con 1111
en los cuatro bits de la izquierda y 1110 o 1111 en los bits 8 a 11 serán tratados
especialmente, como si sus códigos de operación estuviesen en los bits 4 a 15. El resultado
permite 32 nuevos códigos de operación. Puesto que solamente se necesitan 31.
111111111111 se interpretan como si el código de operación real estuviera en los bits 0 a
15, con lo que se obtienen 16 instrucciones sin dirección.
Nótese que, según se avanza en esta explicación, el código de operación se va
haciendo más y más largo; esto es, las instrucciones de tres direcciones tienen un código de
operación de 4 bits, las dedos direcciones tienen uno de 8 bits, las de una dirección lo
tienen de 12 bits y la de ninguna dirección lo tienen de 16 direcciones.
En la práctica, los códigos de operación extendidos no se comportan de manera tan
limpia y regular como en el ejemplo, en el que se asumió que todos los operandos requieren
124
de 4 bits. De hecho, se requiere con frecuencia una diversidad de longitudes y formatos.
La PDP-11
Direccionamiento
Las instrucciones de suma con dos direcciones usan una de las direcciones como
fuente y la otra como destino. La fuente se añade al destino:
Las instrucciones de tres direcciones especifican dos fuentes y un destino. Las dos
fuentes se suman y se guardan en el destino.
Hasta ahora hemos prestado poca atención a la forma en que son interpretados los
bits de un campo de dirección para encontrar el operando. Una posibilidad consiste en que
contengan la dirección de memoria del operando. Sin embargo existen tambien otras
125
posibilidades. Exploraremos algunas de ellas en las secciones siguientes.
Direccionamiento inmediato
El modo más simple de que una instrucción especifique un operando es que la parte
de dirección de la instrucción contenga ya el operando mismo, en lugar de una dirección u
otra información que describa dónde esta. Este operando se denomina operando
inmediato, porque se extrae en forma automática de la memoria, al mismo tiempo que la
instrucción; de aquí que esté inmediatamente disponible para su utilización.
El direccionamiento inmediato tiene la virtud de no requerir de referencias adicionales
a memoria para extraer el operando. Tiene la desventaja de restringir el operando a un
número que pueda caber en el campo de dirección. En una instrucción con una dirección de
tres bits (por ejemplo, un campo de registro), los operandos sólo podrán tener tres bits, lo
que [imita bastante su utilidad.
Las CPU de Intel no poseen un modo de direccionamiento para operandos inmediato.
En su lugar, tienen una gran cantidad de instrucciones distintas en las que uno de los
operandos es inmediato. Por ejemplo, en la figura 5-5 la instrucción ADD se ve correcta y
ortogonal como en la PDP-1 1. En realidad, se utilizan nueve códigos de operación para
ADD, cinco de ellos para operandos inmediatos, dependiendo de la longitud de éstos (8,16 o
32 bits) y de como se especifique el destino.
Los 680x0 tienen un modo de direccionamiento inmediato, de forma que cualquier
operando fuente puede ser una constante. En algunas instrucciones del 68000 (ver figura
5-24) solo se aceptan constantes de 8 a 16 bits, pero en el 68020 y el 68030 se permiten
las tres longitudes en cualquier parte. Además, instrucciones especiales como ADDI, ADDQ
y CMPI permiten que las instrucciones inmediatas se codifiquen en forma más eficiente.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADDQ 0 1 0 1 Dato 0 Modo Reg
SUBQ 0 1 0 1 Dato 1 Modo Reg
SCC 0 1 0 1 Condición 1 1 Modo Reg
DBCC 0 1 0 1 Condición 1 1 0 0 1 Reg
Fig. 5-24. Cuatro instrucciones de la 68000.
Direccionamiento directo
126
Direccionamiento de registros
Direccionamiento indirecto
127
El 68000 permite el direccionamiento indirecto a través de los registros de direcciones
mas no de otra forma. En el 68020 yen el 68030, el direccionamiento indirecto se puede
realizar a través de memoria, en diversas formas. Esta es una de las principales diferencias
entre el 68000 y las CPU más recientes.
Indexación
A, A + 1, A + 2 ,..., A + n - 1
B, B + 1, B + 2 ,..., B + n - 1
MOVE A,B
MOVE A + 1, B + 1
ejecutarla otra vez, modificarla una vez más y repetir el ciclo hasta que las n palabras
hayan sido copiadas.
Aunque durante un tiempo los programas que se modificaban a sí mismos eran muy
populares, ahora se consideran una técnica de programación poco afortunada. Entre otras
razones porque son difíciles de depurar y obstaculizan la compartición de un programa entre
varios usuarios de un sistema de tiempo compartido.
El problema de copiar podrá también resolverse mediante direccionamiento indirecto.
128
La dirección de A se cargará en un registro o en una palabra de memoria. Lo mismo se hará
con la dirección de B. La instrucción MOVE usa dichos registros o palabras como
apuntadores. Después de copiar cada palabra, ambos apuntadores se incrementarán en 1
unidad. Naturalmente los apuntadores son parte de los dalos, no del programa, y por tanto
no son compartidos por usuarios simultáneos.
Otra solución consiste en tener uno o más registros llamados registros de índice,
que funcionan como sigue. Los campos de dirección tienen dos panes: la dirección del
registro de índice y una constante. La dirección del operando es la suma de la constante y el
contenido del registro de Índice. En el ejemplo anterior, si ambas direcciones se indexaran
usando un registro de índice que contuviera el entero k, la instrucción MOVER A, B
trasladaría el contenido de la posición de memoria A + k a la B + k. Si inicializamos el
registro de Índice a 0 y lo incrementamos en uno después de copiar cada palabra, sólo será
necesario un registro para la iteración de copia. Además, incrementar un registro es más
rápido que incrementar una posición de memoria.
También suele usarse la indexación para acceder a un campo determinado de una
estructura, si se conocen la dirección de comienzo de la estructura y la posición del campo
dentro de ella. Las variables locales de un procedimiento se accesan en esta forma.
En el ejemplo precedente era necesario incrementar explícitamente el registro índice
después de cada uso del mismo. La necesidad de incrementar o decrementar un registro
índice justo antes o después de usarlo es tan corriente, que algunas computadoras cuentan
con instrucciones especiales, modos de direccionamiento o incluso registros índice
especiales que automáticamente se incrementan o decrementar. La modificación automática
de un registro índice se llama auto-indexación.
Tanto las pastillas de Intel como las de Motorola tienen una diversidad de modos de
direccionamiento que involucran indexación. En el caso de los 680x0, también tienen auto-
indexación.
129
Las computadoras que están orientadas a pila tienen una instrucción para apilar el
contenido de una posición de memoria o de un registro. Tal instrucción debe copiar el dato e
incrementar el apuntador de la pila. Igualmente, una instrucción para extraer el contenido
de la cima de la pila y llevarlo a un registro o a una posición de memoria debe hacer una
nueva copia en el sitio apropiado y decrementar el puntero de pila. Algunas computadoras
tienen sus pilas de arriba a abajo, de manera que los datos nuevos se introducen en
posiciones de memoria consecutivas en orden descendente, en lugar de hacerlo en
posiciones consecutivas en orden ascendente, como en la figura 5-26.
Las instrucciones sin direcciones se usan en asociación con una pila. Esta forma de
direccionamiento especifica que los dos operandos se desapilan uno después de otro, se
realiza la operación (por ejemplo, una multiplicación o un Y lógico) y el resultado se vuelve
a introducir en la pila. La figura 5-27(a) muestra una pila con cuatro datos. Una
instrucción de multiplicar tiene el efecto de desapilar el 5 y el 6, reajustando temporalmente
el apuntador a 1001. Una vez hecha la operación, el resultado, 30, se apila como se ilustra
en la figura 5-27(b). Si posteriormente se realizara una suma, se obtendrá el resultado
mostrado en la figura 5-27(c).
130
Notación polaca inversa
Desde hace mucho tiempo es tradicional en matemáticas escribir el operador entre los
operandos, como en x + y, en lugar de escribirlo después de ellos, como en x y +. La
notación que incluye el operador entre los operandos se llama infija. La que pone el
operador después de los operandos se llama notación posfija o, más comúnmente, notación
polaca inversa por ser el lógico polaco J. Lukasiewicz (1958) quien investigó sus
propiedades.
La notación polaca inversa tiene algunas ventajas sobre la notación infija para
expresar fórmulas algebraicas. Primero, cualquier fórmula puede ser expresada sin
paréntesis. Segundo, es muy conveniente para evaluar fórmulas en computadoras con pilas.
Tercero, los operadores infijos tienen precedencias, que son arbitrarias e indeseables. Por
ejemplo, sabemos que a x b + c significa (a x b) + c y no a x (b + c), porque la
multiplicación ha sido definida arbitrariamente como precedente sobre la suma. La notación
polaca inversa elimina esta incomodidad.
Existen diversos algoritmos con los que se convierten fórmulas escritas mediante
notación infija en otras escritas en polaca inversa. El que se da más adelante es una
adaptación de una idea debida a E. W. Dijkstra. Supone que una fórmula está compuesta de
los siguientes símbolos: variables, los operadores binarios (de dos operandos) +, —, * y /
los paréntesis abierto y cerrado. Para marcar los limites de una fórmula, insertaremos el
símbolo ⊥ después del último símbolo y antes del primero.
La figura 5-28 muestra un trayecto de ferrocarril desde Valencia a Madrid, con una
bifurcación que desvía hacia Granada. Cada símbolo de la fórmula se representa por un
vagón de ferrocarril. El tren se mueve hacia el oeste (a la izquierda). Cada vez que un
vagón llega a la bifurcación, debe parar y preguntar si debe ir a Madrid directamente o
desviarse a Granada. Los vagones que contienen variables siempre van directamente a
Madrid y nunca a Granada. Los vagones que contienen otros símbolos deben investigar el
contenido del vagón más cercano situado sobre la via que lleva a Granada antes de entrar
en la bifurcación.
La figura 5-29 muestra lo que pasa, según el contenido del vagón más cercano en la
vía de Granada y del de la bifurcación. El primer ⊥ siempre va a Granada. Los números
indican las situaciones siguientes:
131
Vagón en la bifurcación
⊥ + - x / ( )
⊥ 4 1 1 1 1 1 5
recientemente a
Vagón que ha
llegado más
+ 2 2 2 1 1 1 2
la vía de
Granada
- 2 2 2 1 1 1 2
X 2 2 2 2 2 1 2
/ 2 2 2 2 2 1 2
( 5 1 1 1 1 1 3
Fig. 5-29. Tabla de decisión utilizada por el algoritmo
de conversión de infija en polaca invesa.
Algoritmo
132
5. Si la nueva fórmula consta de un solo valor, éste es la respuesta y el algoritmo ha
terminado; en caso contrario, se vuelve al punto 1.
La figura 5-31 describe la evaluación de una fórmula en polaca inversa. Nótese que
el orden de los operadores es el orden en que se usan realmente.
La notación polaca inversa es ideal para evaluar fórmulas en una computadora con
una pila. La fórmula consta de n símbolos, siendo cada uno de ellos o una variable (es decir,
algo con un valor) o un operador. El algoritmo es como sigue.
Algoritmo
1. Poner k a 1.
2. Examinar el símbolo k-ésimo. Si es una variante, se apila. Si es un
operador, desapilar los dos datos que están en su cima, realizar la
operación y apilar el resultado de nuevo.
3. Si k = n, el algoritmo se da por terminado y la solución está en la
pila. Si no fuera así, añade 1 a k y realiza el paso 2.
133
Este punto es importante para la resta y la división, ya que el orden de los operandos
es significativo (a diferencia de la suma o la multiplicación).
Una computadora organizada en torno a una pila ofrece diversas ventajas en
comparación con las máquinas de registros múltiples, como los de los ejemplos:
1. Las instrucciones son cortas ya que muchas de ellas no tienen
dirección.
2. Las fórmulas son fáciles de evaluar.
3. No hay necesidad de utilizar algoritmos complicados para
optimizar la utilización de los registros.
134
Palabra de 16 bit
Dirección
Fuente Destino
CÓDIGO DE MODO DE REGISTRO DE MODO DEL REGISTRO
N
OPERACIÓN LA FUENTE LA FUENTE DESTINO DEL DESTINO
4 3 3 3 3
N+2 (Primer palabra siguiente)
16
N+4 (Segunda palabra siguiente)
16
(a)
Si la pila crece de las direcciones altas a las bajas y el apuntador de pila apunta
siempre a la parte superior (es decir, a la dirección más baja de memoria que contiene un
elemento de la pila), se puede usar la modalidad de decremento predeterminado para apilar
y la de incremento posterior para desapilar. Por el contrario,'si la pila crece de las
direcciones bajas a las altas y, por convención el apuntador de pila apunta a la primera
celda vacía de la pila, en lugar de hacerlo a la última ocupada, se puede usar entonces el
incremento posterior para apilar y el decremento predeterminado para desapilar. Cuál de
los sistemas a utilizar depende de las preferencias y de los antecedentes de uso.
135
Ejemplos de direccionamiento
Direccionamiento en la PDP-11
TIPOS DE INSTRUCCIONES
136
Instrucciones de movimiento de datos
Operaciones binarias
Las operaciones binarias son las que combinan dos operándoos para obtener un
resultado. En la práctica, todas las máquinas de nivel 2 tienen una instrucción para realizar
la suma y la resta de enteros. Excepto el micro de 8 bits, también es corriente que tengan
multiplicación y división de enteros. Se supone que no se necesita explicar por qué las
computadoras tienen instrucciones aritméticas.
Otro grupo de operaciones binarias incluye las instrucciones booleanas. Aunque haya
16 funciones de dos variables, pocas máquinas, si es que hay alguna, tienen instrucciones
para las 16. Por ejemplo, es innecesaria una función que calcule el valor CIERTO
independientemente de los argumentos. Si se necesita en alguna parte de la máquina la
secuencia de bits que representa CIERTO, se puede simplemente moverla hacia allá, en
lugar de calcularla. Argumentos similares muestran que la instrucción para realizar f(P, Q) =
P debe ser bastante inútil.
Tres instrucciones presentes en muchas máquinas son Y, O y O EXCLUSIVO. En
máquinas de longitud de palabra fija, la función Y calcula bit por bit el Y booleano de dos
argumentos de una palabra, siendo el resultado también una palabra. A veces existen
asimismo instrucciones para medias palabras, dobles palabras, etc. Cabe hacer comentarios
similares respecto de las demás instrucciones booleanas.
Un uso muy importante de la función Y es la extracción de bits de las palabras.
Considérese, por ejemplo, una máquina de palabra de 32 bits en la que se almacenan
cuatro caracteres de 8 bits por palabra. Supongamos que se necesita separar el segundo
137
carácter de los otros tres para imprimirlo; es decir es necesaria crear una palabra que
contenga el carácter en los 8 bits de la derecha o, como suele decirse, justificado a la
derecha con ceros en los 24 bits de la izquierda.
Para extraer el carácter, se hace un Y entre la palabra que lo contiene y una constante
denominada máscara. El resultado de esta operación es el cambio de todos los bits no
deseados por ceros (es decir, se enmascaran), como se muestra abajo.
La operación Y tiende a eliminar unos, ya que nunca hay más unos en el resultado que
en los operándoos. La operación O tiende a insertar unos, ya que siempre hay al menos
tantos como tenga el operando que más tenga. La operación O es, por otro lado, simétrica,
tendiendo, en media, a no insertar ni eliminar unos. Esta simetría con respecto a los unos y
los ceros es útil en varias ocasiones; por ejemplo, para generar “números aleatorios”.
Las primeras computadoras realizaban la aritmética de punto flotante llamando a
procedimientos preprogramados, pero hoy día hay muchas computado- ras, especialmente
las concebidas para dedicarse a trabajo científico, que tienen instrucciones de punto flotante
al nivel 2 por razones de velocidad. Algunas máquinas tienen números en punto flotante de
varias longitudes, los más cortos para obtener mayor velocidad y los más largos para
cuando se necesitan muchos dígitos de precisión. Los números en punto flotante se
comentan en el Apéndice B.
Operaciones unarias
138
00000000 00000000 00000000 00011100 A desplazado a la derecha 2 bits
11000000 00000000 00000000 00011100 A rotado a la derecha 2 bits
Tanto los desplazamientos a la izquierda como los que se hacen a la derecha son
útiles. Si una palabra de n bits se rota k bits a la izquierda, el resultado es el mismo que si
se hubiera rotado m – k bits a la derecha.
Los desplazamientos a la derecha se hacen a menudo con extensión del signo. Esto
significa que las posiciones que quedan libres por el lado izquierdo de la palabra se llenan
con el bit de signo original, 0 o 1. Parece como si el bit de signo se estirara hacia la
derecha. Entre otras cosas, ello significa que un número negativo permanecerá negativo. La
situación se ilustra abajo.
139
por una potencia de dos.
Ciertas operaciones binarias ocurren con tal frecuencia con determinados operándoos,
que muchas máquinas de nivel 2 tienen instrucciones unarias que las realizan rápidamente.
Mover un cero a una palabra de memoria o a un registro es extremadamente corriente
cuando se comienza un cálculo. El movimiento de un cero es, naturalmente, un caso
particular de las instrucciones generales de mover. Por eficiencia, se suele disponer de una
operación de BORRAR con una sola dirección, la de la posición a borrar (es decir, a poner a
cero).
También se usa muchas veces la suma de un l a un registro o a una posición de
memoria para contar. Una forma unaria de la instrucción de sumar es la operación de
incrementar, que añade 1. La operación de negar es otro ejemplo. La operación de negar X
es realmente hacer la resta binaria 0 - X; pero también se suministra a veces como una
instrucción distinta.
Casi todos los programas deben tener la capacidad de examinar datos y después
alterar el flujo de control en función de los resultados. Un ejemplo simple es la función raíz
cuadrada. Si el argumento es negativo, el procedimiento da un mensaje de error; en caso
contrario realiza la raíz cuadrada. Dicha función de los resultados. Un ejemplo simple es la
función raíz cuadrada. Si el argumento es negativo, el procedimiento da un mensaje de
error; en caso contrario realiza la raíz cuadrada. Dicha función tiene que examinar el
argumento y luego bifurcar, dependiendo de sí es negativo o no.
Un método corriente de hacerlo es proporcionar instrucciones de salto condicional (a
menudo llamadas de bifurcación condicional) que comprueben alguna condición y salten a
una dirección de memoria particular si la condición se cumple. Algunas veces se puede
poner algún bit de la instrucción a 1 o 0 para indicar si el salto debe ocurrir cuando la
condición se cumple o no, respectivamente.
La condición más corriente a verificar es si un bit particular de la máquina es 0 o no.
Si una instrucción comprueba el bit de signo de un número en complemento a 2 y bifurca a
LUGAR si es 1, se ejecutarán las instrucciones que comienzan en LUGAR si el número fue
negativo o las siguientes al salto condicional, si fue 0 o positivo. La misma comprobación
hecha en complemento a 1 bifurcará a LUGAR siempre que el número comprobado sea
menor o igual que – 1 y nunca saltará a LUGAR si dicho número es mayor o igual que 1. Si
el número es 0, el salto tendrá o no lugar según sea + 0 o – 0. Esto es sin duda incómodo,
porque matemáticamente + 0 = – 0, y éste es, en realidad, uno de los argumentos más
fuertes en contra de la aritmética de complemento a 1 y a favor de la de complemento a 2.
Muchas máquinas tienen bits que indican condiciones específicas. Por ejemplo, puede
haber un bit de desbordamiento que se ponga a 1 siempre que una operación aritmética dé
un resultado incorrecto. Al comprobar este bit se detecta si hubo desbordamiento en la
operación aritmética anterior y, si lo hubo, se puede hacer un salto a una rutina de error. La
68000 tiene incluso una instrucción especial corta, TRAPV, que hace un desvío si el bit de
desbordamiento está activo.
De modo similar, algunos procesadores tiene un bit de acarreo que se pone a 1
cuando tiene lugar un acarreo de bit de la izquierda (por ejemplo, sí se suman dos números
negativos). Un acarreo del bit de la izquierda es completamente normal y no debe
confundirse con un desbordamiento. La comprobación del bit de acarreo se necesita en la
aritmética de precisión múltiple.
Algunas máquinas tienen una instrucción para comprobar el bit de la derecha de una
palabra. Ello permite al programa comprobar si un número (positivo) es par o impar con
una sola instrucción.
La comprobación de cero es muy importante para iteraciones y para muchos otros
fines. Si todas las instrucciones de salto condicional examinaran solamente un bit, la
comprobación de sí una palabra particular está en cero, necesitaría de una comprobación
distinta de cada bit para asegurar que ninguno está a 1. Para evitar esta situación, muchas
máquinas tienen una instrucción por la que examinan una palabra y saltan si es cero.
Naturalmente, esta solución lo único que hace es pasarle la pelota al nivel l. En la práctica,
140
normalmente el hardware tiene una compuerta O a cuyas entradas son todos los bits de un
registro y cuya salida dice si dicho registro contiene algún bit a 1.
La comparación de dos palabras o caracteres para ver si son iguales y, si no lo son,
ver cuál es mayor, también es importante, por ejemplo, en ordenamientos. Para realizar
esta comprobación, se necesitan tres direcciones, dos para los datos y otra para la dirección
a la que se ha de saltar si la condición es verdadera. Las computadoras cuyo formato de
instrucción permiten tres direcciones por instrucción no tienen ningún problema, pero
aquellas que no las permiten sí lo tienen y deben hacer algo para evitarlo.
Una solución común consiste en dotarlas de una instrucción que compare ambos datos
y ajuste uno o más bits de condición para registrar el resultado. Una instrucción posterior
puede comprobar los bits de condición y saltar si los dos valores comparados eran iguales,
distintos, si el primero era mayor, etc. Las máquinas de ejemplo usan esta aproximación.
Se presentan algunas cuestiones delicadas al comparar dos números. Primero, en
máquinas complemento a 1, +0 y –0 son diferentes. Por ejemplo, en una máquina de 32
bits.
141
La columna de la izquierda muestra los enteros positivos del cero al siete en orden
creciente. La de la derecha muestra los enteros con signo desde –4 a +3 en complemento a
2. La respuesta a la pregunta “¿Es 011 mayor que 100?” Depende de que los números se
consideren con o sin signo. La mayoría de las máquinas tienen instrucciones para las dos
formas de ordenar.
Las máquinas que tienen menos de tres direcciones por instrucción a veces tratan las
comparaciones con una instrucción que se salta u omite la siguiente instrucción si la
condición se cumple. La instrucción que se omite será con frecuencia una de salto. En
algunas máquinas pueden saltarse varias instrucciones en vez de una sola; el número de las
que se van a saltar viene especificado en la propia instrucción. Por lo general, este es un
número entre –128 y +127, de modo que cabe en un byte. El 68000 tiene varias
instrucciones de este tipo.
El salto incondicional es un caso especial del salto condicional en el que la condición
siempre se cumple.
142
Control de iteraciones
143
for i : = 1 to n do bigin ... end
i: = l; i: =1;
1: {primera sentencia} 1: if i > n then goto 2;
{segunda sentencia} {primera sentencia}
. {segunda sentencia}
. .
. .
{última sentencia} .
i:i = 1; {última sentencia}
if i < = n then goto 1; i: =i+1;
goto 1;
2: {primera sentencia después 2: {primera sentencia después de
de la iteración} la iteración}
(a) (b)
Fig. 5-40. a) Iteración con comprobación al final. b) Iteración con comprobación al principio.
Entrada / salida
144
Como un ejemplo sencillo de este método, considérese una terminal con cuatro
registros de 1 byte, como se muestra en la figura 5-41. Dos de los registros se usan para
entrada, estado y datos; y los otros dos para salida, así como también estado y datos. Cada
registro tiene una dirección única. Si se utiliza E / S mapeada en memorias, los cuatro
registros forman parte del espacio de direcciones y se pueden leer o escribir por medio de
instrucciones ordinarias. En caso contrario, se proporcionan instrucciones especiales de E /
S, llamadas IN y OUT, para leer y escribir los registros. En ambos casos, las operaciones de
E / S se realizan transfiriendo datos e información del estado entre la CPU y estos registros.
El registro de estado del teclado tiene 2 bits que se utilizan y 6 que no se usan. El bit
más hacia la izquierda (7) adquiere del hardware el valor de l siempre que llega un carácter.
Si previamente el software fijó el bit 6 en 1, se genera una interrupción; en caso contrario,
esto no ocurre (las interrupciones se abordarán en breve). Cuando se usa E / S programada
para recibir información, la CPU entra en una iteración, leyendo constantemente el registro
de estado del teclado, esperando a que se encienda el bit 7. Cuando esto sucede, el
software lee el registro del buffer del teclado, para obtener el carácter. Leer el registro de
datos del teclado provoca que el bit LISTO se ponga en 0.
La operación de salida opera en forma similar. Para escribir un carácter en la pantalla,
el software lee el registro de estado de despliegue, para chequear si el bit LISTO está en 1.
Si no es así, realiza una iteración hasta que el bit sea l, indicando de ese modo que el
dispositivo está listo para aceptar un carácter. Tan pronto como la terminal está lista, el
software escribe un carácter en el buffer del registro de despliegue, lo que provoca que se
transmita a la pantalla, así como que el dispositivo borre el bit LISTO en el registro de
estado. Cuando la terminal ha desplegado el carácter y está preparada para manejar el
siguiente, el controlador vuelve a poner en l al bit LISTO.
Como ejemplo de la E / S programada, considérese el procedimiento en Pas- cal de la
figura 5-42. A este procedimiento se le llama a ejecución con dos parámetros: un arreglo
de caracteres a ser desplegado y el número de caracteres que contiene dicho arreglo, hasta
1K. El cuerpo del procedimiento es una iteración que despliega un carácter a la vez. Para
hacerlo, la CPU debe aguardar hasta que el dispositivo esté listo (ready= l). Los
procedimientos in y out serian rutinas típicas en lenguaje ensamblador para leer y escribir
los registros especificados por el primer parámetro, hacia o desde la variable especificada
por el segundo parámetro. La división entre 128 se deshace de los 7 bits de orden inferior,
dejando el bit LISTO en el bit 0.
145
La principal desventaja de la E / S programada es que la CPU pasa la mayor parte de
su tiempo en un lazo, esperando a que el dispositivo esté listo. Este en- foque se denomina
ocupado en esperar. Si la CPU no tuviera nada más que hacer (v.g., la CPU de una
lavadora), no habría ningún problema. Sin embargo, si hay otros trabajos como ejecutar
programas, dicha espera es un desperdicio, por lo que se requiere de un método para las
operaciones de E / S.
La forma de evitar esta espera, es hacer que la CPU inicialice el dispositivo de E / S y
le indique que genere una interrupción cuando haya terminado su operación. En la figura
5-41 se puede observar como se hace esto. El software puede solicitar, activando el bit
HABILITA INTERRUPCIÓN en un registro del dispositivo, que el hardware le dé una señal
cuando la operación de E / S termine. Más adelante en este capítulo, bajo el tema de flujos
de control, se estudiarán en detalle las interrupciones.
Vale la pena mencionar que en muchas computadoras la señal de interrupción se
genera aplicando el AND booleano a los bits HABILITA INTERRUPCIÓN y LISTO. Si primero
el software habilita interrupciones (antes de la operación de E / S), ésta ocurrirá de
inmediato ya que el bit LISTO tendrá el valor de 1. De ahí que sea necesario primero
inicializar el dispositivo e inmediatamente después habilitar las interrupciones. Escribir en el
registro de estado no modifica al bit LISTO, por ser sólo de lectura.
Aunque la entrada / salida manejada por interrupciones significa un gran adelanto
comparada con la E / S programada, está lejos de ser perfecta. El problema consiste en que
se requiere de una interrupción para cada carácter transmitido y procesar interrupciones
resulta caro. Se necesitaba de una forma para deshacerse de la mayoría de las
interrupciones.
La solución reside en retomar la E / S programada, pero haciendo que alguien
diferente la lleve a cabo. (La solución a muchos problemas reside en dejar que otro haga el
trabajo). La figura 5-43 muestra cómo se organiza esto. En es- te caso, se ha incorporado
una nueva pastilla controladora para el sistema, de Acceso Directo a Memoria (DMA),
con acceso directo al bus.
146
La pastilla DMA tiene en su interior (por lo menos) cuatro registros, los que pueden
cargarse por medio de software para correr en la CPU. El primero contiene la dirección de
memoria a leer o escribir. El segundo contiene el número de bytes o palabras a transferir. El
tercero especifica el número de dispositivo o el espacio de E / S a utilizar, y por último, el
cuarto registro indica si los datos serán leídos de, o escritos en el registro de E / S.
Para escribir un bloque de 32 bytes de la dirección de memoria 100 a una terminal
(por ejemplo, el dispositivo No. 4), la CPU escribe los números 32,100 y 4 en los tres
primeros registros DMA y luego el código correspondiente a escritura (es decir, 1) en el
cuarto registro, tal como se muestra en la figura 5-43. Una vez inicializado así, el
controlador DMA realiza una solicitud del bus para leer el byte 100 de la memoria, de la
misma forma que lo haría la CPU. Una vez teniendo el byte, el controlador hace una
solicitud de E / S al dispositivo No. 4, para escribir en él dicho byte. Después de completar
estas dos operaciones, el controlador incrementa en 1 su registro de direcciones y
decrementa su registro contador también en 1. Si este último es aún mayor que 0, lee otro
byte de memoria y lo escribe en el dispositivo.
Cuando la cuenta por fin llega a 0, se detiene la transferencia de datos y se activa la
línea de interrupción en la pastilla de la CPU. Con el DMA, la CPU sólo tiene que inicializar
unos cuantos registros, después de lo cual, es libre para hacer otra cosa, hasta que la
transferencia completa termine y recibe una interrupción del DMA. Algunos controladores
tienen dos o más de estos registros, lo que les permite controlar varias transferencias
simultáneas.
Mientras que el DMA libera en gran medida a la CPU de la carga que representan las
operaciones de E / S, el proceso no es libre en su totalidad. Si un dispositivo de alta
velocidad, como un disco, está siendo usado por el DMA, se requerirá de muchos ciclos del
bus, para referencias tanto a memoria como a dispositivos. Durante estos ciclos, la CPU
tendrá que esperar (el Acceso Directo a Memoria tiene mayor prioridad de uso del bus que
la CPU, porque los dispositivos de E / S por lo general no pueden tolerar demoras). Al
proceso en el que un controlador DMA quita ciclos a la CPU se le denomina robo de ciclos.
Sin embargo, la ganancia de no tener que manejar una interrupción por cada byte (o
palabra) que se transfiere, sobrepasa a la pérdida por el robo de ciclos. En todas las
computadoras personales y minicomputadoras, el Acceso Directo a Memoria (DMA) es el
método normal de efectuar las operaciones de E / S.
Por otra parte, en las grandes macrocomputadoras la situación es diferente. Estas
máquinas realizan tantas operaciones de E / S, que el robo de ciclos saturaría el bus, e
incluso con sólo una interrupción por cada bloque transferido, se dedicaría demasiado
tiempo al manejo de interrupciones. La respuesta aquí es incorporar a la arquitectura
procesadores especiales de E / S, denominados canales de datos, como se puede apreciar
147
en la figura 2-19.
Un canal es en realidad una computadora especializada. Se le puede dar un programa
a ejecutar y luego desconectarlo para que lo lleve a cabo sin contar con ninguna ayuda de la
CPU principal. Cuando el programa ha sido ejecutado, el canal interrumpe a la CPU. Ya que
un programa de este tipo puede ser muy complicado, involucrando la transferencia de
muchos bloques de datos, se necesita un menor número de interrupciones que con las
simples transferencias de DMA.
En virtud de que ni los microprocesadores de Intel ni los de Motorola utilizan canales
de datos, se usará como ejemplo la estructura de E / S de una de las grandes
macrocomputadoras de IBM. Existen dos tipos de canales. Un canal selector, que controla
los dispositivos de alta velocidad, tales como los discos. Debido a la alta velocidad de estos
dispositivos, un canal selector sólo puede manejar una transferencia a la vez. En contraste,
un canal multiplexor, puede manejar al mismo tiempo diversos dispositivos de baja
velocidad, como son las terminales.
Para realizar operaciones de E / S en una computadora con canales de datos, la CPU
primero crea un programa para el canal y lo almacena en la memoria principal. Enseguida,
ejecuta una instrucción START I / O (Inicia E / S), que específica el canal y el dispositivo de
E / S. A continuación, el canal extrae la dirección de su programa de una localidad fija en la
memoria, coloca dicha dirección en su registro de contador de programa y comienza a
ejecutar su programa de canal. En la figura 5-44 se muestran las diversas palabras
comprendidas en el proceso, para una macrocomputadora típica.
Un programa de canal consta de una o más instrucciones de 64 bits para el canal.
Cada instrucción contiene un código de operación de 8 bits, que indica qué operación
realizar. Estas incluyen: WRITE, READ, READ BACKWARD (v.g., para rebobinar cintas
magnéticas), CONTROL (v.g., arrancar el motor), SENSE (v.g., verificar el fin de archivo) y,
CONDITIONAL BRANCH. Las instrucciones del canal incluyen también una dirección de
buffer de 24 bits para señalar de dónde, o en dónde se leerán o escribirán los datos, un
contador que indica cuántos bytes se van a transferir, así como algunos bits de bandera.
Estos últimos especifican aspectos como la no transmisión de datos (útil para salvar un
registro en una cinta) y “detener el canal después de terminar esta instrucción”.
Además de la instrucción START I / O, la CPU tiene otras instrucciones como HALT I /
O que fuerza la detención de toda actividad en el canal seleccionado. Las instrucciones TEST
I / O y TEST CHANNEL se usan para determinar el estado actual de las actividades de E / S.
Existen también disponibles otras cuantas instrucciones menores de E/S.
Todas las CPU de Intel tiene instrucciones explícitas de E / S para leer o escribir bytes,
palabras o palabras largas. Estas especifican el número de puerto de E / S deseado, ya sea
en forma directa por medio de un campo en la propia instrucción, o indirectamente, usando
el registro DX para almacenarlo. Además, por supuesto se utilizan las pastillas DMA para
liberar a la CPU de la carga de las operaciones de E / S.
Ninguna de las pastillas de Motorola tiene instrucciones de E / S. Se supone que los
registros de los dispositivos de E / S serán direccionados por medio del mapeo a memoria.
También aquí, el DMA se utiliza mucho.
148
FLUJO DE CONTROL
149
muestra en la figura 5-45. En consecuencia, se hace difícil visualizar la secuencia de
ejecución a partir del listado del programa. Cuando los programadores tienen problemas en
seguir la secuencia en que e! procesador va a ejecutar las instrucciones, es fácil que
cometan errores. Esta observación llevó a Dijkstra (1968) a escribir el controvertido articulo
“La declaración GO TO considerada perjudicial”, en la que se sugiere evitar las declaraciones
GO TO. Dicho artículo hizo nacer la revolución de la programación estructurada, una de
cuyas premisas en la sustitución de las declaraciones GO TO con formas más estructuradas
de flujo de control, tal como la iteración WHILE. Desde luego, estos programas se compilan
en el nivel 2, y pueden contener muchos saltos, ya que la implantación de IF, WHILE y otras
estructuras de control de alto nivel requieren de saltos.
Procedimientos
150
La solución de mover n discos de la varilla l a la 3 consiste en mover primero n – 1
discos de la varilla 1 a la 2. Seguidamente se mueve un disco de la l a la 3 y luego los n-1
discos de la 2 a la 3 (véase figura 5-42). Para resolver el problema, necesitamos un
procedimiento que mueva n discos de la varilla i a la j. Cuando se llama al procedimiento
por medio de
torres (n, i, j)
torres (3, l, 3)
La llamada para resolver el problema de la figura 5-47, generará tres llamadas más,
ya que n no es 1. Concretamente:
torres (2, l, 2)
torres (l, l, 3)
torres (2, 2, 3)
La primera y tercera llamadas generarán cada una tres llamadas más, haciendo un
total de siete.
Para que los procedimientos sean recursivos, se necesita una pila donde almacenar los
parámetros. Cada vez que se llama a un procedimiento, se reserva en ella un bloque de
memoria, denominado trama de pila, para la dirección de retorno, los parámetros y las
variables locales si las hay. La trama más reciente es la trama actual. En nuestros ejemplos
supondremos que la pila siempre crece hacia abajo, de las direcciones altas de memoria a
las bajas. Se ha seleccionado esta convención porque la mayoría de las computadoras,
incluyendo las de Intel y Motorola, hacen las cosas de esta manera. De ahí que una
instrucción PUSH (Apila), almacene una palabra en la dirección dada por el apuntador de
pila y luego decremente dicho apuntador según el tamaño de la palabra.
151
Además del apuntador de pila, que apunta a la cima de la pila (dirección numérica
más baja), a menudo conviene tener un apuntador de base local, BL, que apunte a un punto
fijo de la trama. La figura 5-49 muestra la trama de pila para una máquina con palabras
de 16 bits. La pila comienza en la dirección 1000 y crece hacia abajo, hacia la dirección 0.
La llamada original a torres apilan n, i y j, y ejecuta una instrucción de llamada que apila la
dirección de retorno, colocándola en la 994. Al entrar, el procedimiento llamada-almacena el
valor anterior de BL en la pila y decrementa el apuntador de pila para asignar espacio a las
variables locales. Con una sola variable local de 16 bits, el apuntador de pila, AP se
decrementa en 2. La situación, después de hacer todas estas cosas, se muestra en la figura
5-49(a).
152
Una vez dicho esto, podemos explicar para qué sirve BL. En principio, se puede hacer
referencia a las variables con desplazamientos respecto a AP. Sin embargo, según se apilan
y desapilan palabras, estos desplazamientos cambian. Aunque en algunos casos el
compilador puede conocer y seguir el número de palabras que hay en la pila, otras veces no
puede y, en todo caso, requiere considerable trabajo. Además, en algunas máquinas, como
en las Intel, el acceso a variables situadas a una distancia conocida del AP requiere del
orden de media docena de instrucciones.
En consecuencia, muchos compiladores usan un segundo registro, BL, para hacer
referencia a las variables locales y a los parámetros debido a que sus distancias a BL no
cambian con las operaciones de apilar y desapilar. En las CPU de Intel, el registro BP (EBP)
se usa para este fin. En las de Motorola, cualquier registro de direcciones, excepto el A7 (el
apuntador de pila) lo puede hacer. Los parámetros tienen desplazamientos positivos
respecto a BL y las variables loca- les los tienen negativos. Lo primero que un
procedimiento debe hacer es salvar el BL previo (de modo que pueda recuperarse a la salida
del procedimiento), copiar AP a BL y avanzar AP para reservar espacio a las variables
locales. Este código se llama prólogo del procedimiento. Hasta la salida del
procedimiento, la pila debe limpiarse de nuevo, mediante el llamado_ epílogo del
procedimiento. Una de las características más importantes de cualquier computadora reside
en qué tan corto y rápido puede hacer el prólogo y el epílogo. Si son largos y lentos, las
llamadas a procedimiento serán costosas. Los programadores que rindan culto a la
eficiencia, aprenderán a evitar la escritura de muchos procedimientos cortos y a escribir en
su lugar programas largos, monolíticos y sin estructura. Las instrucciones ENTER y LEAVE
de Intel y las instrucciones LINK y UNLK de Motorola se diseñaron para que realicen la
mayor parte del trabajo de los procedimientos de prólogo y epílogo de forma eficiente.
Volvamos ahora al problema de las Torres de Hanoi. Cada llamada a procedimiento
añade a la pila una nueva trama y cada retorno elimina de ella una trama. Para ilustrar el
uso de una pila en la realización de procedimientos recursivos, vamos a hacer un trazado de
llamadas, comenzando con
torres (3, l, 3)
153
torres (2, l, 2)
torres (1, l, 3)
torres (l, 1, 2)
Esta añade una trama a la pila, como se muestra en la figura 5-49(e). Se imprime
otra línea y, después del retorno, se elimina una trama de la pila. Las llamadas a
procedimientos continúan de esta manera hasta que la llamada original termina de
ejecutarse y se elimina de la pila la trama de la figura 5-49(a).
Se pueden pasar parámetros por registro o por la pila. A las normas que regulan el
cómo se pasan los parámetros se les conoce como secuencia de llamado.
154
Corrutinas
155
sino a la sentencia que sigue al “retorno” más reciente, es decir, a la más reciente llamada
a A. Dos procedimientos, cada uno de los cuales considera el otro como un procedimiento
(en el sentido de que es llamado, realiza cierto trabajo y retorna a la sentencia que sigue a
la llamada), se llaman corrutinas.
Ni la llamada ni el retorno ordinarios bastarán para llamar a las corrutinas, ya que la
dirección a la que se ha de saltar viene de la pila, como en un retorno; pero, a diferencia del
retorno ordinario, la llamada a la corrutina pone a su vez una dirección de retorno en alguna
parte para hacer un retorno posterior a ella. Esta operación se podría efectuar en forma
sencilla si hubiera una instrucción que intercambiara la cima de la pila y el contador de
programa. En detalle, esta instrucción podría extraer primero la antigua dirección de retorno
de la pila, introduciéndola en un registro temporal interno; después metería el contador de
programa en la pila y, finalmente transferiría el contenido del registro temporal al contador
de programa. El apuntador de pila no cambia, ya que se saca una palabra de la pila y se
mete otra. Una secuencia de llamadas a corrutinas debe iniciarse metiendo la dirección de
una de ellas en la pila. Una introducción de llamada a corrutina se denomina, a veces,
instrucción de reanudar. De hecho existe en algunas máquinas de nivel 2, tal como se
describe aquí. Sin embargo, más a menudo, se necesitan dos o tres instrucciones para
hacer el trabajo. En la figura 5-52 se ejemplifica la instrucción REANUDAR. Ver tambien
figura 5-51.
Para ilustrar con un ejemplo el uso de las corrutinas, considérese un sistema de
programación muy avanzado que suministre documentación automática de los programas.
En cualquier lugar de un programa el programador puede insertar un comentario precedido
y seguido del símbolo #. El programa es usado por el compilador para producir el programa
objeto. Los comentarios son usados por el sistema de documentación para producir el
manual. El compilador ignora los comentarios y el sistema de documentación ignora el
programa. Para hacer el problema interesante, supondremos que la parte de documentación
es muy inteligente y analiza sintácticamente todos los comentarios para estar segura de que
no cometen errores gramaticales, ya que los que escriben manuales de programación
parecen tener grandes dificultades con el idioma. Un ejemplo de entrada se muestra en la
figura 5.53.
El programa descrito se puede escribir como dos corrutinas; una para analizar
sintácticamente el programa y otra para analizar sintácticamente el castellano. La corrutina
del programa (el compilador) comienza leyendo la entrada y analizándola según viene.
Llega un momento en que encuentra el primer símbolo de comentario, #. En este momento
desea ignorar el comentario para continuar analizando. Para ello, el compilador llama a la
corrutina de documentación, y se salta el comentario.
156
El sistema de documentación comienza leyendo y analizando el comentario. En cierto
momento lee el símbolo de comentario. Desde su punto de vista, debe ignorar el texto del
programa, de manera que regresa al compilador para saltar- se dicho texto. El compilador
arrancará, con todas sus variables y apuntadores internos intactos, desde el punto en que
se detuvo, no por el principio. El analizador sintáctico de castellano puede estar en un
estado muy complicado en este momento y es esencial que, cuando el compilador se haya
comido el siguiente trozo del texto del programa, arranque al analizador de comentarios en
el estado en que estaba cuando reanudó al compilador.
Aquí debemos notar que para realizar corrutinas se necesitan múltiples pilas, ya que
cada corrutina puede también llamar a procedimientos en la forma ordinaria, además de
hacer llamadas a corrutinas.
157
if asiento = 350 # si el avión está lleno #
then
begin
lleno = 1; # pon una bandera #
Nuevo avión # pide otro avión #
end
else reserve(pasajero); # si no, dele un asiento a esta persona #
Fig. 5-53. Un fragmento de programa con código y documentación.
Desvios
158
protecciones, código de operación indefinido, desbordamiento de la pila, intento de arrancar
un dispositivo de E/S que no existe, intento de extraer una palabra con dirección impar y la
división entre cero.
Interrupciones
ACCIONES DE HARDWARE
159
nuevo contador de programa apunta al inicio de la rutina de servicio
de interrupción, para el dispositivo que la provocó.
ACCIONES DE SOFTWARE
160
Cuando una computadora tiene dispositivos de E/S con tiempos críticos, un mejor
enfoque en el diseño es el de asignar una prioridad a cada dispositivo, alta para los
dispositivos muy críticos y baja para los menos decisivos. En forma similar, la CPU debe
tener también prioridades, por lo general determinadas por un campo en la PSW. Cuando
un dispositivo con prioridad n interrumpe la rutina de interrupción, debe correr también con
prioridad n.
Cuando se está ejecutando una rutina de prioridad n, cualquier intento de interrupción
de un dispositivo con menor prioridad se ignora, hasta que la rutina termina y la CPU vuelve
a correr un programa de usuario (prioridad 0). Por otra parte, las interrupciones de
dispositivos con prioridad mayor, deben ejecutarse sin demora.
Teniendo sujetas a interrupción a las propias rutinas de interrupción, la mejor manera
de mantener correcta la administración es asegurarse de que todas las interrupciones sean
transparentes. Considérese un ejemplo simple de interrupciones múltiples. Una
computadora tiene tres dispositivos de E / S, una impresora, un disco y una línea RS 232,
con prioridades de 2, 4 y 5, respectivamente. Al principio (t = 0), se encuentra en ejecución
un programa de usuario, cuando de repente, en 1 = 10, ocurre una interrupción de la
impresora. Como se puede ver en la figura 5-54, se inicia la rutina de servicio de
interrupción (ISR) de la impresora.
161
interrupción para indexar una tabla de 256 elementos y encontrar la dirección de la rutina
de servicio de interrupción. En el 8088, dicha tabla se encuentra en la dirección absoluta 0,
con 4 bytes para cada elemento. En los procesadores 80286 y 80386, los vectores de
interrupción son descriptores de segmento de 8 bytes y la tabla puede estar ubicada en
cualquier parte de la memoria, con un registro global apuntando a su inicio.
Teniendo sólo un nivel de interrupción utilizable, no existe forma de que la CPU
permita que un dispositivo con prioridad alta, ni tampoco baja, suspenda una rutina de
servicio de interrupción con prioridad media. Para resolver este problema, las CPU de Intel
se usan por lo general junto con un controlador de interrupciones 8259 A (véase figura 3-
38). Cuando se presenta la primera interrupción, digamos con la prioridad n, la CPU se
interrumpe. Si se presenta otra con una prioridad mayor, el 8259 A realiza una segunda
interrupción. Si por el contrario es menor, se mantiene pendiente hasta que la primera
termina. (La rutina debe enviar un comando en forma explícita al 8259 A, para indicarle
cuando termina y permitir que se lleven a cabo interrupciones con menor prioridad).
En los procesadores 680 x 0 de Motorola la situación es en cierta forma diferente.
Como en el 8088, tienen 256 vectores de interrupción de 4 bytes que inician en la dirección
absoluta 0. Sin embargo, a diferencia de las pastillas de Intel, tienen tres patas destinadas
al número del nivel de interrupción, del 0 al 6, más el 7 que es del tipo no diferible.
Además, la CPU tiene en la PSW un campo de prioridad de 3 bits. Cuando un dispositivo de
E / S desea provocar una interrupción, coloca su prioridad en las tres patas y envía una
señal. La CPU puede entonces, dependiendo de la prioridad actual, aceptar o rechazar la
solicitud. En este caso no se requiere de una pastilla como la 8259A.
162
CONCLUSIÓN
163
BOLILLA III: ARQUITECTURA
DEL PROCESADOR
164
INDICE
165
INTRODUCCIÓN
166
APUNTES DE CATEDRA
167
Es importante destacar, que este "Señor'" no sabe hacer nada si no se le indica por
medio de las tarjetas con instrucciones. Veamos como funciona el sistema:
1- El "Señor, que llamaremos Unidad de Control, observa el número que le
indica el contador de su escritorio. y se va a la casilla indicada, previo a sumar uno
al contador.
2- El "Señor", toma la tarjeta de la casilla indicada por el contador.
3- Copia el contenido de esa casilla en un papel en blanco, e interpreta lo que
allí se le dice. Vamos a suponer que en esa instrucción se le pide que sume dos
números "A" y "6" y que están en las casillas de las cuales se les da el número, y
que el resultado "R" lo guarde en otra casilla de la que también se le indica su
número.
4- El "Señor" Unidad de Control, va ala casilla en donde se le dice que está
guardado "A" y saca su contenido, que copia en uno de los papeles en blanco que
tiene sobre su escritorio.
5- Luego va al número de casilla donde se le dice que tiene "B" y realiza la
misma operación, copiando el contenido en otro papel en blanco.
6- Toma la calculadora e ingresa "A" y "B" y los suma.
7- Al resultado "R", lo guarda en el número de casilla que se le indico.
8- Una vez que realizó todo lo anterior, y como ha terminado lo que se le
indicaba. se fija en el contador que tiene en la mesa y se examina a que número
debe ir a buscar la próxima tarjeta.
9- Va realizando los pasos 1 a 7 hasta que encuentra una tarjeta que le dice que
se terminaron las instrucciones. En este caso entrega los resultados en el canasto
de su izquierda para que otro pueda interpretarlos, y se queda esperando que se le
introduzcan por su derecha nuevas instrucciones.
Ahora que sabemos como funciona el "Señor 11 y todo su entorno, veamos como
relacionamos, por analogía, con las partes constitutivas de una computadora y su
funcionamiento.
En una visión general, un ordenador se compone de una Unidad Central de Proceso
(CPU), en la que tenemos una Unidad de control (el "Señor"), una Unidad Aritmética y
Lógica (la calculadora) los Registros Internos (los papeles en blanco sobre el escritorio) y
una Memoria (el casillero a su espalda). Por otro lado tenemos, las Interfaces y Unidades de
168
Entrada / Salida (los canastos a ambos lados). El reloj sobre la pared sirve como elemento
de sincronización entre todas las partes del sistema.
En el casillero (memoria) podemos encontrar dos clases de información, por un lado
las tarjetas con ordenes acomodadas secuencialmente ("Instrucciones de un programa") y
por otro lado los datos. a menudo llamados operandos, con los cuales la máquina efectuará
los tratamientos indicados por las instrucciones.
Dentro de la Unidad Central de Proceso (CPU), tenemos dos unidades muy
importantes de la máquina, que tienen correspondencia con las dos clases de información
almacenadas. Una es la llamada "Unidad de Control", o también llamada "Unidad de
Instrucciones'" para las instrucciones del programa, y la segunda, es la "Unidad Aritmética y
Lógica", la que realiza operaciones aritméticas sobre los datos, tales como sumar, restar,
etc., u operaciones lógicas tales como comparar, o analizar si el contenido de los datos son
verdaderos o falsos de acuerdo a la instrucción, etc.
La figura 2 muestra esquemáticamente como pueden resumirse las principales
funciones de la CPU.
169
Almacenamiento Secundario" (discos magnéticos. Disquetes, cintas magnéticas, etc), cuyas
capacidades de almacenamiento son muy superiores a las de una memoria principal.
Estas Unidades Periféricas se conectan a la memoria central directamente a través de
unidades especializadas en la gestión de transferencia de información. Estas "Unidades de
Transferencia de Información", se ocupan de gobernar los canales o buses.
En resumen podemos representar un ordenador como un conjunto ensamblado de
diferentes unidades, cuyo funcionamiento está regido por un programa registrado en la
memoria principal. La Unidad de Control gobierna la ejecución de las operaciones pedidas
por el programa. Si la operación es un cálculo, es la Unidad Aritmética y Lógica quien lo
realiza, al igual que si se debiera efectuar una comparación lógica y tomar una decisión. Si
es una transferencia de información con el exterior, se cede el control aun canal. Figura 3
MICROPROCESADORES
170
La CPU se compone de varias partes. La Unidad de Control, se encarga de traer las
instrucciones de la memoria principal y determinar su tipo. La Unidad Aritmética y Lógica
que realiza operaciones como la suma o la función booleana ANO, necesarias para llevar a
cabo las instrucciones.
La CPU también contiene una pequeña memoria de alta velocidad utilizada para
almacenar los resultados intermedios y cierta información de control. Esta memoria consta
de varios registros, cada uno de los cuales tiene cierta función.
El registro más importante es el "Contador de Programa" (PC = Program Counter),
que indica la dirección de la próxima instrucción que debe ejecutarse. El nombre de
"Contador de Programa" a veces confunde ya que no cuenta nada, pero su uso es muy
difundido.
Otro registro muy importante es el "Registro de Instrucción", que contiene la
instrucción que se está ejecutando. No obstante, la mayoría de las computadoras tienen
otros registros, algunos de los cuales son accesibles a los programadores.
171
que extraiga, examine y ejecute las instrucciones.
Un programa que rea liza esto se llama II intérprete". Esta equivalencia entre el
intérprete y los procesadores físicos es muy importante en la organización de las
computadoras. Después de haber especificado un lenguaje de máquina "L" para una
determinada computadora, el equipo de diseño puede decidir si quiere construir un
procesador físico para ejecutar programas en "L" o si prefiere escribir un intérprete en su
lugar que realice la misma función.
Dado que un intérprete se divide en pasos pequeños las instrucciones que ejecuta. la
máquina en la que funciona puede ser mucho más simple y por lo tanto, menos cara de lo
que costaría un procesador de hardware para la máquina. Por estas razones, los programas
en computadoras modernas, al nivel de máquina convencional, son ejecutados por un
intérprete que corre en una máquina mucho más primitiva y al que se llama "nivel de
microprogramación".
El conjunto de todas las instrucciones que tiene a su disposición un programador en
un nivel se denomina "conjunto de instrucciones". La cantidad de instrucciones varía de una
máquina a otra y de nivel en nivel. Por ejemplo, para el nivel de máquina convencional, el
conjunto suele tener de 20 a 300 instrucciones. Un conjunto de instrucciones grandes no
tiene por que ser mejor que uno pequeño. De hecho suele ocurrir lo contrario. Un conjunto
de instrucciones grandes indica, a menudo, que las instrucciones no son muy generales. Los
compiladores para alto nivel como Ada, Pascal, etc, se desempeñan mejor en máquinas con
conjuntos de instrucciones reducidos y bien definidos. A las máquinas con conjuntos de
instrucciones muy reducidos se las denomina "RISC" (Reduced Instruction Set Computer).
Este tipo de máquinas no utiliza microprogramación y son muy rápidas. A las máquinas con
conjuntos de instrucciones normales o extendidos se las llama "CISC"(Completed
Instruction Set Computer).
ORGANIZACIÓN DE LA CPU
172
La Unidad Aritmética y Lógica realiza sumas, restas y otras operaciones sencillas sobre
el contenido de los registros de entrada, colocando el resultado en el registro de salida, el
cual a su vez puede ser almacenado en la memoria.
Las instrucciones pueden dividirse en tres categorías:
• De registro a memoria.
• De registro a registro.
• De memoria a memoria.
Las instrucciones de registro a memoria permiten que una palabra de memoria sea
extraída a los registros, donde pueden ser usadas como entradas para la ALU en
instrucciones subsecuentes.
Una instrucción típica de registro a registro extrae dos operandos de los registros, los
lleva a los registros de entrada de la ALU, lleva a cabo alguna operación con ellos y
almacena el resultado en otro registro.
Una instrucción de memoria a memoria extrae sus operandos de la memoria y lleva
estos a los registros de entrada de la ALU, donde realiza su operación y escribe el resultado
en la memoria.
La operación de flujo de datos es el corazón de la mayoría de las CPU y define en gran
parte lo que una máquina es capaz de hacer.
173
LA UNIDAD ARITMÉTICA Y LÓGICA
Para pedir al ordenador una operación matemática, por, ejemplo una suma, la
instrucción debe facilitarle la siguiente información:
La clase de operación a realizar, en este caso una suma. Este papel lo cumple el
código de operación.
La dirección de la célula de memoria que contiene el primer dato, o primer operando.
La dirección de la célula de memoria que contiene el segundo dato, o segundo
operando.
La dirección de la célula de memoria donde debe almacenarse el resultado.
De aquí se deduce la forma de la instrucción, que contiene un código y tres
direcciones:
174
Cada una de setas tres instrucciones comportará un código de operación y una
dirección.
CÓDIGO DE DIRECCIÓN
OPERACIÓN
Carga Dirección 1º operando
Adición Dirección 2º operando
Almacenamiento Dirección resultado
175
LA UNIDAD DE CONTROL
Es la unidad que extrae y analiza las instrucciones de la memoria central. Para ello
necesita dos registros:
a) Una parte que está conformada por el “Código de Operación”, que define el
tipo de instrucción a ejecutar (suma, multiplicación, salto, etc.).
b) Otra parte que contiene la/s “Dirección/es del/os, operando/s”.
176
FASE DE BÚSQUEDA DE LA INSTRUCCIÓN
177
Caso de almacenamiento del operando:
178
FASE DE PREPARACIÓN DE LA SIGUIENTE INSTRUCCIÓN
179
EL CANAL
180
LAS UNIDADES PERIFÉRICAS
INTERRUPCIONES
Las " Interrupciones" son ordenes que proceden del exterior y que piden al ordenador
ejecutar un programa asociado a la orden. El programa en curso se ve interrumpido para
permitir la ejecución del programa solicitado por la interrupción, considerado ahora como
prioritario. Terminado este último. se reanuda la ejecución del programa interrumpido.
Es gracias a las interrupciones, como se le comunica ala Unidad de Control que debe
realizar o ejecutar una tarea. ~ bien para avisarle que algo a sucedido ó finalizado. como
por ejemplo cuando el canal le avisa que todos los datos solicitados han sido transferidos a
la memoria.
Más exactamente. el tratamiento de una interrupción consiste. en general. en
memorizar el estado de la máquina desde el final de la instrucción en curso y forzar
seguidamente en el Contador de Programa la dirección de la primera instrucción del
programa asociado a la interrupción. Este programa. a su vez. termina en una instrucción
que restaura el estado que tenía la máquina al momento de la interrupción. lo que permite
la reanudación del programa interrumpido.
Existen dos tipos de interrupciones:
1- Las "Enmascarables": o sea las que pueden ser temporaria- mente ignoradas.
por cuanto no implican un procesamiento o atención inmediata. El ejemplo anterior
del canal es una de las interrupciones enmascarables.
2- Las "No Enmascarables": que no pueden ignorarse por cuanto deben set
atendidas inmediatamente. Entre estas encontramos las interrupciones por errores.
tanto de Hardware como de Software. los errores lógicos (división por cero). etc.
También tenemos las interrupciones que proceden por ordenes del operador, como
por ejemplo la cancelación de un programa, etc.
181
1- Interrupción por errores o averías: falla de la alimentación eléctrica. error de
paridad en memoria. etc.
2- Interrupción por causa del programa (o desvío): instrucción o dirección
incorrecta, operaciones imposibles, división por cero, desbordamiento de capacidad,
etc.
3- Interrupción por entrada / salida: generada por el canal para avisar del fin de
una operación de entrada / salida ó de una anomalía ocurrida en el transcurso de
una operación de entrada / salida.
4- Interrupción externa: utilizada para avisar a la máquina acerca de cualquier
modificación interesante del medio exterior, especialmente en control de procesos
industriales.
5- Interrupción de recuento: para contar impulsos procedentes de un reloj.
182
b- La unidad central se encuentra en una fase ininte- rrumpible (generalmente
en final de instrucción).
A cada nivel de interrupción se asocian dos señales: una impulsiva. procedente del
exterior, para pedir la interrupción, y otra de larga duración que el calculador deja activada
hasta tanto no se haya tratado la interrupción, es decir, hasta que el nivel sea capaz de
aceptar una nueva demanda de interrupción.
A cada nivel de interrupción se asocia un conjunto de posiciones de memoria,
divididas en dos partes: la primera contiene toda la información necesaria para el arranque
del programa de interrupción (en especial la dirección de la primera instrucción). La
segunda sirve para almacenar la información que caracterizan al estado del programa en el
instante de la interrupción, para su posterior reanudación (estado de los diferentes
indicadores. Contador de Programa, enventualmente los registros de base. etc).
El paso de una interrupción al estado activo consiste en memorizar el estado del
programa, almacenando la información pertinente en las posiciones asociadas de memoria
para instaurar después un nuevo estado del programa.
La última instrucción de un programa de interrupción es una muy especial, cuya
finalidad es la de restaurar el estado del programa en el momento de la interrupción,
rescatando las posiciones asociadas de memoria. Además desactiva el nivel de interrupción,
lo que permite responder a otra posible señal de interrupción.
183
CONCLUSIÓN
184
BOLILLA IV: MEMORIA
185
INDICE
186
INTRODUCCIÓN
187
APUNTES DE CATEDRA
MEMoRia
La memoria es aquella parte de la computadora en donde se almacenan los programas
y los datos. No existirían las computadoras digitales con programas almacenados sin una
memoria en la que los procesadores pudieran leer o escribir información.
Puede considerarse como un conjunto de células, cada una con posibilidad de
almacenar una información (palabra), dato o instrucción. Las células están numeradas y la
unidad de control conoce cada célula por su número, llamado "Dirección". La Unidad de
Control puede pedir leer el contenido, o escribir una nueva información en una célula de una
dirección determinada. Para realizar estas operaciones, la Unidad de Control proporciona la
dirección de la célula implicada a un registro asociado ala memoria central, llamado
"Registro de Dirección", o también "Registro de Selección" de memoria.
El dispositivo de selección de memoria analiza el contenido del registro de dirección y
sensibiliza la célula implicada, ya sea para una lectura, o para una escritura. Si se trata de
una lectura, la información almacenada en la célula será transferida a un segundo registro,
también asociado a la memoria central, llamado "Registro de Intercambio" ó "Registro de
Palabra".
En el caso de una escritura, previamente habrá sido preciso cargar en este registro
con la información que se quiere transferir ala célula en cuestión.
La operación de lectura no destruye la información almacenada en la célula, mientras
que la operación de escritura destruye la información almacenada, sustituyéndola por una
nueva información. La figura 1 muestra esta relación.
La unidad básica de memorias es el "dígito binario" al que se denomina "bit". Este
puede contener un "0" ó un "1" y es la unidad más simple posible.
188
Normalmente se dice que las computadoras utilizan aritmética binaria porque es "más
eficiente". En realidad lo que quieren decir es que la información digital puede almacenarse
distinguiendo entre valores de alguna cantidad física continua, como un voltaje o la
corriente. El sistema de numeración binario necesita únicamente diferencias ente dos
valores, en consecuencia es el más fiable para codificar información digital.
Algunas máquinas, tales como los grandes computadores, anuncian tanto aritmética
decimal como binaria. Este truco lo logran utilizando 4 bits para almacenar un dígito
decimal. Con cuatro bits se tiene 16 combinaciones que se utilizan para codificar los dígitos
0 al 9, dejando 6 combinaciones sin usar. A continuación se muestra el número 1944
codificado en forma decimal yen binaria pura, usando 16 bits en cada ejemplo:
DIRECCIONES DE MEMORIA
189
que una máquina de 32 bits tendrá registros de 32 bits e instrucciones (sumar, restar,
mover, etc) para manipular palabras de 32 bis.
ORDENAMIENTO DE BYTES
Fig. 2.
Para el primer caso, en donde comienzan los números se numeran por el extremo
mayor (es decir los bytes de orden superior), estas computadoras se denominan "big
endian", en contraposición a las llamadas "little endian" de la figura 2 (b). Estos términos
(en ingles) se deben a Jonathan Swift, quien en su libro "Los viajes de Gulliver", satirizó a
los políticos que iniciaban una guerra debido a la discusión acerca de si los huevos debían
romperse por el extremo mayor o menor.
Es importante entender que en ambos sistemas un número entero de 32 bits, con un
valor de por ejemplo 6, se representa con los bits 110 en los tres bit más hacia la derecha
(de orden inferior) de la palabra y ceros en los restantes 29 bits hacia la izquierda.
En el esquema "big endian", estos bits se localizan en el byte 3 (ó 7, ú 11, ó 15, etc),
mientras que en el esquema "little endian" corresponden al byte 0 (ó 4, ú 8, ó 12, etc). En
ambos casos la palabra en que se ubica este número entero tiene la dirección 0 (cero).
Si las computadoras solo almacenaran enteros, entonces no habría problemas, sin
embargo, muchas aplicaciones requieren de una mezcla de enteros, cadenas de caracteres
y otro tipo de datos. Considerese un simple registro consistente en una cadena alfabética
(por ejemplo nombre de los alumnos) y el de enteros (como puede ser su número de
legajo, su edad, etc). Para completar la palabra, la cadena se termina con uno ó más bytes
de ceros.
Las dos representaciones son correctas, pero los problemas comienzan cuando una
máquina trata de enviar un registro a la otra a través de una red. Imagínese que la "big
endian" envía un registro a la "little endian" byte por byte, empezando por el byte 0 (cero).
Eso sin considerar que los bits también se invierten dentro de una palabra.
Obviamente no es una solución simple, ya que no es lo mismo tratar datos numéricos
que alfabéticos. Debe quedar claro que la falta de una norma en el ordenamiento de bytes,
constituye una grave molestia cuando se intercambia información entre máquinas
diferentes.
190
CÓDIGOS CORRECTORES DE ERRORES
191
grupo reducido de ellos ".
Las características que ha de poseer una unidad de memoria dependen:
• De la forma en que van a presentar la información a su entrada.
• De la forma en que se obtienen la información a su salida.
• De la cantidad de información a memorizar.
Capacidad
m= 2b
m= 2b = 210 = 1024
Como practica, el alumno puede comprobar que si "b = 14", la memoria tiene una
capacidad de 16K. El número total de posiciones de una memoria de "n * k" es "n x 1024".
Por ejemplo, una memoria de "132 k" posee: 32 x 1024 = 32798 posiciones.
La capacidad total de una memoria se suele indicar mediante el número de posiciones
y el número de bits de cada posiciones.
192
Formas de acceder a las posiciones de memoria
En esta figura se representa una visión panorámica de los diversos tipos de memorias
y la interrelación que existe entre ellas.
En esta clasificación se incluyen solamente las memorias que no poseen partes en
movimiento y que en general se encuentran en el mismo recinto físico que la Unidad de
Control y la Unidad Aritmética y Lógica.
El almacenamiento de información en cantidades elevadas (cientos de miles de "k"
palabras), tanto de datos como de instrucciones de los sistemas programables, se realiza
actualmente en sistemas físicos que poseen partes en movimiento y reciben el nombre
genérico de periféricos.
Son aquellas en las que el tiempo que tarda en leerse o escribirse en una posición es
el mismo para todas las posiciones de la memoria. Aleatoriamente se puede seleccionar
cualquier posición de la memoria para introducir información o leer la que contiene. Por lo
tanto el tiempo de acceso a cualquier posición de la memoria es el mismo
193
independientemente de su ubicación o situación.
En la figura 4 se representa el esquema de bloques general de una memoria de
acceso aleatorio.
m = 2b
194
Write Enable) y de "Selección de Pastilla" (CS = Chip Select).
En base ala convención adoptada, el diagrama indica que el terminal externo WE se
activa en el nivel bajo (activo cuando WE = 0 en un sistema de lógica positiva) y CS se
activa en el nivel alto.
En el proceso de lectura, la memoria lleva a los terminales de salida "O3 O2 O1 O0" la
palabra almacenada en el registro direccionado.
Para leer la memoria presentamos la dirección, habilitamos la entrada CS y ponemos
la entrada de WE = 1. Así pues:
Por esta razón algunos fabricantes etiquetan los terminales de habilitación de escritura
con:
Lectura / escritura (R / W)
Tanto para lectura como para escritura la entrada de selección de pastilla "CS" debe
estar habilitada, es decir, activada. Si CS no se activa, la pastilla está aislada del mundo
exterior. Entonces no es posible ni leer ni escribir en memoria.
El numero total de bits en la figura anterior es "8 x 4 = 32". La forma de disponer los
bits en palabras se denomina organización de la memoria. La memoria de la figura anterior
se describe como una memoria de 8 palabras de 4 bits / palabra.
Debido a que podemos leer o escribir palabras en la memoria, esta se denomina de
"lectura / escritura". Además como podemos escoger cualquier registro de memoria
aleatoriamente, tanto para leer como para escribir, también se las conoce como "memorias
de acceso aleatorio" ó "RAM = Ramdom Access Memory".
En principio la estructura lógica de una RAM semiconductora, del tipo que hemos
discutido, se indica en la figura 5. En esta disponemos de cuatro palabras de 2 bits cada
una, es decir, la organización de la memoria es "4 x 2". Nuestro interés se centra en la
estructura lógica de la memoria y no en los detalles electrónicos. Por lo tanto, hemos
incorporado algunas simplificaciones en comparación con una memoria física real.
195
La estructura utiliza el conmutador controlado por lógica, cuando el nivel lógico de la
línea de control (línea de trazos que atraviesa el conmutador) es "1", el conmutador se
cierra y se establece la conexión; cuando el nivel lógico de la línea de control es "0", el
conmutador se abre.
Los bits se almacenan en "Flip-Flop" elementales, es decir formados por dos
inversores acoplados. Los bits de dirección "A1" "A0" se aplican al decodificador.
Cuando tenemos, por ejemplo, "A1 = 1" y "A0 = 0", la salida de la puerta 62 está en
"1" lógico, mientras que las salidas de las demás compuertas lógicas AND del decodificador
están en "0" lógico. Por lo tanto, solo se puede acceder a los flip-flop del Registro de
Palabra 2, ya que solamente los conmutadores de estos flip-flops están cerrados y por
consiguiente conectados con las líneas de bits.
O sea, la entrada de dirección "A1 A0 = 10" direcciona la palabra 2 y sólo la palabra 2.
Si la selección de la pastilla está en cero lógico, las salidas de las puertas "G0" y "G1"
están en "0" lógico y las líneas de bits no se conectan ni ala entrada de datos ni a los
terminales de salida.
Si "CS = 1 " y "WE = 0 ", los conmutadores que conectan "I1" e "I0" a las líneas de
bits se cerrarán y los flip-flops asumirán estados correspondientes a los niveles lógicos de
196
Pastillas de memoria en paralelo
Con frecuencia surgen casos en los que no es adecuado el número de palabras de una
pastilla, ó el número de bits por palabra, ó las dos cosas simultáneamente. El problema
puede remediarse colocando las pastillas en paralelo.
En la figura 6 se representa la conexión de pastillas en paralelo para incrementar el
número de bits por palabra (pero no el número de palabras). Hay dos pastillas de 8
palabras en paralelo, 4 bits por palabra, para construir una memoria cuyo número de
palabras sigue siendo 8, pero el número de bits se ha incrementado de 4 a 8. Los 3 bits de
dirección se aplican a las pastillas de dirección de ambas memorias. Los terminaks "CS" de
las pastillas se unen, lo mismo que los terminales WE. Las entradas de selección de pastilla
y habilitación de escritura seleccionan y habilitan simultáneamente ambas pastillas.
La pastilla 1 acepta y almacena 4 bits (0, 1, 2, 3), y la pastilla 2, otros 4 bits (4, 5, 6,
7). Por supuesto, se pueden conectar en paralelo más pastillas adicionales. Así, con tres
pastillas de 8 palabras, 4 bits / palabra, se conseguirá una memoria de 8 palabras. 12 bits /
palabra, y así sucesivamente. Cuando se añadan pastillas, la dirección se aplica
simultáneamente a los terminales de entrada de dirección de las demás pastillas.
Análogamente, todas las patitas CS se conectan entre sí para tener una sola entrada CS y
las entradas WE se tratan de la misma forma.
Para dar mayor flexibilidad al problema de los bits por palabra, los fabricantes
disponen de pastillas de memoria con palabras de 1 bit. Así pues, encontramos en catálogos
de fabricantes memorias cuya organización es "256 x 1". "1024 x 1'. "4096 x 1", etc. Una
vez seleccionada una pastilla con un número adecuado de palabras. entonces ensamblamos
una memoria de "n" bits por palabra, simplemente colocando "n" pastillas en paralelo.
En la figura 7 mostramos la forma de poner en paralelo dos pastillas de 8 palabras, 4
bits / palabra, para obtener una memoria de 16 palabras de 4 bits / palabra. Como antes,
los tres bits de dirección se aplican a ambas pastillas, pero en lugar de tener un bit de
entrada CS común aplicado a las dos pastillas, cuando se activa la entrada CS de una
pastilla, se desactiva la entrada CS de la otra, La entrada CS del sistema de memoria (la de
entrada al inversor) ahora es un bit de dirección adicional, que llamamos "A4". Cuando
"A4=1", la pastilla direccionada es la 2. y cuando "A4=0", se direcciona la pastilla 1. El bit
"A4" de dirección de selección de pastilla selecciona por lo tanto una u otra de las pastillas.
197
Los bits de selección "A0", "A1", "A2" seleccionan la posición de una palabra particular
en la pastilla seleccionada. Los bits de entrada de datos y la entrada WE se aplican en
común a ambas pastillas.
Un problema especial, que no aparecía cuando las pastillas se colocaban en paralelo
para incrementar el número de bits por palabra como en la figura 6. surge en este caso
que estamos considerando. Ahora una palabra de salida se lee a veces de una pastilla o a
veces de otra. Presumiblemente la palabra se transmitirá al mismo destino
independientemente de la pastilla que la origine. Por lo tanto, las salidas de las pastillas
tendrán que aplicarse a un bus común, ésta es la razón por la que aparece dicho bus en la
figura 7.
El esquema paralelo de la figura 7, puede, por supuesto, extenderse a más pastillas.
Supongamos, por ejemplo, que quisiéramos utilizar este esquema para colocar en paralelo
cuatro pastillas con el fin de obtener una memoria de 32 palabras de 4 bits / palabra.
Podemos introducir un bit de dirección "A5". Como antes, podríamos aplicar tres bits
de dirección "A0", "A1", "A2" a los terminales de entrada de dirección de las pastillas. Los bits
de dirección "A4" y "A5" se aplicarían aun decodificador como se indica en la figura 8. Las
salidas del decodificador se utilizan entonces para activar las entradas de selección de
pastillas.
198
Memorias pasivas
199
es más que un conversor de código, y por lo tanto, consta de un decodificador y de un
codificador.
Son aquellas en las que el tiempo que tarda en leerse o grabarse una posición
depende de la situación física en el interior de la memoria. Para introducir información en
una posición hay que hacerla pasar por todas las que la preceden hasta alcanzar los
terminales de entrada.
De forma similar, para leer el contenido de una posición hay que hacer pasar la
información por todas las que la siguen hasta alcanzar los terminales de salida.
Dentro de este tipo de memorias. y de acuerdo a la forma de entrada-salida, las
mismas pueden clasificarse en:
1- Registros de desplazamiento: Como ya hemos visto. en estas memorias de
acceso serie, cada orden externa de escritura o lectura desplaza la información una
posición en el interior de la memoria. La orden externa de desplazamiento está
constituida por los impulsos de un generador. Los registros de desplazamiento se
clasifican en dos clases, de acuerdo con las características de frecuencia de los
impulsos de desplazamiento:
a- Registros de desplazamiento estáticos: Son aquellos en los que los impulsos
de desplazamiento pueden anularse por tiempo indefinido, la información queda
almacenada en las diferentes posiciones de la memoria alas que fue llevada por
el último impulso de desplazamiento aplicado.
b- Registros de desplazamiento dinámicos: Son aquellos en las que los
impulsos de desplazamiento no pueden anularse por tiempo indefinido porque
de esta manera desaparece la información contenida en su interior.
2- Memorias FIFO (First Input First Output): Son memorias de acceso serie en
las que la primera información que entra es la primera en salir.
En la figura 9 se representa gráficamente la forma en que se mueve la información
en el interior de la memoria FIFO al realizar sucesivas operaciones de escritura
lectura.
Se puede deducir que la memoria FIFO se comporta igual que un registro de
desplazamiento en la operación de lectura, pero no así en la operación de escritura,
en la que la información se desplaza desde la entrada hasta la posición vacía más
cercana a la salida.
200
3- Memorias LIFO (Last Input First Output): Son memorias de acceso serie en las
que la información que entra en la última operación de escritura es la que primero
sale en la operación de lectura que se realice. En la figura 10 se indica
gráficamente la forma en que se realiza la escritura y la lectura de una memoria
LIFO.
201
El alumno puede deducir que en una operación de escritura, toda la información
contenida en la memoria se desplaza una posición hacia la derecha y en una operación de
lectura se desplaza una posición hacia la izquierda.
Memorias asociativas
202
La estructura asociativa de una unidad de memorias es adecuada para el
almacenamiento de ciertos tipos de organizaciones de datos. Por ejemplo, una tabla de
clientes con su dirección como dato asociado, se debe organizar en forma asociativa para
que al presentar ala memoria el nombre de un cliente, ésta de a la salida su dirección.
MODOS DE DIRECCIONAMIENTO
203
Modo de direccionamiento indirecto
204
Algunos calculadores admiten varios registros de base, La instrucción debe especificar
entonces la dirección del Registro Base escogido
205
Las condiciones de direccionamiento, en la mayoría de los pequeños ordenadores
organizados por páginas, poseen un bit de direccionamiento que, según su valor, implica el
direccionamiento absoluto, es decir dentro de la página cero, o el direccionamiento en la
página de la instrucción en curso por yuxtaposición de los bits de mayor peso del contador
de programa y de la dirección dentro de la página.
Si la compuerta (no dibujada en la figura) está cerrada, hay direccionamiento absoluto
en la página cero, si está abierta hay direccionamiento en la página de la instrucción. En
este caso el direccionamiento por yuxtaposición puede ser considerado como
direccionamiento por referencia al principio de la página en curso.
206
indexado, lo que quiere decir que la dirección especificada en la instrucción es la de la
primera célula del vector (tabla) ya ella se suma el valor del índice, inicialmente puesto a
cero e incrementando en uno cada vez que se ejecute la instrucción de fin de bucle. Esta
última compara el índice con el número de elementos del vector y origina un salto al
principio del bucle mientras quede algún elemento a procesar.
La figura 16 ilustra el concepto de indexación, con la existencia de varios registros
índice.
207
Otros modos de direccionamiento
1- Direccionamiento Inmediato
2- Direccionamiento Inherente
Ordinariamente una dirección que es parte de una instrucción se refiere a una posición
de memoria. Cuando una instrucción indica una fuente o un destino de algunos datos y no
se direcciona específicamente, ya que no se hace referencia a la posición de memoria, se
dice que la instrucción tiene una dirección "inherente". Por ejemplo, en la instrucción
"Borrar el acumulador", los "datos" movidos están en una palabra cuyos bits son todos 0
(ceros) y la dirección de destino de estos datos es el registro acumulador. De nuevo, en la
instrucción "Mover el contenido del registro R1 al registro R2", R1 es la "dirección" donde se
lee una palabra y R2 es la "dirección" donde escribe la palabra.
208
CONCLUSIÓN
209
BOLILLA V: EL NIVEL DEL
LENGUAJE ENSAMBLADOR
210
INDICE
211
INTRODUCCIÓN
212
APUNTES DE CATEDRA
Estos dos pasos no tienen lugar simultáneamente; el segundo no comienza hasta que
el primero ha terminado. En la interpretación, en cambio, hay sólo un paso: la ejecución del
programa fuente original. No se genera primero un programa equivalente. La interpretación
tiene la ventaja de que el programa suele ser más pequeño y de mayor flexibilidad, pero la
traducción suele producir programas más rápidos.
Cuando se está ejecutando el programa objeto, sólo hay tres niveles en acción: el de
microprogramación, el de máquina convencional y el de máquina del sistema operativo. Por
tanto, en tiempo de ejecución, sólo pueden encontrarse en la memoria de la computadora
tres programas: el programa objeto del usuario, el sistema operativo y el microprograma.
Toda traza del programa fuente original se ha desvanecido. Así, el número de niveles
presentes en tiempo de ejecución puede diferir del número de ellos presentes antes de la
traducción. Es importante recalcar que, aunque nosotros definamos un nivel por las
instrucciones y construcciones lingüísticas que tienen a su disposición los programadores (y
no por el método de implementación), otros autores hacen una mayor distinción entre
niveles realizados por intérpretes en tiempo de ejecución y niveles realizados por
traducción.
213
INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR
Los traductores se pueden dividir a grandes rasgos en dos grupos, según la relación
que haya entre el lenguaje fuente y el objeto. Cuando el lenguaje fuente es, en esencia, una
representación simbólica de un lenguaje numérico de máquina, el traductor se llama
ensamblador y el lenguaje fuente se llama lenguaje ensamblador. Cuando el lenguaje
fuente es un lenguaje de alto nivel como el C o Pascal, y el lenguaje objeto es un lenguaje
de máquina numérico o una representación simbólica de uno de ellos, el traductor se llama
compilador.
214
Formato de una sentencia en lenguaje ensamblador
215
Una característica negativa de algunos ensambladores es que el número de caracteres
de sus etiquetas está limitado a seis u ocho. Por el contrario, la mayoría de los lenguajes de
alto nivel permiten usar nombres de longitud arbitraria. El uso de nombres largos y bien
escogidos hace los programas mucho más legibles e inteligibles por otras personas (véase
fig. 2-2 como ejemplo de ello).
El campo de operación tiene una abreviatura simbólica del código de operación (si la
sentencia es una representación simbólica de una instrucción máquina) o una seudo
instrucción (si la sentencia es una orden al ensamblador). La selección de un nombre
apropiado es sólo cuestión de gusto, por lo que diferentes diseñadores de lenguaje
ensamblador a menudo hacen distintas elecciones. En el caso de Intel eligieron MOV,
mientras que Motorola prefirió MOVE.
Tanto el 80386 como el 68030 permiten bytes, palabras y operandos largos. ¿Cómo
sabe el ensamblador qué longitud usar? De nueva cuenta los dos diseña- dores escogieron
soluciones distintas, lntel dio a sus registros diferentes nombres, de manera que EAX se
utiliza para mover elementos de 32 bits, AX para 16 bits y AL o AH para 8 bits. En
contraste, Motorola decidió agregar a cada código de operación un sufijo.L para palabras
largas, .W para palabras y, .B para bytes. Ambas formas son válidas, aunque destacan la
naturaleza arbitra- ría del diseño de lenguajes.
Los dos ensambladores difieren también en el nombre de la seudo instrucción que se
usa para reservar espacio para datos. lntel escogió DD (Define Da- ¡os) y Motorola le
nombró DC (Define Constante). Una vez más, sólo es cuestión de gustos.
El campo de operandos de una sentencia en ensamblador se usa para especificar las
direcciones y registros que la instrucción de máquina usa como operar dos. El campo de
operandos de una instrucción de suma de enteros dice qué s va a sumar a qué. El campo de
operandos de una instrucción de salto dice dónde hay que saltar .El campo de operandos de
una seudo instrucción depende de ella (por ejemplo, cuánta memoria hay que reservar).
El campo de comentarios ofrece a los programadores oportunidad de explicar el
funcionamiento del programa en beneficio de otros programadores, par que lo usen o
modifiquen posteriormente. Un programa en lenguaje ensamblador sin este tipo de
documentación resulta casi incomprensible para cualquier programador, con frecuencia
hasta para el propio autor. El campo de comentarios sólo es para el consumo humano; no
tiene ningún efecto en el proceso c ensamble o en el programa generado.
Existe un mito muy popular según el cual los programas que se usan mucho(
especialmente los grandes, deberían escribirse en ensamblador por razones de eficiencia.
Aunque fue acertado en un tiempo, ya no lo es más. Es instructivo con parar el sistema MUL
TICS con el sistema de tiempo compartido de la 360/6' denominado TSS/67. Ambos
sistemas operativos se empezaron por la misma época ( a mediados de la década de los
sesenta) y tienen aproximadamente
mismo tamaño (enorme). La mayor parte del MUL TICS (95OJo) se escribió e un
lenguaje de alto nivel (el PL/l), mientras que el TSS/67 se escribió totalmente en
ensamblador .
Un gran sistema operativo como el MUL TICS es una prueba de fuego para un
lenguaje de alto nivel. Un sistema operativo debe controlar todos los dispositivos de E/S,
hacer frente a situaciones muy criticas en tiempo, manipular grandes bases de datos y
hacer muchas otras tareas; por eso es crucial obtener, buenas prestaciones. Si los
lenguajes de alto nivel pueden pasar esta prueba tan critica, está claro que habrá pocas
aplicaciones en que se puedan demostrar las ventajas que se ganarían usando el lenguaje
ensamblador. Una excepción sería; por ejemplo, la programación del microprocesador que
controla una lavador debido al gran número de unidades vendidas.
Los resultados de ambos proyectos pueden compararse en forma elegante tenemos en
cuenta que se tardó aproximadamente el mismo tiempo en ponerlos a funcionar. Sin
embargo, MUL TICS fue escrito por 50 personas con un costo estimado de lO millones de
dólares, mientras el TSS/67 necesitó 300 personas su costo estimado fue de 50 millones de
216
dólares (Graham, 1970). Salta a la vista que el uso del PL/ 1 ahorró millones de dólares al
proyecto MUL TICS.
Varios estudios han mostrado que el número de líneas de código depurado que puede
producir un programador al mes en un proyecto que dure varios años es de unas 100 a 200
líneas, independientemente del lenguaje de programación que use (Corbató, 1969). Sólo se
puede esperar un rendimiento más alto en programas pequeños. Como una sentencia en
PL/l equivale a 5 o lO sentencias en ensamblador, la productividad de un programador PL/l
será 5 o 10 veces mayor que la de uno que programe en ensamblador. Esto mismo es
válido para cualquier otro lenguaje de alto nivel.
Otra razón de peso en contra de la programación en lenguaje ensamblador es que casi
no se entiende un programa escrito por otra persona. Un listado completo del MUL TICS en
PL/l tiene unas 3000 páginas, algo bastante difícil de digerir en una tarde. Sin embargo,
asimilar semejante volumen es poca cosa en comparación con la lectura de 30 000 páginas
de ensamblador. Aunque nadie intentará nunca leer el listado del MUL TICS completo, la
gente puede in- tentar comprender determinados procedimientos, que tienen en promedio 4
páginas de PL/l. Es corriente que, en proyectos largos, cambie 15 % del personal al año. En
consecuencia, después de 5 años, sólo unos pocos de los programadores originales
permanecerán aún en este trabajo. Si los programadores nuevos no entendieran los
programas de sus predecesores, el proyecto se encontraría en una situación muy
embarazosa.
Afinación de programas
Con base en la observación anterior, de que sólo una pequeña parte del código es la
responsable de la mayor parte del tiempo de ejecución, se puede tener otro enfoque.
Primero, el programa se escribe en un lenguaje de alto nivel. Luego se hace una serie de
mediciones para establecer las partes del programa que ocuparán la mayor parte del tiempo
217
de ejecución. Estas mediciones incluirán normalmente el uso del reloj del sistema para
calcular la cantidad de tiempo que se gasta en cada procedimiento, la cuenta del número de
veces que se ejecuta cada iteración y otros pasos similares.
Por ejemplo, supongamos que el 10 % del programa ocupa el 90 % del tiempo de
ejecución. Esto significa que para un trabajo de 100 segundos, 90 se gastan en el 10 %
critico y lO en el 90 % restante del programa. El 10 % critico se puede mejorar
rescribiéndolo en ensamblador. Este proceso se llama afinación y se ilustra en la figura 7-
2. Aquí se necesitan 5 años-hombre más para rescribir los procedimientos críticos, pero su
tiempo de ejecución se reduce de 90 a 30 segundos.
Resulta instructivo comparar el método mixto entre lenguajes de alto nivel y
ensamblador con la versión en lenguaje ensamblador puro (fig. 7-2). El último es 20 % más
rápido, pero tiene un precio de más del triple. Además, la ventaja del método mixto es
realmente mayor que la indicada, ya que la escritura de un procedimiento en ensamblador a
partir de uno escrito en lenguaje de alto nivel y ya depurado es, de hecho, mucho más fácil
que escribir el mismo procedimiento en ensamblador desde el principio. En otras palabras,
la estimación de 5 años- hombre para rescribir los procedimientos críticos es en extremo
conservadora. Si realmente se necesitara sólo 1 año-hombre, la razón de costos entre el
método mixto y el de ensamblador puro sería mayor de 4 a 1 en favor del método mixto.
Un programador que use un lenguaje de alto nivel no está sumergido en una
inmensidad de bits y, a veces, puede ver aspectos del problema que permitan verdaderas
mejoras. Esta situación no ocurre con frecuencia con los programadores en ensamblador,
que normalmente se ocupan de hacer malabarismos con las instrucciones para ahorrarse
unos pocos microsegundos. Graham (1970) nos cuenta que cierto procedimiento en PL/1 de
MUL TICS se rescribió en 3 meses. de manera que la nueva versión era 26, veces más chica
y 50 veces más rápida que la original, así como otro que se hizo 20 veces más pequeño y
40 veces más rápido con 2 meses de trabajo.
Corbató (1969) describe un procedimiento en PL/l para el manejo de un tambor que
se redujo de 50000 a 10000 palabras de código, compilado en menos de un mes y un
programa de control de E/S que se redujo de 65000 a 30 000 palabras de código compilado,
con una mejora en la velocidad de un factor 8 en cuatro meses. Esto muestra que los
programadores en lenguaje de alto nivel tienen una visión global de lo que están haciendo,
y. por ello es mucho más fácil que se les ocurran ideas que lleven a algoritmos totalmente
diferentes y mucho mejores.
Después de esta introducción, uno se pregunta maravillado: "¿Por qué molestarse
estudiando los ensambladores si la programación en ensamblador tiene tantos y tan serios
inconvenientes?" Al menos existen tres razones. La primera es que el éxito o fracaso de un
proyecto importante puede depender de la consecución de un factor de mejora de 5 o 10 en
algún procedimiento crítico, por lo que es importante estar en condiciones de escribir un
buen código en ensamblador cuando sea absolutamente necesario. La segunda es que, en
ocasiones, la programación en ensamblador es la única alternativa, debido a la falta de
memoria (las calculadoras de bolsillo tienen una CPU, pero pocas tienen un megabyte de
memoria y, menos aún, un disco duro). La tercera razón es que un compilador debe
producir una salida que utilice el ensamblador, o realizar el proceso de ensamble por sí
mismo. De ahí que resulte esencial entender el lenguaje ensamblador para comprender
cómo funcionan los compiladores.
218
EL PROCESO DE ENSAMBLAJE
219
Las referencias adelantadas pueden tratarse de dos maneras. La primera es que el
ensamblador podría leer el programa fuente dos veces. Cada lectura del programa fuente se
llama una pasada, y todo traductor que lea el programa de entrada dos veces se llama un
traductor de dos pasadas. En la pasada 1, el ensamblador de dos pasadas colecciona todas
las definiciones de símbolos, incluyendo las etiquetas de las sentencias, y las almacena en
una tabla. En el momento en que empieza la segunda pasada, ya se conocen los valores de
todos los símbolos; ya no existe el problema de las referencias adelantadas y puede leerse
cada sentencia, ensamblarla y obtener una salida.. Este método es conceptualmente
sencillo, aunque requiere una pasada adicional sobre la entrada.
El segundo método consiste en intentar hacer el ensamblaje en una pasada, a pesar
de todo. Cuando se encuentra una sentencia que no puede ser ensamblada por contener
una referencia adelantada, no se genera ninguna salida; en vez de hacerlo, se introduce la
sentencia con la referencia adelantada en una tabla, con la indicación de que todavía no ha
sido ensamblada. Al final del ensamblaje, todos los símbolos habrán sido definidos, de modo
que todas las sentencias de dicha tabla pueden ensamblarse.
Este último método genera la salida en distinto orden que en el de las dos pasadas. Si
al ensamblaje le sigue una carga, el cargador puede reordenar las piezas de la salida para
dejarlas en el orden correcto. Por tanto, esta objeción no tiene importancia. El problema del
ensamblador de una pasada estriba en que si hay muchas sentencias que contengan
referencias adelantadas, la tabla que debe contener todas las sentencias no ensambladas
puede hacerse demasiado grande y no caber en memoria. Este método presenta un grado
de complejidad considerablemente mayor y tiene dificultades para imprimir un listado,
incluyendo el código objeto producido. Por estas razones, la mayoría de los ensambladores
son de dos pasadas.
La primera pasada
220
Fig. 7-3. El Contador de Posiciones de Instrucciones (ILC) va tomando el valor de la instrucción donde se
cargará la instrucción en memoria. En este ejemplo, las sentencias anteriores a SUSANA ocupan 100 byte.
L 14, = F'5'
Para cargar el registro 14 con una palabra completa que tenga un constante de valor
5. En esta forma el programador evita escribir de manera explícita una instrucción DC para
ubicar una palabra con un valor inicial de 5. Se les llama literales a las constantes para las
cuales el ensamblador reserva memoria automática. Además de ahorrar al programador un
poco de escritura, las literales hacen más legibles los programas al hacer que el valor de la
constante aparezca en la instrucción fuente. La primera pasada del ensamblador debe
construir una tabla con todas las literales que utiliza el programa. Como las dos familias
utilizadas en uestros ejemplos tienen instrucciones inmediatas, sus ensambladores no
proporcionan literales. Hoy en día, las instrucciones inmediatas son muy comunes, pero
antes eran poco usuales. Es muy probable que el uso extendido de literales haya hecho ver
a los diseñadores que el direccionamiento inmediato era una buena idea.
En la mayoría de los ensambladores, la primera pasada utiliza por lo menos dos
tablas: la tabla de símbolos y la de códigos de operación. En caso de ser necesaria, se usa
también la tabla de literales. La de símbolos tiene, como se muestra en la figura 7-4, un
elemento para cada símbolo. Los símbolos se definen, bien usándolos como etiquetas, bien
por definición explícita (por ejemplo, EQU en el 370). Cada elemento de la tabla de símbolos
contiene el símbolo (o un apuntador a él), su valor numérico y, algunas veces, otra
información. Esta información adicional puede incluir:
1. Longitud del campo de datos asociado al símbolo.
2. Bits de reubicación. (¿Cambia el valor de símbolo si el programa se carga en una
dirección distinta a la que se supuso ensamblador?)
3. Si el símbolo ha de ser accesible o no a un procedimiento externo.
221
AAA -- -- 37 1 6
ADD EAX IMMED32 05 5 4
ADD REG REG 01 2 19
AND EAX IMMED32 25 5 4
AND REG REG 21 2 19
. . . . . .
. . . . . .
. . . . . .
Fig. 7-5. Extractos de una tabla de códigos de operación en un ensamblador 80386
Como ejemplo, considérese al código de operación ADD. Si una instrucción ADD tiene
al registro EAX como primer operando y una constante de 32 bits (INMED32) como
segundo, se usa entonces el código de operación O5H y la instrucción tiene una longitud de
5 bytes. (En la figura no se muestran constantes que pueden expresarse en 8 o 16 bits y
que utilizan diferentes códigos de operación.) Si se usa ADD con dos registros como
operandos, la instrucción tiene dos bytes con un código de operación O1H. La clase de
instrucción (arbitraria) 19 se asignaría a todas las combinaciones código de operación-
operandos que siguieran las mismas reglas y se procesarían en la misma forma que una
instrucción ADD con dos registros como operandos.
Si se requiere de literales, durante el ensamblaje se mantiene una tabla de éstas,
creando nuevos elementos cada vez que se encuentra una. Después de la primera pasada,
dicha tabla se ordena para eliminar las literales duplicadas.
La figura 7-6 muestra un procedimiento que puede servir de base a la primera
pasada de un ensamblador. El estilo de programación es digno de mención en sí mismo. Los
nombres de los procedimientos se han elegido de manera que den una idea más o menos
precisa de lo que hacen. Más importante aún, la figura 7-6 representa un esbozo de la
primera pasada que, aunque no está completo, es bueno para empezar. Es lo bastante corto
como para que se entienda con facilidad y se vea claramente que lo siguiente que debe
hacerse es escribir los procedimientos que usa.
222
Algunos de estos procedimientos son bastante cortos, como MiraSiHay- Etiqueta, que
entrega la etiqueta como cadena de caracteres si la hay y una cadena de espacios en blanco
si no la hay. Otros procedimientos, como tipo 0 y tipo 1, pueden ser más largos y llamar a
otros procedimientos a su vez. En general, las clases no serán dos, por supuesto, sino que
dependerán del lenguaje que se ensambla.
La estructuración de los programas de este modo tiene otras ventajas, además de la
facilidad de programación. Si el ensamblador lo escribe un grupo de gente, los
procedimientos pueden repartirse entre sus miembros. Todos los detalles (engorrosos)
sobre la obtención de la entrada están escondidos dentro de LeeSiguienteSentencia. Si
tienen que hacer algún cambio (por ejemplo, debido a un cambio de sistema operativo),
sólo resultará afectado el procedimiento auxiliar y no se necesitaría hacer cambios
directamente en el procedimiento PrimeraPasada.
En algunos ensambladores, las sentencias se almacenan en una tabla después de
leídas. Si la tabla se llenara, debería entonces escribirse en un disco varias veces. Por otra
223
parte, si el programa que está siendo ensamblado es tan corto como para caber en la tabla,
la segunda pasada puede obtener sus entradas de ésta, eliminando las operaciones de E/S
en el disco.
Cuando se lee seudo instrucción END, se termina la primera pasada. Entonces se
ordenan la tabla de símbolos y la de literales, si se necesita. La tabla de literales ordenados
se examina para ver si hay duplicaciones que se puedan eliminar.
La segunda pasada
224
Una vez que se conoce el valor numérico del código de operación y los valores de los
operandos, se puede ensamblar la instrucción completa, la que entonces se coloca en un
buffer de salida, para luego escribirla en un disco cuando éste se llene.
La sentencia fuente original y el código objeto generado a partir de ella (en octal o en
hexadecimal) se imprimen o se guardan para su impresión posterior . Después de que se
haya ajustado el CPI, puede extraerse la siguiente instrucción.
Hasta ahora supusimos que el programa fuente no contiene ningún error . Cualquiera
que haya escrito alguna vez un programa en cualquier lenguaje, sabe hasta que punto es
realista dicha suposición. Algunos de los errores mas comunes son:
1. Se ha usado un símbolo no definido.
2. Se ha definido un símbolo mas de una vez.
3. El nombre del campo de código de operación no es un código de operación válido
4. No se le han suministrado al código de operación suficientes operandos
5. Se le han suministrado demasiados operandos al código de operación
6. Un número octal contiene un 8 o un 9
7. Uso no permitido de registros (por ejemplo, salto a un registro)
8. Falta de sentencia END
Los programadores son más ingeniosos cuando se ponen a buscar nuevas formas de
cometer errores. Muchas veces los errores debidos a símbolos indefinidos se deben a
errores de escritura y un ensamblador muy inteligente podría intentar figurarse cuál de los
símbolos definidos se parece más al indefinido y usarlo en su lugar. Poco puede hacerse
para corregir la mayoría de los otros errores. Lo mejor que puede hacer un ensamblador
con una sentencia errónea es imprimir un mensaje de error e intentar continuar
ensamblando.
La tabla de símbolos
225
una distribución uniforme de los valores de salida. Los símbolos se pueden almacenar en
una tabla de k elementos numerados de 0 a k - 1. Todos los pares (símbolo, valor) cuyo
símbolo se transforme en i se almacenarán en una lista encadenada a la que apunte el
ejemplo i de la tabla. Con n/k símbolos y k elementos en la tabla, la media de las longitudes
de las listas será n. Eligiendo k aproximada- mente igual a n, los símbolos se encontrarán
con frecuencia en el primer elemento de la lista correspondiente. Ajustando k podremos
reducir el tamaño de la tabla al costo de búsquedas más lentas. La codificación por
transformación de los símbolos se ilustra en la figura 7-8.
226
MACROS
MOV EAX,P
MOV EBX,P
MOV Q,EAX
MOV P,EBX
227
definiciones de macros para su uso posterior. Desde ese momento, siempre que el nombre
de la macro (CAMBIA, en el ejemplo de la figura 7-9) aparezca como código de operación,
el ensamblador lo remplazará por su cuerpo. El uso del nombre de una macro como código
de operación se denomina llamada a macro y su reemplazo por el cuerpo, expansión de
macro.
La expansión de una macro se produce durante el proceso de ensamblaje, no durante
el proceso de ejecución del programa. Este punto es muy importante. El programa de la
figura 7-9(a) y el de la figura 7-9(b) producirán exactamente el mismo código máquina.
Si se considera solamente el programa en lenguaje máquina, es imposible decir si se han
utilizado macros en su generación, ya que la expansión de macros se terminó y sus
definiciones fueron eliminadas al finalizar el proceso de ensamblaje.
Las llamadas a macros no deben confundirse con las llamadas a procedimientos. La
diferencia básica reside en el hecho de que las primeras indican al ensamblador que
remplace el nombre de la macro por su cuerpo, mientras que una llamada a un
procedimiento es una instrucción de máquina que será insertada en el programa objeto, y
más tarde será ejecutada para llamar al procedimiento. La figura 7-10 compara llamadas a
macro con llamadas a procedimiento.
Llamado a Llamada a
Item
macro procedimiento
Durante la
Durante el
Momento en el que se hace ejecución del
ensamblaje
programa objeto
El cuerpo se inserta en el
programa objeto en todos los
Sí No
sitios donde aparece el
nombre
Es una instrucción de llamada
a procedimiento insertada en No Sí
el programa objeto
Debe usarse una instrucción
retorno para devolver el
No Sí
control a la sentencia que
sigue a la llamada
Número de copias del cuerpo Una por cada
que aparecen en el programa llamada a la 1
objeto macro
Fig. 7-10. Comparación entre llamadas a macro y a procedimientos.
228
Macros con parámetros
El tipo de macros descrito anteriormente se usa para acortar programas en los que se
repite con precisión la misma secuencia de instrucciones varias veces.
Frecuentemente se da el caso de que un programa contiene varias secuencias de
instrucciones que son casi iguales, pero no del todo, como se ilustra en la figura 7-11(a).
Aquí la primera secuencia intercambia P y Q y la segunda R y S.
Los macroensambladores manejan los casos de secuencias casi idénticas permitiendo
que las definiciones de macro acepten parámetros formales y que las llamadas a macro
proporcionen parámetros reales. Cuando se desarrolla una macro, cada parámetro formal
que aparece en el cuerpo se remplaza por el parámetro real correspondiente. Los
parámetros reales se sitúan en los campos de operando de la llamada a la macro. La figura
7-11(b) muestra el programa de la figura 7-11(a) usando macros con parámetros. Los
símbolos P1 y P2 son los parámetros formales. Cada ocurrencia de P 1 dentro del cuerpo de
la macro se remplaza por el primer parámetro actual, cuando la macro se extiende. En
forma similar, P2 se remplaza por el segundo parámetro actual.
CAMBIA P, Q
Fig. 7-11. Secuencia casi idénticas de instrucciones. (a) Sin macro. (b) Con una macro
Para que un ensamblador pueda soportar macros debe ser capaz de realizar dos
funciones: guardar las definiciones y expandir las llamadas. Se examinarán estas funciones
una a una.
El ensamblador debe mantener una tabla de todos los nombres de las macros y, junto
con cada nombre, un apuntador a la definición, de manera que pueda recuperarla cuando la
necesite. Algunos ensambladores tienen una tabla independiente para los nombres de las
macros y otros tienen una tabla combinada de códigos de operación, donde se guardan
todas las instrucciones de máquina, seudo instrucciones y nombres de macros.
Cuando se encuentra una definición de macro, se añaden a la tabla de macros el
nombre de la macro, el número de parámetros formales y un apuntador a otra tabla (la de
definiciones de macros) donde se guarda el cuerpo. También se construye una lista de
parámetros formales para su uso en el procesamiento de la definición. Luego se lee el
cuerpo y se guarda en la tabla de definiciones. Los parámetros formales que aparecen
dentro del cuerpo se indican por una marca especial. Como ejemplo, se muestra a
continuación la representación interna de la definición de la macro CAMBIA, utilizando el
229
punto y coma como "control de carro" y el ampersand como símbolo del parámetro formal.
230
necesario retraducir los procedimientos modificados y no habrá que tocar los demás,
aunque sí será necesario volver a enlazar (relink) todos los módulos objeto. El enlace es
generalmente mucho más rápido que la traducción; de esta manera este proceso de dos
pasos puede ahorrar una gran cantidad de tiempo durante el desarrollo de un programa
largo.
231
Tareas realizadas por el programa ensamblador
232
Este problema, llamado de reubicación, tiene lugar porque cada módulo objeto de la
figura 7-13 representa un espacio de direccionamiento distinto. En una máquina con
espacio de direccionamiento segmentado, como el del MULTICS, cada módulo objeto puede
tener el espacio de direccionamiento situado en su propio segmento. En una máquina con
una memoria lineal, unidimensional, los módulos objeto tienen que mezclarse en un único
espacio de direccionamiento. La naturaleza bidimensional de la memoria virtual del MUL
TICS elimina la necesidad de mezclar los módulos objeto y simplifica en gran medida la
tarea del ensamblador. Los distintos espacios de direccionamiento de los módulos objeto
deben también mezclarse en una máquina que tuviese una memoria paginada
unidimensional.
Además, las instrucciones de llamada a procedimientos de la figura 7-14(a) tampoco
funcionarán. En la dirección .400, el programador ha intentado llamar al módulo objeto B,
pero ya que cada procedimiento se traduce por separado, el ensamblador no puede saber
cuál es la dirección que ha de poner en la instrucción de llamada. La dirección del módulo
objeto B no se conoce hasta el momento del enlace. Este problema recibe el nombre de
referencias externas. Estos dos problemas pueden ser resueltos por el programa
233
ensamblador .
El programa ensamblador mezcla los distintos espacios de direccionamiento de los
módulos objeto para conseguir un espacio de direccionamiento único y lineal en los
siguientes pasos:
1. Construye una tabla de todos los módulos objeto y sus longitudes.
2. Basado en esta tabla, asigna una dirección de carga a cada módulo objeto.
3. Busca todas las instrucciones que contengan una dirección de memoria y, a
cada una de ellas, le suma una constante de reubicación igual a la dirección de
comienzo del módulo en el que están contenidas.
4. Busca todas las instrucciones que hacen referencia a otros procedimientos e
inserta en ellas la dirección de los mismos.
La tabla de módulos objeto construida en el paso 1 se muestra aquí para los módulos
de la figura 7-14:
Los módulos objeto contienen seis partes, como se ve en la figura 7-15. La primera
contiene el nombre del módulo, cierta información necesaria para el ensamble, como las
longitudes de las distintas partes del módulo objeto y, algunas veces, la fecha de
ensamblaje.
Identificación
Lista de reubicación
Fin de módulo
La segunda parte del módulo objeto es una lista de los símbolos definidos en el
módulo a los que otros módulos pueden hacer referencia, junto con sus valores. Por
ejemplo, si el módulo consta de un procedimiento llamado “GRANLIO”, entonces la tabla de
234
puntos de entrada contendrá la cadena de caracteres "GRANLIO" seguida de la dirección a
la cual corresponde. El programador en lenguaje ensamblador indicará qué símbolos han de
ser declarados como puntos de entrada o símbolos externos usando una seudo instrucción.
La tercera parte del módulo objeto consta de una lista de los símbolos que usa, pero
que están definidos en otros módulos, junto con otra que dice qué instrucciones usa cada
uno de esos símbolos. Con esta última lista el ensamblador inserta las direcciones correctas
en las instrucciones que usan símbolos externos. Un procedimiento puede llamar a otros
procedimientos traducidos independientemente declarando como externos los nombres de
dichos procedimientos. El programador en lenguaje ensamblador indica los símbolos que
han de ser declarados como externos mediante una seudo instrucción. En algunas
computadoras, las tablas de puntos de entrada y de referencias externas se combinan en
una sola.
La cuarta parte del módulo objeto contiene el código ensamblado y las constantes.
Esta es la única parte del módulo que se cargará en memoria para su ejecución. Las otras
cinco partes las usará el montador (linker) y serán descartadas antes de que comience la
ejecución.
La quinta parte del módulo objeto es la lista de reubicación. Como se ve en la figura
7-14, a las instrucciones que contengan direcciones se les debe sumar una constante de
reubicación. Como el montador (linker) no tiene manera de saber por inspección cuáles
palabras de la parte cuatro son datos y cuáles son instrucciones, esta tabla proporciona la
información sobre cuáles son las direcciones que hay que reubicar .La información puede
tomar la forma de una tabla de bit, con un bit por cada dirección potencialmente reubicable,
o una lista explícita de direcciones que han de re ubicarse.
La sexta parte es una indicación de fin de módulo ya veces contiene una información
redundante especial para descubrir errores mientras se lee el módulo y la dirección en la
que ha de comenzar la ejecución.
La mayor parte de los montadores (linkers) requieren dos pasadas. En la primera, el
montador (linker) lee todos los módulos objeto y construye una tabla de nombres de
módulos y longitudes. La otra, de símbolos globales, contiene todos los puntos de entrada y
las referencias externas. En la segunda pasada se leen los módulos objeto, se re ubican y se
enlazan uno a uno.
235
El problema de mover programas que ya han sido ensamblados y reubicados está
íntimamente relacionado con el momento en que se hace la ligadura final entre los nombres
simbólicos y las direcciones absolutas de la memoria física. Cuando se escribe un programa,
contiene nombres simbólicos para las direcciones de memoria, como en SALTA LUGAR. El
momento en que se determina la dirección real de memoria correspondiente a LUGAR se
llama tiempo de ligadura. Hayal menos seis posibilidades para el tiempo de ligadura:
1. Cuando el programa se escribe.
2. Cuando el programa se traduce.
3. Cuando se liga el programa, pero antes de cargarse.
4. Cuando el programa se carga.
5. Cuando se carga un registro de base usado para direccionamiento.
6. Cuando se ejecuta la instrucción que contiene la dirección.
236
Si una instrucción que contenga una dirección de memoria se moviera después de la
ligadura, sería incorrecta (suponiendo que el objeto al que haga referencia se haya movido
también). Si el traductor produjera un módulo de carga absoluto como salida, la ligadura se
habría producido en el momento de la traducción y el programa debería ejecutarse en las
direcciones en las que el traductor esperaba que lo hiciera. El método de ensamblado que
se ha descrito en la sección anterior liga los nombres simbólicos con las direcciones
absolutas, por lo que el programa no funcionará si se mueve a direcciones diferentes
después del ensamblado, como se muestra en la figura 7-16.
Hay dos cuestiones relacionadas con esto. La primera se refiere al momento en que
los nombres simbólicos se ligan con direcciones virtuales; la segunda, al momento en que
se ligan las direcciones virtuales con direcciones físicas. Sólo cuando ambas operaciones se
hayan realizado, el proceso de ligadura estará completo. Cuando el ensamblador mezcla los
espacios de direccionamiento de los módulos objeto en un espacio único y lineal de
direcciones, está de hecho creando un espacio de direccionamiento virtual. La reubicación y
el montaje sirven para ligar los nombres simbólicos con direcciones virtuales específicas.
Esto es cierto tanto si se usa la memoria virtual como si no se usa.
Supongamos por el momento que el espacio de direccionamiento de la figura 7-
14(b) estuviese paginado. Está claro que las direcciones virtuales correspondientes a los
nombres simbólicos A, B, C y D ya han sido determinadas, aunque sus direcciones físicas de
memoria principal dependan del contenido de la tabla de páginas en el momento en que se
usen. Un módulo de carga absoluto es en realidad una ligadura de nombres simbólicos con
direcciones virtuales. Cualquier mecanismo que permita el cambio sin dificultad en el mapeo
entre direcciones virtuales y físicas de la memoria principal, facilitará el movimiento de
programas por la memoria principal, aunque ya hayan sido ligados a un espacio virtual de
direccionamiento. Uno de estos mecanismos es la paginación. Después de que un programa
se haya movido en la memoria principal, solamente habrá que cambiar la tabla de páginas,
no el programa en si.
Un segundo mecanismo es el uso de un registro de reubicación en tiempo de
ejecución, tal como el registro CS en las CPU de Intel. En las máquinas que usan este
método de reubicación, el registro siempre apunta ala dirección de la memoria física de
inicio del programa actual. A todas las direcciones de memoria se les suma el registro de
reubicación, por medio de hardware, antes de enviarlas a memoria. El proceso de
reubicación es por completo transparente al mecanismo es menos general que el de
paginación, ya que implica mover al programa completo como a una unidad (a menos que
haya registros separados de código y de datos, en cuyo caso se le debe mover como a dos
unidades). Es posible tener un tercer mecanismo en máquinas como las CPU 680xO, que
pueden referenciar memoria en forma relativa al contador de programa. Siempre que se
mueve un programa en la memoria, sólo se necesita actualizar el contador de programa.
Los programas cuyas referencias a memoria son en su totalidad relativas al contador de
programa o absolutas (v .g. , a direcciones absolutas en registros de dispositivos de E/S);
se dice que son independiente de la posición. Un procedimiento de este tipo se puede
colocar en cualquier parte del espacio de direcciones virtual, sin necesidad de reubicación.
Enlace dinámico
237
diferentes, se expondrán ambas.
En el MUL TICS existe un segmento asociado a cada programa denominado segmento
de enlace, el cual contiene un bloque de información para cada procedimiento que pudiera
ser llamado. Dicho. bloque se inicia con una palabra reservada para la dirección virtual del
procedimiento, seguida del nombre de éste en la forma de una cadena de caracteres.
Cuando se aplica el enlace dinámico, las llamadas a procedimiento del programa
fuente se traducen a instrucciones que direccionan en forma indirecta la primera palabra del
bloque de enlace correspondiente, como se muestra en la figura 7-17(a). El traductor
llena esta palabra con una dirección inválida o con un patrón de bits que fuerza un desvió.
238
vuelve a ejecutar la instrucción causante de la falta de enlace, permitiendo que el programa
continúe desde donde estaba antes del desvió.
Todas las referencias al procedimiento que tengan lugar después se ejecutarán sin
causar falta de enlace, ya que la palabra indirecta contiene ahora una dirección virtual
válida. En consecuencia, sólo se hará uso del enlace dinámico la primera vez que se llame a
cada uno de los procedimientos.
En el OS/2, el esquema de enlace dinámicos más general que el de MULTICS. Un
programador de OS/2 no necesita saber los nombres de todos los procedimientos que su
programa, en última instancia, llamará. Considérese el ejemplo siguiente. En un sistema
distribuido de operaciones bancarias, una máquina central recibe solicitudes de terminales
distantes para llevar a cabo ciertas transacciones. Al momento de diseñar el sistema, se
esperaba que al evolucionar éste, se incorporaran nuevos tipos de transacciones.
Para permitir la evolución del sistema, se ha decidido con antelación que cada
transacción tenga un nombre y que cada una se lleve a cabo por medio de un procedimiento
del mismo nombre. El código ejecutable para este procedimiento se almacenará como un
archivo con el mismo nombre, en un directorio especial.
Cuando una terminal remota envía un mensaje a la computadora central, éste incluye
el nombre de la transacción. En seguida, el programa de transacción construye el nombre
de archivo que contiene el código relevante y realiza una llamada de sistema solicitando al
sistema operativo que localice el archivo y lo traiga a la memoria. Después, hace una
segunda llamada al sistema operativo para que busque y le proporcione la dirección de
inicio del procedimiento que necesita (el archivo puede contener varios procedimientos).
Teniendo ya esta dirección (en realidad un selector de segmento y un desplazamiento), el
programa principal llama al procedimiento. Las llamadas posteriores al mismo
procedimiento se realizan en la forma normal, sin necesidad de llamadas de sistema.
Debe quedar claro que este esquema hace posible incorporar nuevos procedimientos a
un programa ya probado, compilando simplemente el código objeto relevante y colocándolo
en alguna parte de un disco. Ni siquiera es necesario que el programa sepa por adelantado
en donde se encuentra el procedimiento, ya que esta información puede estar contenida en
el mensaje que se le envía. Tampoco se requiere que el programa detenga su ejecución y se
recompile.
239
CONCLUSIÓN
240
BOLILLA VI (Parte 1):
PERIFÉRICOS
241
INDICE
242
El futuro del DVD: _________________________________________________ 256
PERIFERICOS DE SALIDA: ______________________________________________ 257
PANTALLAS DE SISTEMAINFORMATICO (Monitor): ______________________ 257
Impresoras ___________________________________________________________ 258
Impresoras con cinta entintada: _________________________________________ 258
Impresora de Bola: _________________________________________________ 258
Impresoras de agujas: _______________________________________________ 259
Impresoras sin cinta entintadas: _________________________________________ 259
Impresoras térmicas: ________________________________________________ 259
Impresoras de inyección de tinta: ______________________________________ 259
Impresoras láser: ___________________________________________________ 259
Impresoras Láser de color: ___________________________________________ 259
PERIFERICOS DE COMUNICACION.. _____________________________________ 259
MODEM _____________________________________________________________ 260
Aspectos técnicos ____________________________________________________ 260
Como usar la Tecnología 56K ________________________________________ 260
CONCLUSIóN __________________________________________________________ 261
243
INTRODUCCIÓN
244
APUNTES DE CATEDRA
PERIFÉRICOS
RESEÑA HISTÓRICA
La naturaleza ha dotado al ser humano de diversas habilidades entre las que merecen
destacarse la capacidad de abstracción y la posibilidad de realizar cálculos matemáticos.
Estas habilidades no hubieran progresado en la medida que lo han hecho si el hombre no se
hubiera visto obligado a realizar cálculos complejos mentales o con ayuda de sus dedos.
Debido a esto se vio obligado a ayudase de diversas maneras.
En la historia de la humanidad el ábaco fue la primera herramienta de cálculos
diseñada y construida por el hombre para ayudarse en la realización de operaciones
matemáticas.
Existen diversas variantes de instrumento según las diferentes zonas donde se ha
utilizado:
1. En Oriente se fabricaron los primeros ábacos que todavía se utilizan en algunos
países.
2. En Europa los griegos, posteriormente debido a intercambios comerciales con
otros pueblos.
3. En España el ábaco se utilizo hasta prácticamente el siglo XX pero con el
nombre de contador .
4. En Sudamérica también existieron herramientas que pudieron tener una
utilización similar, como el quipu de loS Incas.
INTRODUCCIÓN
Los periféricos son una serie de dispositivos que conectan a la unidad central del
sistema de la computadora con el exterior permitiendo:
1. Introducir en la computadora la información necesaria, en forma de ordenes de
comando y datos para realizar los procesos necesarios.
2. La comunicación interactiva de la computadora con los usuarios durante el proceso.
3. El envío al exterior de la unidad central del sistema de la computadora de los
resultados obtenidos tras los procesos de información realizados.
Los periféricos son traductores que se encargan de comunicar una computadora que
utiliza un alfabeto de solo dos caracteres con los seres humanos que manejan un alfabeto
con más caracteres.
La eficacia de un sistema informático depende de la velocidad de trabajo de sus
periféricos. Los periféricos se comunican con la unidad central de proceso a través de los
canales de transferencia de información, los buses.
La conexión entre los periféricos y la unidad central del sistema de la computadora se
realiza a través de adaptadores o interfaces.
La comunicación a través de protocolos de comunicaciones que compatibilizan la
transmisión de datos entre ambos. Existen básicamente dos métodos para la transmisión de
datos :
4. Serie: las diversas señales se transmiten bit a bit, una tras otra, sobre el mismo
cable físico.
5. Paralelo: todas las señales que integran una palabra o dato unitario se transfiere
simultáneamente a través de cables separados paralelos.
245
diferentes:
• Línea compartida: Todos los periféricos se conectan a la unidad central del
sistema a través de una sola línea de comunicaciones.
• Radial o en estrella: cada periférico se conecta con la computadora a través
de su propia línea de comunicaciones.
PERLFERICOS DE ENTRADA:
Los periféricos de entrada son subsistemas que permiten la introducción de
información y ordenes en el interior de la p .C .
Los periféricos de entrada de información son los más lentos del sistema informático
por una razón evidente: son manejados por el ser humano. Entre los dispositivos de entrada
se cuentan:
TECLADO:
El método más común de interacción con una computadora es el empleo del teclado,
es la unidad periférica de entrada de datos al sistema informático más universal. El teclado
transforma la pulsación de cada tecla en una señal electrónica particular que es reconocida
por la C.P.U.
Los teclados proporcionan varias respuestas ( desde duras hasta blandas) y tiene
varias disposiciones, dependiendo de su computadora y el modelo del teclado.
La mayoría proporciona el teclado "QWERTY" (debido al orden que siguen las teclas
alfabéticas de la primera fila), el más popular , grandes teclas etiquetadas con letras
romana y punto en relieve en las teclas F, J y 5 para que los programas de procesamiento
numérico puedan utilizar estas teclas y las cercanas para emular una calculadora ( en la
Macintosh, el punto en relieve está en las teclas D , Ky5).
En las PCs, los teclados se conectan a los circuitos de la tarjeta madre. La mayoría de
los teclados en las PCs son del tipo 101 (que brinda 101 tecla), aunque están disponibles
varios estilos con más o menos teclas especiales, diodos emisor de luz (LED) y otras
características, como cubiertas de plástico para aplicaciones industriales o de servicio de
comida.
Los teclados "Macintosh" se conectan al bus de escritorio apple (ADB), el cuál maneja
todas las formas de entrada de un usuario, desde la tabla digitalizadoras hasta los ratones.
246
2° “Teclas de función”
Realiza un conjunto de operaciones especiales especificadas por el fabricante de la
computadora o de la aplicación informática que esté ejecutando en su momento. Las
ventajas de las teclas de función es órdenes a través del teclado.
3° “Teclas numéricas”
Son un bloque de teclas similares al de una calculadora para facilitar el trabajo de
introducción de datos y la realización de operaciones matemáticas. El bloque de teclas
numéricas tienen dos modos de funcionamiento principales: si la tecla NUM LOCK (bloqueo
numérico) está pulsada en el teclado, en la pantalla del sistema informático aparecerán los
dígitos impresos en cada tecla numérica, mientras no este pulsada, las teclas estarán en
modo de control del cursor , pudiéndose utilizar estas teclas para navegar por la pantalla de
la computadora.
4° “Tecla ENTER o INTRO”
Esta tecla se utiliza para indicar a la computadora que ha terminado de introducir
información en una línea
Si se esta trabajando en un programa de aplicación se realizará la acción que
corresponda, por ejemplo, en un procesador de textos el cursos pasará a la línea siguiente.
5° “Tecla CTRL”
Esta tecla se denomina control, y se usa en combinación con otras teclas.
Generalmente sirve para avisar al sistema operativo de que el usuario esta intentando
realizar una acción especial.
6° "Tecla ALT"
Esta tecla se denomina alternar , también es una tecla que provoca acciones
especiales de la computadora o de los programas que estén ejecutándose en ese momento.
Por Ejemplo, pulsando al mismo tiempo la tecla ALT y 164 se leerá en el monitor la letra ñ.
7° “Tecla ESC"
Se denomina escape. como su nombre indica permite "escapar" de algunos .procesos,
como la ejecución de un listado en la pantalla de la computadora, o de algunos programas
de aplicación comercial.
TECLADOS MECÁNICOS :
Son más antiguos que los electrónicos y, en algunos casos, menos fiables y caros de
construir. Los teclados mecánicos presentaron un problema debido a que, por su tecnología
de construcción la parte mecánica de las teclas no efectuaba solo un contacto al pulsarla,
sino que existía un efecto rebote sobre la superficie del contacto eléctrico que enviaba varas
veces la señal al controlador del teclado.
TECLADOS ELECTRÓNICOS:
Solucionaron el problema del efecto rebote creando un retardo en el controlador para
eliminar las señales producidas por el mismo.
Cuidados y advertencias
Si bien el teclado es considerado un dispositivo no frágil, esta expuesto aciertos
riesgos que pueden alterar su normal funcionamiento.
Dentro del teclado existe una placa con un contacto electrónico para cada tecla. Al
presionar una de ellas, se acciona un contacto y la información se transmite a la
computadora a través de cables. Para que este mecanismo se desencadene normalmente
hay que tomar ciertas precauciones :
No es recomendable comer, ni fumar mientras se trabaja en la PC. El teclado tiene la
particularidad de "atraer" las migas y cenizas, estas se van depositando en los intersticios y
al acumularse, termina tapando los contactos, lo que provoca dificultades tales como letras
247
que no se marcan o se repiten y lentitud en la escritura.
Tampoco es una buena costumbre dejar la taza de café cerca del teclado o apoyada
sobre el gabinete, el derrame de cualquier líquido sobre el teclado puede anular el
funcionamiento de los contactos y facilitar al adherencia de suciedad, provocando problemas
como los recién mencionados.
Por otra parte, al quedar expuesto sobre el escritorio, el teclado se convierte en un
inevitable depositario del polvo ambiental. Por ello, se recomienda, cubrirlo con una funda
mientras no este en uso.
Si se desea limpiarlo superficialmente nunca emplee alcohol común o sustancias
solventes ya que puede dañar su mecanismo. En cambio, utilice alcohol isopropílico, un
aerosol de aire comprimido o simplemente un trapo húmedo-
MOUSE (RATON)
A fines de los 60 en California se desarrollo un dispositivo que consistió en una cajita
capaz de ajustarse en la concavidad formada por la palma de la mano ( ergonómicamente ).
El ratón es la extensión del dedo humano para señalar, tocar y escoger los objetos
que se muestran ella pantalla. El mouse es simplemente un controlador del cursos o
puntero que aparece en la pantalla del sistema informático al que se conecta.
Este posee un software asociado que relaciona las filas y las columnas de la pantalla
del sistema informático con un espacio situado en una superficie donde se sitúa el aparato.
Un decodificador convierte el movimiento del ratón en movimiento del cursos en la pantalla
de la computadora.
En el ratón se utiliza una bola de acero pesada, cubierta de goma, metida dentro de
una caja de plástico. Dentro de la caja hay dos ruedas dentadas que se friccionan contra la
bola de acero y que se mueven según se gire la bola a través de una superficie plana. Estas
ruedas son las que informan a los circuitos integrados del ratón los cambios de posición.
Suelen tener dos o tres botones para poder ejecutar las diferentes operaciones por
ejemplo: en el proceso de señalamiento y doble click para abrir un documento o en la
operación de hacer click y arrastrar en la que el botón del ratón se mantiene oprimido, para
arrastrar un objeto o para seleccionar una opción en el menú desplegable.
Existen dos tecnologías principales en fabricación de ratones: Mecánicos y Ópticos.
1- Ratones Mecánicos:
Los ratones mecánicos constan de una bola situada en su parte inferior, la bola, al
moverse el ratón, roza unos contactos en forma de rueda que indican el movimiento del
cursor en la pantalla del sistema informático.
2- Ratones Ópticos:
Los ratones ópticos tienen un pequeño haz de luz láser en lugar de la bola rodante de
los mecánicos. un sensor óptico situado dentro del cuerpo del ratón detecta el movimiento
del reflejo al mover el ratón sobre el espejo e indica la posición del cursor en la pantalla de
la computadora.
Una limitación de los ratones ópticos es que se ubican sobre una superficie que refleje
el haz de luz.
248
Tipos de ratones
Ratones Inalámbricos.
Funcionan en base al envío de una señal infrarroja o una onda de radio a una unidad
receptora la cual es la encargada de enviar la información a la tarjeta correspondiente.
Ratones Estacionarios.
Estos se basan en la tecnología Marble Sensing, que posibilita el usuario un alto grado
de precisión y libertad en los desplazamientos del cursor (Tracking), esto se debe a que a
diferencia de los traskballs y ratones tradicionales, no incorpora elementos mecánicos y por
consiguiente no requiere de mantenimiento. La tecnología Marble Sensing permite la
medición óptica del movimiento mediante un sistema electrónico que actúa como una
cámara, de manera que es capaz de calcular el desplazamiento del cursor
PANTALLAS TÁCTILES:
Este dispositivo se usa en espacios reducidos y /o en lugares abarrotados de objetos,
donde el movimiento del mouse se toma dificultoso, su aspecto es agradable y fino y su
ergonomía se adapta de manera cómoda y natural. Su funcionamiento es simple para ello
basta con posesionar un dedo sobre el pequeño pad y desplazarlo por su superficie, que
hace las veces de pantalla, no acepta otros objetos como lápices o puntos. El click se puede
hacer tanto presionando las dos pequeñas teclas ubicadas sobre el pad como ejecutando un
leve golpe sobre su superficie, no requiere mantenimiento físico , al no experimentar
continuos movimientos con el uso, su cable presupone una mayor vida útil.
Una de las desventajas es que su precisión no es como la del mouse pero la mayor
dificultad se registro al intentar manejar el dispositivo con la mano húmeda, el puntero se
desplaza a la deriva por la pantalla.
BOLAS GIRATORIAS:
Son similares a los ratones, excepto que el cursor se mueve utilizando uno o más
dedos para hacer girar la bola, no necesitan una superficie plana como el ratón esto es
importante para ambientes reducidos y computadoras portátiles de baterías. Las bolas
giratorias tienen al menos dos botones: uno para hacer click o doble click y otro para
seleccionar menú y arrastrar objetos.
ESCANER
Son lectores ópticos de imágenes. No es fácil almacenar imágenes dentro de la
computadora, la única forma fácil y rápida de hacerlo es utilizando un periférico de este
tipo. Los escáner leen imágenes en dos dimensiones y las convierten en bits.
El principio de funcionamiento de un escáner es la digitalización, es decir, la
conversión de una información analógica a datos comprensibles por la P.C. para ello se vale
de una serie de componentes internos que posibilitan este objetivo. Una fuente de luz va
iluminando, línea por línea la imagen o documento en cuestión y la luz reflejada en la
imagen es recogida por los elementos que componen el CCD (Charged-Couple Device)
dispositivo que convierte la luz recibida en información analógica. Por último un DAC
(Digital- Analog Converter) convierte los datos analógicos en valores digitales.
Los escáner se asocian a un tipo de software especialmente diseñado pata el manejo
de este tipo de información en código binario llamados OCR (Opticals Character Recognition
o reconocimiento óptico de caracteres); que permiten reconocer e interpretar los caracteres
de teclados por el escáner en forma de una matriz de puntos e identificar y determinar que
caracteres son los que el subsistema está leyendo .
Un caso particular de la utilización de un escáner ~ aunque representa una de sus
principales ventajas, es la velocidad de lectura e introducción de la información en el
sistema informático con respecto al método tradicional de introducción manual de datos por
medio del teclado, llegándose a alcanzar los 1200 caracteres por segundo.
Profundidad de color
El parámetro expresado en bits, indica el número de tonalidades de color que un píxel
249
puede adoptar; lo normal en la actualidad es un valor de 24 bits por píxeles. Los 24 bits de
color se han convertido en un estándar .
Hay algunos escáner capaces de utilizar 30 o incluso 36 bits de color, pero la mayoría
lo hacen a nivel interno, para disminuir el intervalo entre una tonalidad y la siguiente, pero
solamente envían a la PC 24 bits.
Tipos de escáner:
Existen tres tipos :
• Escáner de mano.
• Escáner de sobremesa.
• Escáner de rodillo.
Escáner de mano:
Es la alternativa más económica, puesto que elimina gran parte de los mecanismos
que encarecen a los dispositivos de sobremesa: más correctamente el de tracción y que es
el usuario el que mueve el escáner sobre la imagen o documento a digitalizar .
Ventaja:
• Es económico.
• Ahorra espacio
Desventajas:
• La poca fiabilidad en cuanto al proceso ya que depende de la
habilidad y el pulso del usuario y mover el escáner de forma
demasiado lenta o rápida puede afectar el resultado final.
Escáner de Sobremesa:
Representan la alternativa más profesional y de calidad, aunque también
más cara y realmente son los que más se están extendiendo. A modo de
pequeñas fotocopiadoras, el documento o imagen se coloca sobre un cristal
bajo el cual la lente luminosa se desplaza, digitalizando el documento.
Ventajas:
• Permite obtener una gran calidad y fiabilidad.
Desventajas:
• Su tamaño .
• Su precio.
Escáner de Rodillo:
Es una interesante alternativa, a medio camino entre los dos anteriores, como su
nombre lo indica utiliza como mecanismo de tracción un rodillo que recoge
automáticamente el documento y lo digitaliza. La calidad obtenida no es tanta como los
modelos de sobremesa pero es una excelente opción para usuarios con determinadas
necesidades.
Calibración
Estos dispositivos necesitan ser calibrados, muchos escáner de mano incluyen una
hoja con diferentes tonalidades de color, que debe ser digitalizado para que nuestro
periférico, establezca los patrones necesarios. Aunque todos los modelos permiten la
calibración cada vez se utiliza con mayor frecuencia-
250
verticales.
Cada vez son más los productos que llevan en su etiqueta uno de estos códigos
donde, por medio de las barras verticales de color negro, se consigue una identificación
para todo tipo de productos.
Esta codificación ha sido definida de forma estándar por la Organización de Estándares
Internacionales y, en ella, cada una de las líneas tiene un determinado valor dependiendo
de su presencia o ausencia y también de su grosor .
Los lectores de código de barras captan los datos de entrada al sistema informático al
hacer pasar delante de un censor óptico la serie de barras verticales codificadas. El principal
uso que se le da a estos subsistemas es el de control de mercaderías, como así también el
control de acceso de personal en instalaciones de distinta índole.
Los censores lectores de barras pueden estar fijos en una estructura de diferentes tamaños
y tecnologías, como pueden ser los que tienen en las cajas de algunos supermercados, o
bien en forma de lápiz óptico .
El censor lector de las barras convierte el código de barras en impulsos eléctricos que
representa la información contenida en la etiqueta. A su vez, un decodificador convierte los
pulsos eléctricos en código binario para su tratamiento en la computadora.
TABLETA DIGITALIZADORA
Son herramientas que permiten el manejo del cursor a través de la pantalla del
sistema informático y facilitan una importante ayuda en el tratamiento de los comandos de
órdenes en aplicación de CAD / CAM (Diseño asistido por computadora).
Las tabletas digitalizadoras convierten una serie de coordenadas espaciales en un
código binario que se introduce en la computadora. Estas coordenadas serán manejadas
posteriormente por programas de dibujo, ingeniería, etc.
La tableta suele tener impresos en su armazón pulsadores con símbolos dibujados
para ejecutar de modo directo comandos que agilizan el trabajo de manejo de software.
Estas tabletas poseen una resolución de alrededor de una décima de milímetro y
pueden manejar gráficos en dos y tres dimensiones.
Una posibilidad de manejo muy intuitiva convierte a las tabletas digitalizadoras en
unas herramientas muy útiles y polivalentes en los sistemas informáticos de diseño y
manejo de gráficos.
Existen diversas tecnologías de construcción de tarjetas, pudiendo ser estas:
• Tabletas Mecánicas
• Tabletas Electrónicas.
La mecánicas, debido al desgaste producido en sus componentes por el uso
continuado, son menos precisas y más delicados de manejar que las electrónicas, siendo
esta, por ello, la más extendidas comercialmente en el mercado.
LAPIZ OPTICO:
Los lápices ópticos son dispositivos de introducción de datos que trabajan
directamente con la pantalla de la computadora, señalando puntos en ellas y realizando
operaciones de manejo de software. Para operar con el lápiz óptico se coloca este sobre la
pantalla del sistema informático. En el momento en el que el cañón de rayos catódicos de la
pantalla barre el punto sobre el que se posiciona
El lápiz, este envía la información aun software especial que la maneja. El
microprocesador calcula cual es la posición sobre la pantalla de la computadora permitiendo
manipular la información representada en ella. Los lápices ópticos permiten la introducción
de datos, el manejo del cursor, etc., en la pantalla de la computadora. Son una asistencia
251
para la limitaciones de los teclados en algunas aplicaciones, sobre todo las que no son de
gestión puras ( creativas, etc.).
PERIFERICOS DE ALMACENAMIENTO:
Los periféricos de almacenamiento, llamados también de memoria auxiliar, son unos
dispositivos en los que se almacenan, temporal o permanentemente, los datos que va a
manejar la CPU durante el proceso, y que no es posible mantener en la memoria principal.
Los periféricos de almacenamiento se pueden clasificar de acuerdo al modo de acceso
a los datos que contienen:
• Acceso Secuencial: debe seguir una secuencia donde la información que requiere,
puede estar al principio o al final del soporte que lo contiene, es decir que si o si
debe recorrer todo el espacio ocupado hasta donde se encuentre la información
solicitada-
• Acceso Aleatorio: el elemento de lectura accede directamente a la dirección donde
se encuentra almacenada físicamente la información, sin tener que pasar
previamente por la entre el principio de la superficie de grabación y el punto donde
se almacena la información buscada.
Discos
Los discos son dispositivos que están fabricado en un material rígido o flexible y se
utilizan habitualmente como periféricos de apoyo al proceso de la computadora, siendo el
principal medio de almacenamiento de la información que utilizan las computadoras. El
acceso a la información almacenada se realiza en forma aleatoria.
Habitualmente se les conoce como memoria masiva.
La clasificación de los tipos de discos magnéticos es de carácter físico. Se diferencian
entre sí en el soporte sobre el que se deposita la capa de material magnético. Los discos
magnéticos se clasifican en:
• Discos Flexibles (floppy disks )
• Discos Duros (hard disks)
Una computadora personal posee una o dos unidades para trabajar con discos
flexibles. A estas unidades de trabajo se las denominan disqueteras. El tamaño de los discos
que se utilizaran en las disqueteras puede ser de 31/2 pulgadas (unidad "A") o de 5 1/4
pulgadas (unidad "E").
Los discos duros generalmente se denominan unidad "C". Los discos duros tienen
mayor capacidad de almacenamiento sobre el mismo espacio que los discos flexibles, debido
a que aquellos tienen una mayor densidad de pistas por pulgada.
La velocidad de acceso a la información es considerablemente mayor en los discos
duros que en los disquetes debido a la mayor velocidad de giro de los platos de los discos
duros ya que no existen fricción entre las cabezas lectoras y los platos del disco.
La principal ventaja que poseen los disquetes frente los discos duros es su
portabilidad.
Discos flexibles
Son unos de los componentes más delicados del sistema informático, debido a que la
portabilidad, precisamente su ventaja, implica que sean muy vulnerables a los malos tratos
por una manipulación descuidada cuando se encuentran fuera de las disqueteras de la
computadora.
Actualmente existen dos formatos de discos flexibles que se diferencia según la
252
longitud de su diámetro: los de 5 1/4 pulgadas y los de 31/2 pulgadas. Es este ultimo
formato el que se está imponiendo en estos momentos por su mayor seguridad y facilidad
de manejo.
Las diferencias entre los dos formato s, además del tamaño ya reseñado, se presenta
en:
Disco duro
El primer disco duro surge a mediados de los años cincuenta diseñado por mM. Tenia
un tamaño aproximado de un televisor y sólo podía almacenar 5 megabytes de datos; su
tiempo medio de acceso era aproximadamente de medio segundo.
En la actualidad, un disco duro con una capacidad de un gigabyte cabe en la palma de
la mano y su tiempo de acceso es de unos 12 milisegundos.
Los discos duros son el principal subsistema de almacenamiento de información en los
sistemas informáticos.
El interior de un disco duro se compone de unas o varias placas cuya superficie está
magnetizada y una serie de cabezas lectoras, una para cada una de las diferentes
superficies en que se divide cada placa.
La superficie útil total del disco duro se divide en:
253
tamaño donde se graba la información. En los discos la información
se graba en serie, ya que las pistas tienen un bit de ancho, en las
cintas, la información se graba en paralelo puesto que están
compuestas de 9 pistas paralelas.
• Sectores: El sector la mínima cantidad de información que se
maneja al realizar un acceso al disco.
La división del disco se realiza para hacer más rápido el acceso a la
información almacenada en la superficie, ya que para la cabeza
lectora es mucho más sencillo saber que la información a localizar
está, por ejemplo, en la pista 3 sector 5 que tener que buscar esa
información por toda la longitud de la pista 3 .
• Cilindros: El cilindro está formado por la totalidad de las superficies
útiles existentes en las diferentes placas que forman el disco duro. La
razón por la que se realiza esta división es que la superficie de una
placa del disco es limitada, pero si se instalan varias placas
superpuestas dentro de la misma carcasa del disco duro, cada una
con su dispositivo de lectura-escritura se aumenta la capacidad de
almacenamiento del disco.
El disco duro que se instala en la unidad central del sistema de una microcomputadora
se denomina Winchester .
Esta tecnología se caracteriza porque la cabeza lectora no toca físicamente al disco
duro. La principal ventaja del método Winchester es que ni 1a superficie del disco ni la
cabeza de lectura sufren desgaste por el razonamiento, por ello es mucho mayor el tiempo
de vida medio de estos subsistemas de almacenamiento.
La carcaza es de un material rígido, metálico o plástico de gran dureza que sirve para
proteger físicamente los discos y cabezales situados en el in6terior del subsistema.
Existen dos tipos principales de discos duros:
1. Discos fijos:
Los discos fijos se fabrican dentro de una carcasa sellada de la que
no se puede extraer. El montaje de los componentes internos del
disco se realiza en la fabrica con unas condiciones muy estrictas de
limpieza y aislamiento para evitar la entrada de polvo que pudieran
deteriorarlo. Por ello nunca debe abrirse la carcasa de protección de
un disco duro excepto por personal técnico en las condiciones
adecuadas.
2. Disco removibles:
Los discos removibles están montados en un contenedor, también
sellado, que ,les permite entrar y salir de unos habitáculos
especiales. Estos habitáculos están situados en la carcasa de la
computadora o bien conectados a ésta por medio de un cable
interfaz.
Discos opticos:
Los discos ópticos son un medio de almacenamiento de información que permite una
mayor flexibilidad, seguridad y capacidad de almacenamiento que los subsistemas
convencionales de almacenamiento magnético (disquetes y cintas). Su base técnica es
similar ala de los "compact disks" (disco de música) pudiéndose almacenar alrededor de 600
megabytes de información por cada disco.
En estos momentos la principal función de los discos ópticos es la distribución
comercial de software debido a su gran capacidad de almacenamiento.
254
Existen dos tipos diferentes de discos ópticos, dependiendo de la posición del escrito o
no sobre el disco:
1. Técnica láser:
La técnica láser graba la información agujereando, mediante un rayo,
un soporte sensible a su acción y lee, mediante un rayo similar, la
información contenida en el soporte. Como los agujeros son
permanentes, la información grabada también es permanente. Cada
posición de un agujero es un bit que tomará uno de los dos valores
posibles del código binario.
2. Técnica magneto-ópticas:
Las técnicas magneto-ópticas se basan en un material de una
superficie magnética que al ser calentado a gran temperatura por el
láser e inducido por una corriente eléctrica cambia su polarización
magnética y se almacena la información.
La ventaja de esta seguridad técnica es la no destructividad, el láser no realiza
agujeros como en el caso anterior, pudiéndose grabar información varias veces sobre la
misma superficie.
Cintas magneticas:
Las cintas magnéticas son el tipo más elemental de los periféricos destinados al
almacenamiento de datos. Fueron el primer subsistema que utilizó un medio magnético
como soporte de almacenamiento masivo de información.
En su origen las cintas magnéticas se utilizaron como unidades de almacenamiento y
apoyo al proceso de información, de la misma manera que ahora se utilizan los discos, si
bien en la actualidad, debido a sus limitaciones, se utilizan generalmente sólo como soporte
de copias de seguridad.
La primera unidad de cinta se comercializó a primeros de los años cincuenta, poseía
una capacidad de almacenamiento de 1,44 megabytes un tamaño similar al de un disquete
de 31/2 pulgadas. El soporte físico sobre el que se construye la cinta es una tira de plástico
de media pulgada (1,25cm) de ancho y unos 800 metros de largo sobre la que se deposita
una capa de un material magnético donde se realiza la grabación y lectura.
La principal ventaja de utilizar este tipo de soporte es su bajo costo. La diferencia
entre las cintas magnéticas y el disco es el tipo de acceso, es decir , en las cintas
magnéticas el acceso es puramente secuencial mientras que en el disco el tipo de acceso es
de forma aleatoria.
El inconveniente es su lentitud, comparada con los demás medios de almacenamiento
actuales, también es que no puede utilizar toda su longitud para almacenar datos.
DVD:
La cinta de video permitió a los poseedores de aparatos reductores/ grabadores poder
ver y grabar películas y programas de TV .
Uno de los problemas a los que se enfrentaron en un principio fue la existencia de dos
formatos incompatibles entre sí: VHS y Betamax. Al final la batalla la ganó el sistema VHS
por el gran número de películas que se lanzaron en dicho formato ya pesar de que la
cantidad de imagen y sonido era inferior ala ofrecida por Betamax.
Para solucionar esta carencia se creo el Láser Disk. La cantidad era superior ,el sonido
era equiparable al del Compact Disk, los discos duraban más, y se podía acceder a
diferentes secciones de la película.
Los discos eran demasiados grandes, había que darles la vuelta y sobre todo, no se
podía grabar. Los fabricantes volvieron a digitalizar y comprimir las películas mediante
tecnología MPEG-1 , lanzaron al mercado el video-cd, que ofrecía gran calidad de imagen y
sonido sobre un soporte mas extendido como era el CD. La idea de formato CD era buena
pero se necesitaba conseguir mayor calidad a base de aumentar la capacidad de los discos.
255
En 1994 surgieron dos propuestas diferentes entre si: Toshiba y Time Warner (entre otras)
presentaron su proyecto de un disco de doble cara llamado SD (Super Density), mientras
que Philips y Sony hicieron lo propio el MMCD (multimedia CD) pero con un disco de una
sola cara aunque con dos capas.
Luego surgió el disco de doble cara ya la vez de doble capa llamado Digital Vídeo Disk
o DVD. Poco después, y viendo el potencial que podría tener en el mundo de la informática,
el nombre paso a ser digital Versatile Disk. El cambio del nombre se debió a que no solo
serviría para almacenar vídeo sino que también podría almacenar datos y sonido .
La compresión MPEG-2:
Al igual que sucede con el video-cd o el CD-I ,la imagen se encuentra comprimida
pues de no ser así se necesitaran 700 Mb. para almacenar únicamente 6 minutos de vídeo.
La diferencia es que en esta ocasión se ha optado por la compresión MPEG~2 bastante mas
avanzada que su predecesora .A pesar de que el concepto que envuelve a la norma MPEG-2
es similar ala MPEG-l se han incluido extensiones para cubrir un rango de aplicaciones mas
amplio como la cuantizacion no lineal, la división de la señal de vídeo en dos o mas canales
a diferente resolución o la inclusión de canales de datos diferenciados. Al hacer uso de la
Tecnología de comprensión MPEG se llega a una cantidad que ronda el medio megabytes
por segundo.
256
PERIFERICOS DE SALIDA:
Los periféricos de salida son las unidades del sistema informático a través de las que
la computadora entrega información al mundo exterior .
La tecnología de los periféricos de salida ha evolucionado mucho desde que la
computadora entregaba su respuesta en una cinta o en una hoja de papel. En la actualidad,
sé esta experimentando con periféricos de salida mucho más intuitivos y fáciles de
comprender para el hombre como los sintetizadores de voz, etc.
257
Modo Gráfico : La pantalla del sistema informático se divide en una serie de punto de
información que aparece en su superficie.
El tamaño lógico de la pantalla de la computadora está directamente relacionado con
la cantidad de información en forma de puntos por filas que proporciona la tarjeta
gráfica conectada a la pantalla del sistema informático. El número de punto puede
llegar los 1280 puntos por 1024 filas en las tarjetas gráficas SVGA.
Es evidente la mayor potencia del medio gráfico que el modo de texto, por ello, en la
actualidad, prácticamente todas las tarjetas controladoras de los subsistemas de vídeo
de las computadoras trabajan en modo gráfico.
Impresoras
Su función en el sistema informático es obtener una copia en papel de la información
existente en memoria o en disco.
Para que una impresora pueda funcionar correctamente debe estar en posición ON-
LINE, lo que quiere decir, que se encuentre en líneas con la computadora a la espera de
recibir datos que el usuario a solicitado imprimir .
La introducción de circuitos integrados en los mecanismos de las impresoras a
permitido una mayor flexibilidad y potencia con respecto a las primeras teletipos
completamente electromecánico que actuaban como periféricos de salida en algunos
sistemas informáticos antiguos.
La instalación de memoria intermedias y otras de ayudas electrónicas ha ayudado a
mejorar los subsistemas de impresión al descargar partes de las tareas de impresión desde
la C.P.U. en estos controles internos de la impresora.
Dependiendo de su tecnología de construcción, las impresoras pueden dividirse en:
• Impresoras con cinta entintada.
- Impresoras de margaritas
- Impresoras de bolas.
- Impresoras de agujas.
• Impresoras sin cinta entintada.
- Impresoras térmicas
- Impresoras de inyección de tintas
- Impresoras láser.
- Impresoras láser color.
- Impresoras de películas gráficas.
Impresora de Bola:
Son similares alas impresoras de margaritas pero de mejor calidad. Los caracteres se
sitúan sobre una esfera metálica que posiciona al carácter en el punto de impresión y
golpea ala cinta entintada para imprimirlo.
258
Impresoras de agujas:
En las impresoras de agujas el cabezal esta formado por 7 o 9 agujas que golpean una
cinta entintada entre ésta y el papel, cada una de ellas tiene la posibilidad de un cierto
movimiento horizontal. Con esta capacidad se puede generar matrices de 7 por 5 o 9 por 7
puntos con los que se forman los diferentes caracteres.
Impresoras térmicas:
El método es similar a las aguja, pero se diferencian en que, en lugar de utilizar un
papel normal, utilizan un papel especial termo sensible y en lugar de las agujas utilizan
unas resistencias eléctricas que al calentarse y apoyarse sobre el papel, van generando loS
caracteres.
Esta tecnología ha ido retirándose poco a poco del mercado debido a que el paso del
tiempo, la luz y, sobre todo, el calor afectaban mucho al papel termo sensible,
deteriorándose con el tiempo. Aunque en la actualidad es comúnmente utilizada por los
equipos de fax.
Impresoras láser:
El fundamento de este tipo de impresoras es un láser de baja potencia que genera un
rayo que es manejado por un elemento de control que permite o bloquea el paso de la luz.
Un disco de espejo desvía al rayo barriendo repetidamente el tambor fotoconductor,
quedando los caracteres trazados eléctricamente sobre el tambor . Al girar este se le aplica
un polvo de tinta pulverizada llamado tonner similar a la existentes en las fotocopiadoras y
que solo se adhiere a las zonas expuestas a rayos láser. Esta tinta es la que finalmente
forman los caracteres.
La impresoras láser son las que poseen una tecnología de impresión más rápida (
entre 4 y 8 paginas por minutos) y también una mayor definición de caracteres o gráficos
que van a formar el resultado final, obteniendo entre 300 y 600 puntos por pulgada.
PERIFERICOS DE COMUNICACION..
259
MODEM
Los ordenadores trabajan con información digital (todos los datos) se almacenan en
forma de 1 y O. Las líneas, sin embargo, suelen analógicas t y trasmiten los datos como una
señal continua con una serie de picos y valles.
El Módem es un Modulador/Demodulador (de allí su nombre). Modulas los datos
digitales que salen del ordenador convirtiéndolos en una señal analógica. Después demodula
esta señal que entra en el ordenador convirtiéndola de nuevo al formato digital.
Aspectos técnicos
La tecnología 56 K es algo diferente que la de los Modems analógicos de 14.000~
28.000 y 33.660. Para alcanzar mayores velocidades deben utilizar conexiones parcialmente
digitales.
La línea telefónica análoga es el factor que limita la velocidad de transferencia de los
datos debido al ruido que introduce en las transmisiones.
Las líneas digitales también generan ruido y tienen un. límite en la velocidad de
transmisión. Pero tiene menos ruido y, además, permiten una velocidad de transmisión
mayor ala de las análogas.
Poco a poco, todas las redes telefónicas se están convirtiendo al formato digital.
El Sistema Telefónico como una red digital con una porción analogica
Los fabricantes de Modems han creado técnicas que utilizan las ventajas de esta
porción digital de la red telefónica para conseguir mayores velocidades de transmisión
puramente analógica. En general, estas nuevas técnicas tratan el sistemas telefónico como
una red digital que tiene una porción analógica.
Esta conexión semi-digital obliga a varios compromisos. El más importante ellos es
que el Proveedor de Servicios de Internet debe poseer líneas telefónicas digitales.
Los Modems 56 K consiguen una velocidad de transmisión más elevada que los
módems tradicionales. Se evita así, una conversión desde una línea digital a otra analógica
en la conexión entre el usuario y el Proveer de Servicios.
Las conexiones normales se inician sobre una línea analógica. La compañía telefónica
las convierte en digitales y vuelven a convertirse en analógicas, en el -5egmento final ante
de llegar al proveer de servicios. Las conexiones 56K comienzan siendo analógica, se
convierten en digitales y, sin embargo, no se vuelven a convertir en analógica en el
proveedor de servicios.
Los Modems 56K tiene sentido para algunas aplicaciones aunque no para otras. Por
ejemplo, las comunicaciones de módem a módem, no pueden aprovechar las mayores
velocidades, ya que necesita de los sistemas de un ISP en uno de los extremos de la
conexión, sin embargo, son útiles para acceder a Internet.
260
de forma rápida y sencilla sin tener que comprar un módem nuevo o enviarlo a la fábrica
para que actualicen su hardware.
CONCLUSIÓN
Al haber realizado el trabajo de investigación nos ayuda a tener una idea concreta
sobre los tipos de periféricos analizando y determinando en cada caso cual es el más
conveniente para el usuario.
A merced de esto el trabajo grupal ayuda a establecer pautas que se deberán seguir a
medida que se progresa en la investigación.
Hubo que investigar en distintos libros y revistas y así ir determinando lo que cada
integrante debía realizar para lograr un buen fin. También nos ha dejado como enseñanza
que en el momento de adquirir un equipo debe tenerse en cuenta distintos aspectos como
ser:
Velocidad,
Capacidad de la RAM,
Servicio Técnico,
Sistema operativo,
y elegir para nuestra conveniencia
y alcance los demás periféricos.
261
CONCLUSIÓN
262
BOLILLA VI (PARTE 2):
TÉCNICAS Y DISPOSITIVOS
DE ENTRADA SALIDA
263
INDICE
264
INTRODUCCIÓN
265
APUNTES DE CATEDRA
Cuando un ordenador recibe los datos de entrada en fichas son necesarios los
siguientes dispositivos:
• Una máquina perforadora para transformar manualmente los documentos originales
en fichas perforadas;
• Una máquina verificadora para controlar que las perforaciones de las fichas sean
exactas;
• Una máquina selectora para ordenar las fichas en base a campos determinados.
Realmente esta máquina casi no se utiliza, ya que se prefiere, desde que las
posibilidades del ordenador lo permiten, cargar las fichas desordenadas en un
soporte magnético y que esta tarea de ordenar la realice el mismo ordenador
mediante un programa (programas de selección):
• Lectora de fichas conectada al ordenador.
Antes de hablar de estos dispositivos veamos en qué consiste una ficha.
Se trata de una pequeña cartulina rectangular con una discreta resistencia y un buen
aislamiento eléctrico. La ficha esta dividida en 80 columnas y 12 filas. Las filas están
numeradas físicamente de 0 a 9, existiendo también dos filas superiores a la fila 0 (la 11 y
la 12).
La característica de las fichas es representar los datos carácter a carácter. Las cifras
se representan con una perforación en la fila correspondiente; las letras del alfabeto se
obtienen por medio de dos perforaciones , de las que la superior puede ser la 12 (línea más
266
alta) o la 11 o la 0. Para los caracteres especiales se usan tres perforaciones en un misma
columna. Obviamente, no se aprovechan todas las combinaciones posibles de las
perforaciones en una columna.
Las perforadoras, como su nombre indica, taladran, perforan las fichas introducidas
(en la fig. 1, ejemplo de una perforadora Honeywell Bull). Los modelos más perfeccionados
pueden incluso escribir en el borde superior el contenido de la perforación. Se parecen, al
igual que las verificadoras, a máquinas de escribir. La única diferencia reside en su mayor
tamaño. En estas perforadoras se puede introducir un programa, representado por una ficha
perforada, el cual, reflejando el contenido de la ficha, facilita la perforación de un grupo de
fichas.
En las verificadoras, las fichas llegan ya perforadas y comprueban, pulsando sobre el
teclado, las perforaciones existentes.
267
Foto. Detalle de una lectora de fichas (Foto cedida por Honeywell Bull)
Las lectoras de fichas, con un mecanismo de arrastre, hacen llegar las fichas hajo el
dispositivo de lectura, que puede ser electromecánico o fotoeléctrico. La lectura puede ser
en serie, es decir, una columna tras otra, o en paralelo, una fila tras otra. En ambos casos,
el resultado final es una fotografía del estado de las perforaciones existentes en la ficha en
la que a cada perforación le corresponde un bit 1, ya las posiciones sin perforación, un bit 0.
Supongamos que cada columna de la ficha se «fotografíe» en 2 bytes que constituyen
una palabra de ordenador. En este caso, el contenido de la ficha después de la lectura
consta de 80 palabras, carácter a carácter. A esta zona de memoria del ordenador la
llamamos buffer de lectura.
Los datos contenidos en el buffer solo pueden utilizarse si previamente han sido
interpretados según las directrices del programa. Para cada ficha, antes de la perforación,
se establece el trazado, es decir, se determina cuantos caracteres son necesarios para cada
dato y en qué columna de la ficha tienen que perforarse. Por otro lado, el programa tiene
que saber, por medio de las convenciones del lenguaje utilizado, las características de los
datos que residen en el buffer. Por lo tanto, puede ocuparse de reagrupar los caracteres que
pertenecen a cada dato, realizar eventuales transformaciones de código y transferir esos
datos desde el buffer a las zonas de memoria dedicadas a ellos.
La lectura de la ficha perforada es, en realidad, bastante complicada; de hecho,
mientras la ficha se desliza a velocidad constante bajo la estación de lectura, el ordenador
tiene que leerla columna a columna (o fila a fila) con la temporización exacta, para no
sobreponer las informaciones.
Si el ordenador utiliza las fichas en los dispositivos de salida, deberá conectarse a una
unidad perforadora de fichas. En tal caso, los datos que se perforarán sobre una ficha
tendrán que prepararse en un buffer de escritura, carácter a carácter, para luego ser
transferidos a la ficha por medio de punzones dirigidos eléctricamente.
Hemos mencionado la máquina selectora de fichas. Junto a ésta podíamos encontrar
otra máquina, denominada intercaladora, que servía para agrupar, en una única secuencia,
dos paquetes de fichas ya ordenadas. Hoy en día también se prefiere realizar este trabajo
con dispositivos magnéticos por medio de un programa de ordenador (programas de
agrupación).
Pasemos ahora a examinar los periféricos de banda perforada. Constan de una cinta
de papel resistente de color opaco, que contiene en toda su longitud una secuencia de
268
pequeños agujeros para su arrastre. Se trata, bien de lectoras, bien de perforadoras, o de
lectoras/perforadoras. En éstas tenemos una estación de lectura y/o perforación, donde la
lectura puede realizarse de igual manera que para las fichas perforadas, es decir, de
manera electromecánica o fotoeléctrica, y la perforación, mediante punzones accionados
eléctricamente. Además, existe un dispositivo para el arrastre de la cinta, el cual
normalmente se controla mediante programa. Algunos dispositivos de lectura permiten leer
la banda por bloques (como sucede en las cintas magnéticas), mientras que otros sólo
permiten la lectura a gran velocidad de toda la banda disponible. Es evidente que en el
primer caso se pueden introducir datos procesables por el ordenador en forma de bloques,
mientras que en el segundo sólo puede llenarse una parte de la memoria. Algunos
ordenadores contienen una lectora de banda perforada para cargar en memoria el programa
inicial de comienzo y/o parte del sistema operativo.
De todas formas, si un ordenador utiliza periféricos de banda perforada. Generalmente
dispone también de un dispositivo manual para la perforación de la banda.
El código de perforación puede realizarse utilizando un determinado número de bits,
generalmente 7 u 8, y las perforaciones se realizan perpendicularmente a la directriz de
arrastre a lo largo de los canales. Los datos se perforan carácter a carácter utilizando
siempre un bit para el control de paridad. En la figura 1 se representa una banda con 8
canales, donde el canal 8 se utiliza para el control de paridad y los canales del 1 al 7 para el
código.
También para la banda de papel son válidas las mismas observaciones hechas para las
fichas. Los datos se reciben carácter a carácter en un buffer de lectura, o son preparados en
un buffer de escritura. El programa se encarga de todas las transformaciones de código
necesarias para poder trabajar con los datos. En el caso de que se carguen programas de
lenguaje de máquina mediante banda perforada, cada carácter grabado puede representar
el contenido binario de un byte, y es suficiente transferirlo a la memoria a partir de la
posición deseada.
269
DISPOSITIVOS DE SOPORTE MAGNÉTICO
IMPRESORAS
Las impresoras son los periféricos que más se utilizan para la salida de datos del
ordenador, de manera inteligible para el hombre.
Estas se encargan de imprimir los resultados de los procesos sobre folios o sobre
módulos de papel continuo.
En el primer caso, es posible, mediante carretes apropiados, introducir el folio, que
después la impresora tratará como lo hace una máquina de escribir corriente. Por el
contrario, los módulos de papel continuo están doblados en forma de acordeón y son fáciles
de separar. Están dotados de dos cintas laterales perforadas que permiten «enganchar» el
papel al mecanismo de arrastre. Algunas impresoras permiten utilizar, por medio de carros
superpuestos, un módulo de papel continuo y hojas sueltas de inserción frontal.
Mediante un interruptor especial se puede elegir el espaciado entre las líneas, que
normalmente es de 1/6 ó 1/8 de pulgada. El número de caracteres que se pueden imprimir
en una línea varía, dependiendo de la impresora utilizada: las medidas habituales son de
32, 80, 120, 132 ó 160 caracteres por línea. Para controlar el número de líneas que se
pueden imprimir en una hoja existen diferentes posibilidades, dependiendo del tipo de
impresora. En algunas existe una tecla de «reset» (recomponer), que puede accionarse
después de haber colocado la hoja. El sistema cuenta las líneas impresas ( el número de
líneas por página puede ser fijo o modificable por software: el más común es de 66 líneas
por página) y accede automáticamente a una hoja nueva, dejando el margen necesario. Si
se desea cambiar de hoja en base a unas reglas más complicadas, se puede utilizar en el
programa un contador de líneas y mandar el avance del papel con una orden de impresión
en vacío.
Más flexible es el sistema de avance del papel, basado en la utilización de una cinta de
papel perforada, cerrada en círculo y ubicada en la impresora.
El principio de funcionamiento es el siguiente: se corta la cinta de papel de manera
que sea tan larga como las hojas utilizadas, y se encola en forma de círculo. El dispositivo
de arrastre de la cinta actúa, por lo tanto, conjuntamente con el movimiento del papel en la
impresora.
La cinta de papel ofrece, además de una pista de perforaciones para el arrastre, la
posibilidad de realizar perforaciones en diferentes posiciones sobre los 12 canales o pistas.
Es posible dirigir por programa el avance del papel en base a las perforaciones existentes en
los diferentes canales de la cinta, así como el formato de la línea de impresora (ver figura
2). Los lenguajes simbólicos de alto nivel constan de una serie de instrucciones que facilitan
la impresión de los resultados con el formato y paginación deseados. Considerando la forma
en la que se imprimen los caracteres, las impresoras pueden dividirse en dos grupos: por
impacto y sin impacto.
270
Fig. 2. Cinta de control para el desplazamiento del papel.
Al primer grupo pertenecen las impresoras que imprimen el carácter sobre el papel por
contacto mecánico por medio de una cinta entintada. Pertenecen al segundo grupo las
máquinas en las cuales la impresión se realiza por medio de sistemas químicos, magnéticos
o eléctricos.
Además, un carácter puede imprimirse con una imagen continua o en base a puntos.
El primer sistema, muy parecido al utilizado en las teclas de una máquina de escribir, consta
de un dispositivo con la forma del carácter en relieve, que golpea una cinta posicionada
entre el papel y el dispositivo. Por el contrario, el segundo sistema consta de una matriz de
agujas (matriz 7 x 5, 9 x 7, 7 x 7, 8 x 8 u otras) , que forma cada vez el carácter deseado
activando algunas agujas.
Hay que considerar otra subdivisión entre los tipos de impresoras disponibles:
impresoras en serie e impresoras en paralelo. Las impresoras en serie producen la línea
impresa carácter a carácter. Existen también las monodireccionales, que imprimen sólo de
izquierda a derecha y en las cuales el retroceso del carro se hace sin imprimir: y las
bidireccionales, que imprimen tanto de izquierda a derecha como de derecha a izquierda.
Las impresoras en paralelo imprimen todos los caracteres de una línea a la vez o de
tal manera que parece que la impresión se realiza simultáneamente en todas las posiciones.
Ahora que conocemos los parámetros en base a los que están subdivididas las
impresoras, pasaremos a hablar de los tipos más importantes.
En las impresoras de cadena, que son del tipo en paralelo, el dispositivo de impresión
está formado por una cadena metálica cerrada en forma de anillo, que gira a velocidad
constante en paralelo a la línea de impresión. En la parte superior lleva todo el grupo de
caracteres disponibles, que están repetidos un cierto número de veces. La cinta está situada
entre la cadena y el papel. Detrás de ésta hay una serie de pequeños martillos, tantos
cuantos son los caracteres que se pueden imprimir en una línea. Cuando el programa pide
la impresión de un determinado carácter en una determinada posición, hay que esperar a
que la cadena tenga disponible dicho carácter en la posición deseada para poder activar el
martillo correspondiente. En la figura 3 se representa un esquema del dispositivo de
impresión con cadena.
271
Fig. 3. Esquema de un dispositivo de impresión con cadena.
Con impresoras de esta clase se obtienen velocidades comprendidas entre 600 y 3.000
líneas por minuto. Son bastante caras.
En las impresoras de cilindro, figura 4, que también son del tipo en paralelo, el grupo
de caracteres está situado en una serie de canales circulares sobre la superficie de un
cilindro metálico, que gira a velocidad constante. A lo largo de una directriz del cilindro se
encuentra el mismo carácter, por lo que, a cada instante, está disponible en
correspondencia con las diferentes posiciones de impresión. El funcionamiento es similar al
que vimos anteriormente. La única diferencia reside en que la línea se escribe en tiempos
sucesivos, imprimiendo en el mismo instante todos los caracteres iguales tan rápidamente,
que parece que todos los caracteres de una línea se imprimen simultáneamente.
272
Fig. 5. Esquema del dispositivo de impresión de bola. También se puede
disponer de cabezas de escritura con forma diferente: cilíndrica, de rueda o de
margarita.
Foto. Impresora láser para la impresión de textos, números e imágenes sobre papel a la
velocidad de 12 originales (formato A-4) por minuto. (foto cedida por Rank Xerox)
273
Son impresoras en serie y a impacto más bien lentas (30 cps -caracteres por segundo-
) y caras, pero tienen una óptima calidad de impresión, figura 7.
Se obtienen velocidades mayores, incluso del orden de los 200 cps, con impresoras en
serie, de impacto y de agujas. En la figura 8 se representa un esquema para una matriz de
7 x 7. En este caso, la cabeza de impresión tiene las dimensiones de una columna de la
matriz y se mueve a lo largo de la línea de impresión a velocidad constante.
Correspondiéndose a cada carácter, se activan las agujas necesarias tantas veces como
haga falta (en el ejemplo, 7 veces las 7 agujas de una columna) y el carácter se crea por
puntos y por impacto. En la figura 9 se pueden observar las diferentes fases de realización
de la letra «A» por medio de una impresora de agujas.
274
Fig. 9. Diferentes fases en la formación de la letra "A" con una impresora de aguja.
275
figura 11).
276
contrario, si utilizamos una impresora de matriz por puntos, siempre que el sistema lo
permita será posible obtener, mediante software, diseños especiales, es decir, diseñar
caracteres particulares.
Tomemos la matriz 8 x 8. Esta tiene una imagen en memoria de 8 bytes consecutivos,
en los que: los bits 1 corresponden a los puntos que se tienen que imprimir.
Mediante una adecuada configuración de los 1 se puede imprimir, por ejemplo, la letra
n (ver figura 13).
PLOTTER
Fig. 14. Ejemplo de un plotter; arriba a la izquierda, detalle de plumas de 4 colores. (Foto
cedida por Calcomp.)
277
También existen plotters en los que la hoja de papel, situada horizontalmente, queda
inmóvil y el dibujo se realiza con el solo movimiento de la pluma. El programa es el que
dirige todos estos desplazamientos y permite trazar gráficos muy complejos con tanta
mayor precisión cuanto menor sea el incremento de coordenadas (es decir, el más pequeño
desplazamiento horizontal o vertical que puede realizar).
Algunos ordenadores realizan la impresión de gráficos de forma distinta. De hecho,
éstos pueden copiar sobre el papel cualquier imagen que aparezca en la pantalla. Por lo
tanto, se dice que tienen el dispositivo de hard copy: es decir, se trata de una imagen de
puntos que se reproduce línea a línea mediante una impresora corriente de matriz por
puntos.
LA PANTALLA
Hemos mencionado la pantalla como una unidad de salida (output) muy difundida y a
menudo utilizada en estrecha unión con el teclado de entrada (input), que domina
totalmente el campo de ordenadores personales. Consiste en una pantalla en blanco y negro
o de dos o más colores (de 8 a 16), muy parecida a la de un televisor corriente. Su
dimensión habitual es de 12 pulgadas (ver figura 15).
278
(letra, número u otros) bajo la forma de tabla de bytes, una para cada carácter. El
microprocesador, que se encarga de la pantalla, utiliza el buffer para obtener una relación
de las tablas que representan los distintos caracteres. Por lo tanto, se puede decir que el
buffer contiene los punteros de las imágenes de los caracteres.
Es evidente que la posibilidad de accionar sobre los punteros para la búsqueda de los
caracteres en tablas diferentes a la estándar del sistema aumenta notablemente las
posibilidades gráficas de la pantalla.
La pantalla puede ser utilizada también como unidad de entrada por medio de un lápiz
óptico o lápiz luminoso (light-pen), que sirve para indicar una posición de la pantalla. La
posición viene determinada durante el continuo barrido de la pantalla por medio del rayo
luminoso.
Se recomienda la utilización del lápiz particularmente en operaciones de selección,
pero siempre con el debido cuidado y habilidad, ya que su posicionamiento tiene efecto
inmediato.
Para facilitar la gestión de la pantalla se utiliza un indicador luminoso (generalmente
intermitente), llamado cursor, que en todo momento se encuentra en la posición
actualmente disponible y que puede ser movido utilizando las teclas de desplazamiento del
cursor.
TERMINALES
Fig. 16. Terminal constituido por un teclado alfanumérico y una impresora o una
pantalla, la pantalla utiliza la nueva técnica de ventanillas múltiples.
279
líneas de entrada.
La CPU envía tensión (estado lógico 1) a las diferentes líneas de la matriz, una por
una, cíclicamente, miles de veces por segundo.
El pulsar una tecla equivale a cortocircuitar una línea con una columna y, por lo tanto,
a obtener un 1 también en la columna, lo que indica que al menos una tecla ha sido
pulsada. Con el barrido sistemático de las líneas y columnas para averiguar dónde aparece
un 1, se obtiene la identificación exacta de la tecla pulsada. Esta operación, junto con la
detección de la tecla pulsada, se efectúa mediante programa con adecuadas instrucciones
de entrada y salida, que escriben sobre las líneas y leen las columnas.
Cuando se pulsan dos o más teclas a la vez (rollover), se da una situación anómala.
Para remediarlo se lleva a cabo el barrido de todo el teclado, también después de
determinar que una tecla ha sido pulsada. En el caso de que se determinen nuevas
pulsaciones, generalmente son ignoradas.
Otro problema ligado a la gestión del teclado es el rebote. Por rebote se entiende el
fenómeno según el cual, la pulsación de una tecla provoca el cierre efectivo y definitivo del
contacto con un cierto retraso, del orden de los 15/20 ms, después de un determinado
número de oscilaciones. Lo mismo sucede cuando dejamos que la tecla vuelva a su posición
inicial.
Por tanto, es necesario evitar que la operación de determinar el estado de la tecla, en
una situación transitoria, interprete de manera errónea una oscilación. Se procede,
entonces, bien con una técnica hardware, por medio de filtros RC, bien por software,
introduciendo rutinas de retardo en los programas de gestión del teclado y volviendo a leer
el estado de la tecla después de haber transcurrido un cierto tiempo desde la primera
determinación, para confirmar o no la lectura anterior.
Algunos teclados están dotados de un buffer en el que se pueden conservar algunos
de los caracteres pulsados, a la espera de visualizarlos en la posición inmediatamente
disponible en la salida, bien sobre papel, bien en pantalla.
Esta operación es tarea del sistema, aunque se puede omitir.
El terminal de pantalla es muy utilizado y cómodo. Es posible efectuar una entrada
muy sofisticada de datos, utilizando las posibilidades de desplazamiento del cursor.
Hasta ahora se ha hablado de terminales no inteligentes, es decir, de dispositivos
utilizados sólo para entrada y salida. Existe también una categoría de terminales
inteligentes, es decir, programables sin dependencia alguna del ordenador al que están
conectados. En realidad, se trata de pequeños ordenadores que pueden funcionar de
manera autónoma.
Finalmente, refiriéndonos al tipo de conexión, los terminales se clasifican en remotos y
no remotos. Se consideran remotos aquellos terminales para los que no es posible una
conexión directa, por medio de cables, al ordenador central.
280
PROCESOS DE COMUNICACIÓN PARA LA TRANSMISIÓN DE DATOS A
DISTANCIA
En este caso, la transmisión de los datos a distancia (un determinado número de bits
transmitidos en serie, es decir, sobre una única línea uno tras otro) se efectúa
generalmente por medio de líneas telegráficas, telefónicas o a través de enlaces por radio.
Tanto en la estación transmisora como en la receptora, tienen que estar presentes el
hardware y el software necesarios para la transmisión: es decir, los procesos de
comunicación (protocolo de transmisión), que permiten la «comprensión» entre las dos
estaciones. Por ejemplo, la señal por una parte y el reconocimiento del principio de un
mensaje, por otra.
La transmisión puede ser síncrona o asíncrona.
En el primer caso, después de un intercambio de informaciones que permiten la
sincronización entre los dos dispositivos, se realiza la transmisión en bloque del conjunto de
caracteres que constituyen el mensaje.
Esta termina con la transmisión de un carácter de fin de bloque, por parte del emisor,
y con una señal de confirmación de llegada, por parte del receptor.
Por el contrario, en la transmisión asíncrona, cada carácter va precedido y seguido por
un cierto número de bits que determinan su principio y su fin. En general, la transmisión
síncrona se utiliza en líneas de velocidad media o alta, y la transmisión asíncrona, en líneas
de baja velocidad.
La velocidad se mide en baudios (1 baudio = 1 bit por segundo).
OTROS PERIFÉRICOS
281
Fig. 17. Detalle de un puesto de trabajo de un
sistema gráfico donde resalta el lápiz. (Foto cedida
por Calcomp.)
Existen dispositivos, aún no muy utilizados y con limitado vocabulario, para la entrada
oral de datos al ordenador.
Análogamente, existen dispositivos con salida oral de datos desde el ordenador.
Después de haber hablado de los dispositivos I/O (entrada/salida) más comunes que
se pueden conectar a un ordenador, vamos a hablar ahora de las técnicas principales
utilizadas en las transferencias de datos desde el ordenador a los periféricos, y viceversa,
haciendo referencia a los modernos sistemas de microprocesadores.
Generalmente, para conectar un periférico al ordenador es necesario una interfase que
realice las transferencias en serie o en paralelo, o que disponga de la conversión de datos
serie/paralelo, y viceversa.
El periférico, en el caso de dispositivos con partes mecánicas complejas, consta de un
controlador del dispositivo (controller) que, como su nombre indica, realiza todas las
funciones de control necesarias para el correcto funcionamiento del dispositivo. Por ejemplo,
el controlador de una unidad de floppy-disk (diskette) debe realizar, por lo menos, las
funciones siguientes:
Lectura
1. Cargar el registro
2. Generar una búsqueda
3. Esperar para el correcto posicionamiento
4. Transferencia de los datos bajo control de interrupción
5. Verificar que la operación se realice correctamente
Escritura
1. Cargar el registro
2. Generar una búsqueda
3. Esperar para el correcto posicionamiento
4. Mandar una orden de escritura
5. Cargar los datos después de que haya recibido una señal de demanda
6. Verificar los indicadores de estado «ocupado» y el carácter de control de
bloque (CRC).
282
Por el contrario, el controlador de pantalla tiene que encargarse de buscar en la tabla
de caracteres la matriz de puntos necesaria para evidenciar cada carácter que se encuentra
en la zona de pantalla, encargarse del cursor y del desplazamiento de líneas.
Dado que en un sistema están conectados muchos periféricos, es necesario establecer
un proceso de comunicación o técnica de I/O, que haga posible que cada uno de ellos
trabaje. Podemos esquematizar tres procesos: polling (interrogatorio de tráfico), las
interrupciones (interrupt) y el DMA (Direct Memory Access o Acceso Directo a Memoria)
esquematizados en la figura 18.
El primer método, I/O programado o polling, es el más simple. Se trata de una técnica
síncrona en la que el ordenador interroga cíclicamente a los periféricos que están
conectados por medio del bus de datos, el bus de direcciones y algunas líneas del bus de
control, para saber si solicitan alguna tarea.
En la interfase de conexión de cada dispositivo se encuentra un indicador (flag), al que
se le pregunta acerca de la disponibilidad de los dispositivos.
Se trata de un ciclo repetitivo realizado por software por medio de un algoritmo
adecuado. En la figura 19 se esquematiza la secuencia de polling.
283
Fig. 19. Ciclo de polling (interrogatorio de tráfico).
284
Interrupciones (interrupts)
285
Transferencia DMA
El DMA permite que el programa se ejecute utilizando el modo asíncrono con respecto
a la transferencia de los datos. Al final de la trasmisión, el procesador central es avisado por
medio de una interrupción. Se trata de dispositivos caros y se usan cuando se necesita una
transferencia rápida como en los discos, en las cintas o en las pantallas.
No es nunca tarea fácil realizar la programación necesaria para efectuar las
entradas/salidas de un ordenador. Por eso siempre existen programas estándar
proporcionados por las casas constructoras junto con el ordenador, para gestionar los
periféricos. El conjunto de estos programas toma el nombre de sistema de control para la
I/O, conocido como IOCS (Input/output Control System).
286
GLOSARIO
287
periférico que demanda tareas y en la definición de prioridad
para peticiones simultáneas, es necesario hardware
adicional. El servicio de las demandas tiene carácter
software y se realiza por medio de rutinas denominadas de
«servicio».
IOCS
Conjunto de programas estándar generalmente
(Input/Output
proporcionados por las casas constructoras para la gestión
Control
de las operaciones de entrada y salida.
System)
Joystick
Es una palanca direccional que puede moverse manualmente
(palanca
para dirigir el movimiento de un punto en la pantalla.
direccional)
Dispositivo de entrada por medio del cual se introducen en el
Lectora de
ordenador los programas y los datos sobre fichas
fichas
perforadas.
Perforadora de Dispositivo de salida conectado al ordenador. Los resultados
fichas de los procesos se obtienen bajo forma de fichas perforadas.
Dispositivo de salida que, aprovechando el desplazamiento
Plotter vertical de la hoja de papel y el desplazamiento horizontal
de una pluma, realiza la impresión de gráficos y dibujos.
Técnica software de I/O, en la que la transferencia de datos
Polling se realiza bajo el control de un programa que interroga
(Interrogatorio cíclicamente a los periféricos. La transferencia se realiza sólo
de tráfico) si el periférico que lo demanda es interrogado por el
programa.
Registro interno de un dispositivo (unidad central o
periférico) que proporciona, por medio del estado de sus
Registro de
bits, la información acerca del estado del dispositivo. Por ej.
estado
la petición de un dato, disponibilidad de un dato, el buffer de
I/O ocupado, etc.
Modalidad de comunicación y transferencia de datos entre
Técnicas de
los periféricos y la unidad central, con referencia tanto al
I/O
aspecto hardware como al software.
Dispositivo de I/O formado por un teclado alfanumérico por
el que se introducen los datos y los programas en el
Terminal
ordenador sin pasar a través de soportes intermedios, o por
una impresora o por una pantalla.
288
CONCLUSIÓN
289
CONCLUSIÓN FINAL
290
BIBLIOGRAFÍA
291