359
UNIVERSIDAD NACIONAL DE LA RIOJA INGENIERIA EN SISTEMAS Y LICENCIATURA EN SISTEMAS DOCENTES TITULAR: LIC. MARCELO MARTINEZ ADJUNTO: ING. CLAUDIA CESARINI J.T.P: ING. FERNANDO SANCHEZ AÑO 2003 MANUAL DE CATEDRA PROCESAMIENTO DE DATOS I

Manual Datos i 2003[1]

  • Upload
    zylmary

  • View
    3.657

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Manual Datos i 2003[1]

UNIVERSIDAD NACIONAL DE LA RIOJA

INGENIERIA EN SISTEMAS Y LICENCIATURA EN SISTEMAS

DOCENTES

TITULAR: LIC. MARCELO MARTINEZ

ADJUNTO: ING. CLAUDIA CESARINI

J.T.P: ING. FERNANDO SANCHEZ

AÑO 2003

MANUAL DE CATEDRA

PROCESAMIENTO DE DATOS I

Page 2: Manual Datos i 2003[1]

INDICE GENERAL

BOLILLA I: LA COMPUTADORA__________________________________________________4

INDICE____________________________________________________________________5

INTRODUCCIÓN___________________________________________________________6

LA COMPUTADORA________________________________________________________7CONCEPTO:______________________________________________________________7FUNCIONES Y ACCIONES:_________________________________________________7Para qué sirve una computadora?:______________________________________________7Computadora y Circuitos:_____________________________________________________8HARDWARE Y SOFTWARE:________________________________________________8Arquitectura - Componentes Básicos:___________________________________________9BUSES DE COMPUTADORAS:_____________________________________________10Buses síncronos y asíncronos:________________________________________________12Canales de e/s_____________________________________________________________14SISTEMA OPERATIVO____________________________________________________17

CONCLUSIÓN_____________________________________________________________19

BOLILLA II (Parte 1): EL NIVEL DE LOGICA DIGITAL____________________________20

INDICE___________________________________________________________________21

INTRODUCCIÓN__________________________________________________________22

EL NIVEL DE LOGICA DIGITAL____________________________________________23COMPUERTAS Y ALGEBRA BOOLEANA____________________________________23CIRCUITOS DIGITALES BÁSICOS__________________________________________32MEMORIA_______________________________________________________________45MICROPROCESADORES y BUSES__________________________________________54

CONCLUSIÓN_____________________________________________________________67

BOLILLA II (Parte 2): EL NIVEL DE MICROPROGRAMACIÓN_____________________68

INDICE___________________________________________________________________69

INTRODUCCIÓN__________________________________________________________70

EL NIVEL DE MICROPROGRAMACIÓN_____________________________________71REPASO SOBRE EL NIVEL DE LÓGICA DIGITAL____________________________72UNA MICROARQUITECTURA TIPICA______________________________________78UNA MACROARQUITECTURA TIPICA______________________________________85MICROPROGRAMACIÓN: UN EJEMPLO____________________________________92EL DISEÑO DEL NIVEL DE MICROPROGRAMACIÓN_________________________97

CONCLUSIÓN____________________________________________________________116

BOLILLA II (Parte 3): EL NIVEL DE MAQUINA CONVENCIONAL_________________117

INDICE__________________________________________________________________118

INTRODUCCIÓN_________________________________________________________119

EL NIVEL DE MÁQUINA CONVENCIONAL_________________________________120EJEMPLOS DEL NIVEL DE MAQUINA CONVENCIONAL_____________________120FORMATOS DE INSTRUCCIÓN___________________________________________121

1

Page 3: Manual Datos i 2003[1]

Tipos de Instrucciones_____________________________________________________136Flujo De Control__________________________________________________________149

CONCLUSIÓN____________________________________________________________163

BOLILLA III: ARQUITECTURA DEL PROCESADOR_____________________________164

INDICE__________________________________________________________________165

INTRODUCCIÓN_________________________________________________________166

ARQUITECTURA DEL PROCESADOR______________________________________167ESTRUCTURA GENERAL________________________________________________167DESCRIPCIÓN DE LOS COMPONENTES DE UN PROCESADOR_______________167Microprocesadores________________________________________________________170EJECUCIÓN DE LAS INSTRUCCIONES_____________________________________171ORGANIZACIÓN DE LA CPU_____________________________________________172LA UNIDAD ARITMÉTICA Y LÓGICA_____________________________________174LA UNIDAD DE CONTROL_______________________________________________176FASE DE BÚSQUEDA DE LA INSTRUCCIÓN________________________________177FASE DE BÚSQUEDA O ALMACENAMIENTO DEL OPERANDO_______________177FASE DE PREPARACIÓN DE LA SIGUIENTE INSTRUCCIÓN__________________179INSTRUCCIÓN DE RUPTURA DE SECUENCIA______________________________179EL CANAL______________________________________________________________180LAS UNIDADES PERIFÉRICAS____________________________________________181INTERRUPCIONES______________________________________________________181

CONCLUSIÓN____________________________________________________________184

BOLILLA IV: MEMORIA_____________________________________________________185

INDICE__________________________________________________________________186

INTRODUCCIÓN_________________________________________________________187

MEMoRia________________________________________________________________188DIRECCIONES DE MEMORIA_____________________________________________189ORDENAMIENTO DE BYTES_____________________________________________190CÓDIGOS CORRECTORES DE ERRORES___________________________________191CLASIFICACIÓN Y ORGANIZACIÓN DE LAS MEMORIAS____________________191PARá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________________________________213INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR___________________________214EL PROCESO DE ENSAMBLAJE___________________________________________219MACrOS________________________________________________________________227MONTAJE (LINKING) y CARGA___________________________________________230

CONCLUSIÓN____________________________________________________________240

BOLILLA VI (Parte 1): PERIFÉRICOS__________________________________________241

2

Page 4: Manual Datos i 2003[1]

INDICE__________________________________________________________________242

INTRODUCCIÓN_________________________________________________________244

PERIFÉRICOS____________________________________________________________245RESEÑA HISTÓRICA____________________________________________________245INTRODUCCIóN_________________________________________________________245PERlFERICOS DE ENTRADA:_____________________________________________246PERIFERICOS DE SALIDA:_______________________________________________257PERIFERICOS DE COMUNICACION..______________________________________259CONCLUSIó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)__________266Dispositivos de fichas y de banda perforada____________________________________266Dispositivos de soporte magnético____________________________________________270Impresoras______________________________________________________________270Plotter__________________________________________________________________277La pantalla______________________________________________________________278Terminales______________________________________________________________279Procesos de comunicación para la transmisión de datos a distancia__________________281Otros periféricos__________________________________________________________281Técnicas de entrada/salida (input/output)_______________________________________282GLOSARIO_____________________________________________________________287

CONCLUSIÓN____________________________________________________________289

CONCLUSIÓN FINAL__________________________________________________290

BIBLIOGRAFÍA___________________________________________________________291

3

Page 5: Manual Datos i 2003[1]

BOLILLA I: LA

COMPUTADORA

4

Page 6: Manual Datos i 2003[1]

INDICE

BOLILLA I: LA COMPUTADORA________________________________________________4

INDICE____________________________________________________________________5

INTRODUCCIÓN___________________________________________________________6

LA COMPUTADORA________________________________________________________7CONCEPTO:______________________________________________________________7FUNCIONES Y ACCIONES:_________________________________________________7Para qué sirve una computadora?:______________________________________________7Computadora y Circuitos:_____________________________________________________8HARDWARE Y SOFTWARE:________________________________________________8

Software:________________________________________________________________8Al software se lo clasifica en dos grupos:____________________________________8

Hardware:_______________________________________________________________9Arquitectura - Componentes Básicos:___________________________________________9

Unidad de Control:________________________________________________________9Unidad aritmético-lógica:___________________________________________________9Memoria:(Memoria Central)________________________________________________9Periféricos:______________________________________________________________9Núcleo de la computadora:__________________________________________________9

BUSES DE COMPUTADORAS:_____________________________________________10Buses síncronos y asíncronos:________________________________________________12

Arbitraje del bus:________________________________________________________13Ejemplo de encadenamiento margarita:_______________________________________13

Solicitud del Bus_______________________________________________________13Dispositivos de E/S_______________________________________________________13Manejo de interrupciones:_________________________________________________14

Canales de e/s_____________________________________________________________14TECNOLOGÍA DE CANALES:____________________________________________15TIPOS DE CANALES:___________________________________________________15

Multiplexor:__________________________________________________________15Selector______________________________________________________________16Multipexor por bloques:_________________________________________________16

Spoll:______________________________________________________________16SISTEMA OPERATIVO____________________________________________________17

Introducción:____________________________________________________________17¿QUÉ ES UN SISTEMA OPERATIVO?_____________________________________18

CONCLUSIÓN_____________________________________________________________19Desvios_______________________________________________________________158Interrupciones__________________________________________________________159

ACCIONES DE HARDWARE__________________________________________159ACCIONES DE SOFTWARE___________________________________________160

5

Page 7: Manual Datos i 2003[1]

INTRODUCCIÓN

6

Page 8: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

LA COMPUTADORACONCEPTO:

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.

PARA QUÉ SIRVE UNA COMPUTADORA?:La computadora introdujo un cambio cualitativo, tanto en la organización como en el

desarrollo del trabajo y el ocio. Y no por lo que es sino por lo que hace.La computadora puede hacer muchas cosas: controlar el riego y las condiciones

ambientales de una plantación, realizar una exploración delicadísima del cerebro humano, asistir una operación quirúrgica, prevenir riesgos atmosféricos, probar recetas de cocina, enviar cartas a la velocidad de la luz, regular todos los elementos mecánicas y electrónicos de un edificio, realizar el censo de población de un país, ver la casa antes de construirla, etc.. y así sucesivamente.

Lo que no debemos olvidar es que la computadora sólo está limitada por nuestra propia capacidad imaginativa, si bien los desarrollos en microcomputación y nuevos lenguajes han de proveer a este instrumento de un motor social mucho más poderoso.

COMPUTADORA Y CIRCUITOS:

7

Page 9: Manual Datos i 2003[1]

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.

Al software se lo clasifica en dos grupos: Software de Base: controla las operaciones de la computadora en sí (Sistema

Operativo, Bios).Software de Aplicación: los cuales resuelven problemas para los usuarios (programas

del usuario).

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

8

Page 10: Manual Datos i 2003[1]

materiales de la propia computadora, sean mecánicos, eléctricos o electrónicos, así como las unidades periféricas, sean teclados, impresoras, monitores, etc..

ARQUITECTURA - COMPONENTES BÁSICOS:

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

9

Page 11: Manual Datos i 2003[1]

entrada y salida o de E/S. Estas tres fases reúnen la labor desarrollada por las computadoras.

La UC puede compararse al director de la fábrica, que distribuye las tareas en el taller, a la UAL, con trabajadores contables que realizan todos los cálculos y procesos que se les indican. Los trabajos que éstos llevan a término pasan de nuevo por el director, quién controla la exactitud y calidad de las operaciones realizadas. Hay pues, un camino de doble dirección entre la unidad de control y la unidad aritmético-lógica; también existe un camino doble entre la unidad de control y la memoria. La memoria Central es comparable al almacén de la fábrica, allí se guardan todos los elementos que han ingresado, así como las instrucciones de procesamiento y los resultados de las operaciones parciales.

La UC es una especie de mecanismo de relojería electrónico interno que lee y ejecuta una instrucción tras otra, a un ritmo dado.

Este ritmo es rapidísimo. Para saber cómo debe operar dispone de unos programas recogidos en la memoria ROM que le instruyen acerca de las normas elementales de una labor de dirección.

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:

UC

UAL

MemoriaCentral

Canal Canal

Instrucciones

Datos

Resultados

UnidadCentral deProceso

Unidades Periféricas

UnidadesDe E/S

Tarjeta de memoria

Tarjeta de E/S

Tarjeta de E/S

Coprocesador

ALU

Bus del Sistema

Bus Local

Buses

Registros

Bus integrado a la pastilla

10

Page 12: Manual Datos i 2003[1]

Los Buses son los ilustrados por las líneas con Flechas.

Los Sistemas de cómputo pueden tener varios buses.A pesar que los diseñadores de microprocesadores tienen la libertad de usar cualquier

clase de Bus, a efecto que las tarjetas diseñadas por terceras personas puedan conectarse al Bus del sistema, deben haber reglas bien definidas del funcionamiento de éste, las cuales deben ser obedecidas por todos los dispositivos conectados al mismo. Esas 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 y tengan los conectores necesarios para acoplarse a la tarjeta Matriz, tanto físicamente como en términos de voltaje.

Algunos dispositivos conectados al Bus se encuentran en estado activo y pueden iniciar transferencias, mientras que otros están en estado pasivo aguardando solicitudes. A los activos s les llama Maestros mientras que a los pasivos se les denomina Esclavos. Cuando la CPU ordena leer o escribir un bloque a un controlador de discos, ésta actúa como dispositivo Maestro el controlador como esclavo. Sin embargo, el controlador puede actuar más adelante como dispositivo Maestro, al indicar a la memoria que acepte las palabras que lee de la unidad del disco.

Hay varias combinaciones típicas entre dispositivos Maestros y esclavos. Sin embargo LA MEMORIA NO PUEDE, bajo ninguna circunstancia, actuar como dispositivo Maestro.

Ejemplo de Combinaciones: Maestros y Esclavos del Bus.

Maestro Esclavo EjemploCPU Memoria Extracción de instrucc.y datosCPU E/S Inicio de transferencia de datosCPU Coprocesador Traspaso de inst. de pto. FlotanteE/S Memoria DMA(acceso directo memoria)Coprocesador Memoria Extracción de operadores

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

BUSES SÍNCRONOS Y ASÍNCRONOS: Dependiendo de los ciclos de tiempo., los buses pueden clasificarse en dos 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 y50 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. Lo mejor es manejar una tecnología mixta utilizando un asíncrono, esto es un bus sin reloj maestro, en vez de que todo esté amarrado al reloj, (como el caso del síncrono, debido a sus intervalos de tiempos discretos, todo el trabajo se realiza en

11

Page 13: Manual Datos i 2003[1]

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, esto es uno de los inconvenientes), cuando el bus maestro ha activado las señales de dirección, MREQ (indica que la memoria y no un dispositivo está siendo accesada), RD (distingue las operaciones de lectura de las de escritura) 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 vez, cundo 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. Activar SINE 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, MREQ, RD Y SINM. 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 4 pasos:

Se activa SINM Se activa SINE en respuesta a SINM. Se desactiva SINM en respuesta a SINE. Se desactiva SINE en respuesta a la desactivación de SINM.

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

Page 14: Manual Datos i 2003[1]

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.

Ejemplo de encadenamiento margarita:

Solicitud del Bus

Dispositivos de E/SEn 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.

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

Autorización del bus

árbitro

1 2 3 4

13

Page 15: Manual Datos i 2003[1]

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/SCanales 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.

EL MICROPROGAMA DEL CANAL: está compuesto por dos grupos de instrucciones:

1. Ejecutan operaciones de E/S y son: De lectura y escritura. De control de programa (bifurcación). De control de periféricos.

2. Instrucciones de E/S que ejecuta el procesador central: Indica cuando se inicia y finaliza la operación de E/S.

14

Page 16: Manual Datos i 2003[1]

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.

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.

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. UN REGISTRO DE ESTADO: permite conocer el estado de la transferencia.

Bus

Canal 1

Canal 2

Canal 3

P1 P2 P3

Procesador de E/S 1

Procesador de E/S 2

P1 P2 P3

P1 P2 P3

Placa controladora

15

Page 17: Manual Datos i 2003[1]

Ensamblado: operación de unir bytes para formar 16 bits.Desensamblado: operación que descompone una transmición en bytes.

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

Multipexor por bloques:

Es una mezcla de los dos anteriores. Puede trabajar como multiplexor o selector.

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

SEVER

Usuario 1 11

Usuario 2Usuario 3

Us. 4

Periféricos (imp.,discos duros)

16

Page 18: Manual Datos i 2003[1]

SISTEMA OPERATIVOIntroducció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.

Programas de aplicación

Sistema bancario Reservación en una línea aérea Juegos

Programas de Sistemas

Compiladores Editores Interpretes de comandos

SOHardware Lenguaje de Máquina

MicroprogramaciónDispositivos físicos

A continuación viene un software primitivo que controla en forma directa los dispositivos y proporciona una interfaz más limpia con la siguiente capa. Este software llamado microprograma se localiza por lo general, en la memoria exclusiva para lectura. Es en realidad un intérprete busca las instrucciones de lenguaje de máquina tales como ADD, MOVE Y JUMP para llevarlas a cabo como una serie de pequeños pasos. Por ej.: para hacer la instrucción ADD el microprograma debe determinar la localización de los números que se desean sumar, buscarlos, sumarlos y almacenar el resultado en alguna parte. El conjunto de instrucciones que interpreta el microprograma definen al LENGUAJE DE MÁQUINA, que tiene por lo general de 50 a 300 instrucciones, la mayoría sirve para desplazar datos a través de la máquina, hacen operaciones aritméticas y comparan valores. En esta capa los dispositivos de E/S se controlan al cargar valores en registros del dispositivo Especiales. Por ej.: se puede ordenar a un disco que lea al cargar los valores de la dirección del disco, la dirección de la memoria principal, el byte de conteo, y la instrucción (Read – Write), en sus registros. Ela práctica son necesarios muchos más parámetros.

Una de las principales funciones del SO es ocultar toda esa complejidad y proporcionar al programador un conjunto más conveniente de instrucciones con el cuál trabajar, por ejemplo: READ BLOCK FROM FILE, es conceptualmente más sencillo que tener que preocuparse de los detalles de movimiento de las cabezas del disco, esperar que se detengan, etc..

Por arriba del SO, está el resto del Software del Sistema. Aquí se encuentra el intérprete de comandos que es el SHELL, compiladores. Editores. Es importante saber que estos programas no forman parte del SO aunque fabricante de computadoras los 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

17

Page 19: Manual Datos i 2003[1]

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.

¿QUÉ ES UN SISTEMA OPERATIVO?Es un conjunto de programas que tiene como propósito posibilitar que los programas

problemas evolucionen ordenadamente en el computador, resolviendo todas las situaciones que podrían no estar previstas en esos programas facilitando la explotación del equipo e independizando a los programadores de tareas rutinarias y complejas como por ej.: lectura/escritura de un dispositivo periférico, como un disco, controlar y administra el tiempo de la CPU, ordenar la información a almacenar, etc..

El SO es un Sistema o conjunto de programas con fines diversos, agrupados en Subsistemas, cada uno de los cuales cumple con una misión específica supervisados por un programa que cumple la función de control de la actividad de la CPU, denominado SUPERVISOR.

Desde otro punto de vista lo podemos analizar como:UNA MÁQUINA EXTENDIDA O MÁQUINA VIRTUAL, que sea más fácil de programar que

el Hardware adyacente. El SO es un programa que oculta la verdad acerca del Hardware al programador y presenta una agradable y sencilla visión de los archivos con su nombre, los cuales se pueden leer o escribir en ellos, así también protege al programador del Hardware del disco y presenta una sencilla interfáz orientada a archivos, ocultando también varios asuntos pocos agradables relacionados con las interrupciones, cronómetros, control dela memoria y otras a características de bajo nivel.

CONTROLADOR DE RECURSOS: Supongamos qué, tres programas qué están en ejecución intentaran imprimir sus salidas en forma simultánea en la misma impresora. El resultado sería un caos. El SO ordena este caos el almacenar en el disco todas las salidas destinadas a la impresora. Al concluir uno de los programas, el SO podría entonces copiar su salida desde el disco hacia la impresora y si una computadora tiene varios usuarios, es necesario mayor control y protección de la memoria, los dispositivos de E/S y demás recursos, debido que con frecuencia los usuarios deben compartir recursos tales como las unidades de cinta, como así también la información entre aquellos usuarios que trabajan juntos.

En resumen el SO lleva un registro de la utilización delos recursos, dar paso a las solicitudes de recursos, llevar la cuenta de su uso y mediar entre las solicitudes en conflicto de los distintos programas y usuarios.

18

Page 20: Manual Datos i 2003[1]

CONCLUSIÓN

19

Page 21: Manual Datos i 2003[1]

BOLILLA II (Parte 1): EL

NIVEL DE LOGICA DIGITAL

20

Page 22: Manual Datos i 2003[1]

INDICE

BOLILLA II (Parte 1): EL NIVEL DE LOGICA DIGITAL____________________________20

INDICE___________________________________________________________________21

INTRODUCCIÓN__________________________________________________________22

EL NIVEL DE LOGICA DIGITAL____________________________________________23COMPUERTAS Y ALGEBRA BOOLEANA____________________________________23

Compuertas_____________________________________________________________23Algebra booleana________________________________________________________25Implementación de funciones booleanas______________________________________26Equivalencia entre circuitos________________________________________________28

CIRCUITOS DIGITALES BÁSICOS__________________________________________32Circuitos integrados______________________________________________________32Circuitos combinacionales_________________________________________________35

Multiplexores_________________________________________________________35Decodificadores_______________________________________________________37Comparadores_________________________________________________________39Arreglos (matrices) lógicos programables___________________________________39

Circuitos aritméticos______________________________________________________41Registros de corrimiento_________________________________________________41Sumadores___________________________________________________________42Unidades aritméticas y lógicas____________________________________________43

Relojes________________________________________________________________43MEMORIA_______________________________________________________________45

Biestables______________________________________________________________45Bieslables SR sincronizados______________________________________________47Biestables D sincronizados_______________________________________________47

Flip-flops y registros______________________________________________________47Registros_____________________________________________________________48

Organización de las memorias______________________________________________49Propiedades de las memorias_______________________________________________52

MICROPROCESADORES y BUSES__________________________________________54Microprocesadores_______________________________________________________54Buses de computadora____________________________________________________56Buses síncronos_________________________________________________________58BUSES ASINCRONOS___________________________________________________61Arbitraje del bus_________________________________________________________62Manejo de interrupciones__________________________________________________65

CONCLUSIÓN_____________________________________________________________67

21

Page 23: Manual Datos i 2003[1]

INTRODUCCIÓN

22

Page 24: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

EL NIVEL DE LOGICA DIGITAL

En el nivel jerárquico inferior de la figura 1-2 se encuentra el nivel de lógica digital, que es el verdadero hardware de la computadora. En este capítulo examinaremos muchos aspectos de la lógica digital como elemento básico para el estudio de los niveles superiores, comentados en los capítulos siguientes. El presente estudio hará énfasis en las microcomputadoras, no sólo porque son fáciles de comprender sino porque se están volviendo cada vez más importantes.

Los elementos básicos con que se construyen las computadoras digitales son asombrosamente simples. Empezaremos nuestro estudio examinando estos elementos básicos y el álgebra especial de dos valores (álgebra de Boole) que se usa para analizarlos. Luego estudiaremos algunos circuitos fundamentales que pueden construirse usando combinaciones simples de compuertas, incluyendo algunos que realizan operaciones aritméticas. En seguida veremos cómo pueden combinarse las compuertas para almacenar información, es decir, cómo se organizan las memorias. Después abordaremos el tema de las CPU, con especial atención a la forma en que las CPU integradas en una pastilla de silicio se conectan con la memoria y los dispositivos periféricos.

COMPUERTAS Y ALGEBRA BOOLEANA

Los circuitos digitales pueden construirse a partir de un número pequeño de elementos primitivos combinándolos en innumerables formas. En las siguientes secciones se describirán tales elementos, se mostrará cómo pueden combinarse

éstos y se presentará una poderosa técnica matemática útil para analizar su comportamiento.

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

Lo importante es darse cuenta de que, cuando Ve está alto, Vs está bajo y viceversa. El

23

Page 25: Manual Datos i 2003[1]

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.

Si la señal de salida de la figura 3-1(b) se introduce en un inversor, tendríamos otro circuito que sería el inverso de la compuerta NAND, siendo su salida 1 si y sólo si ambas entradas son 1. Este circuito se llama compuerta Y o AND y su símbolo y descripción funcional se dan en la figura 3-2( d). De manera similar, la compuerta NOR puede conectarse a un inversor para obtener un circuito cuya salida sea 1, si alguna o ambas entradas es 1 y 0 si ambas son 0. La figura 3-2(e) muestra el símbolo y la descripción funcional de esta compuerta, denominada compuerta OR. Los pequeños círculos que forman parte de los símbolos del inversor, la compuerta NAND y la compuerta NOR se llaman burbujas de inversión y suelen también usarse en otros contextos para expresar una señal invertida.

Las cinco compuertas de la figura 3-2 son los elementos principales para la construcción del nivel de lógica digital. De la explicación anterior debió quedar en claro que las compuertas NAND y NOR requieren dos transistores cada una, mientras que las AND y OR requieren tres. Por esa razón, muchas computadoras están basadas en compuertas NAND y NOR y no en las más familiares AND y OR. (En la práctica, las compuertas se realizan en una forma algo diferente, pero las NAND y NOR son aún más simples que las AND y OR.) También se usan abundantemente compuertas de más de dos entradas. En principio, una compuerta NAND, por ejemplo, puede tener un número arbitrario de entradas, aunque en la práctica no suelen tener más de ocho.

24

Page 26: Manual Datos i 2003[1]

Aunque el tema de cómo se hacen las compuertas pertenece al nivel de dispositivo, se describirán las familias tecnológicas más importantes, debido a que se mencionan con frecuencia. Las dos tecnologías más importantes son la bipolar y la MOS (Metal-Oxido-Semiconductor). Entre las bipolares están la Lógica de Transistor- Transistor (llamada TTL), que ha sido durante años el material de trabajo de la electrónica digital, y la Lógica Acoplada por Emisor (denominada ECL), que se usa cuando se necesita gran velocidad.

Las compuertas MOS son 10 veces más lentas que las TTL y 100 veces más que las ECL pero no necesitan casi energía ni espacio, por lo que pueden empaquetarse en forma muy compacta. Hay muchas variedades de compuertas MOS, entre las que están las designadas por las siglas PMOS, NMOS, CMOS y otras que van apareciendo día tras día.

Algebra booleana

Para describir los circuitos que se pueden construir combinando compuertas, se necesita un nuevo tipo de álgebra en que las variables y las funciones sólo puedan tomar los valores 0 y 1. Como esta álgebra fue inventada por el matemático inglés George Boole (1815-1864), se le denomina álgebra de Boole o álgebra booleana. En rigor, en realidad nos referimos aun tipo específico de álgebra booleana denominada álgebra de conmutación; sin embargo, el término "álgebra booleana" se usa tan ampliamente con el significado de "álgebra de conmutación", que no haremos distinción alguna.

Así como hay funciones en el álgebra "ordinaria" (la que se imparte en la escuela secundaria), también hay funciones en el álgebra de Boole. Una función booleana toma una o varias variables de entrada y da por resultado un valor que depende sólo de ellas. Una función sencilla, f, puede definirse diciendo que f (A) es 1 si A es 0 y f(A) es 0 si A es 1. Esta función es la función NOT de la figura 3-2(a).

Una función booleana de n variables sólo tiene 2" conjuntos posibles de valores de entrada, por lo que puede especificarse completamente como una tabla de 2n filas, indicando cada una de ellas el valor de la función para una combinación determinada de los valores de entrada. Esta tabla se denomina tabla de verdad. Las tablas de la figura 3-2 son ejemplos de tablas de verdad. Si se toma el acuerdo en listar siempre las filas de una tabla de verdad en el orden numérico (base 2), esto es, para dos variables, en el orden 00, 01, 10 y 11, la función puede describirse completamente por el número de 2n bits obtenido al leer verticalmente la columna de resultado de la tabla de verdad. Así, NAND es 1110, NOR es 1000, AND es 0001 y OR es 0111. Evidentemente, sólo existen 16 funciones booleanas de dos variables, correspondientes alas 16 posibles combinaciones de 4 bits. Por el contrario, el álgebra ordinaria tiene infinitas funciones de dos variables y ninguna de ellas puede describirse dando una tabla de resultados de todas las combinaciones posibles de las entradas, ya que cada variable puede tomar un número infinito de valores.

La figura 3-3(a) muestra la tabla de verdad de una función booleana de tres variables: 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.

25

Page 27: Manual Datos i 2003[1]

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.

Implementación de funciones booleanas

Como ya se mencionó, la formulación de una función booleana como suma de hasta 2n

términos productos lleva directamente a una de las implementaciones posibles. Puede verse cómo se lleva a cabo esta realización por medio del ejemplo de la figura 3-3. En la parte (b) de la figura vemos las entradas A, B y C a la izquierda y la salida M a la derecha. Como se necesitan los complementos de las entradas, se los genera conectando a las entradas los inversores 1, 2 y 3. Para no enmarañar la figura, se han dibujado seis líneas verticales, tres de ellas conectadas a las variables de entrada y las otras tres a sus complementos. Las líneas tienen una disposición conveniente para usarlas como entradas de las compuertas ulteriores. Por ejemplo, las compuertas 5, 6 y 7 usan A como entrada. En un circuito real probablemente estas compuertas se conectarían directamente a A, sin necesidad de hilos "verticales" intermedios.

El circuito contiene cuatro compuertas Y, una para cada término de la ecuación ( es decir, uno por cada fila de la tabla de verdad con un 1 en la columna de resultado). Cada compuerta y calcula una fila de la tabla de verdad, como se indicó antes. Finalmente todos los términos se pasan por una compuerta OR para obtener el resultado final.

El circuito de la figura 3-3(b) usa una convención que se necesitará repetidamente en todo el libro: cuando se crucen dos líneas, se supondrá que no están conectadas a menos que esté dibujado un punto grueso en la intersección. Por ejemplo, la salida de la compuerta 3 cruza las seis líneas verticales, pero sólo está conectada a C. Sin embargo, otros autores usan convenciones diferentes.

En el ejemplo de la figura 3-3 se aprecia con toda claridad cómo se realiza un circuito para cualquier función booleana:

1. Se escribe primero la tabla de verdad de la función.2. Se generan los complementos de las entradas por medio de inversores. 3. Se dispone una compuerta Y o AND para cada término que tenga un 1 en la

columna de resultado. 4. Se conectan las entradas apropiadas a las compuertas AND. 5. Se conectan todas las salidas de las. compuertas AND a una compuerta OR.

26

Page 28: Manual Datos i 2003[1]

27

Page 29: Manual Datos i 2003[1]

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.

Equivalencia entre circuitos

Los diseñadores de circuitos naturalmente intentan reducir el número de compuertas para disminuir el costo de los componentes, el espacio de circuito impreso, el consumo de energía, etc. Para reducir la complejidad de un circuito, el diseñador debe encontrar otro que calcule la misma función que el original con menos compuertas (o quizá con compuertas más simples; por ejemplo, compuertas de dos entradas en lugar de cuatro). El álgebra de Boole puede ser una herramienta muy útil en la búsqueda de circuitos equivalentes.

28

Page 30: Manual Datos i 2003[1]

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

Page 31: Manual Datos i 2003[1]

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

Page 32: Manual Datos i 2003[1]

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

Page 33: Manual Datos i 2003[1]

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

Las compuertas no se fabrican ni se venden individualmente, sino en unidades llamadas circuitos integrados, chips o pastillas. Una pastilla es un pedazo de silicio cuadrangular de unos 5 x 5 mm en el que se han depositado algunas compuertas. Normalmente las pastillas se montan en unas cápsulas cerámicas o de plástico de 5 a 15 mm de ancho y de 20 a 50 mm de largo. A lo largo de sus bordes mayores se sitúan dos filas paralelas de patas metálicas de unos 5 mm de largo, que pueden insertarse en soportes o soldarse a circuitos impresos. Cada pata se conecta a una entrada o a una salida de alguna compuerta de la pastilla, a la corriente eléctrica o a tierra. Las cápsulas con dos filas de patas fuera y una pastilla dentro reciben el nombre técnico de DIP (siglas inglesas que significan encapsulado de dos hileras en línea); pero todo el mundo las llama pastillas, confundiendo así la distinción entre la pieza de silicio y su envoltorio. Las cápsulas más usuales tienen 14, 16, 18, 20, 22, 24, 28, 40,64 o 68 patas. En algunas aplicaciones especiales se utilizan cápsulas con patas en los cuatro lados.

Las pastillas pueden dividirse en varios grupos, con base en el número de compuertas que contienen, según se describe abajo. Este esquema de clasificación es en extremo burdo, pero a veces útil. El limite superior de los circuitos VLSI se encuentra entre 1 y 2 millones de transistores.

SSI (circuitos integrados a escala pequeña): 1 a 10 M SI (circuitos integrados a escala media): 10 a 100 LSI (circuitos integrados a escala grande): 100 a 100 000 VLSI (circuitos integrados a escala muy grande): más de 100 000

Estas clases tienen propiedades diferentes y se usan de manera distinta. Un circuito SSI suele contener de dos a seis compuertas, cada una de las cuales puede usarse individualmente, como se hizo en las secciones. anteriores. La figura 3-10 ilustra una pastilla SSI típica que contiene cuatro compuertas NAND. Cada una de ellas tiene dos entradas y una salida, lo que implica la necesidad de 12 patas para las cuatro. Además, la 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,

32

Page 34: Manual Datos i 2003[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

Page 35: Manual Datos i 2003[1]

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

Page 36: Manual Datos i 2003[1]

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

Muchas aplicaciones de la lógica digital requieren un circuito de varias entradas y varias salidas, de modo que las salidas estén determinadas únicamente por el valor instantáneo de las entradas. Estos circuitos se llaman circuitos combinacionales. No todos los circuitos tienen esa propiedad. Por ejemplo, un circuito que contenga elementos de memoria puede generar salidas que dependan tanto de los valores de entrada como de los almacenados. Un ejemplo típico de circuito combinacional es uno que realice una tabla de verdad, como la de la figura 3-3(a). En esta sección, como ejemplo de pastillas MSI, examinaremos algunos circuitos combinacionales usados con frecuencia.

Multiplexores

En el nivel de lógica digital, un multiplexor es un circuito de 2n entradas de datos, una salida de datos y n entradas de control que seleccionan una de las entradas de datos. El dato de entrada seleccionado es el que aparece en la salida. La figura 3-12 muestra un esquema de un multiplexor de ocho entradas. Las tres líneas de control, A, B y C, codifican un número de 3 bits que específica qué línea de las ocho de entrada pasa a la compuerta OR y de ahí a la salida. Independientemente de los valores de las líneas de control, siete de las compuertas, AND siempre darán una salida 0; la otra puede dar 0 o 1, según sea el valor de la línea de entrada que se seleccione. Cada combinación de las entradas de control permite el paso de información por una sola de las compuertas AND.

35

Page 37: Manual Datos i 2003[1]

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 D i 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

Page 38: Manual Datos i 2003[1]

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

Page 39: Manual Datos i 2003[1]

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

Page 40: Manual Datos i 2003[1]

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.

Arreglos (matrices) lógicos programables

Se vio antes que podían construirse funciones arbitrarias (tablas de verdad) calculando los términos producto con puertas AND y pasando todos éstos por una compuerta OR. Una pastilla muy general para realizar sumas de productos es el arreglo lógico programable ( designado también por sus siglas inglesas PLA), que se muestra en la figura 3-16. Esta pastilla, la 74S330, tiene líneas de entrada para 12 variables. Internamente se genera el complemento de cada una de ella, haciendo un total de 24 señales de entrada. El corazón del circuito lo forma un conjunto de 50 compuertas AND cada una de las cua1es puede tener como entrada cualquier subconjunto de las 24 señales de entrada. El usuario determina qué entrada va a qué compuerta AND por medio de una matriz de 24 x 50. Cada línea de entrada a las 50 compuertas AND contiene un fusible.

39

Page 41: Manual Datos i 2003[1]

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 aplicaciones, en otras son preferibles las PLA hechas "a medida" para cierto cliente (para

40

Page 42: Manual Datos i 2003[1]

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

Es el momento de pasar de los MSI de uso general a los aritméticos. Empezaremos por un sencillo registro de corrimiento; después veremos cómo pueden construirse sumadores, y finalmente examinaremos las unidades aritméticas y lógicas, que desempeñan un importante papel en cualquier computadora.

Registros de corrimiento

Nuestro primer circuito MSI aritmético es un registro de corrimiento de 8 entradas y 8 salidas (véase figura 3-17). El dato de 8 bits se presenta en las entradas D0, ..., D7 y se obtiene desplazando un bit en las salidas S0, ...,S7. La línea de control C, determina el sentido del desplazamiento: si es 0, el corrimiento es a la izquierda, si es 1, a la derecha.

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

Page 43: Manual Datos i 2003[1]

Sumadores

No se puede imaginar una computadora que no sume enteros. En consecuencia, una parte esencial de una CPU son los circuitos para realizar la adición. La figura 3-18(a) muestra la tabla de verdad de un circuito para sumar 1 bit. La función tiene dos salidas: la suma de las entradas A y B, y el acarreo a la siguiente posición (a la izquierda). La figura 3-18(b) muestra un circuito que realiza la suma y el acarreo. Este circuito se conoce por semisumador.

Aunque el semisumador sirve para sumar los dos bits menos significativos de dos palabras de varios bits, no funciona en una posición intermedia, debido a que no tiene en cuenta el acarreo que proviene de su derecha. Lo qué se necesita es el sumador completo de la figura 3-19. Como se ve, el sumador completo puede construirse con dos semisumadores. La salida Suma estará a 1 si hay un número impar de entradas (A, B y Acarreo de entrada) a 1. La salida Acarreo de salida estará a 1 si A y B están a 1 (entrada de la izquierda de la puerta OR) o bien sólo una de ellas está a 1 y el Acarreo de entrada también lo está. Los dos semisumadores juntos generan tanto la suma como los bits de acarreo.

42

Page 44: Manual Datos i 2003[1]

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.

Unidades aritméticas y lógicas

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

En muchas computadoras digitales, el orden en que tienen un lugar los eventos es crítico. Algunas veces un evento debe preceder a otro, mientras que otros deben realizarse simultáneamente. Para permitir a los diseñadores satisfacer las relaciones de tiempo, muchos circuitos digitales utilizan relojes para su sincronización. Un reloj en este contexto, es un circuito que emite una serie de impulsos de un ancho y una separación determinadas con precisión. El intervalo entre los flancos de subida o bajada de dos pulsos consecutivos se llama tiempo de ciclo del reloj. Normalmente las frecuencias de los pulsos están entre 1 y 100 MHz, correspondientes a ciclos de reloj entre 1000 nseg a 10 nseg. La frecuencia del reloj suele controlarse por medio de un oscilador a cristal, para obtener una gran precisión.

43

Page 45: Manual Datos i 2003[1]

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 REL13. Flanco de subida de REL2 4. Flanco de bajada de REL2

44

Page 46: Manual Datos i 2003[1]

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

Un componente esencial de toda computadora es su memoria. Sin ella no podría haber computadoras como las conocemos. Se usa para guardar las instrucciones a ejecutar y sus datos. En las secciones siguientes examinaremos los componentes básicos de una memoria, empezando al nivel de compuertas para ver como funcionan y como se combinan para obtener memorias grandes.

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

45

Page 47: Manual Datos i 2003[1]

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.

Con un razonamiento similar, es fácil ver que si se pone S a 1 en el estado 1 nada ocurre, pero si se pone R a 1, el biestable se coloca en estado 0. En resumen, cuando S se pone a 1 momentáneamente, el biestable termina en el estado 1, sin tomar en cuenta el estado en que estuvo antes. De modo similar, cuando R se pone momentáneamente a 1, el biestable pasa a estado 0. El circuito "recuerda" si la última entrada que estuvo a 1 fue R o S. Esta propiedad puede emplearse para construir memorias de computadora.

46

Page 48: Manual Datos i 2003[1]

Bieslables SR sincronizados

A menudo es conveniente impedir que un biestable cambie de estado excepto en ciertos momentos específicos. Para conseguirlo, modificamos ligeramente el circuito, como se muestra en la Figura 3-24, obteniéndose un biestable SR sincronizado. Este circuito tiene una entrada adicional, el reloj, que normalmente está a 0. Con el reloj a 0 ambas compuertas AND dan 0, independientemente de S y R, y el biestable no cambia de estado. Cuando el reloj es 1, el efecto de las puertas Y desaparece y el biestable se hace sensible a S y a R. A pesar de su nombre, la señal de reloj no tiene por qué estar manejada por un reloj. Cuando la señal de reloj está a 1, se suele decir que el biestable está habilitado o activado, es decir, que es sensible a S y a R.

Hasta ahora hemos esquivado cuidadosamente el problema de lo que sucede cuando tanto S como R son 1 a la vez. Y por una buena razón: el circuito se vuelve no determinista cuando R y S vuelven a 0. El único estado consistente para S = R = 1 es Q = Q = 0, pero tan pronto como las entradas vuelven a 0, el biestable puede ponerse en cualquiera de los dos estados estables. Si alguna de las entradas vuelve a 0 antes que la otra, gana la que esté más tiempo a 1, ya que durante ese pequeño instante hay una sola entrada a 1 y fuerza el estado correspondiente. Si ambas entradas se pusieran a 0 simultáneamente (lo que es muy improbable), el bienestar se situaría al azar en cualquiera de sus estados estables.

Biestables D sincronizados

Una forma de resolver la ambigüedad de los biestables SR es estar seguros de que no ocurrirá. La figura 3-25 muestra un biestable con una sola entrada, D. Como la entrada a la compuerta AND inferior es siempre el complemento de la entrada a la superior, nunca se presentará el problema de ambas a 1. Cuando D = 1 y el reloj esté a 1, el biestable pasará a estado 1. Cuando D = 0 y el reloj esté a 1 también, el biestable pasará a 0 lógico. Dicho de otro modo, cuando el reloj esté a 1, se muestreará el valor actual de D y se guardará en el biestable. Este circuito, denominado biestable D sincronizado, es una verdadera memoria de un bit. El valor almacenado está siempre disponible en Q. Para cargar el valor actual de D en memoria, hay que enviar un impulso positivo por la línea de reloj.

Flip-flops y registros

En muchos circuitos es necesario muestrear el valor de cierta línea en un instante determinado y almacenarlo. En principio, esto se podría hacer con un biestable D sincronizado, mandando un impulso muy corto por la línea de reloj en el momento de muestrear. En la práctica, puede ser difícil la generación de impulsos muy cortos, por lo que se ha desarrollado un tipo distinto de biestables. Se denominan flip-flops o biestables accionados por flanco, y en ellos la transición tiene lugar no cuando el reloj es 1, sino durante la transición de 0 a 1 o de 1 a 0. Así , la duración del impulso de reloj no tiene importancia, siempre que las transiciones ocurran con rapidez.

Es importante insistir en la diferencia entre un flip-flop y un biestable. Un flip-flop se dispara por flanco mientras que un biestable se dispara por nivel. Es necesario tener 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.

47

Page 49: Manual Datos i 2003[1]

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

Los flip-flops están disponibles en varias configuraciones. En la figura 3-27 (a) se muestra una de las más simples, con dos biestables D independientes con señales de borrado (CLR) y puesta a 1 (OR). Aunque están en el mismo chip de 14 patas, ambos flip-flops son independientes. La figura 3-27(b) muestra una disposición algo diferente, con ocho flip-flops. A éstos no sólo les faltan las líneas Q y de puesta a 1, sino que además todas sus entradas de reloj están juntas y conectadas a la pata 11. Cada uno de ellos es del tipo de la figura 3-26(d). Pero las burbujas de inversión se cancelan con el inversor conectado a la pata 11, por lo que se cargan con el flanco de subida. También todas las señales de borrado están conectadas, por lo cual si la pata 1 se pone a 0 fuerza a todos los biestables a ponerse a 0. En el caso de que al lector le parezca sorprendente que la pata 11 se invierta una vez a su entrada y oirá en cada señal CK, la explicación es que una señal de entrada quizá no pueda atacar los ocho biestables y se usa el inversor de entrada como amplificador.

Es evidente que la razón por la cual se juntan las líneas de reloj y borrado en la figura 3-27(b) es ahorrar patas, pero esto lleva a que el uso a que se puede destinar la pastilla sea distinto del que tendrían ocho flip-flops independientes. Se utiliza como un registro de 8 bits. Así, también pueden usarse dos de estas pastillas para realizar un registro de 16 bits conectando entre si las patas 1 y 11 respectivas. Se verá con más detalle el uso de los registros en el capitulo 4.

A medida que avanzamos, vamos viendo que la escasez de patas lleva al diseño de pastillas con un cociente compuertas/patas cada vez mayor. El sencillo biestable D de la figura 3-25 requiere cinco compuertas, por lo que una pastilla con ocho de ellos, análoga a la de la figura 3-27(b), necesitará 57, incluyendo los ocho inversores para CK y los ocho para CLR. Un flip-flop es más complejo internamente que un biestable accionado por nivel, por lo que la figura 3-27(b) representa el equivalente a unas 100 puertas, lo que es bastante más complejo que las sencillas pastillas SSI de la figura 3-11. En la siguiente sección estudiaremos una organización distinta de las pastillas de memoria, que permita un cociente compuertas/patas mucho mayor.

48

Page 50: Manual Datos i 2003[1]

Organización de las memorias

Aunque hemos progresado desde la simple memoria de 1 bit de la figura 3-25 a la de 8 bits de la figura 3-27(b), no podemos seguir por este camino, debido a la falta de patas en las pastillas. Cada biestable requiere dos patas, D y Q, además de las de control compartidas por todos. Para construir memorias grandes se requiere una organización distinta.

Lo que se necesita es un diseño en que el número de patas crezca en relación logarítmica con la capacidad de memoria, en lugar de hacerlo en forma lineal. Una organización de memorias muy extendida que cumple ese criterio es la de la figura 3-28. Este ejemplo ilustra una memoria de cuatro palabras de tres bits. Cada operación lee o escribe una palabra completa de 3 bits. Aunque la capacidad de esta memoria de 12 bits es algo mayor que la de nuestro registro de 8, necesita menos patas y, lo que es más importante, el diseño se generaliza fácilmente para memorias grandes.

Aunque a primera vista la memoria de la figura 3-28 parece complicada, en realidad es bastante simple, debido a su estructura regular. Tiene ocho líneas de entrada y tres de salida. De las de entrada, tres son de dato: DE0, DE1 y DE2; dos de dirección: DIR0, y DIR1; y tres de control: CS para seleccionar la pastilla, RD para distinguir la lectura de la escritura y OE para permitir la salida. Las líneas de salida son para los datos: DS0, DS1 y DS2. En principio, podía ponerse esta memoria en un chip de 14 patas, incluyendo la alimentación y la tierra, frente a las 20 del registro de ocho biestables.

Se necesita una lógica externa que ponga CS en alto para seleccionar la pastilla, así

49

Page 51: Manual Datos i 2003[1]

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 DIR 0 y DIR1; las restantes permanecen sin ser alteradas.

50

Page 52: Manual Datos i 2003[1]

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

Page 53: Manual Datos i 2003[1]

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

Propiedades de las memorias

Lo más interesante de la memoria de la figura 3-28 es que se generaliza con facilidad para tamaños mayores. Tal como está dibujada, la memoria es de 4 x 3, es decir, de 4 palabras de 3 bits cada una. Para extenderla a 4 x 8 sólo tendríamos que añadir cinco columnas más de cuatro biestables cada una, así como cinco líneas de entrada y cinco de salida. Para ir de 4 x 3 a 8 x 3 deberemos añadir cuatro filas más de tres biestables cada una, así como una línea de dirección adicional, DIR2. Con esta clase de estructura, el número de palabras debería ser una potencia de dos, para que la eficiencia sea máxima; sin embargo, el número de bits por palabra puede ser cualquiera.

Como la tecnología de circuitos integrados es muy adecuada para hacer pastillas con una estructura interna repetitiva en dos dimensiones, las memorias son aplicaciones ideales de aquélla. A medida que esta tecnología se perfecciona, aumenta el número de bits que pueden meterse en una pastilla, cuadruplicándose aproximadamente cada 3 o 4 años. En los primeros años de la década de los setenta las pastillas tenían 1K bits; más tarde, tuvieron sucesivamente 4K, 16K, 64K, 256K, etc. En 1990 ya eran comunes las memorias con 4 millones de bits. No siempre las pastillas de más capacidad vuelven obsoletas a las de menos, debido a las interrelaciones entre capacidad, velocidad, consumo, precio y conveniencia de interconexión.

Para un tamaño de memoria dado, existen varias formas de organizar la pastilla. En la figura 3-30 se aprecian dos posibles organizaciones para una pastilla de tamaño mediano (256K-bit): 32K x 8 y 256K x 1. En la primera, se necesitan 15 líneas para direccionar el 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

52

Page 54: Manual Datos i 2003[1]

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, 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

53

Page 55: Manual Datos i 2003[1]

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

Con la información acerca de las pastillas de memoria en sus diferentes escalas de integración, se puede abordar ahora el tema principal de este capítulo; los

microprocesadores. En esta sección se verán algunos de los aspectos generales de los microprocesadores desde el punto de vista de la lógica digital, incluyendo el significado de las señales asociadas a cada terminal. También se proporcionará una introducción al diseño de buses, en virtud de la estrecha relación que existe entre éstos y algunos microprocesadores y se darán ejemplos detallados de ambos en las siguientes secciones.

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, 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

54

Page 56: Manual Datos i 2003[1]

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

A continuación se describirá cada una de estas categorías y se proporcionarán más detalles cuando se describan más adelante las pastillas de lntel y de Motorola. En la figura 3-31 se muestran estos grupos de señales de manera general para una pastilla de CPU. Las patas de control del bus son en su mayoría salidas del microprocesador hacia el bus (o sea entradas para las pastillas de memoria y de entrada/salida), indicando la acción que desea realizar.

Las patas de interrupción son entradas de los dispositivos de entrada/salida al microprocesador. En la mayoría de los sistemas, el microprocesador puede indicar a estos lentos dispositivos que inicien su operación y después dedicarse a algo más útil mientras éstos trabajan. Cuando termina la operación de E/S, la pastilla controladora de entrada/salida activa una señal en una de estas patas para interrumpir ala CPU para que atienda al dispositivo, por ejemplo para verificar si hubo algún error de E/S. Algunos microprocesadores tienen una pata de salida para reconocer la señal de interrupción.

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

55

Page 57: Manual Datos i 2003[1]

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

56

Page 58: Manual Datos i 2003[1]

A continuación se estudiará el funcionamiento de los buses. Algunos dispositivos conectados al bus se encuentran en estado activo y pueden iniciar transferencias, mientras que otros están en estado pasivo aguardando solicitudes. A los dispositivos activos se les llama maestros mientras que a los pasivos se les denomina esclavos. Cuando la CPU ordena leer o escribir un bloque aun controlador de discos, ésta actúa como dispositivo maestro y el controlador como esclavo. Sin embargo, el controlador puede actuar más adelante como dispositivo maestro, al indicar a la memoria que acepte las palabras que lee de la unidad de disco. En la figura 3-33 se listan varias de las combinaciones típicas entre dispositivos maestros y esclavos. La memoria no puede, bajo ninguna circunstancia, actuar como dispositivo maestro.

A menudo las señales binarias que emiten los dispositivos no son la suficientemente fuertes para activar el bus, en especial si éste es relativamente largo 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 parecida, los dispositivos esclavos se conectan 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.

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

57

Page 59: Manual Datos i 2003[1]

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

Page 60: Manual Datos i 2003[1]

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. Para dar tiempo a la memoria para decodificar la dirección y poner los datos en el bus, no

59

Page 61: Manual Datos i 2003[1]

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

60

Page 62: Manual Datos i 2003[1]

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

61

Page 63: Manual Datos i 2003[1]

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.

Debe quedar claro que la sincronización completa es independiente de los ciclos de tiempo. Cada paso se provoca por un paso previo, y no por un impulso de reloj. Si una pareja maestro-esclavo en particular es lenta, de ninguna manera afecta a otra posterior que sea mucho más rápida.

Con esto deben quedar claras las ventajas de los buses asíncronos, pero el hecho es 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 sólo activa sus señales y la memoria sólo reacciona a éstas. No hay retroalimentación (causa y efecto), pero si los componentes se han seleccionado adecuadamente, el trabajo se desarrollará de manera correcta sin necesidad de sincronización.

Arbitraje del bus

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

Page 64: Manual Datos i 2003[1]

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, otros dispositivos pueden solicitar el bus mientras que el primero lo está utilizando. Cuando

63

Page 65: Manual Datos i 2003[1]

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

64

Page 66: Manual Datos i 2003[1]

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

65

Page 67: Manual Datos i 2003[1]

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

Page 68: Manual Datos i 2003[1]

CONCLUSIÓN

67

Page 69: Manual Datos i 2003[1]

BOLILLA II (Parte 2): EL

NIVEL DE

MICROPROGRAMACIÓN

68

Page 70: Manual Datos i 2003[1]

INDICE

BOLILLA II (Parte 2): EL NIVEL DE MICROPROGRAMACIÓN_____________________68

INDICE___________________________________________________________________69

INTRODUCCIÓN__________________________________________________________70

EL NIVEL DE MICROPROGRAMACIÓN_____________________________________71REPASO SOBRE EL NIVEL DE LÓGICA DIGITAL____________________________72

Registros_______________________________________________________________72Buses__________________________________________________________________72Multiplexores y decodificadores____________________________________________74Unidades aritméticas y lógicas y registros de corrimiento_________________________74Relojes________________________________________________________________75Memoria principal_______________________________________________________76Encapsulado de los componentes____________________________________________77

UNA MICROARQUITECTURA TIPICA______________________________________78La ruta de datos__________________________________________________________78Microinstrucciones_______________________________________________________80Cronología de las microinstrucciones_________________________________________82Secuenciamiento de las microinstrucciones____________________________________84

UNA MACROARQUITECTURA TIPICA______________________________________85Pilas__________________________________________________________________85El juego de macroinstrucciones_____________________________________________89

MICROPROGRAMACIÓN: UN EJEMPLO____________________________________92El lenguaje micro ensamblador_____________________________________________92El ejemplo de microprograma______________________________________________93Observaciones sobre el microprograma_______________________________________95Perspectivas____________________________________________________________96

EL DISEÑO DEL NIVEL DE MICROPROGRAMACIÓN_________________________97Microprogramación horizontal frente a microprogramación vertical________________97Nanoprogramación______________________________________________________104Mejora del rendimiento__________________________________________________105Memoria caché_________________________________________________________111

CONCLUSIÓN____________________________________________________________116

69

Page 71: Manual Datos i 2003[1]

INTRODUCCIÓN

70

Page 72: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

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

Page 73: Manual Datos i 2003[1]

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 00 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0

Fig. 4-1. Un registro de 16 bits de información

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

72

Page 74: Manual Datos i 2003[1]

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.

Multiplexores y decodificadores Los circuitos que tienen una o más líneas de entrada y que calculan uno o varios

73

Page 75: Manual Datos i 2003[1]

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.

Unidades aritméticas y lógicas y registros de corrimiento Toda computadora necesita algún medio para hacer operaciones aritméticas. El

circuito más simple es un sumador, que toma dos entradas de n bits y produce su suma como salida. Un circuito aritmético más general es la ALU (Unidad Aritmética y Lógica). También tiene dos entradas y una salida de datos, pero además tiene algunas entradas y salidas de control. La de la figura 4-4(a) tiene dos bits de función, F0 y F1 que determinan qué función se ha de realizar. La ALU que vamos a usar en nuestro ejemplo puede calcular A + B, AND B, A y A-. Las dos primeras no requieren explicación; la tercera simplemente copia A en la salida; la cuarta obtiene A negando (todos sus bits invertidos). La tercera función puede parecer inútil, pero veremos su utilidad después. La figura 3-20 muestra una ALU de cuatro funciones que opera sobre datos de un bit. Replicando este circuito n veces y conectando el acarreo del bit i al del i + 1, obtendremos una ALU de n bits que realice las operaciones AND, OR, NOT y suma.

Una ALU también puede tener salidas de control. Salidas típicas son aquellas que se ponen a 1 cuando la salida de la ALU es negativa o cero, cuando hay acarreo del bit más significativo o cuando ha ocurrido un desbordamiento. El ejemplo de la figura 4-4(a) tiene dos salidas de control: N, para indicar que la salida de la ALU es negativa y Z, que indica que es cero. El bit N es simplemente una copia del más significativo de la salida, mientras que el bit Z es el NOR de todos los bits de salida.

Aunque algunas ALU pueden realizar también operaciones de desplazamiento, la 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.

74

Page 76: Manual Datos i 2003[1]

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.

El diseñador de computadoras puede hacer que cuatro transiciones diferentes tengan lugar en cierto orden dentro de un ciclo activando cada una de ellas con el AND lógico de la señal habilitadora y una línea de reloj distinta. Primero se disparará la transición asociada a la línea principal de reloj, luego la que esté asociada a la línea de reloj de menor retardo y así sucesivamente.

75

Page 77: Manual Datos i 2003[1]

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

Page 78: Manual Datos i 2003[1]

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

Page 79: Manual Datos i 2003[1]

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

Page 80: Manual Datos i 2003[1]

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, F 0 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 combinacional, es decir, calcula continuamente la salida en función de las entradas y el

79

Page 81: Manual Datos i 2003[1]

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.

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,

80

Page 82: Manual Datos i 2003[1]

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.

El siguiente paso en el diseño de la micro arquitectura es inventar un formato de microinstrucción que contenga 22 bits. La figura 4-9 muestra uno de los posibles, con dos campos adicionales, COND y ADDR, que se describirán en seguida. La microinstrucción contiene 13 campos, 11 de los cuales son:

AMUX - Controla la entrada izquierda ala ALU: O; tampón de A, 1 = MBR. ALU – Función de la ALU: O=A+B, 1=A AND B, 2=A, 3= A. SH - Función del registro de corrimiento: O = nada, 1 = a la derecha, 2 = a la

izquierda. MBR - Carga del MBR a partir del registro de corrimiento: O = no carga, 1 = carga. MAR - Carga del MAR a partir del registro de B: O = no carga, 1= carga. RD - Petición de lectura de memoria: O = no pide, 1 = carga el MBR de memoria. WR - Petición de escritura en memoria: O = no pide, 1 = escribe el MBR en

memoria. ENC - Control de almacenamiento en registros de memoria interna: O = no

almacena, 1 = almacena. C - Selecciona el registro dónde almacenar si ENC = 1: O = PC, 1 = AC, etc. B - Selecciona la fuente del bus B: O = PC, 1 = AC, etc.A - Selecciona la fuente del bus A: O = PC, 1 = AC, etc. El orden de los campos es completamente arbitrario. Se ha elegido el orden que

minimice el cruce de líneas en una figura que hay más adelante. (Este criterio no es tan disparatado como parece; los cruces de líneas suelen corresponder- se con cruces de conexiones en circuitos impresos o integrados, lo que causa problemas en diseños bidimensionales.)

81

Page 83: Manual Datos i 2003[1]

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.

La figura 4-10 es un diagrama de bloques detallado de la micro arquitectura de nuestra máquina completa. Puede parecer impresionante a primera vista, pero merece la pena estudiarla en detalle. Cuando el lector entienda completamente cada bloque y cada línea, podrá avanzar en la comprensión total del nivel de microprogramación. El diagrama de bloques tiene dos partes: la ruta de datos, a la izquierda, que ya estudiamos de modo pormenorizado, y la sección de control, de la que trataremos ahora.

82

Page 84: Manual Datos i 2003[1]

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 ciclo. Mientras los datos salen a los buses A y B, la unidad de "Incremento" de la sección de

83

Page 85: Manual Datos i 2003[1]

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.

El MBR también se carga durante el cuarto sub ciclo si MBR=I. Las dos señales que controlan la memoria, RD y WR, están activas mientras estén

presentes en el MIR. En efecto, los campos correspondientes del MIR actúan como si fueran biestables.

Secuenciamiento de las microinstrucciones Lo único que nos queda por ver es cómo se elige la siguiente microinstrucción. Aunque

la mayoría de las veces basta extraer la siguiente microinstrucción en secuencia, se necesita algún mecanismo que permita saltos condicionales en el microprograma para tomar decisiones. Por esta razón dotamos a cada microinstrucción de dos campos adicionales: ADDR, que es la dirección de un sucesor potencial de la microinstrucción en curso, y COND, que determina si la siguiente microinstrucción se extrae de M PC + 1 o de ADDR. Cada microinstrucción contiene potencialmente un salto condicional. Se ha tomado esta decisión porque los saltos condicionales son muy comunes en los microprogramas y, al permitir que toda microinstrucción tenga dos posibles sucesores, los microprogramas se ejecutan más rápido que si se tuviera que ajustar alguna condición en una microinstrucción y examinarla en la siguiente. La mayoría de las arquitecturas usan esta estrategia de una forma u otra.

La elección de la siguiente microinstrucción la realiza la caja rotulada "Lógica de Microsecuenciamiento" durante el sub ciclo de 4, cuando las salidas de la ALU N y Z son válidas. La salida de esta caja controla el multiplexor M (Mmux), que encamina M PC + 1 o ADDR al M PC, que determinará cuál será la siguiente microinstrucción a extraer. Hemos proporcionado al microprogramador cuatro alternativas posibles ajustando COND como sigue:

0 = No saltar; la siguiente microinstrucción se toma de M PC + 1. 1 = Saltar a ADDR si N= 1. 2 = Saltar a ADDR si Z = 1. 3 = Saltar a ADDR incondicionalmente.

La lógica de microsecuenciamiento combina los dos bits de la ALU, N y Z, y los dos bits de COND para generar la salida. Llamando a éstos 1 y D (izquierdo y derecho), la señal correcta será.

Mmux = IDN + IDZ + ID = DN + IZ + ID

Donde + significa O INCLUSIVO. Expresado con palabras, la señal de control a Mmux es 1 (encaminando ADDR al M PC) si ID es 012 y N= 1, si ID es 102 y Z = 1, o si ID es 112. En caso contrario es 0 y se extrae la siguiente microinstrucción en secuencia. El circuito que 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.

84

Page 86: Manual Datos i 2003[1]

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.

UNA MACROARQUITECTURA TIPICA Para continuar nuestro ejemplo del nivel de microprogramación, pasaremos ahora a la

arquitectura del nivel de máquina convencional que deberá ser soportado por el intérprete que se ejecute en la máquina de la figura 4-10. Por conveniencia, llamaremos macro arquitectura a la arquitectura del nivel 2 o del3, y así distinguirla de la arquitectura del nivel 1 o micro arquitectura. (Para los propósitos de este capítulo, ignoraremos el nivel 3, ya que sus instrucciones son en gran parte las del nivel 2 y sus diferencias no tienen importancia aquí.) De modo similar, a las instrucciones del nivel 2 las llamaremos macroinstrucciones. Así, durante este capítulo, llamaremos macroinstrucciones a las instrucciones normales del nivel de máquina convencional, como ADD, MOVE, etc. (La razón por la que repetimos esto es que algunos ensambladores proporcionan la posibilidad de definir “macros”, en ensamblador, que no tiene nada que ver con lo que aquí entendemos como macroinstrucciones.) Algunas veces nos referiremos a nuestro ejemplo de máquina de nivel 1 como Mic-1 ya la de nivel 2 que soporta como Mac-1. Antes de describir la Mac-1, vamos a divagar un poco para motivar el diseño.

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

Page 87: Manual Datos i 2003[1]

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

Page 88: Manual Datos i 2003[1]

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 que

87

Page 89: Manual Datos i 2003[1]

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.

Cuando se haya terminado mulp y se haya llamado a interno, la configuración de la pila será la mostrada en la figura 4-13(c). Cuando interno llame a mulp, la pila estará como muestra la figura 4-13(d). Ahora nos encontramos con el problema: ¿qué código generará el compilador para accesar a los parámetros de mulp ya sus variables locales? Si intentara leer p usando una instrucción semejante a MOVE 3976,DONDE, mulp funcionaría cuando se le llama desde el programa principal, pero no cuando se le llamara desde interno. De manera similar, MOVE 3971,DONDE funcionará cuando se le llame desde in- terno, pero no desde el programa principal. Lo que se necesita realmente es alguna forma de decir "extrae la palabra que esté una dirección por encima del apuntador de pila". En otras palabras, el Mac-1 necesita un modo de direccionamiento que extraiga o almacene una palabra situada a una distancia conocida del apuntador de pila (o algún modo de direccionamiento equivalente).

88

Page 90: Manual Datos i 2003[1]

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 utiliza para accesar a elementos de un vector, entre otras cosas. El direccionamiento local

89

Page 91: Manual Datos i 2003[1]

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.

BinarioNemotécnic

oInstrucción Significado

0000xxxxxxxxxxxx LODD Carga directa ac: =m[x]0001xxxxxxxxxxxx STOD Almacena

directom [x]:= ac

0010xxxxxxxxxxxx ADDD Suma directo ac:=ac + m[x]0011xxxxxxxxxxxx SUBD Resta directo ac:=ac - m[x]0100xxxxxxxxxxxx JPOS Salta si

positivoif ac ³ 0 then pc:=x

0101xxxxxxxxxxxx JZER Salta si cero if ac = 0 then pc:=x0110xxxxxxxxxxxx JUMP Salta pc:=x0111xxxxxxxxxxxx LOCO Carga

constanteac:=x(0 ³ x ³ 4095)

1000xxxxxxxxxxxx LODL Varga local ac:=m[sp + x]1001xxxxxxxxxxxx STOL Almacena

localm[x + sp]: =ac

1010xxxxxxxxxxxx SAL Suma local ac:=ac + m[sp + x]1011xxxxxxxxxxxx SUBL Resta local ac:=ac - m[sp - x]1100xxxxxxxxxxxx JNEG Salta si

negativoif ac < 0 then pc:=x

1101xxxxxxxxxxxx JNZR Salta si no cero

if ac ¹ 0 then pc:=x

1110xxxxxxxxxxxx CALL Llama a proced

sp:=sp – 1; m[sp]:=pc; pc=x

1111000000000000

PSHI Apila indirecto sp:=sp – 1; m[sp]:=m[ac]

1111001000000000

POPI Dasapila indirecto

m[ac]:= m[sp]; sp:=sp + 1

1111010000000000

PUSH Apila sp:=sp – 1; m[sp]:=ac

1111011000000000

POP Desapila ac:=m[sp]; sp:=sp + 1

1111100000000000

RETN Retorno pc:=m[sp];sp:=sp+1

1111101000000000

SWAP Intercambia ac y sp

tmp:=ac; ac:=sp; sp:=tmp

11111100yyyyyyyy INSP Incrementa sp sp:=sp + y (0 £ y £

90

Page 92: Manual Datos i 2003[1]

255)11111110yyyyyyyy DESP Decrementa

spsp:=sp - y (0 £ y £ 255)

xxxxxxxxxxxx es una dirección de máquina de 12 bits; en la columna 4 se llama x.Yyyyyyyy es una constante de 8 bits; en la columna 4 se llama y

Fig. 4-14. El conjunto de instrucciones del Mac-1

Hay cinco instrucciones de salto, una incondicional (JUMP) y cuatro condicionales (JPOS, JZER, JNEG y JNZE). JUMP siempre copia los 12 bits menos significativos al contador de programa, mientras que las otras cuatro sólo la hacen si se cumple la condición especificada.

LOCO carga en AC una constante de 12 bits en el rango de O a 4095 (inclusive). PSHI apila la palabra cuya dirección está en AC. La operación inversa es POPI, que desapila una palabra y la guarda en la posición de memoria direccionada por AC, PUSH y POP sirven para manipular la pila de diversas maneras. SW AP intercambia los contenidos de AC y SP, la que es útil cuando hay que incrementar o decrementar SP en una cantidad desconocida en tiempo de compilación. También resulta útil inicializar SP al principio de la ejecución. Las instrucciones INSP y DESP se utilizan para aumentar o disminuir SP en cantidades conocidas al momento de la compilación. Debido a la falta de espacio de codificación, los desplazamientos se han limitado a 8 bits. Por último, la instrucción CALL se usa para llamar a un procedimiento, guardando la dirección de retorno en la pila y RETN regresa de un procedimiento, desapilando la dirección de retorno y almacenándola en el registro PC.

Hasta ahora, la máquina no tiene instrucciones de entrada / salida, ni se le agregarán, pues no las necesita. En su lugar usa E/S por memoria. Una lectura de la dirección 4092 dará una palabra de 16 bits con el siguiente carácter ASCII del dispositivo normal de entrada en los 7 bits menos significativos y ceros en los 9 más significativos. Cuando haya un carácter disponible en la 4092, se pondrá a 1 el bit más significativo del registro de estado de la entrada, con dirección 4093. La lectura de la dirección 4092 pone a cero la 4093. La rutina de entrada estará normalmente en una pequeña iteración de espera a que la 4093 se haga negativa. Cuando suceda, cargará el contenido de la 4092 y regresará.

La salida se realizará en forma similar. Una escritura en la 4094 tomará los 7 bits menos significativos de la palabra escrita y los copiará en el dispositivo normal de salida. El bit más significativo del registro de estado de la salida, de dirección 4095, se borrará, volviéndose a poner a 1 cuando el dispositivo de salida esté listo para recibir un nuevo carácter. Los dispositivos normales de entrada y salida pueden ser un teclado y una pantalla, una lectora de tarjetas y una impresora o alguna otra combinación.

Un ejemplo de cómo se programa con este juego de instrucciones se observa en la figura 4-11(b), que es el programa de la figura 4-11(a), compilado a lenguaje ensamblador por un compilador que no hace ninguna optimización, ya que un código optimizado dificultaría el seguimiento del ejemplo: Los números 0 a 19 en los comentarios, identificados por una barra inclinada en el lenguaje ensamblador, ayudan a ver las partes que se corresponden de las dos mitades de la figura, OUTNUM 1 y STOP son rutinas de biblioteca que realizan las funciones obvias.

91

Page 93: Manual Datos i 2003[1]

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 .

El lenguaje micro ensamblador En principio, podría escribir microprogramas en binario, a razón de 32 bits por

microinstrucción. Los programadores masoquistas podrían disfrutar con ello, pero nadie más. Por tanto, necesitamos un lenguaje simbólico en el que expresar los microprogramas. Una notación posible es hacer que el microprogramador especifique una microinstrucción por línea, nombrando cada campo distinto de cero y su valor. Por ejemplo, para sumar AC a A y guardar el resultado en AC, podría escribir .

ENC = 1, C = 1, B = 1, A= 10

Muchos lenguajes de microprogramación utilizan una notación similar. Pero es una monstruosidad, al igual que los lenguajes que la utilizan.

Una idea mucho mejor es usar una notación de lenguaje de alto nivel, reteniendo el concepto de una línea por microinstrucción. Es concebible escribir microprogramas en un lenguaje de alto nivel ordinario, pero como la eficiencia es de crucial importancia, se utiliza un lenguaje ensamblador, que los definimos como un lenguaje simbólico cuyas instrucciones se correspondan biunívocamente con las del lenguaje máquina. Recuérdese que 25% de ineficiencia en el microprograma desacelera la máquina completa 25%. Llamaremos a nuestro lenguaje Micro ensamblador de Alto Nivel ("LMAN"). En LMAN los almacenamientos en los 16 registros de anotaciones, en el MAR o en el MBR, se representan por sentencias de asignación. Así, nuestro ejemplo anterior, en LMAN, se escribiría ac : = a + ac (como nuestra intención es que el LMAN se parezca al Pascal, adoptaremos el convenio del Pascal que consiste en utilizar nombres en letra cursiva minúscula para los identificadores).

Para indicar el uso de las funciones 0, 1, 2, y 3 de la AL U, podemos escribir respectivamente:

ac: = a + ac, a: = and (ri, mascp), ac: = a ya: = inv(a),

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

Sin embargo, se presenta un pequeño problema cuando deseamos examinar un registro pero no almacenarlo. ¿Cómo especificamos el registro que vamos a examinar? Para resolver este problema introducimos la seudo variable alu, a la que se puede asignar un valor simplemente para indicar el contenido de la ALU.

Por ejemplo,alu : = tir, 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 con sus microinstrucciones correspondientes.

92

Page 94: Manual Datos i 2003[1]

Sentencia

AMUX

COND

ALU

SH

MBR

MAR

RD

WD

ENC C B A

ADDR

mar:=pc; rd 0 0 2 0 0 1 1 0 0 0 0 0 00rd 0 0 2 0 0 0 1 0 0 0 0 0 00ir:=mbr 1 0 2 0 0 0 0 0 1 3 0 0 00pc:=pc + 1 0 0 0 0 0 0 0 0 1 0 6 0 00mar:=ir; mbr:=ac; wr 0 0 2 0 1 1 0 1 0 0 3 1 00alu:=tir; if n them gato 15 0 1 2 0 0 0 0 0 0 0 0 4 15ac:=inv(mbr) 1 0 3 0 0 0 0 0 1 1 0 0 00tir:= lshift (tir); if n then goto 25

0 1 2 2 0 0 0 0 1 4 0 4 25

alu:=ac; if z them gato 22 0 2 2 0 0 0 0 0 0 0 0 1 22ac:= band (ir, amask); goto 0 0 3 1 0 0 0 0 0 1 1 8 3 00sp:=sp + (-1); rd 0 0 0 0 0 0 1 0 1 2 2 7 00tir:= lshift (ir + ir); if n then goto 69

0 1 0 2 0 0 0 0 1 4 3 3 69

Fig. 4-15. algunas sentencias LMAN y sus microinstrucciones correspondientes

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

Page 95: Manual Datos i 2003[1]

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 microinstrucción

94

Page 96: Manual Datos i 2003[1]

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

La suma de 1 al AC se hace en la línea 16, que de otro modo se hubiera desperdiciado, como la 13.

El micro código de JPOS comienza en la línea 21. Si AC<O, la bifurcación no se realiza y JPOS termina inmediatamente saltando de nuevo al bucle'(ciclo) principal. En cambio si AC >= 0, se extraerán los 12 bits menos significativos del IR haciendo el y lógico de éste con la máscara 007777 y guardando el resultado en el PC. No cuesta aquí nada eliminar los bits de código de operación y por ello es aconsejable hacerlo. Si hubiera costado una microinstrucción adicional, tendríamos que examinar muy cuidadosamente si el tener basura en los 4 bits más significativos del PC puede causar algún problema más tarde.

En cierto modo, JZER (línea 23) funciona en forma contraria a JPOS. En JPOS, si la condición se cumple, no se produce el salto y el control vuelve al bucle principal. En JZER se produce el salto si se cumple la condición. Como el código para realizar el salto es el mismo en todas las instrucciones de salto, podemos ahorrar micro código yendo a la línea 22 siempre que sea posible. Este estilo de programación normalmente se consideraría primitivo si se tratara de un programa de aplicación; pero en un microprograma no se tienen esos escrúpulos. El rendimiento es lo más importante.

JUMP y LOCO son evidentes, por lo que la siguiente rutina de ejecución interesante es la de LODL. Primero se calcula la dirección absoluta de memoria sumando el desplazamiento contenido en la instrucción al SP. Después se inicia la lectura de memoria. Como el resto del código es igual que el de LODL y LODD, usaremos las líneas 7 y 8 para ambos. No sólo se ahorra memoria de control sin pérdida de velocidad, sino que también hay menos código que depurar. STOL, ADDL y SUBL son similares. El código de JNEG y JNZE es similar al de JZER y JPOS, respectivamente (y no al contrario). CALL decrementa primeramente el SP y entonces apila la dirección de retorno, saltando finalmente al procedimiento. La línea 49 es casi idéntica a la línea 22; si hubieran sido exactamente iguales, podríamos haber eliminado la 49 poniendo en la 48 un salto incondicional a la 22. Desafortunadamente, debemos mantener activo WR durante otra microinstrucción.

Las macroinstrucciones restantes tienen 1111 en sus 4 bits más significativos, por lo que se necesita decodificar los bits del campo de dirección para distinguirlas. Sus rutinas de ejecución son tan simples que no las vamos a comentar.

Observaciones sobre el microprograma Aunque hemos estudiado el microprograma con bastante detalle, es interesante hacer

algunos comentarios. En la figura 4-16 incrementamos el PC en la línea 1. Podíamos también haberlo incrementado en la línea O, dejando libre la línea 1 para alguna otra cosa mientras se espera. En esta máquina no hay nada que hacer, pero en una real el microprograma tendría la oportunidad de examinar los dispositivos de E/S en espera de servicio, refrescar la memoria o alguna otra cosa.

Si hubiéramos dejado la línea 1 como está, podríamos, sin embargo, acelerar la máquina modificando la línea 8 para leer

mar: = pc,. ac : = mbr; rd,. goto 1;

En otras palabras, podemos empezar la extracción de la siguiente microinstrucción antes de terminar la ejecución de la que esté en curso. Esta posibilidad es una forma primitiva de escalonamiento o seriación. También se puede aplicar el mismo truco a otras rutinas de ejecución.

Está claro que una proporción considerable del tiempo de ejecución de cada

95

Page 97: Manual Datos i 2003[1]

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

Page 98: Manual Datos i 2003[1]

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.

Microprogramación horizontal frente a microprogramación verticalProbablemente la decisión más importante sea cuán codificadas deban estar las

microinstrucciones. Si fuéramos a construirla Mic-1 con una sola pastilla VLSI, se podrían ignorar abstracciones tales como registros, ALU, etc., y pensar sólo en las compuertas. Para que funcione la máquina, se necesitan ciertas señales, como las 16 de habilitación de salida de los registros al bus A o las que controlan el funcionamiento de la ALU. Si miráramos dentro de la ALU, veríamos que toda la circuiteria interna está controlada por cuatro líneas, no dos, ya que en la esquina izquierda de la figura 3-20 encontrarnos un decodificador de 2 a 4. En resumen, se puede hacer funcionar cualquier máquina con n señales de control aplicadas en los lugares adecuados sin decodificar nada.

Este punto de vista nos obliga a considerar un formato de microinstrucción diferente: hacerlo de n bits, uno por señal de control. Las microinstrucciones diseñadas según este principio se denominan horizontales y representan un extremo del espectro de posibilidades. En el otro extremo están las microinstrucciones con un pequeño número de campos muy codificados. Se dice que son verticales. Los nombres derivan de la manera en que un artista dibujaría sus memorias de control respectivas: los diseños horizontales tienen un número bastante pequeño de microinstrucciones anchas; los verticales tienen muchas microinstrucciones estrechas.

Entre ambos extremos hay muchos diseños intermedios. Nuestras microinstrucciones, por ejemplo, tienen algunos bits, como MAR, MBR, RD, WR y AMUX, que controlan directamente funciones del hardware. Por otro lado, los campos A, B, C y ALU requieren alguna lógica de decodificación antes de que puedan aplicarse a compuertas individuales. Una instrucción vertical extrema tendría solamente un código de operación, que sería simplemente una generalización de nuestro campo ALU, y algunos operandos, como nuestros campos

A, B y C. En una organización de este tipo se necesitarían códigos de operación para leer y escribir en memoria, hacer micro saltos, etc., porque los campos que controlan esas funciones en nuestra máquina ya no estarían presentes.

Para distinguir más claramente entre microinstrucciones horizontales y verticales, vamos a rediseñar nuestro ejemplo de micro arquitectura y hacer que se use microinstrucciones verticales. Cada microinstrucción contendrá ahora tres campos de 4 bits, que suman un total de 12 bits, frente a los 32 de la versión original. El primer campo es el código de operación, OP, que dice qué hace la microinstrucción. Los siguientes campos son dos registros, R1 y R2. Para los saltos, se combinan formando un único campo de 8 bits, R. Una microinstrucción típica sería ADD, SP, AC, que sumará el AC al SP.

En la figura 4-17 se muestra la lista completa de códigos de operación de las microinstrucciones de esta nueva máquina que llamaremos Mic-2. En la lista vemos que cada microinstrucción realiza una única función: si suma, no puede desplazar ni cargar el MAR, ni siquiera mantener activa la señal RD. Con apenas 12 bits por microinstrucción, sólo hay sitio para especificar una operación.

97

Page 99: Manual Datos i 2003[1]

Binario

Nemotécnico

Instrucción Significado

0001 ADD Suma r1:=r1 + r20001 AND Y booleano r1:=r1 Y r20010 MOVE Mueve registro r1:=r20011 compl. Complementa r1:=inv(r2)0100 LSHIFT Desplaza a la izquierda r1:=desizq(r2)0101 RSHIFT Desplaza a la derecha r1:=desder(r2)

0110GETMBR Almacena el MBR en

registror1:=rim

0111TEST Examina registro if r2 < 0 then n:=true; if r2 = 0

then z:=true 1000 BEGRD Comienza lectura rdm:=r1; lec1001 BEGWR Comienza escritura rdm:=r1; rim:=r2; esc1010 CONRD Continua lectura Lec1011 CONWR Continua escritura Esc1100 (no usado)1101 NJUMP Salta si N = 1 if n then goto r1110 ZJUMP Salta si Z = 1 if z then goto r1111 UJUMP Salta siempre goto r

r= 16 * r1 + r2

Fig. 4-17. Código de operación del Mac-2

Vamos a rehacer la figura 4-10 para mostrar las nuevas microinstrucciones. La figura 4-18 muestra el nuevo diagrama de bloques. La ruta de datos, representada a la izquierda, es idéntica a la anterior. La mayor parte de la porción de control, a la derecha, también quedará igual. En particular, aún necesitamos el MIR y la memoria de control (aunque esta vez con anchura de 12 bits, en lugar de 32). Los tamaños y funciones del M PC, el Mmux, el incrementador, el reloj y la lógica de microsecuenciamiento son idénticos a los del diseño horizontal. Además, necesitaremos decodificadores de 4 a 16 para los campos R1 y R2, análogos a los de A, B y C de la figura 4-10.

Las tres principales diferencias entre la figura 4-10 y la figura 4-18 son los bloques rotulados AND, NZ y "Decodificación de OP". Se necesita AND porque el campo R1 lleva tanto el bus A como el C. Se presenta el problema de que el bus A se carga durante el sub ciclo 2 pero el bus C no puede cargarse en la memoria interna hasta que se hayan estabilizado los registros de A y B, en el sub- ciclo 3.

98

Page 100: Manual Datos i 2003[1]

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 BEGRD, que inicia una lectura en memoria. Usa la función 2 de la ALU (selección de bus A),

99

Page 101: Manual Datos i 2003[1]

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

Sólo deben generarse internamente 15 términos producto, ya que ABCD no se necesita.

100

Page 102: Manual Datos i 2003[1]

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

Page 103: Manual Datos i 2003[1]

102

Page 104: Manual Datos i 2003[1]

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 minicomputadora muy simple. La PDP-8, por ejemplo, es una minicomputadora con palabras

103

Page 105: Manual Datos i 2003[1]

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 microprograma se ejecuta como sigue. Primero se extrae una palabra de la memoria de control y se usa para seleccionar una palabra de la nanomemoria, que se extrae y se guarda en el registro de microinstrucción. Los bits de este registro se utilizan como señales de control durante un ciclo. Al finalizar este ciclo, se extrae la siguiente palabra de la memoria de control y el proceso se repite.

Por ejemplo, supongamos que el microprograma original tiene 4096 x 100 bits pero sólo aparecen 128 microinstrucciones distintas. Bastaría una nanomemoria de 128 x 100 bits para guardar las microinstrucciones necesarias. La memoria de control tendría ahora 4096 x 7 bits, apuntando cada una de sus palabras a una nanoinstrucción. El ahorro de memoria en este ejemplo sería:

ahorro = 4096 x 100 -4096 x 7 -128 x 100 = 368 128 bits

El precio que debe pagarse por el ahorro de memoria es una ejecución más lenta. La 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.

104

Page 106: Manual Datos i 2003[1]

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.

Mejora del rendimiento Aunque el objetivo de la nanoprogramación es reducir el tamaño de la memoria de

control, incluso al precio de una ejecución más lenta, también se ha invertido gran cantidad de tiempo y esfuerzo en el objetivo opuesto: intentar acelerar la ejecución, incluso al precio de una mayor memoria de control. Estos dos criterios de diseño aparentemente incompatibles tienen que ver con dos estrategias de mercadotecnia: la de máquinas baratas y la de máquinas rápidas. En esta sección examinaremos algunas de las maneras en que se puede modificar nuestra sencilla micro arquitectura para que las máquinas funcionen más rápido.

Hasta ahora hemos supuesto que los cuatro sub ciclos tenían la misma duración. Aunque esto es sencillo, pocas veces produce el mejor rendimiento, ya que invariablemente uno de los cuatro necesita mucho más tiempo que los otros tres. Si los cuatro duraran lo mismo que el peor de los casos, la velocidad de la máquina disminuiría notablemente. La forma de corregir esto es permitir que la duración de cada sub ciclo sea independiente de la de los demás. La duración de cada sub ciclo debe ajustarse a la necesaria para realizar su función.

Aunque esto constituye un paso hacia adelante en la dirección correcta, es aún demasiado conservador, ya que la duración de cada sub ciclo está todavía determinada por el peor de los casos en ese sub ciclo. Considérese, por ejemplo, el sub ciclo 3 de nuestros ejemplos. Si la función de la ALU es la suma, probablemente se necesite más tiempo (debido a los retrasos en la propagación del acarreo) que si la operación fuera simplemente seleccionar A. Si la duración del sub ciclo 3 se determinara en el momento del diseño, debería ser la de la suma y no la de seleccionar A. Otra estrategia consistiría en que cada operación que va a realizarse determine la duración del sub ciclo, de modo que sea tan corta como sea posible.

Una vez tomada la decisión de hacer que la duración de cada sub ciclo dependa de la operación, debemos encontrar una forma de llevar a la práctica esta estrategia. Acelerar o des acelerar el reloj es una técnica difícil, por eso lo que se hace es conseguir un reloj maestro con un periodo mucho más corto que la duración del sub ciclo. Así. cada sub ciclo dura un determinado número de impulsos. Por ejemplo. si ALU tardara entre 75 y 150 nseg en realizar una operación. se podría usar un reloj maestro con un periodo de 25 nseg. durando el sub ciclo correspondiente entre tres y seis periodos.

Nos queda averiguar cómo sabe la máquina cuánto debe durar un sub ciclo. Hay dos posibles soluciones. Una de ellas es que la microinstrucción tenga campos que digan explícitamente los tiempos necesarios. La otra es derivar estos tiempos basándose en los campos de operación (utilizando una PLA). de la misma forma que se generan las demás señales de control en una máquina vertical. La primera solución cuesta bits de la memoria de control y la segunda cuesta lógica de decodificación y tiempo.

Otra forma de obtener mayor potencia de la máquina. consiste en incrementar la 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

105

Page 107: Manual Datos i 2003[1]

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

AC 000100 000100 077777 100001 000010Men 000050 170000 177775 000010 100001

000030 010100 100002 077771 100007N=0V=0

N=0V=0

N=1V=1

N=0V=1

N=1V=1

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.

Afortunadamente, la mayoría de .las ALU no sólo generan N y Z sino también D y A (acarreo). Sin embargo, si sólo hubiera cuatro saltos condicionales para cada uno de los bits NZDA, la macroinstrucción OMITE SI MENOR requeriría muchas microinstrucciones. Para mayor flexibilidad. muchas máquinas no permiten examinar individualmente los bits de estado de la ALU. En cambio. un único bit de las microinstrucciones provoca el O lógico de los bits NZDA con los cuatro bits menos significativos del campo ADDR y se salte al resultado. La figura 4-23 da algunos ejemplos. Si los 4 bits menos significativos fueran O, esto se convertiría en un salto condicional con 16 alternativas. Si todos fueran 1, se convertiría en salto incondicional a una dirección específica terminada en 1111.

Campo DIR

NZDA

Dirección hacia donde salta

10000000 1001 1000100110001000 1001 1000100110001011 1001 1000101110001011 1000 1000101110001011 0000 1000101110001111 0000 1000111110001111 1100 1000111110000000 1100 10001100

Fig. 4-23. Algunos ejemplos de saltos a múltiples destinos,

basándose en los bits NZDA

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

106

Page 108: Manual Datos i 2003[1]

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.

Ciclo1 2 3 4 5 6 7 8 9 10 11

Extracción de instrucciones

1 2 B 4 5 6 7 8 9

Decodificación de instrucciones

1 2 B 4 5 6 7 8

Cálculo de direcciones 1 2 B 4 5 6 7Extracción de operando 1 2 B 4 5 6Ejecución 1 2 B 4 5

Fig. 4-24. Unidad de procesamiento en línea de 5 etapas. Las instrucciones están etiquetadas con números. La instrucción marcada como B es un salto condicional

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.

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

107

Page 109: Manual Datos i 2003[1]

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.

El tiempo promedio de ejecución (en ciclos) se puede calcular como la suma ponderada de los dos casos: instrucciones regulares e instrucciones de salto.

Tiempo promedio de ejecución = (1- Pj)(l) + Pj[Pt1 + b) + (1- P,)(1)] Un poco de álgebra revela que el tiempo promedio por instrucción es 1 + bPjP,. Luego

la eficiencia de ejecución es 1/(1 + bPjP,). Asignando los valores (típicos estimados) de b = 4, Pj = 0.3 y P, = 0.65, la máquina corre a menos del 60% de su capacidad potencial.

¿Qué puede hacerse para mejorar el desempeño? Para empezar, si se pudiera predecir la dirección del salto, se podría extraer la instrucción apropiada " (siguiente) y eliminar la penalización. En la fórmula para la eficiencia se puede " entonces reemplazar P, por la probabilidad P w de que la suposición sea falsa.

Existen dos clases de predicciones: estáticas (al tiempo de compilación) y dinámicas (al tiempo de ejecución). Con predicción estática, el compilador hace una suposición para cada una de las instrucciones de salto que genera. Suponer por ejemplo, en las instrucciones iterativas que el salto regresará al inicio de la iteración, es correcta la mayoría de las veces. Cuando se trata de una condición improbable, tal como una llamada al sistema que genera un código de error, es muy posible que el salto no se lleve a cabo. En muchos casos se utilizan diferentes instrucciones para estos casos y el solo hecho de observar el código de operación proporciona una buena sugerencia.

Otro esquema más elaborado para los diseñadores de máquinas consiste en proporcionar dos códigos de operación para cada tipo de salto y hacer que el compilador use el primero si cree que el salto se llevará a cabo y el segundo en caso contrario. En forma alternativa, para programas de uso intensivo, se pueden correr primero en un simulador, registrando, el comportamiento de cada salto; luego, el programa binario puede "parcharse" con el código de operación apropiado (probablemente se realice, probablemente no se realice).

En el método de predicción dinámica, el microprograma construye, durante la ejecución, una tabla con las direcciones que contienen saltos y guarda un registro del comportamiento de cada uno. Este método tiende a hacer más lenta la máquina al llevar el registro, de modo que requiere de alguna ayuda del hardware. Algunas mediciones han mostrado que de esta manera no es difícil lograr un 90% de precisión.

La predicción de los saltos no es el único punto de ataque. Otra opción es determinar por anticipado en la línea, hacia que dirección será el salto. Algunas pruebas, como el salto si es igual son mucho más fáciles de hacer que en salto si menor que. Las primeras se pueden hacer con un comparador, mientras que las segundas requieren de un ciclo completo de trayectoria de datos para hacer una resta. Con este enfoque, siempre que el microprograma encuentre un salto, hace una verificación rápida en una etapa temprana de la línea para ver si puede resolver el salto de inmediato, en cuyo caso sabe en donde continuar con la extracción de la siguiente instrucción.

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

108

Page 110: Manual Datos i 2003[1]

trabajar en estrecha coordinación durante el diseño.

a := b + c;if b < c then declaración

if b < c a := b + c;then declaración

(a) (b)

Fig. 4-25. (a) Un fragmento en lenguaje Pascal. (b) Como pudiera ser el tratamiento

por parte del compilador

Si todo lo demás falla, siempre existe la posibilidad de seguir ambas trayectorias en paralelo. Para hacerlo, se requieren dos líneas de procesamiento en el hardware y no evita el problema de eliminación. No obstante, este método se utiliza en ocasiones en las computadoras de orden superior, en las que el aspecto importante es el desempeño y no el precio. Desde luego, si cada trayectoria se topa con otro salto antes de resolver el primero, el asunto se vuelve aún más complicado. Probablemente no sea la mejor idea tener "flojeando" algunas docenas de líneas de procesamiento, para enfrentar el peor de los casos.

Después de toda esta teoría respecto a lo que podría hacerse, regrese por un momento a la máquina de ejemplo. Esta, no tiene distintas unidades de hardware para extracción, decodificación, etc., de modo que no es posible formar estas líneas de procesamiento, pero con cambios menores al microprograma, se puede lograr un número limitado de traslapes entre las microinstrucciones de extracción y ejecución, la que también es una forma de realizar las líneas.

En la figura 4-10, por ejemplo, si la siguiente microinstrucción pudiera extraerse de alguna manera durante el sub ciclo 4, ya no se necesitaría el sub ciclo 1 y el reloj sólo generaría impulsos para los sub ciclos 234234234. ..El principal problema surge con las rnicroinstrucciones de salto condicional. Si la máquina esperara a que las líneas de estado de la ALU estén disponibles antes de iniciar la extracción de la microinstrucción siguiente, seria demasiado tarde. El ciclo habría prácticamente terminado y se podría conseguir poco traslape. En algunas máquinas el problema se resuelve usando las líneas de estado de la ALU del ciclo anterior que, por supuesto, deberán guardarse en biestables para evitar que se desvanezcan. Estos valores están disponibles al comienzo de cada microinstrucción y por tanto puede empezar la siguiente extracción inmediatamente, mucho antes de que se termine la ejecución de la microinstrucción en curso. No es necesario decir que esto complica en gran medida la vida del microprogramador.

Desde el punto de vista técnico, es posible escribir microprogramas para una máquina de este estilo en una forma razonable. Por ejemplo, para examinar alguna palabra de la memoria de anotaciones y saltar si es negativa, el microprograma puede pasar la palabra por la ALU en una microinstrucción que no contenga un salto. La siguiente microinstrucción 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

109

Page 111: Manual Datos i 2003[1]

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.

11: alu:=tir;12:mar:=ir;rd; if n then goto 1613:rd;14ac:=mbr + ac; goto 0;

16:ac:=ac + 1; rd;17:a:=inv(mbr);18:ac:=ac + a; goto 0

52:alu:=tir;53:mar:=ac;rd;if n then goto 5654:sp:=sp + (-1); rd55:mar:=sp; wr; goto 1056:rd;57:mar:=sp; sp:=sp + 1; rd;58:rd;59:mar:=ac; wr; goto 10;

(a) (b)

Fig. 4-26. (a) Un fragmento en lenguaje Pascal. (b) Como pudiera ser el tratamiento por parte del compilador

La situación se volvería en extremo compleja si se utilizaran saltos condicionales de alternativas múltiples, formados haciendo el O lógico de NZDA con los bits menos significativos de ADDR en vez de comprobaciones sobre los bits individuales. Además, en muchas máquinas, el traslape de la extracción y la ejecución de las microinstrucciones se hace de tal modo que, al principio de la ejecución de la microinstrucción la elección de la microinstrucción n + 1 ha de hacerse utilizando los bits de estado de la ALU de la microinstrucción n - 1. No vamos a continuar profundizando en el tema, pero con esto basta para entender completamente la definición de microprogramación dada por Rosin.

110

Page 112: Manual Datos i 2003[1]

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.

Podemos formalizar este cálculo llamado c al tiempo de acceso a la memoria caché, m 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

111

Page 113: Manual Datos i 2003[1]

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

Cuando h tiende a 1, todas las referencias pueden ser satisfechas en la memoria caché y el tiempo de acceso se aproxima a c. Por otra parte, cuando h tiende a 0, se necesita una referencia a memoria cada vez y el tiempo de acceso se aproxima a c + m, primero un tiempo c para verificar (sin éxito) la caché y luego un tiempo m para efectuar la referencia a memoria. En algunos sistemas, la segunda referencia puede iniciarse en paralelo con la búsqueda en la caché, de modo que si no encuentra la palabra en ésta, el ciclo de memoria ya ha comenzado. Sin embargo, esta estrategia es más complicada pues, requiere que la memoria pueda detenerse sobre sus pistas, cuando la palabra fue localizada en la caché. El algoritmo básico de búsqueda en la caché y el iniciar (o detener) la referencia a la memoria principal dependiendo del resultado de dicha búsqueda, son aspectos que maneja el microprograma.

Se utilizan dos formas diferentes de organización de la caché, junto con una tercera que es un híbrido de las dos primeras. Para los tres tipos, se asume que la memoria sea de 2'.. bytes, dividida (de manera conceptual) en bloques consecutivos de b bytes, lo que da un total de 2m / b bloques. Cada bloque tiene una dirección que es un múltiplo de b. El tamaño b del bloque es por lo general una potencia de dos.

El primer tipo es la memoria caché asociativa, cuyo ejemplo se muestra en la figura 4-28. Consiste en cierto número de renglones o líneas, cada uno de los cuales contiene un bloque y su número correspondiente, junto con un bit de Validez que indica si el renglón está actualmente en uso o no. El ejemplo de la figura 4-28 ilustra una caché con 1024 renglones y una memoria con 224 bytes, dividido en 222 bloques de 4 bytes. En este tipo de caché el orden de los accesos es aleatorio.

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

112

Page 114: Manual Datos i 2003[1]

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

Page 115: Manual Datos i 2003[1]

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. Cuando se diseña cualquier computadora real, se realiza siempre una intensa simulación de

114

Page 116: Manual Datos i 2003[1]

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

Page 117: Manual Datos i 2003[1]

CONCLUSIÓN

116

Page 118: Manual Datos i 2003[1]

BOLILLA II (Parte 3): EL

NIVEL DE MAQUINA

CONVENCIONAL

117

Page 119: Manual Datos i 2003[1]

INDICE

BOLILLA II (Parte 3): EL NIVEL DE MAQUINA CONVENCIONAL_________________117

INDICE__________________________________________________________________118

INTRODUCCIÓN_________________________________________________________119

EL NIVEL DE MÁQUINA CONVENCIONAL_________________________________120EJEMPLOS DEL NIVEL DE MAQUINA CONVENCIONAL_____________________120FORMATOS DE INSTRUCCIÓN___________________________________________121

Criterios de diseño de formatos de instrucción_________________________________122Códigos de operación con extensión________________________________________123Ejemplos de formatos de instrucciones______________________________________125

La PDP-11__________________________________________________________125Direccionamiento_______________________________________________________125

Direccionamiento inmediato_____________________________________________126Direccionamiento directo_______________________________________________126Direccionamiento de registros___________________________________________127Direccionamiento indirecto_____________________________________________127Indexación__________________________________________________________128Direccionamiento por medio de pilas______________________________________129

Notación polaca inversa______________________________________________131Evaluación de fórmulas en la notación polaca inversa_______________________132

Algoritmo_______________________________________________________132Algoritmo_______________________________________________________133

Ejemplos de direccionamiento___________________________________________136Direccionamiento en la PDP-11________________________________________136

Tipos de Instrucciones_____________________________________________________136Instrucciones de movimiento de datos_______________________________________137Operaciones binarias_____________________________________________________137Operaciones unarias_____________________________________________________138Comparaciones y Saltos Condicionales______________________________________140Instrucciones de llamada a procedimiento____________________________________142Control de iteraciones____________________________________________________143Entrada / salida_________________________________________________________144

Flujo De Control__________________________________________________________149Flujo de control secuencial y saltos_________________________________________149Procedimientos_________________________________________________________150Corrutinas_____________________________________________________________155Desvios_______________________________________________________________158Interrupciones__________________________________________________________159

ACCIONES DE HARDWARE__________________________________________159ACCIONES DE SOFTWARE___________________________________________160

CONCLUSIÓN____________________________________________________________163

118

Page 120: Manual Datos i 2003[1]

119

Page 121: Manual Datos i 2003[1]

INTRODUCCIÓN

120

Page 122: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

EL NIVEL DE MÁQUINA CONVENCIONAL

En este capítulo se introduce el nivel de máquina convencional (nivel 2) y se revisan muchos aspectos de su arquitectura. Históricamente, el nivel 2 se desarrolló antes que los demás, y por ello aún se le suele denominar (incorrecta- mente) "el" lenguaje de máquina. Esta situación se ha establecido así porque en muchas máquinas el microprograma está en memoria de lectura solamente, lo que significa que los usuarios (a diferencia del fabricante de la máquina) no pueden escribir programas para el nivel 1. Incluso en máquinas que pueden ser microprogramazas por el usuario, la enorme complejidad de la arquitectura del nivel 1 es suficiente para descorazonar a los programadores más atrevidos. Debido a que no hay máquinas con protecciones de hardware al nivel 1, tampoco, es posible permitir a una persona que depure microprogramas nuevos mientras otra esté usando la máquina. Esta característica inhibe aún más la práctica de la microprogramación por los usuarios.

EJEMPLOS DEL NIVEL DE MAQUINA CONVENCIONAL

Más que intentar la definición rigurosa de lo que es el nivel de la máquina convencional (10 que de cualquier manera es casi imposible), se presentará este nivel viendo los ejemplos usuales, primero Intel y después Motorola. El propósito de estudiar las familias de CPU existentes es mostrar como las ideas vertidas aquí pueden aplicarse en el "mundo real". Se compararán y verán los contrastes de estas máquinas en diversas formas, para mostrar cómo diferentes diseñadores toman distintas elecciones.

No debe llegarse a la conclusión de que el resto de este libro se refiere a la: programación de las CPU de Intel y Motorola. Lejos de eso, estas máquinas se usarán para ilustrar la idea del diseño de una computadora como una serie de niveles. Se examinarán varias de las características de sus respectivas arquitecturas y se proporcionará, donde sea necesario, información acerca de su programación. Sin embargo, no se pretende presentar una descripción completa. Para un conocimiento cabal de todos los detalles de estas máquinas, sírvase consultar las publicaciones del fabricante.

Por último, este capítulo se refiere en principio a la arquitectura e instrucciones utilizadas por el usuario común (v.g., programas de aplicación). Aquellas que son de interés para los diseñadores de sistemas operativos, se omitirán o diferirán hasta la exposición del tema en el capítulo 6.

121

Page 123: Manual Datos i 2003[1]

FORMATOS DE INSTRUCCIÓN

Un programa consta de una secuencia de instrucciones, cada una de las cuales especifica una acción particular. Una parte de la instrucción, llamada código de operación, señala la acción que va a ejecutarse. Muchas instrucciones contienen los datos que usan o especifican dónde están. Por ejemplo, una instrucción que compare dos caracteres para ver si son iguales debe especificar qué caracteres se han de comparar. Todo lo relativo a la especificación de dónde está el dato (dirección) se llama direccionamiento y se verá en la sección 5-3.

La figura 5-17 muestra varios formatos típicos de instrucciones de nivel 2. En algunas máquinas de nivel 2 todas las instrucciones tienen igual longitud; en otras pueden haber dos o tres longitudes. Por otra parte, las instrucciones pueden ser de longitud menor, igual o mayor que la longitud de palabra.

Algunas relaciones posibles entre longitudes de instrucción y de palabra se muestran en la figura 5-18.

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 1Direccionamiento Direccionamiento

0 Instrucción 0 Instrucción Instrucción Instrucción Instrucción1 Instrucción 1 Instrucción Instrucción Instrucción Instrucción2 Instrucción 2 Instrucción Instrucción Instrucción Instrucción3 Instrucción 3 Instrucción Instrucción Instrucción Instrucción

(a) (b)

Direccionamiento Direccionamiento0 Instrucción 0 Instrucción Instrucción Instrucción Instrucción1

Instrucción1 Instrucción Instrucción

2 2 Instrucción Instrucción Instrucción3 Instrucción 3 Instrucción Instrucción Instrucción4

Instrucción4 Instrucción Instrucción Instrucción

5 5 Instrucción Instrucción6 6 Instrucción7 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

122

Page 124: Manual Datos i 2003[1]

Criterios de diseño de formatos de instrucción

Cuando un grupo de diseñadores de una computadora ha de elegir un formato (o formatos) de instrucción, debe considerar multitud de factores. El primero, y el más importante, es que las instrucciones cortas son mejores que las largas. Un programa compuesto den instrucciones de 16 bits ocupa solamente la mitad del espacio de memoria que uno con n instrucciones de 32 bits. Después de todo, la memoria no es gratuita y por eso los diseñadores no desean malgastarla inútilmente.

Una segunda razón es que la memoria tiene una velocidad de transferencia particular, determinada por su tecnología y diseño. La velocidad de transferencia o caudal de una memoria es el número de bits por segundo que pueden ser leídos de ella. Una memoria rápida puede dar el procesador (o a un dispositivo de E/S) más bits por segundo que una memoria lenta.

Si el caudal de una memoria particular es de t bits por segundo y la longitud media de instrucción es de r bits, entonces la memoria puede entregar al máximo t/r instrucciones por segundo. Esto significa que la velocidad de ejecución de las instrucciones (es decir, la velocidad del procesador) depende de la longitud de ellas. Las más cortas equivalen a un procesador más rápido. Si el tiempo requerido para ejecutar una instrucción es muy largo en comparación con el requerido para extraería de la memoria, entonces el tiempo de extracción de la instrucción no será tan importante. Sin embargo, con CPU rápidas las memorias suelen ser un cuello de botella. En consecuencia, un importante criterio de diseño consiste en aumentar el número de instrucciones extraídas por segundo.

Un segundo criterio de diseño de los formatos de instrucción es dejar suficiente sitio en la instrucción para expresar todas las operaciones deseadas. Es imposible concebir una máquina con 2n operaciones y una instrucción con menos de n bits. Simplemente no habrá suficiente espacio en el código de operación para indicar qué instrucción se requiere.

Un tercer criterio consiste en que es muy conveniente que la longitud de la palabra de máquina sea un múltiplo entero de su longitud de carácter. Si el código de los caracteres tiene k bits, la longitud de palabra deberá ser k, 2k, 4k, 5k y así sucesivamente; de otra manera, se derrochará espacio cuando se almacenen caracteres. Naturalmente, es posible almacenar 3.5 caracteres por palabra, pero ello causará una grave ineficiencia en el acceso a los caracteres. Las restricciones Impuestas en la longitud de palabra por el código de los caracteres afectan a la longitud de instrucción, ya que o bien una instrucción debe ocupar un número entero de palabras o bien un número entero de instrucciones debe llenar una palabra. Seria probablemente una catástrofe un diseño con un carácter de 9 bits, una instrucción de 12 bits y una palabra de 31 bits.

Un cuarto criterio concierne al número de bits del campo de dirección. Consideremos el diseño de una máquina con un carácter de 8 bits (posiblemente 7 bits más el de paridad) y una memoria principal que deba contener 215 caracteres. Los diseñadores podrán optar por asignar direcciones consecutivas a unidades de 8, 16, 24 o 32 bits, entre otras posibilidades.

Imaginemos qué ocurriría si el equipo de diseño degenerase en dos facciones rivales, una partidaria de hacer del byte la unidad básica de memoria y la otra partidaria de que lo sea la palabra de 32 bits. El primer grupo propondrá una memoria de 216 bytes numerados 0, 1, 2, 3,..., 65535; el otro, una de 214 palabras numeradas 0,1,2,3,..., 16383.

El primer grupo aducirá que, para comparar dos caracteres en la organización de palabras de 32 bits, el programa no solamente tendría que extraer las palabras que contienen los caracteres, sino extraer también cada carácter de su palabra para compararlos. Hacer esto cuesta instrucciones adicionales y por lo tanto derrocha espacio. Además, la organización de 8 bits proporciona una dirección para cada carácter, haciendo así más fácil la comparación.

Los partidarios de la palabra de 32 bits replicarán que su propuesta requiere solamente 214 direcciones diferentes, dando una longitud de dirección de sólo 14 bits, mientras la propuesta del byte requiere 16 bits para direccionar la misma memoria. Una dirección más corta significa una instrucción más corta, lo que no solamente ocupa menos espacio sino que también requiere menos tiempo de extracción. De igual modo, podrían retener la dirección de 15 bits para hacer referencia a una memoria cuatro veces mayor que la que admite la organización de 8 bits.

Este ejemplo demuestra que, para tener una mayor resolución de memoria, se debe

123

Page 125: Manual Datos i 2003[1]

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

Códigos de operación con extensión

En la sección anterior vimos cómo se puede llegar a un compromiso entre direcciones cortas y una buena resolución de memoria. En esta sección examinaremos los compromisos entre los códigos de operación y las direcciones. Consideremos una instrucción de n + k bits con un código de operación de k bits y una única dirección den bits. Esta instrucción admite 2k operaciones diferentes y 2n celdas de memoria direccionables. Alternativamente, los mismos n + k bits podrían repartirse entre un código de operación de k -l bits y una dirección de k + 1 bits, lo que supone la mitad de instrucciones pero el doble de memoria direccionable, o igual cantidad de memoria pero el doble de resolución. Un código dc operación de k + 1 bits y una dirección de n-l bits da más operaciones. El precio es, sin embargo, o un menor número de células direccionables o peor resolución con igual cantidad de memoria. Es posible encontrar soluciones intermedias entre los bits del código de operación y los de la dirección, además de la muy sencilla que se acaba de describir. El esquema descrito en el párrafo siguiente se llama código de operación con extensión.

El concepto de un código de operación con extensión puede verse más claramente mediante un ejemplo. Consideremos una máquina en la que las instrucciones tienen 16 bits de longitud y las direcciones 4 bits, como muestra la figura 5-19. Esta situación podría ser razonable en una máquina que tuviese 16 registros (por tantas direcciones de registro de 4 bits) en los que se efectuaran todas las operaciones aritméticas. Un diseño posible seria un código de operación de 4 bits y tres direcciones en cada instrucción, que dan 16 instrucciones de tres direcciones.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Código de operación Dirección 1 Dirección 2 Dirección 3Fig. 5-19. Instrucción con código de operación de 4 bits y tres campos de dirección de 4 bits cada uno

Sin embargo, si los diseñadores necesitan 15 instrucciones de tres direcciones, 14 dedos, 31 de una y 16 sin dirección, pueden usar los códigos de operación 0 a 14 como instrucciones de tres direcciones, pero interpretar el código de operación 15 de manera diferente (véase figura 5-20).

124

Page 126: Manual Datos i 2003[1]

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 de 4 bits. De hecho, se requiere con frecuencia una diversidad de longitudes y formatos.

125

Page 127: Manual Datos i 2003[1]

Ejemplos de formatos de instrucciones

En esta sección, se examinarán los formatos de instrucciones de la PDP-11 de Intel y de Motorola en el nivel de máquina convencional. Se incluye aquí a la PDP-11, pues su limpieza y regularidad da luz a los futuros arquitectos de conjuntos de instrucciones.

La PDP-11

La mayoría de las instrucciones dedos operandos de la PDP-11 se codifican como se muestra en la figura 5-21. Cada una tiene un código de operación de 4 bits y dos campos de dirección de 6 bits. El bit más a la izquierda del código de operación indica si la instrucción opera en bytes o en palabras. Los campos de direcciones se subdividen en dos campos de 3 bits, uno para el modo y otro para el registro (la PDP-11 tiene E registros). Los campos de modo indican si el operando está en un registro, en la memoria, si es una constante, etc. Los mismos ocho modos que están disponibles para los operandos de origen, lo están también para los de destino y cualquier código de operación se puede usar con cualquier operando, fuente o destino. A un juego de instrucciones en el que el método para especificar las direcciones de los operandos es independiente del código de operación, se le denomina ortogonal. Quienes programan compiladores tienen preferencia por los juegos de instrucciones ortogonales.

Para unas cuantas instrucciones, incluyendo a las de un operando, la PDP-11 utiliza un esquema de código de operación extendido, usando códigos xlii (binario) como escape hacia códigos de operación más largos. También aquí se presenta una regularidad considerable, por ejemplo, la mayoría de las instrucciones de un operando usan códigos de operación de 10 bits y los mismos 6 bits para los campos de modo y registro que en las instrucciones de dos operandos. Las instrucciones de la PDP-11 que direccionan memoria, tienen una o dos palabras adicionales de 16 bits en seguida de la instrucción para especificar la dirección.

Direccionamiento

Las instrucciones pueden clasificarse según el número de direcciones que usan. Recuérdese que una colección numerada de registros forma, de hecho, una memoria de alta velocidad y define un espacio de direcciones. Una instrucción que sume el registro 1 con el registro 2 debería clasificarse como de dos direcciones porque la instrucción debe especificar qué registros han de sumarse, de la misma manera que una instrucción que sume dos palabras de memoria debe especificar qué palabras se suman.

Son comunes instrucciones que especifican 1, 2 y 3 direcciones. En muchas máquinas que hacen operaciones aritméticas con tina sola dirección, un registro especial llamado acumulador proporciona uno de los operando. En estas máquinas la dirección es generalmente la de una palabra de memoria m donde está situado el operando. La instrucción de suma que especifica la dirección m tiene el efecto de

acumulador: = acumulador + memoria [m]

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:

destino: = destino + fuente

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 posibilidades. Exploraremos algunas de ellas en las secciones siguientes.

126

Page 128: Manual Datos i 2003[1]

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 0ADDQ 0 1 0 1 Dato 0 Modo RegSUBQ 0 1 0 1 Dato 1 Modo Reg

SCC 0 1 0 1 Condición 1 1 Modo RegDBCC 0 1 0 1 Condición 1 1 0 0 1 Reg

Fig. 5-24. Cuatro instrucciones de la 68000.

Direccionamiento directo

Otro método sencillo de especificar un operando es dar la dirección de la palabra de memoria donde está contenido. Este proceso se llama direccionamiento directo. Se discutirán más adelante los detalles por ¡OS que la computadora sabe qué direcciones son inmediatas y cuáles son directas. Existen en general dos enfoques: usar códigos de operación diferentes, o usar un modo de direccionamiento especial para cada tipo de operando.

Todas las CPU de Intel tienen direccionamiento directo. Tanto Cl 8088 como el 80286 utilizan direccionamiento directo de 16 bits. El 80386 usa direcciones de 16 bits en los modos real y virtual y segmentos de 16 bits en el modo protegido. En el modo protegido de 32 bits, las direcciones directas tienen 32 bits de longitud. Nótese que en todos los casos las direcciones directas son demasiado cortas para cubrir todo el espacio de direcciones,

Los 680x0 tienen dos formas de direccionamiento directo, una con una dirección de 16 bits y otra con una de 32 bits. Se puede accesar a las direcciones de los primeros 64K de memoria con la forma corta, pero las direcciones que superan los 64K necesitan la forma larga. Estas dos formas se indican por los valores del campo MODO de tres bits, y por tanto se aplican a todas las instrucciones de la figura 5-23 que tienen uno o más campos de OPERANDO.

127

Page 129: Manual Datos i 2003[1]

Direccionamiento de registros

El direccionamiento de registros es conceptualmente igual que el direccionamiento directo. En esta forma de direccionamiento el campo de dirección contiene el número del registro donde está almacenado el operando. Una máquina con 16 registros y 65 536 palabras de memoria tiene realmente dos espacios de direcciones. Se puede considerar que, en dicha máquina, una dirección tiene dos partes: a) un bit que indica sise desea un registro o una palabra de memoria y b) un campo de dirección que indica el registro o palabra de memoria que se desea. Puesto que hay menos registros que palabras de memoria, se necesitan direcciones más pequeñas para éstos; por eso se utiliza a menudo un formato de instrucción diferente para operandos en registro y para operandos en memoria.

Si hubiera una instrucción de registros por cada instrucción que direccionan memoria, la mitad de los códigos de operación se referirían a operandos situados en memoria y la otra mitad a operandos situados en registros. Seria necesario un bit en el código de operación para especificar qué espacio de direcciones se va a utilizar. Se verá más claro que estamos usando dos espacios de direcciones si dicho bit se traslada desde el campo de código de operación al de dirección. El bit indicaría entonces qué espacio de direcciones usar.

Se diseñan máquinas Con registros por dos razones: a) los registres son más rápidos que la memoria Central, y b) como hay pocos, sólo se necesitan unos cuantos bits para direccionarlos. Por desgracia> el tener 80 15 registros complica en gran medida la programación porque deben tomarse decisiones respecto a los operandos y a los resultados intermedios que van a conservarse en el limitado número de registros y respecto a los que van a guardarse en la memoria central. W. L. van del Poel (1958), señaló con acierto que las computadoras deberían estar dotadas de 0, 1 o suficientes ejemplares de cada recurso para que los programadores no perdieran el tiempo pensando qué hacer si se acaban (regla de ninguno, uno o infinitos).

Tanto las pastillas de Intel como las de Motorola tienen un amplio repertorio de instrucciones que toman sus operandos de registros y depositan sus resultados también en registros.

Direccionamiento indirecto

En el direccionamiento directo la dirección especifica la palabra de memoria o registro que contiene el operando. En el indirecto la dirección específica la palabra de memoria o registro que contiene no el operando, sino la dirección del operando.

Primero, el contenido de la posición ¡000 se lleva a un registro interno de la CPU. Este número de 15 bits (1510) no se pone en R1. Si así fuera, como en la figura 5-25(a), tendríamos una instrucción con direccionamiento directo. En vez de eso, se extrae el contenido de la posición 1510 y se pone en R1. El contenido de la posición 1000 no es el operando sino que "apunta" al operando. Por eso se dice que es un apuntador.

Todos los procesadores de Intel tienen direccionamiento indirecto a través de un registro. Por ejemplo, es posible poner un apuntador en SI y especificar que el operando está ubicado en memoria en la dirección a la que apunta SI. En el 8088 y en el 80286 sólo se pueden direccionar en forma indirecta los registros BX, SI y DI; en tanto que en el 80385 se pueden utilizar todos los registros. No es posible ¡levar a cabo el direccionamiento indirecto en ninguno de éstos utilizando un apuntador en la memoria.

128

Page 130: Manual Datos i 2003[1]

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

Muchos algoritmos exigen la realización de operaciones sobre una secuencia de datos estructurados, almacenados en posiciones de memoria consecutivas. Por ejemplo, consideremos un bloque de n palabras de máquina que ocupan las posiciones

A, A + 1, A + 2 ,..., A + n - 1

que deben ser trasladadas a las posiciones

B, B + 1, B + 2 ,..., B + n - 1

Suponiendo que la máquina tenga una instrucción

MOVE A,B

que traslade el contenido de la posición A a la B, se podría ejecutar esta instrucción y modificarla para obtener

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. La dirección de A se cargará en un registro o en una palabra de memoria. Lo mismo se hará

129

Page 131: Manual Datos i 2003[1]

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.

Direccionamiento por medio de pilas

Ya se ha dicho que conviene tener instrucciones de máquina lo más breves posible para ahorrar tiempo de CPU y memoria. La reducción de las longitudes de las direcciones se puede llevar al extremo de tener instrucciones sin dirección, únicamente con código de operación. Aunque parezca increíble, esta situación es posible: se lleva a cabo organizando la máquina a base de una estructura de datos llamada pila.

Una pila consta de datos elementales (palabras, caracteres, bits, etc.) almacenados en orden consecutivo en la memoria. El primer dato introducido en la pila se dice que está en el fondo de ella. El que se ha introducido más recientemente se dice que está en su cima. Hay siempre un registro o una palabra de memoria asociada a la pila que contiene la dirección de su cima. Se denomina apuntador de pila.

Aunque ya estudiamos las pilas en el capitulo 4, aquí las revisaremos brevemente, porque emplearlas para hacer aritmética es algo diferente que usarlas para guardar variables locales (aunque, por supuesto, se pueden combinar). La figura 5-26 ilustra el funcionamiento de una pila. En la figura 5-26(a) hay ya dos datos en la pila. El fondo de la pila está en la posición 1000 de la memoria y la cima en la posición 1001. El apuntador de pila contiene 1001, que es la dirección del dato que está en la cima de la pila; es decir, "apunta" hacia la cima. En la figura 5-26(b) se ha introducido un 6 en la pila y el apuntador indica 1002 como una nueva cima. En la figura 5-26(c) se ha apilado un 75, tomando el apuntador el valor 1003. En la figura 5-26(d) se han desapilado el 75.

130

Page 132: Manual Datos i 2003[1]

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 mos-trado en la figura 5-27(c).

131

Page 133: Manual Datos i 2003[1]

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 bifur-cació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:

132

Page 134: Manual Datos i 2003[1]

Vagón en la bifurcación + - x / ( )

Vag

ón q

ue h

a ll

egad

o m

ás

reci

ente

men

te a

la

vía

de

Gra

nada

4 1 1 1 1 1 5+ 2 2 2 1 1 1 2- 2 2 2 1 1 1 2X 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.

1. El vagón que está en la bifurcación se dirige hacia Granada.2. El vagón que ha entrado más recientemente en la vía de Granada da

la vuelta y va a Madrid.3. El vagón de la bifurcación y el que ha entrado más recientemente en

la vía de Granada son "secuestrados" y desaparecen (es decir, se eli-minan).

4. Fin. Los símbolos que están en Madrid representan la fórmula en notación polaca inversa cuando se leen de izquierda a derecha.

5. Fin. Se ha producido un error. La fórmula original no estaba balan-ceada correctamente.

Después de producirse cada acción, se hace una nueva comparación entre el vagón de la bifurcación, que puede se el mismo de la comparación previa o el siguiente, y el vagón que está en este momento al último en la vía de Granada. El proceso continúa hasta que se alcanza el punto 4. Obsérvese que la vía de Granada se usa como una pila, considerando el encaminamiento de un vagón hacia Granada como una operación de apilar y la recuperación de un vagón de la vía de Granada para llevarlo a Madrid como una operación de desapilar.

Nótese que el orden de las variables es el mismo en las dos notaciones. Sin embargo, el orden de los operadores es diferente. Los operadores en la notación polaca inversa aparecen, de hecho, en el orden en que serán ejecutados durante la evaluación de la expresión. La figura 5-30 da ejemplos de fórmulas en notación infija y sus equivalentes en polaca inversa.

Infija Polaca inversaA + B x CA x B + CA x B + C x D(A + B) / (C - D)A x B / C((A + B) x C + D) / (E + F + G)

ABC x +AB x C +AB x CD x +AB + CD - /AB x C /AB + C x D + EF + G + /

FIG. 5-30. Ejemplo de fórmula infija y sus equivalentes en polaca inversa.

Evaluación de fórmulas en la notación polaca inversa

El siguiente algoritmo evalúa una fórmula en notación polaca inversa.

Algoritmo

1. Examinar cada símbolo que en la fórmula está en notación polaca inversa, comenzando por el extremo de la izquierda hasta llegar a un operador.

2. Escribir en un trozo de papel el operador y los dos operandos situados inmediatamente a su izquierda.

3. Borrar el operador y los operandos en la fórmula, dejando un hueco.4. Realizar la operación con los operandos y escribe el resultado en el hueco.5. Si la nueva fórmula consta de un solo valor, éste es la respuesta y el algoritmo ha

133

Page 135: Manual Datos i 2003[1]

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.

La figura 5-33 muestra la evaluación de la misma fórmula que en la figura 5-32, si bien en la 5-33 se utiliza una pila. Obsérvese que el número que está en la cima de la pila es el operando de la derecha, no el de la izquierda.

134

Page 136: Manual Datos i 2003[1]

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 direc-ció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.

Ninguna de las CPU de Intel tiene direccionamiento de pila, pero si instrucciones especiales (PUSH y POP) para colocar Hems en la pila (apilar) y para retirarlas de ella (desapilar). En contraste todas las pastillas 680x0 tienen direccionamiento de pila por medio de auto-indexación. En la modalidad de decremento predeterminado, primero se decrementa el (registro) apuntador de pila y luego el registro se utiliza como apuntador. En la modalidad de incremento posterior, primero se realiza el direccionamiento y después se incrementa el registro.

135

Page 137: Manual Datos i 2003[1]

Palabra de 16 bit

DirecciónFuente Destino

NCÓDIGO DE OPERACIÓN

MODO DE LA FUENTE

REGISTRO DE LA FUENTE

MODO DEL DESTINO

REGISTRO DEL DESTINO

4 3 3 3 3

N + 2 (Primer palabra siguiente)

16

N + 4 (Segunda palabra siguiente)

16(a)

Modo Nombre Cómo se localiza el operando0 Direccionamiento de registro El operando está en R1 Indirecto sobre registro R contiene un apuntado al operando2

Auto-incrementado

Se extrae el contenido de R y se utiliza como apuntador al operando. Después de este paso, pero antes de ejecutar la instrucción, R se incrementa en 1 (instrucciones de byte) o en 2 (instrucciones de parabra)

3Auto-incrementado indirecto

Se extrae de R la dirección de una palabra que contiene el apuntado al operando. Después se incrementa R en 1 o 2, antes de ejecutar la instrucción.

4Auto-incrementado

Primero se decrementa R en 1 o 2. Después el nuevo valor de R se utiliza como un apuntador al operando.

5Auto-incrementado inderecto

Primero se decrementa R en 1 o 2. Después el nuevo valor de R se utiliza como la dirección de memoria que contiene un apuntador al operando.

6 Indexado El operando está en al dirección igual a la suma del contenido de R (registro de índice) y el desplazamiento de 17 bits en complemento a 2 contenido en la siguiente palabra. En los modos 6 y 7 el contador de programa (R7) se incrementa en 2 inmediatamente después de extraer la siguiente palabra

7 Direccionamiento indexado + indirecto

La posición de memoria que contiene un apuntador al operando se obtiene sumando el contenido de R y la siguiente palabra. En los modos 6 y 7 el contador se programa (R7) se incrementa en 2 inmediatamente después de extraer la siguiente palabra.

(b)Fig. 5-33. a) Formato de una instrucción de la PDP-11 de dos direcciones. b) Descripción de los modos de direccionamiento de la PDP-11. R es el registro especificado con el modo.

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.

136

Page 138: Manual Datos i 2003[1]

Ejemplos de direccionamiento

En las secciones anteriores se estudiaron varios modos de direccionamiento; el inmediato, el directo, el indirecto, el indexado, etc. Sin embargo, queda aún la cuestión de cómo el hardware o el intérprete de nivel uno reconocen que el direccionamiento pertenece a alguno de los modos mencionados. Una solución consiste en tener código de operación por separado para cada método; esto es, diferentes códigos para ADD INMEDIATO, ADD DIRECTO, ADD INDIRECTO, etc. Otra forma es hacer que el modo forme parte de la dirección. Cada instrucción pudiera contener unos cuantos bits por dirección para especificar el modo de direccionamiento deseado.

Direccionamiento en la PDP-11

Las direcciones en la PDP-11 se especifican por medio de un campo de 6 bits, como se puede apreciar en la figura 5-33(a). Las instrucciones de una dirección tienen uno de estos campos, mientras que las de dos direcciones tienen dos, con el mismo código en cada campo. Los campos de 6 bits constan de 3 bits para el modo de direccionamiento y 3 bits para el número de registro. En la figura 5-33(b) se muestra el significado de los modos. En la PDP-11, el registro 6 corresponde al apuntador de pila y el registro 7 al contador de programa; este último se incrementa en 2 inmediatamente después de extraer la palabra de una instrucción (antes de ejecutar la instrucción). Se debe tener presente esta propiedad al examinar algunos de los modos de direccionamiento.

Todas las instrucciones de la PDP-11 tienen 16 bits realmente, pero, en algunos casos, utilizan una o dos palabras adicionales situadas a continuación y que pueden considerarse como parte de ellas. Los modos de direccionamiento 6 y 7 requieren una constante de 16 bits para indexar. Además, si se especifica uno de los modos 2 o 3 con el registro 7 (el contador de programa), se observará la siguiente secuencia de pasos.

En primer lugar, se extrae la instrucción y se incrementa el registro 7 en dos (una palabra consta de 2 bytes). Luego el registro 7 se usa como apuntador (puntero) del dato (modo 2) o de la dirección del dato (modo 3). En ambos casos la palabra señalada por R7 es la que sigue a la instrucción. Una vez que se ha extraído la palabra, tiene lugar el auto-incremento del registro 7, incrementándose en 2. El direccionamiento con auto-incremento aplicado al contador de programa es un truco que permite utilizar como dato la palabra que está a continuación de la instrucción. En el modo 2 este dato es el operando, lo que nos da un direccionamiento inmediato. En el modo 3 es la dirección del operando, obteniéndose un direccionamiento directo. Si tanto la fuente como el destino requieren una palabra adicional, la primera es para la fuente.

TIPOS DE INSTRUCCIONES

Las instrucciones del nivel de máquina convencional se pueden dividir aproximadamente en dos grupos: instrucciones de propósito general e instrucciones de propósito especial. Las primeras tienen una aplicación muy amplia. Por ejemplo, la posibilidad de mover datos a través de la máquina seguramente se necesita en casi todas las aplicaciones. Las instrucciones de propósito especial tienen aplicaciones mucho más restringidas. La instrucción MOVEP de la 68000 almacena en memoria el contenido de un registro D en bytes alternos, con un byte sin utilizar entre los bytes de datos. Hay pocas aplicaciones en las que es realmente útil esta instrucción, y ningún compilador la generará jamás (se incluyó para facilitar la comunicación con los periféricos más antiguos de 8 bits). En las siguientes secciones examinaremos los grupos más importantes de instrucciones de propósito general.

137

Page 139: Manual Datos i 2003[1]

Instrucciones de movimiento de datos

La operación de la copia de datos de un lugar a otro es la más fundamental de todas. Por copia entendemos la creación de un nuevo objeto con la misma secuencia de bits que el original. Este uso de la palabra “movimiento” es algo diferente al que se le asigna en español. Cuando decimos que Manuel Mangosta se ha movido de Madrid a Barcelona, no queremos decir que se creó una copia idéntica del señor Mangosta en Barcelona y que el original está todavía en Madrid. Cuando decimos que el contenido de la posición de memoria 2000 se ha movido a algún registro, siempre queremos decir que se ha creado ahí una copia idéntica y que el original está todavía sin alterar en la posición 2000. Las instrucciones de movimiento de datos se podrían haber llamado más bien instrucciones de duplicación, pero el término “movimiento de datos” ya está establecido. Los datos se almacenan en diversos lugares, pero es diferente la forma en que se accede a las palabras. Tres lugares comunes son una palabra de memoria determinada, un registro o la pila. La pila puede estar en unos registros especiales o en memoria, pero la forma en que se accede a ella es diferente del acceso ordinario a memoria. Un acceso a memoria requiere una dirección, mientras que para meter o sacar un dato de la pila no hay que hacer un direccionamiento explícito. Las instrucciones de movimiento de datos requieren la especificación explicita o implícita de la fuente de la información (es decir, el original) y el destino (donde se ha de colocar la copia).

Las instrucciones de movimiento de datos deben, de algún modo, indicar la cantidad de datos que va a moverse. Existen instrucciones para mover cantidades de datos de apenas un bit o hasta de la memoria entera. En máquinas de palabra de longitud fija el número de palabras que deben moverse generalmente lo especifica la instrucción; por ejemplo, puede haber instrucciones distintas para mover una palabra y para mover media palabra. Las máquinas de palabra de longitud variable a menudo tienen instrucciones que especifican solamente la dirección de la fuente y del destino pero no la cantidad. El movimiento continúa hasta que se encuentra una marca de fin de datos en los datos mismos.

Los procesadores 680 x O tienen una instrucción MOVE para fines generales, con dos operándoos arbitrarios, como se puede ver en la figura 5-23. Esta instrucción puede mover datos entre los registros, la memoria o la pila a cualquier lado. Las CPU de Intel tienen instrucciones de movimiento mucho más limitadas, pero existen muchas de ellas, de manera que también es posible mover cualquier cosa a cualquier lado.

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

138

Page 140: Manual Datos i 2003[1]

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.

10110111 10111100 11011011 10001011 A00000000 11111111 00000000 00000000 B

(máscara) 00000000 10111100 00000000 00000000 A Y B

El resultado deberá desplazarse ahora 16 bits a la derecha para aislar el carácter en la parte derecha de la palabra.

Un uso muy importante del O es el empaquetamiento de bits en una palabra, siendo el empaquetamiento lo contrario de la extracción. Para cambiar los 8 bits de la derecha de una palabra de 32 bits sin alterar los 24 bits restantes, primero se enmascaran los 8 bits no deseados y luego se hace un O con el nuevo carácter, como se muestra abajo.

10110111 10111100 11011011 10001011 A11111111 11111111 11111111 00000000 B

(máscara)10110111 10111100 11011011 00000000 A Y B00000000 00000000 00000000 01010111 C10110111 10111100 11011011 01010111 (A Y B) 0 C

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

Las operaciones unarias tienen un operando y producen un resultado. Como tienen una dirección menos que especificar, estas instrucciones son a veces más cortas que las binarias.

Las instrucciones para desplazar o rotar el contenido de una palabra o de un byte son bastante útiles y, a menudo, se suministran en varias modalidades. Los desplazamientos son operaciones en que los bits se mueven a la izquierda o a la derecha, perdiéndose los que se salen de la palabra. Las rotaciones son desplazamientos en los que los bits que se salen por un lado aparecen en el otro. La diferencia entre el desplazamiento y la rotación se ilustra abajo.

00000000 00000000 00000000 01110011 A

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

139

Page 141: Manual Datos i 2003[1]

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

11111111

11111111 11111111 11110000 A

00111111

11111111 11111111 11111100 A desplazado sin extensión del signo

11111111

11111111 11111111 11111100 A desplazado con extensión del signo

Un uso importante del desplazamiento es la multiplicación por potencias de 2 y la división entre ellas. Si un entero positivo se desplaza k bits a la izquierda, el resultado es el número original multiplicado por 2 k, siempre que no haya desbordamiento. Si un entero positivo se desplaza k bits a la derecha, el resultado es el número original dividido entre 2k.

El desplazamiento puede acelerar ciertas operaciones aritméticas. Considérese, por ejemplo, el cálculo de 18 X n, en donde n es algún entero positivo.

18 x n = 16 x n + 2 X n. 16 X n se puede obtener desplazando una copia de n cuatro bits a la izquierda. 2 X n puede obtenerse desplazando n un bit a la izquierda. La suma de estos dos números es 18 x n. La multiplicación se ha realizado con un movimiento, dos desplazamientos y una suma, lo que muchas veces es más rápido que una multiplicación.

El desplazamiento de números negativos, incluso con extensión de signo, da resultados algo diferentes. Por ejemplo, consideremos el número – 1 en complemento a uno. Desplazado 1 bit a la izquierda da – 3. Otro desplazamiento de 1 bit da – 7:

11111111 11111111 11111111 11111110 – 1 en complemento a uno

11111111 11111111 11111111 11111100 – 1 desplazado 1 bit a la izquierda = – 3

11111111 11111111 11111111 11111000 – 1 desplazado 2 bits a la izquierda = – 7

EL desplazamiento a la izquierda en complemento a 1 no multiplica por 2. Sin embargo, el desplazamiento a la derecha simula correctamente la división.

Considérese ahora la representación en complemento a 2 de – 1. El desplazamiento a la derecha de seis bits con extensión de signo da – 1, mientras que la parte entera de – 1/64 debería ser 0:

11111111 11111111 11111111 11111111 – 1 en complemento a 2

11111111 11111111 11111111 11111111 – 1 desplazado 6 bits a la derecha = – 1

Sin embargo, el desplazamiento a la izquierda simula la multiplicación por 2. Las operaciones de rotación son útiles para el empaquetamiento y

desempaquetamiento de secuencias de bits en una palabra. Si se desean examinar todos los bits de una palabra, la rotación de ésta un bit cada vez pone cada bit en el signo, donde se le puede examinar fácilmente. Después de examinar todos los bits de la palabra, ésta vuelve a su valor original.

Todas las máquinas de nuestros ejemplos tienen una amplia variedad de instrucciones de desplazamiento / rotación, en ambas direcciones. Algunas comprenden al bit de acarreo y otras no. Sin embargo, los compiladores prácticamente nunca generan ninguna de ellas, con excepción del desplazamiento a la izquierda, como una forma optimizada de multiplicar 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.

140

Page 142: Manual Datos i 2003[1]

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.

Comparaciones y Saltos Condicionales

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, 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

141

Page 143: Manual Datos i 2003[1]

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.

00000000 00000000 00000000 00000000 + 0 en complemento a 1

11111111 11111111 11111111 11111111 - 0 en complemento a 1

Los diseñadores tienen que decidir si +0 y –0 son iguales y, si no lo son, cuál es mayor. Sin importar la decisión que tomen, hay argumentos convincentes para afirmar que la decisión es errónea. Si hacen +0= –0, entonces el hecho de que una comparación produzca igual no significa que las secuencias de bits de los datos comparados sean las mismas. Considérese una máquina con palabra de 32 bits en la que se almacenan cuatro caracteres de 8 bits. Si se almacenaran cuatro caracteres con código 0 en una palabra, ésta contendrá 32 ceros. Si se almacenaran cuatro caracteres con código 255 en otra palabra, ésta tendrá 32 unos. Si al comparar estas dos palabras resultaran iguales porque +0 = –0, un programa de proceso de textos podrá llegar a la conclusión errónea de que las dos palabras contienen los mismos cuatro caracteres.

Por otro lado, si el hardware tratara –0 y +0 como distintos, entonces el resultado de comparar la suma de –1 y +1 con +0 podría dar que no son iguales, ya que –1 sumando a +1 puede dar -0 como resultado. No es necesario decir que esta situación es totalmente indeseable. Las máquinas de complemento a 2, que incluyen los ejemplos, no tienen problemas con +0 y –0, pero las de complemento a 1 sí los tienen. La consecuencia es que las máquinas con aritmética en complemento a 1 están desapareciendo lentamente.

Otro punto delicado en relación con la comparación de números es la decisión por la que los números deben considerarse con signo o sin él. Hay dos formas de ordenar de menor a mayor los ocho números binarios de tres bits.

Sin signo

Con signo

000 100 (el menor)

001 101010 110011 111100 000101 001110 010111 011 (el

mayor)

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

142

Page 144: Manual Datos i 2003[1]

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.

Instrucciones de llamada a procedimiento

Un procedimiento es un grupo de instrucciones que realizan alguna tarea y al que se le puede involucrar (llamar) desde diversos puntos del programa. A veces se usa el término subrutina en lugar de procedimiento, especialmente si se trata de programas en lenguaje ensamblador. Cuando un procedimiento termina su tarea, debe retornar a la sentencia que sigue a la de llamada. Por tanto, se debe transmitir la dirección de retorno al procedimiento para que sepa dónde retornar.

Hay tres lugares donde se pone la dirección de retorno: la memoria, un registro o la pila. La peor solución es ponerla en una única posición fija de memoria. Con este método, si el procedimiento llamara a otro, la segunda llamada haría que se perdiera la dirección de retorno de la primera.

Una ligera mejora consiste en que la instrucción de llamada a procedimiento almacene la dirección de retorno en la primera palabra del procedimiento, estando la primera instrucción ejecutable en la segunda palabra. El procedimiento podría retornar con un salto indirecto a la primera palabra o, si el hardware pone el código de operación de la instrucción de salto junto a la dirección de retorno, saltando directamente a ella. El procedimiento puede llamar a otros, ya que cada uno tiene espacio para una dirección de retorno. Si el procedimiento se llamara a sí mismo, este esquema fallaría, porque la segunda dirección de retorno destruiría a la primera. La habilidad de que un procedimiento se pueda llamar a sí mismo, llamada recursión, reviste extrema importancia tanto para los teóricos como para los programadores que hacen el trabajo práctico. Es más, si un procedimiento A llama a B, éste llama a C y C llama de nuevo a A (recursión indirecta), tampoco funciona este esquema.

Una mejora consistirá en que la instrucción de llamada a procedimiento ponga la dirección de retorno en un registro, dejando al procedimiento la responsabilidad de almacenarla en un lugar seguro. Si el procedimiento es recursivo, deberá poner la dirección de retorno en un lugar diferente cada vez que se la llame.

Lo mejor que puede hacer la instrucción de llamada a procedimiento con la dirección de retorno es metería en una pila. Cuando el procedimiento haya terminado, sacará la dirección de retorno de la pila y la meterá en un contador de programa. Si se dispone de esta forma de llamada a procedimiento, la recursión no planteará problemas especiales: las direcciones de retorno se salvarán de manera que se evite la destrucción de las anteriores. Todas las máquinas de ejemplo utilizan este método.

143

Page 145: Manual Datos i 2003[1]

Control de iteraciones

Es frecuente que se necesite ejecutar un grupo de instrucciones un número fijo de veces y, por ello, algunas máquinas tienen instrucciones para facilitarlo.

Todos los métodos requieren de un contador que se incrementa (o decrementa) en alguna constante cada vez que se pasa por la iteración. Si se verifica cierta condición, la iteración termina.

Un método pone un valor inicial en un contador y luego pasa a ejecutar el código de la iteración. La última instrucción de la iteración actualiza el contador y, si aún no se ha satisfecho la condición de terminación, salta a la primera del lazo. En caso contrario, la iteración termina y se pasa ejecutar la siguiente instrucción. Esta forma de hacer iteraciones se caracteriza por hacer la comprobación al final, como se muestra en la figura 5-40(a).

Las iteraciones con comprobación al final tienen la propiedad de ejecutarse siempre una vez al menos, aunque n sea menor o igual que 0. Por ejemplo, pongamos un programa que mantiene los registros del personal de una empresa. En cierto punto el programa está leyendo información de tarjetas acerca de determinado empleado. Lee en n el número de hijos que tiene dicho empleado y ejecuta una iteración n veces, una por hijo, leyendo su nombre, sexo y fecha de nacimiento, para que la empresa pueda mandarle un regalo el día de su cumpleaños (es una atención de la empresa). Si el empleado no tiene hijos, n será 0 pero la iteración se ejecutará una vez, mandando regalos y dando resultados erróneos.

La figura 5-40(b) muestra otra forma de realizar la comprobación, que funciona satisfactoriamente aunque n sea menor o igual que 0. Obsérvese que la comprobación es diferente en ambos casos, de modo que los diseñadores han de elegir un método o el otro. Considérese el código que debería producirse con la sentencia Pascal.

144

Page 146: Manual Datos i 2003[1]

for i : = 1 to n do bigin ... endi: = 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 de la iteración}

2: {primera sentencia después de la iteración}

(a) (b)Fig. 5-40. a) Iteración con comprobación al final. b) Iteración con comprobación al principio.

Si el compilador no tuviera ninguna información sobre n, seguiría la aproximación de la figura 5-37(b) para tratar correctamente el caso de n < 0. Si, en cambio, pudiera determinar que n >0, por ejemplo, viendo dónde se asigna un valor a n, podría usar un código como el mejor de la figura 5-40(a). La primera normalización del lenguaje FORTRAN especificaba que todas las iteraciones se ejecutaran al menos una vez, para permitir que siempre se generara el código más eficiente de la figura 5-40(a). En 1977 se corrigió este defecto cuando incluso la comunidad de usuarios del FORTRAN empezó a darse cuenta de que no era una buena idea que la sentencia de iteración tuviera una semántica exótica, aunque ahorrara una instrucción de salto por iteración.

Todas las CPU de Intel realizan iteraciones en un número fijo de veces utilizando la instrucción LOOP, la cual decrementa en uno los registros CX / ECX y salta a una etiqueta dada, si el resultado no es igual a cero. En caso de ser cero, la ejecución continúa con la siguiente instrucción.

Las 680 x 0 tienen una instrucción en cierto modo más general, que primero verifica los códigos de condición para una condición dada, saliendo de la iteración si ésta se cumple. Si la condición es falsa, el registro D se decrementa. Si el resultado es 0 o más, la iteración se repite; en caso contrario se da por termina- da la iteración y se ejecuta la instrucción que le sigue.

Entrada / salida

Ningún otro grupo de instrucciones presenta tanta variación de máquina a máquina como el de las instrucciones de entrada / salida. En la actualidad, se encuentran en uso cuatro diferentes esquemas de E / S. Estos son:

1. E / S programada. 2. E / S manejada por interrupciones. 3. E / S de Acceso Directo a Memoria (DMA).4. E / S usando canales de datos.

A continuación se describirá cada uno de estos esquemas. El método más sencillo posible es E / S programada, el cual se usa en algunos

microprocesadores de orden inferior. Estos, tienen una sola instrucción de entrada y una sola de salida. Cada una de estas instrucciones selecciona uno de los dispositivos de E / S y se transfiere un solo carácter entre un registro fijo del procesador y el dispositivo seleccionado. El procesador debe ejecutar una instrucción explícita para cada uno de los caracteres que se leen o escriben.

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

145

Page 147: Manual Datos i 2003[1]

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.

146

Page 148: Manual Datos i 2003[1]

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.

147

Page 149: Manual Datos i 2003[1]

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 en la figura 2-19.

148

Page 150: Manual Datos i 2003[1]

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.

149

Page 151: Manual Datos i 2003[1]

FLUJO DE CONTROL

El flujo de control se refiere a la secuencia en que se ejecutan las instrucciones. En general, las que se realizan consecutivamente se extraen de posiciones consecutivas de memoria. Las llamadas a procedimientos alteran el flujo de control, deteniéndose el procedimiento en curso y arrancando el que ha sido llamado. Las corrutinas están relacionadas con los procedimientos y causan alteraciones similares al flujo. Los desvíos y las interrupciones también producen el mismo efecto en condiciones especiales. Todos estos temas se verán en las secciones siguientes.

Flujo de control secuencial y saltos

La mayoría de las instrucciones no alteran el flujo de control. Después de ejecutarse una, se extrae la que le sigue en la memoria y se ejecuta. Después de cada instrucción el contador de programa se incrementa en el número de posiciones de memoria que dicha instrucción ocupa. Si se observa el contador de programa durante un largo periodo comparado con el tiempo medio de ejecución de una instrucción, se verá que es, aproximadamente, una función lineal del tiempo, incrementándose en la longitud media de instrucción cada tiempo medio de ejecución de instrucción. Dicho de otro modo, el orden dinámico en el que el procesador realmente ejecuta las instrucciones es el mismo que el orden en que éstas aparecen en el listado del programa.

Si un programa tiene saltos, no se mantiene esta relación tan simple entre el orden en que las instrucciones están escritas y el orden en que se ejecutan. Cuando hay saltos, el contador de programa deja de ser una función monótona creciente de tiempo, como se 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

150

Page 152: Manual Datos i 2003[1]

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

La técnica más importante para estructurar programas es el procedimiento. Desde cierto punto de vista, una llamada a procedimiento altera el flujo de control, como lo hace el salto, pero a diferencia de éste devuelve el control a la sentencia que sigue a la llamada, una vez que ha terminado de realizar su tarea.

Sin embargo, desde otro punto de vista el cuerpo del procedimiento se puede considerar como si definiera una nueva instrucción de nivel superior. Desde este punto de vista, una llamada a procedimiento puede considerarse como una simple instrucción, aunque pueda ser bastante complicada. Para comprender la parte de un programa que contiene una llamada a un procedimiento, sólo se necesita saber qué hace, no cómo lo hace.

Un tipo muy interesante es el procedimiento recursivo, que es un procedimiento que se llama a sí mismo. El estudio de este tipo de procedimientos proporciona una profundidad considerable de cómo están implementadas las llamadas a procedimientos y de lo que son en realidad las variables locales. A continuación se dará un ejemplo de un procedimiento recursivo. Un viejo problema que tiene una solución sencilla por medio de la recursión es el de las “ Torres de Hanoi”. Hay tres varillas, la primera de las cuales pasan por el centro de una serie de n discos concéntricos. Cada uno de ellos tiene un diámetro más pequeño que el que está justo por debajo de él. Las otras dos varillas están vacías inicialmente. El problema consiste en transferir todos los discos a la varilla 3, uno cada vez, de manera que nunca haya un disco mayor sobre uno menor. La figura 5-46 muestra la configuración inicial para n = 5 discos.

151

Page 153: Manual Datos i 2003[1]

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)

Se imprime la solución. El procedimiento comprueba primero sí n = 1. Si lo es, la solución es trivial; nada más que moverlo de la i a la j. Si n ¹ i, la solución consta de tres partes como la que acabamos de comentar, siendo cada una de ellas una llamada a un procedimiento recursivo.

La solución completa se muestra en la figura 5-48.

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.

152

Page 154: Manual Datos i 2003[1]

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

153

Page 155: Manual Datos i 2003[1]

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)

La figura 5-49(a) muestra la pila justo después de hacer esta llamada. El procedimiento comprueba primero si n = l y, al descubrir que n = 3, hace la llamada

torres (2, l, 2)

154

Page 156: Manual Datos i 2003[1]

Después de completar esta llamada, la pila está como se muestra en la figura 5-49(b) y el procedimiento comienza de nuevo por el principio (un procedimiento llamado siempre empieza por el principio). Esta vez la comprobación de sí n = 1 falla de nuevo y se hace la llamada

torres (1, l, 3)

Entonces la pila está como se muestra en la figura 5-49(c) y el contador de programa apunta al comienzo del procedimiento. Esta vez la comprobación tiene éxito y se imprime una línea. Seguidamente el procedimiento retorna, elimina una trama de la pila y deja BL y AP como en la figura 5-49(d). El procedimiento continúa ejecutándose en la dirección de retorno, que es la segunda llamada:

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.

155

Page 157: Manual Datos i 2003[1]

Corrutinas

En la secuencia ordinaria de llamada es clara la distinción entre el procedimiento que llama y el llamado. Considérese el procedimiento A, que llama al procedimiento B, en la figura 5-50.

El procedimiento B hace cálculos un rato y retorna a A. A primera vista podría considerarse simétrica esta situación, ya que ni A ni B son el programa principal, sino que son procedimientos (el procedimiento A podría haber sido llamado por el programa principal, pero este hecho es irrelevante). Además, primero hay una transferencia de control de A a B (la llamada) y más tarde una transferencia de control de B a A (el retorno).

La simetría viene del hecho de que cuando pasa el control de A a B, B comienza a ejecutarse desde el principio. Cuando B retorna a A, la ejecución no comienza al principio de A, sino en la sentencia que sigue a la llamada. Si A se ejecutara durante un rato y llamara a B otra vez, la ejecución comenzaría al principio de B de nuevo, no en la sentencia que sigue al retorno anterior. Si, en el transcurso de la ejecución, A llamara a B muchas veces, cada una de las veces que arrancara B, éste comenzaría por el principio, mientras que A nunca lo hace.

Esta diferencia se refleja en el método por el que se pasa el control de A a B. Cuando A llama a B, usa la instrucción de llamada a procedimiento, que pone la dirección de retorno (es decir, la de la primera sentencia que sigue a la llamada) en algún sitio útil, por ejemplo en la cima de la pila. Pone entonces la dirección de B en el contador de programa para completar la llamada. Cuando B retorna, no usa la instrucción de llamada, sino la de retorno, que simplemente desapila la dirección de retorno y la mete en el contador de programa.

A veces es útil tener dos procedimientos, A y B, cada uno de los cuales llame al otro como a un procedimiento. Cuando B retorna a A, salta la sentencia que sigue a la llamada a B, como antes. Cuando A transfiere control a B, no va al principio (excepto la primera vez) 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

156

Page 158: Manual Datos i 2003[1]

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

157

Page 159: Manual Datos i 2003[1]

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.

158

Page 160: Manual Datos i 2003[1]

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

Un desvío es un tipo de llamada automática a procedimiento iniciada por alguna condición debida al programa, normalmente una condición importante aunque improbable. Un buen ejemplo es el desbordamiento.

En muchas computadoras, si el resultado de una operación aritmética excede al mayor número que pueden representar, tendrá lugar un desvío, entendiéndose por esto que se conmutará el flujo de control a alguna posición de memoria fija, en lugar de continuar en secuencia. En dicha posición fija habrá un salto a un procedimiento de- nominado procedimiento controlador de desvíos por desbordamiento, que realizará alguna acción apropiada, tal como imprimir un mensaje de error. Si el resultado de una operación cae en el rango correcto, no ocurrirá ningún desvío.

La característica esencial del desvío es que se inicia en alguna condición excepcional causada por el programa mismo y detectada por el hardware o por el microprograma. Otro método para tratar desbordamientos consiste en tener un registro de un bit que se ponga a 1 cuando suceda un desbordamiento. El programador que desee comprobar si hay desbordamiento debe incluir una instrucción explícita de salto si el bit de desbordamiento está a 1” después de cada instrucción aritmética. Hacer esto sería lento y costaría mucho espacio.

Por lo regular, los desvíos se implementan haciendo que el microprograma realice la verificación.

El desvío puede implementarse por medio de una comprobación explícita efectuada por el intérprete a nivel 1. Si detecta desbordamiento, cargará la dirección del desvío en el contador de programa. Lo que es un desvío en un nivel puede estar bajo control del programa en un nivel inferior. El hecho de hacer que el microprograma efectúe la comprobación ahorra tiempo en comparación con el que ocupa la comprobación hecha por el programador, ya que la puede hacer fácilmente al mismo tiempo que alguna otra cosa. También ahorra memoria, ya que las comprobaciones necesitan estar una sola vez en unos pocos procedimientos del nivel 1, independientemente de cuántas operaciones aritméticas haya en el programa principal.

Algunas condiciones corrientes que causan a veces desvíos son desbordamientos y subdesbordamientos en punto flotante, desbordamiento en enteros, violación de protecciones, código de operación indefinido, desbordamiento de la pila, intento de arrancar

159

Page 161: Manual Datos i 2003[1]

un dispositivo de E/S que no existe, intento de extraer una palabra con dirección impar y la división entre cero.

Interrupciones

Las interrupciones son cambios en el flujo de control, no ocasionados por el programa que se ejecuta, sino por alguna otra cosa normalmente relacionada con la E/S. Por ejemplo, un programa puede decirle al disco que empiece a transferir información y que produzca una interrupción cuando acabe la transferencia. Al igual que el desvío, la interrupción detiene el programa en curso y transfiere control al procedimiento de tratamiento de interrupciones, que realiza alguna acción apropiada. Cuando termina, el procedimiento de interrupciones retorna el control al programa interrumpido. Debe continuar el proceso interrumpido exactamente en el mismo estado en que estaba cuando tuvo lugar la interrupción. Ello significa restaurar los registros internos al estado que tenían antes de la interrupción.

La diferencia esencial entre los desvíos y las interrupciones es que los desvíos son síncronos con el programa y las interrupciones son asíncronas. Si el programa se vuelve a ejecutar un millón de veces, los desvíos tendrán lugar cada vez, pero las interrupciones pueden variar, por ejemplo, conforme al momento exacto en que una persona en una terminal pulsa la tecla de retorno de carro. La razón de que los desvíos sean reproducibles y las interrupciones no lo sean reside en que los desvíos los ocasiona el programa directamente, y las interrupciones, a lo sumo, son causadas por el programa en forma indirecta. Para apreciar realmente cómo funciona una interrupción, considérese un ejemplo común: una computadora desea enviar una línea de caracteres a una terminal. Primero, el software del sistema reúne en un buffer a todos los caracteres que se van a escribir, inicializa una variable global apt, para apuntar al inicio del buffer y asigna a una segunda variable global cuenta con el número de caracteres que se enviarán. En seguida checa si la terminal está lista y, en su caso, envía el primer carácter (v.g., utilizando registros como los de la figura 5-41). Una vez iniciada la operación de E/S, la CPU se libera para correr otro programa o hacer alguna otra cosa. En el transcurso del tiempo, el carácter se despliega en la pantalla. La interrupción puede ahora comenzar. Los pasos, en forma simplificada, son los siguientes:

ACCIONES DE HARDWARE

1. El controlador del dispositivo activa una línea de interrupción para iniciar la secuencia de interrupción.

2. Tan pronto como la CPU se encuentra preparada para manejar la interrupción, activa en el bus una señal de interrupción recibida.

3. Cuando el controlador del dispositivo ve que su señal de interrupción ha sido recibida, pone un número entero pequeño en las lineas de datos para identificarse a si mismo. A este número se le denomina vector de interrupción.

4. La CPU quita del bus al vector de interrupción y lo almacena de manera temporal.

5. La CPU apila el contador de programa y la Palabra de Estado del Programa (PSW) en la pila.

6. En seguida, la CPU ubica un nuevo contador de programa utilizan- do el vector de interrupción como índice dentro de una tabla en la parte baja de la memoria. Si, por ejemplo, el contador de programa es de 4 bytes, el vector de interrupción n correponde a la dirección 4n. Este 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

Page 162: Manual Datos i 2003[1]

7. La primera cosa que hace la rutina de servicio de interrupción es salvar todos los registros, de modo que puedan recuperarse más tarde. Se pueden salvar en la pila, o en una tabla del sistema.

8. Cada vector de interrupción es compartido, por lo general, por todos los dispositivos de un tipo determinado, así que aún no se sabe qué terminal provocó la interrupción. Se puede encontrar el número de la terminal leyendo algún registro de dispositivo.

9. Se puede leer ahora, cualquier otra información acerca de la interrupción, tal como códigos de estado.

10. Si ocurrió un error de E/S, se puede manejar aqui. 11. Se actualizan las variables globales apt y cuenta. La primera se

incrementa para apuntar al siguiente byte; y la segunda se decrementa para indicar que queda un byte menos para desplegar. Si cuenta es aún mayor que 0, existen aún caracteres por enviar. Entonces, copia el que está siendo apuntado en ese momento por apt en el registro del buffer de salida.

12. En caso de requerirse, se envía un código especial para indicar al dispositivo o al controlador de interrupciones que la instrucción ha sido procesada. Por ejemplo, el 8259A requiere de dicha señal.

13. Restaura todos los registros salvados.14. Ejecuta la instrucción RETURN FROM INTERRUPT (regresa de

interrupción), poniendo a la CPU de nuevo en el modo y estado que tenía justo antes de que ocurriera la interrupción. La computadora continúa como si no hubiera habido interrupción.

Un concepto clave relacionado con las interrupciones es la transparencia. Cuando sucede una interrupción, tienen efecto algunas acciones y se ejecutan algunos códigos, pero cuando todo termina, la computadora debe de ser regresada exactamente al mismo estado en que se encontraba antes de la interrupción. Una rutina de interrupción que tiene esta propiedad se dice que es transparente. Hacer que todas la interrupciones sean transparentes hace que el proceso de interrupciones en su conjunto sea mucho más fácil de entender.

Si la computadora sólo tiene un dispositivo de E/S, entonces las interrupciones trabajan tal y como se describió antes y no hay nada más que agregar al respecto. Sin embargo, una computadora grande puede tener muchos dispositivos de E/S y varios pueden estar corriendo al mismo tiempo, probablemente en beneficio de diferentes usuarios. Existe una posibilidad diferente de cero, que mientras una interrupción se esté ejecutando, un segundo dispositivo de E/S quiera generar su interrupción.

Para este problema se pueden tomar dos enfoques. El primero es que todas las rutinas de interrupción inhiban, como primera tarea, a todas las interrupciones posteriores, aun antes de salvar los registros. Este enfoque es muy simple mientras las interrupciones se suceden en forma estrictamente secuencial, pero puede causar problemas a los dispositivos que no pueden tolerar mucha demora. Por ejemplo, en una línea de comunicaciones de 9600 bps, los caracteres llegan cada 1042 microsegundos, esté o no listo el dispositivo. Si el primer carácter no ha sido procesado para cuando llega el segundo, puede haber pérdida de información.

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

161

Page 163: Manual Datos i 2003[1]

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.

En t = 15, la línea RS 232 requiere de atención y genera otra interrupción. Ya que la linea RS 232 tiene una prioridad mas alta (5) que la de la impresora (2), la interrupción se realiza. El estado de la maquina, que en ese momento está corriendo la ISR de la impresora, se coloca en la pila y se inicia la ISR de la línea RS 232.

Poco después, en t = 20, el disco termina y requiere de servicio. No obstante, su prioridad (4) es menor que la de la rutina actualmente en ejecución (5), de modo que el hardware de la CPU no acepta la interrupción y la mantiene pendiente. En t = 25, termina la rutina de las líneas RS 232 y regresa al estado en que se encontraba antes de generar la interrupción, es decir, ejecutando la rutina de servicio de interrupción de la impresora, con la prioridad 2. Tan pronto como la CPU cambia a la prioridad 2, aún antes de poder ejecutar una sola instrucción, se permite entonces la interrupción del disco con prioridad 4 y se ejecuta la ISR del disco. Cuando ésta concluye, la rutina de la impresora puede continuar. Por último, en t = 40, todas las rutinas de servicio han finalizado y el programa de usuario continúa en el punto en el que se le dejó.

Todas las pastillas de Intel tienen dos niveles (prioridades) de interrupción, diferibles y no diferibles. Estas últimas se usan, por lo regular, para señalar casi catástrofes, tales como errores de paridad de memoria. El tipo diferible es el que utilizan todos los dispositivos de E/S.

Cuando un dispositivo de E/S envía una interrupción, la CPU usa el vector, de 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-

162

Page 164: Manual Datos i 2003[1]

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.

163

Page 165: Manual Datos i 2003[1]

CONCLUSIÓN

164

Page 166: Manual Datos i 2003[1]

BOLILLA III:

ARQUITECTURA DEL

PROCESADOR

165

Page 167: Manual Datos i 2003[1]

INDICE

BOLILLA III: ARQUITECTURA DEL PROCESADOR_____________________________164

INDICE__________________________________________________________________165

INTRODUCCIÓN_________________________________________________________166

ARQUITECTURA DEL PROCESADOR______________________________________167ESTRUCTURA GENERAL________________________________________________167DESCRIPCIÓN DE LOS COMPONENTES DE UN PROCESADOR_______________167Microprocesadores________________________________________________________170EJECUCIÓN DE LAS INSTRUCCIONES_____________________________________171ORGANIZACIÓN DE LA CPU_____________________________________________172LA UNIDAD ARITMÉTICA Y LÓGICA_____________________________________174LA UNIDAD DE CONTROL_______________________________________________176FASE DE BÚSQUEDA DE LA INSTRUCCIÓN________________________________177FASE DE BÚSQUEDA O ALMACENAMIENTO DEL OPERANDO_______________177

Caso de búsqueda del operando, seguido de procesamiento:______________________177Caso de almacenamiento del operando:______________________________________178

FASE DE PREPARACIÓN DE LA SIGUIENTE INSTRUCCIÓN__________________179INSTRUCCIÓN DE RUPTURA DE SECUENCIA______________________________179EL CANAL______________________________________________________________180LAS UNIDADES PERIFÉRICAS____________________________________________181INTERRUPCIONES______________________________________________________181

CONCLUSIÓN____________________________________________________________184

166

Page 168: Manual Datos i 2003[1]

INTRODUCCIÓN

167

Page 169: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

ARQUITECTURA DEL PROCESADORESTRUCTURA GENERAL

Una computadora digital es un sistema de procesadores, memorias y dispositivos de entrada / salida interconectados. Veremos aquí estos componentes y su interconexión. Procesadores, memorias y dispositivos de entrada / salida son conceptos claves por lo que iniciaremos el estudio de la arquitectura del procesador analizando cada uno de ellos.

DESCRIPCIÓN DE LOS COMPONENTES DE UN PROCESADOR

En una visión muy general un ordenador lo podemos asimilar a la siguiente situación. Supongamos una oficina donde tenemos un "Señor" sentado frente a un escritorio en donde tiene una calculadora una cierta cantidad de papeles en blanco donde escribir datos y un contador que le indica el número de la casilla que deberá leer a continuación. A su espalda tiene una serie de casilleros numerados en donde puede guardar o sacar información y un lugar preciso tiene una determinada cantidad de tarjetas en donde están escritas instrucciones. Además, en la pared hay un reloj donde se le indica el tiempo que tiene para resolver cada instrucción.

Por otro lado, también tiene a cada lado un canasto, el de su derecha es donde se le introducen datos, requerimientos ó instrucciones y el de su izquierda es donde el entrega datos o respuestas a los requerimientos. Esto se puede apreciar en la siguiente figura (Figura 1).

168

Page 170: Manual Datos i 2003[1]

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

Page 171: Manual Datos i 2003[1]

La Unidad de Control, que contiene el "Contador de Programa" y el "Registro de Instrucción", extrae de la memoria, en la dirección indicada por el Contador de Programa, la nueva instrucción a ejecutar y la copia en el Registro de 'Instrucción, el que tiene el siguiente formato:

En donde el "CÓDIGO DE OPERACIÓN" indica que tipo de operación deberá realizar, y las direcciones de los operandos y del resultado, indica donde ir a buscar los operandos y donde guardar el resultado respectivamente.

Una vez que ha decodificado (interpretado) el tipo de operación a realizar, busca los operandos y los copia en los registros internos de la "Unidad Aritmética y Lógica" (ALU) para que esta realice la operación indicada en el "Código de Operación".

Tal como se ha indicado hasta aquí, la máquina puede ejecutar un programa inicialmente registrado en la memoria central, sobre datos registrados en la memoria central y almacenar los resultados en la memoria central a medida que son obtenidos.

Ahora es necesaria dotarla de medios para comunicarse con el exterior; este es el papel reservado a las Unidades Periféricas.

Existen dos grandes clases de unidades periféricas: "Las Unidades de Comunicación" (lectoras de tarjetas, impresoras, unidades de visualización de rayos catódicos, teclados, etc), que permiten el dialogo con el exterior; y las "Memorias Auxiliares" ó "Unidades de 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

170

Page 172: Manual Datos i 2003[1]

MICROPROCESADORES

En la Figura 4 se puede apreciar la organización de una microcomputadora con un solo bus o canal. La Unidad Central de Procesamiento (CPU) es el "cerebro" de la computadora. Su función es ejecutar programas almacenados en la memoria central tomando las instrucciones examinándolas y luego ejecutándolas una a continuación de otra.

171

Page 173: Manual Datos i 2003[1]

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.

EJECUCIÓN DE LAS INSTRUCCIONES

En la CPU se ejecutan instrucciones en una serie de pequeños pasos: 1- Extrae de la memoria la siguiente instrucción y la lleva al registro de instrucción. 2- Cambia el Contador de Programa de modo que señale la siguiente instrucción. 3- Determina el tipo de instrucción que acaba de extraer. 4- Verifica si la instrucción requiere datos de la memoria y, si es así, determina donde

están situados. 5- Extrae los datos, si los hay, y los carga en los registros internos de la CPU. 6- Ejecuta la instrucción. 7- Almacena los resultados en el lugar apropiado. 8- Vuelve al punto 1 para empezar: la ejecución de la instrucción siguiente.

A esta secuencia de pasos se la denomina ciclo de máquina y es la forma básica de operación de toda computadora.

Esta descripción de como funciona la CPU se parece mucho a un programa. El hecho de que sea posible escribir un programa que imite el funcionamiento de la CPU demuestra que no es necesario que un programa sea ejecutado por una CPU "física... es decir, un dispositivo compuesto de elementos electrónicos, sino que puede utilizarse otro programa 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).

172

Page 174: Manual Datos i 2003[1]

ORGANIZACIÓN DE LA CPU

La organización interna de una parte clásica de la CPU se debe al diseño de "Von Neumann", y se muestra en la Figura 5. A esta parte se la denomina la "trayectoria de los datos", y consiste en los registros (normalmente de 1 a 16) y en la ALU (Unidad Aritmética-Lógica). Dichos registros alimentan dos entradas a la ALU (A y B en la figura). los cuales retienen información mientras la ALU realiza sus cálculos.

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

173

Page 175: Manual Datos i 2003[1]

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.

174

Page 176: Manual Datos i 2003[1]

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:

CÓDIGO DE OPERACIÓN

DIRECCIÓN 1° OPERANDO

DIRECCIÓN 2° OPERANDO

DIRECCIÓN DEL

RESULTADO

La figura 6 representa la Unidad Aritmética y Lógica capaz de ejecutar esta operación, la cual está rodeada de tres registros donde de memorizan los dos operandos y el resultado.

La instrucción de suma necesita cuatro accesos a la memoria central, que permiten sucesivamente buscar la instrucción, después el primer operando, luego el segundo operando y, por último, almacenar el resultado. A las máquinas que utilizan este tipo de instrucción se las llama de tres direcciones.

Existen otras máquinas llamadas de una dirección. Su Unidad Aritmética y Lógica posee un registro partivular, denominado acumulador, que sirve tanto para albergar el primer operando como el resultado. Esta característica permite intrucciones de una sola dirección: la del segundo operando.

La operación de suma necesita tres instrucciones para:1- Cargar el primer operando en el acumulador.2- Sumar el segundo operando con el contenido del acumulador.3- Almacenar en memoria el contenido del cacumulador.

Cada una de setas tres instrucciones comportará un código de operación y una

175

Page 177: Manual Datos i 2003[1]

dirección.

CÓDIGO DE OPERACIÓN

DIRECCIÓN

Carga Dirección 1º operandoAdición Dirección 2º operando

Almacenamiento Dirección resultado

La Unidad Aritmética y Lógica está esquematizada en al figura 7, donde el acumulador sustituye a los registros R1, R2 de la figura anterior.

El segundo operando puede almacenarse durante la operación en el “Registro de Palabra” asociado a la memoria. Este es el caso de la computadora conocida como "Abacus".

176

Page 178: Manual Datos i 2003[1]

LA UNIDAD DE CONTROL

Es la unidad que extrae y analiza las instrucciones de la memoria central. Para ello necesita dos registros:

1- Uno llamado "Contador de Instrucciones", "Contador Ordinal" ó “Contador de Programa” (PC = Program Counter), que contiene la dirección de la próxima instrucción a ejecutar. Su nombre se debe a que, exceptuado las rupturas de secuencia, este registro va aumentando su contenido en una unidad para pasar a la siguiente instrucción.

2- Un registro llamado “Registro de Instrucción”, que contiene la última instrucción extraída de la memoria. Si bien existen distintos diseños para este registro, vamos a ver el Registro de Instrucción de “Abacus”, que es la arquitectura que estamos analizando y que es la que está más difundida. Este Registro de Instrucción se divide en dos partes:

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

La unidad de control contiene además un órgano generador de secuencias llamado “Secuenciador”, el que tras analizar el código de operación, distribuye las ordenes al conjunto de unidades del ordenador, tales como la Memoria, Unidad Aritmética y Lógica, etc., a fin de hacerles ejecutar las distintas fases de la instrucción. Esto puede verse en la Figura 8.

El desarrollo de una instrucción de procesamiento en un computador de una dirección, puede descomponerse en tres fases:

1- Búsqueda y análisis de la instrucción. 2- Búsqueda y procesamiento del operando o bien, almacenamiento del operando. 3- Preparación de la siguiente instrucción.

FASE DE BÚSQUEDA DE LA INSTRUCCIÓN

177

Page 179: Manual Datos i 2003[1]

La Unidad de Control ordena la transferencia del contenido del Contador de Programa (es decir la dirección de la instrucción por ejecutar) al Registro de Selección, y envía a la memoria una orden de lectura. Una vez terminada esta operación de lectura, la instrucción queda disponible en el Registro de Palabra. Entonces, la Unidad de control ordena la transferencia del contenido de este registro al Registro de Instrucción.

Los circuitos especializados de la Unidad de Control pueden entonces analiza el Código de Operación de la instrucción. Esta primera fase es común a todos los tipos de instrucciones. Tal como indica la Figura 9.

FASE DE BÚSQUEDA O ALMACENAMIENTO DEL OPERANDO

Caso de búsqueda del operando, seguido de procesamiento:

Una vez analizado el código de operación de la instrucción, la unidad de control sabe que se trata de una instrucción de procesamiento, con búsqueda previa del operando. La dirección del operando se encuentra en la zona de dirección del Registro de Instrucción. La Unidad de Control ordena su transferencia al Registro de Selección de memoria y acto seguido ordena una operación de lectura en la memoria. Al finalizar dicha operación, el operando buscado queda disponible en el Registro de Palabra. La Unidad de Control posiciona los circuitos de la Unidad Aritmética y Lógica para realizar el procesamiento solicitado por el código de operación y ordena la transferencia del operando a la Unidad Aritmética y lógica. El resultado del procesamiento del operando queda almacenado en el Acumulador.

Obsérvese que un posible procesamiento puede ser simplemente una transferencia del operando al acumulador. Figura 10.

178

Page 180: Manual Datos i 2003[1]

 Caso de almacenamiento del operando:

La dirección de almacenamiento del operando se encuentra en la zona de dirección del Registro de Instrucción. La Unidad de Control ordena su transferencia al Registro de Selección de la memoria. El operando a almacenar está en el Acumulador. La Unidad de Control ordena su transferencia al Registro de Palabra. Acto seguido completa la ejecución ordenando a la memoria una operación de escritura. Figura 11.

179

Page 181: Manual Datos i 2003[1]

FASE DE PREPARACIÓN DE LA SIGUIENTE INSTRUCCIÓN

Consiste en aumentar una unidad (a menudo se dice incrementar en uno) el contenido del Contador de Programa, de manera que contenga la dirección de la siguiente instrucción..

INSTRUCCIÓN DE RUPTURA DE SECUENCIA

Este tipo de instrucción, también llamado instrucción de bifurcado o de salto, permite modificar el desarrollo secuencial del programa, haciendo que la instrucción de salto sea seguida, no por la instrucción almacenada en la siguiente dirección de memoria, sino por una instrucción cuya dirección viene suministrada por la propia instrucción de salto.

El salto puede ser condicional, o sea que este no tendrá efecto si no se satisface una determinada condición, normalmente relacionada con el contenido del acumulador, en caso de no cumplirse esta condición, el programa continuar en secuencia.

El Código de Operación define la condición y la Dirección indica el emplazamiento de la próxima instrucción por ejecutar en caso de satisfacerse la condición. Esto puede verse en la figura 12.

Si la respuesta de la Unidad Aritmética y Lógica es que la condición ha sido satisfecha, la Unidad de Control ordena la transferencia de la dirección al Contador de Programa e inhibe la suma, de una unidad a este contador, en caso contrario ordena incrementar en uno al Contador de Programa.

180

Page 182: Manual Datos i 2003[1]

EL CANAL

Es un dispositivo que es capaz, en general, de gestionar la transferencia, tanto en un sentido como en otro, de un conjunto de información entre las Unidades Periféricas y la Memoria Central. En los ordenadores actuales esta transferencia puede operarse simultáneamente con el desarrollo de un programa de cálculo. Las informaciones transferidas se almacenan en memoria en forma secuencial. Para inicializar la transferencia, instrucciones especiales de entrada/salida deben suministrar al canal lo siguiente:

1. La dirección de la Unidad Periférica implicada. 2. La dirección para el almacenamiento de la primera información. 3. El número de informaciones a transferir.

En lo sucesivo el canal se ocupara totalmente de la gestión de la transferencia. Por cada información transferida, sumar uno a la dirección de almacenamiento y restar uno al número de informaciones a transferir. En el momento en que toda la información ha sido transferida, advertir a la Unidad de Control a través de un mecanismo llamado “ Interrupción”. Esto de aprecia en la Figura 13.

181

Page 183: Manual Datos i 2003[1]

LAS UNIDADES PERIFÉRICAS

Se distinguen dos grandes clases de Unidades Periféricas:

1- Las memorias auxiliares: que sirven de soporte de almacenamiento de gran capacidad y de medio de comunicación con el interior del sistema. Estas unidades están compuestas por los discos, disquetes, cintas magnéticas, etc.

2- Las unidades de comunicación: que podemos a su vez dividirlas en: a) Comunicación entre el sistema y el medio exterior: que permiten el intercambio

de información sobre soportes generados o leídos por el hombre, como pueden ser las máquinas lectoras o perforadoras de cintas o tarjetas perforadoras, las impresoras, etc.

b) Unidades para el diálogo entre el hombre y el computador: tales como las máquinas de escribir, unidades de visualización, teclado y monitores de terminales, etc.

c) Las unidades para intercambio de información a distancia: como por ejemplo las líneas de comunicación, las redes de computadoras, las terminales, otros computadores, etc.

d) Las unidades para el intercambio de información a través de dispositivos que aceptan o suministran datos analógicos: tales como modems, conversores analógicos / digitales, etc.

La mayoría de las unidades constan de dos partes:

1- Una parte electrónica, llamada “Controlador” o “Unidad de Control de Periféricos”. 2- Una unidad electromecánica que, gobernada por 1a primera, lee o escribe datos en

los dispositivos periféricos.

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.

Podemos clasificar las interrupciones según el campo de aplicación del procedimiento de interrupción como por ejemplo:

1- Interrupción por errores o averías: falla de la alimentación eléctrica. error de

182

Page 184: Manual Datos i 2003[1]

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.

Determinados computadores presentan una sola posibilidad de interrupción, en cuyo caso se pasarían todas las causas de interrupción a través de una compuerta lógica "OR", y el programa de interrupción comienza a comprobar un conjunto de indicadores a fin de detectar cuál es la causa de la misma.

Otros poseen varios niveles de interrupciones. A cada nivel de interrupción le corresponde un conductor proveniente de la causa o causas de la interrupción y también de los programas asociados. Dichos niveles pueden estar jerarquizados, lo que significa que están clasificados por orden de las prioridades respectivas, y que un programa de interrupción puede a su vez ser interrumpido por una demanda de interrupción clasificada en un nivel superior de prioridad. El programa interrumpido pasa entonces al estado de espera.

Los pequeños ordenadores, especializados en la guía de procesos, poseen frecuentemente sistemas de interrupción bastante elaborados. En general, presentan varias características del tipo siguiente de organización modular:

Las interrupciones están agrupadas en cierto número de niveles jerárquicos, o sea, cada uno de ellos posee una prioridad diferente. Un programa de un determinado nivel de prioridad puede verse interrumpido por un programa solicitado por una interrupción de nivel superior.

Un nivel agrupa varios subniveles, cada cual con su conductor de interrupción y su prioridad dentro del nivel. Los programas asociados a los subniveles de un mismo nivel no pueden interrumpirse mutuamente, siendo únicamente efectiva su prioridad en caso de elección entre varios de ellos, si se encontrasen simultáneamente en estado de espera.

Un subnivel agrupa, a su vez, varias demandas de interrupciones, cuyas causas son investigadas por prueba de los indicadores.

Una interrupción puede encontrarse en varios estados a saber:

1- Estado desactivado: el nivel no acepta ninguna demanda de interrupción. Un nivel puede ser activado o desactivado por el programa.

2- Estado de espera: el nivel pasa al estado de espera si recibe una señal de demanda de interrupción. Varias razones pueden diferir la consideración operativa de la interrupción. Primeramente, es preferido que el nivel esté autorizado, puesto que se distinguen dos formas de estado de espera:

Estado de espera inhibido: el nivel ha resultado inhibido por programa, de tal manera que la interrupción ha podido ser memorizada pero no tomada en cuenta por el ordenador, también se suele decir que el nivel ha sido enmascarado.

Estado de espera autorizado: la interrupción puede ser tomada en cuenta por el ordenador, si se han satisfecho las siguientes condiciones:

a- No existe ningún nivel de prioridad superior en el estado autorizado de espera.

b- La unidad central se encuentra en una fase ininte- rrumpible (generalmente en final de instrucción).

2- Estado activo: implica que la unidad central tome en cuenta la interrupción y se mantiene durante toda la ejecución del programa de interrupción.

183

Page 185: Manual Datos i 2003[1]

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.

184

Page 186: Manual Datos i 2003[1]

CONCLUSIÓN

185

Page 187: Manual Datos i 2003[1]

BOLILLA IV: MEMORIA

186

Page 188: Manual Datos i 2003[1]

INDICE

BOLILLA IV: MEMORIA_____________________________________________________185

INDICE__________________________________________________________________186

INTRODUCCIÓN_________________________________________________________187

MEMoRia________________________________________________________________188DIRECCIONES DE MEMORIA_____________________________________________189ORDENAMIENTO DE BYTES_____________________________________________190CÓDIGOS CORRECTORES DE ERRORES___________________________________191CLASIFICACIÓN Y ORGANIZACIÓN DE LAS MEMORIAS____________________191PARáMETROS y CARACTERíSTICAS MáS IMPORTANTES DE UNA MEMORIA_192

Capacidad_____________________________________________________________192Formas de acceder a las posiciones de memoria_______________________________193

Memorias de acceso aleatorio (RAM = Ramdom Acess Memory)_______________193Estructura de una RAM semiconductora_________________________________195

Pastillas de memoria en paralelo_____________________________________197Memorias pasivas___________________________________________________199

Memorias de acceso serie_______________________________________________200Memorias asociativas__________________________________________________202

MODOS DE DIRECCIONAMIENTO______________________________________203Modo de direccionamiento directo________________________________________203Modo de direccionamiento indirecto______________________________________204Modo de direccionamiento relativo_______________________________________204Modo de direccionamiento indexado______________________________________206Modo de direccionamiento por registro indirecto____________________________207Otros modos de direccionamiento________________________________________208

CONCLUSIÓN____________________________________________________________209

187

Page 189: Manual Datos i 2003[1]

INTRODUCCIÓN

188

Page 190: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

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.

189

Page 191: Manual Datos i 2003[1]

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:

DECIMAL: 0001 1001 0100 0100 BINARIO: 0000011110011000

En el formato decimal, 16 bits pueden almacenar los números 0 al 9999. teniendo únicamente 10.000 combinaciones, mientras que un número binario puro de 16 bits puede almacenar 65.536 combinaciones diferentes. Por esta razón se dice que el binario es más eficiente.

Sin embargo, supongamos que se inventara un dispositivo electrónico altamente fiable que pudiera almacenar directamente los dígitos 0 al 9 en diez niveles de voltajes. Cuatro de estas unidades podrían almacenar cualquier número decimal entre 0 y 9999. Los cuatro elementos proporcionarían 10.000 combinaciones. Con tales dispositivos. Obviamente, el sistema decimal es más eficiente.

DIRECCIONES DE MEMORIA

La memorias constan de cierto número de "celdas" (ó posiciones) cada una de las cuales puede almacenar una porción de información. Cada celda tiene un número asociado, denominado "dirección", por el cual los programas pueden referirse a ella. Si una memoria tiene "n" celdas, tendrá las direcciones de 0 a (n-1). Todas las celdas de una memoria tienen la misma cantidad de bit. Si una celda tiene "k" bits, podrá tener cualquiera de sus "2k" combinaciones. Las celdas adyacentes tienen direcciones consecutivas.

Las computadoras que utilizan sistemas binarios también expresan las direcciones de memoria como números binarios. Si una dirección tiene "m" bits, el número máximo de celdas direccionables es directamente "2m".

El número de bits de la dirección está relacionado con el número de celdas direccionables directamente en la memoria y es independiente del número de bits por celda. Una memoria con "212" celdas de 8 bits y otra de "212" celdas de 60 bits, necesitarán, cada una, direcciones de 12 bits.

A continuación se dan algunas celdas de computadoras comerciales:

Burroughs B1700 1 bit por celda.IBM PC 8 bits por celda.DEC PDP-8 12 bits por celda. IBM 1130 16 bits por celda.DEC PDP-15 18 bits por celda.Honeywell 6180 36 bits por celda.

La importancia de la celda reside en que es la unidad direccionable más pequeña. En los últimos años los fabricantes de computadoras han establecido como norma una celda de 8 bits, la que se denomina "byte". Estos bytes se agrupan en "palabras". Una computadora con una palabra de 16 bits tiene 2 bytes por palabra, mientras que otra con una palabra de 32 bits tiene 4 bytes por palabra.

La relevancia de la palabra está en que la mayor parte de las instrucciones operan sobre palabras enteras, por ejemplo, suma de dos palabras. De ahí que una máquina de 16 bits tendrá registros de 16 bits e instrucciones para manipular palabras de 16 bits, en tanto que una máquina de 32 bits tendrá registros de 32 bits e instrucciones (sumar, restar, mover, etc) para manipular palabras de 32 bis.

190

Page 192: Manual Datos i 2003[1]

ORDENAMIENTO DE BYTES

Los bytes en una palabra pueden numerarse de izquierda a derecha o de derecha a izquierda. En principio esto podría parecer irrelevante, pero como veremos, esto tiene grandes implicaciones.

La figura 2(a) presenta una parte de memoria de una computadora de 32 bits. cuyos bytes están numerados de izquierda a derecha (máquinas de la familia Motorola). La figura 2(b) muestra la presentación análoga de una computadora con numeración de derecha a izquierda (familia Intel).

Dirección

Big Endian Little Endian

0 0 1 2 3 3 2 1 04 4 5 6 7 7 6 5 48 8 9 10 11 11 10 9 812 12 13 14 15 15 14 13 12

byte bytePalabra de 32 bits Palabra de 32 bits

(a) Memoria Big Endian (b) Memoria Little Endian

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.

191

Page 193: Manual Datos i 2003[1]

CÓDIGOS CORRECTORES DE ERRORES

La memoria de una computadora puede en ocasiones cometer errores debido a picos o caídas de voltajes en el suministro de energía eléctrica u otras causas. Para prevenir tales errores, la mayoría usan códigos de detección o de corrección de errores.

Cuando se usan estos códigos se agregan bits extras a cada palabra de memoria en una forma especial. Cuando se lee una palabra de la memoria, se verifican los bit adicionales para ver si ha ocurrido un error.

Para entender como se manejan los errores, es necesario entender que es en realidad un error. Supongamos que una palabra de memoria es de "m" bits de datos a los que se agregan "r" bits redundantes o de verificación, siendo "n" la longitud total (es decir n = m + r). Para referirse a una unidad de "n" bits, conteniendo "m" datos y "r" bits de verificación, se utiliza el término "palabra código".

Dadas dos palabras códigos cualquiera, es posible determinar en cuantos bits difieren. Por ejemplo, entre las palabras código 10001001 y 10110001, hay una diferencia de 3 bits.

El número de bits en el que difieren dos palabras códigos se llama "distancia de Hamming". Esto significa que si dos palabras están separadas ente sí por una distancia de Hamming de "d" bits, se necesitarán "d" de verificación para convertir un código en otro.

En una palabra de memoria de "m" bits, existen "2m" combinaciones de bits legales, pero por la forma en que se calculan los bits de verificación, únicamente "2m" de las "2n" palabra códigos son válidas. Sí una lectura de memoria da una palabra invalida, la computadora sabe que ha ocurrido un error de memoria.

Dado el algoritmo para calcular los bits de verificación es posible encontrar las dos palabras de código cuya distancia de Hamming sea la mínima.

Las propiedades de detección y corrección de errores, dependen de su distancia de Hamming. Para detectar "d" errores de un bit se necesita de un código con una distancia "d + 1", porque con dicho código no es posible que "d" errores de un solo bit puedan cambiar una palabra válida en otra palabra válida.

De la misma manera, para corregir errores de un solo bit se requiere de un código con una distancia "2d + 1", pues así las palabras códigos legales se encuentran tan separadas entre sí, que aun con "d" cambios, la palabra original está más cerca que cualquier otra y puede ser unívocamente determinada.

Como ejemplo sencillo de códigos detectores de errores, consideremos que agregamos un bit de paridad, el cual se elige de modo que el número de bits con valor 1 sea par (o impar). Dicho código tiene una distancia de 2, ya que cualquier error de un solo bit produce una palabra código con la paridad equivocada. Se puede usar para detectar errores sencillos.

CLASIFICACIÓN Y ORGANIZACIÓN DE LAS MEMORIAS

En la descripción de los componentes de un procesador, dentro de la Unidad Central de Proceso, se encuentra la Unidad de Memoria Central ó Principal, en la que se almacenan las instrucciones, los datos u operandos, los resultados parciales y los resultado finales del proceso.

Cuando en un procesador, el sistema es especializado y el número de bits a memorizar es pequeño, se suelen utilizar registros de entrada / salida en paralelo o en serie disponibles como bloques funcionales de 4 a 8 bits en escalas de integración media (M SI) en la mayoría de las tecnologías.

Cuando la cantidad de información a memorizar es elevada y en especial cuando el sistema digital de proceso es programable, y han de memorizarse las instrucciones del programa, además de los datos, nunca se necesita tener acceso a toda la información simultáneamente. Por ello los elementos que memorizan información se pueden agrupar constituyendo una unidad de memoria en la que sólo se pueden acceder simultáneamente aun cierto número de aquellos.

"Se define por lo tanto una unidad de memoria como un conjunto de dispositivos biestables (que pueden encontrarse en dos estados distintos) agrupados de tal manera que solamente es posible introducir información o leer la que poseen simultáneamente en un grupo reducido de ellos ".

Las características que ha de poseer una unidad de memoria dependen:

192

Page 194: Manual Datos i 2003[1]

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.

Nos referiremos exclusivamente a las memorias que forman parte integrante de un sistema digital de proceso y que están física- mente situadas en el mismo recinto físico que la Unidad de control y la Unidad Aritmética y Lógica. Estas memorias constituyen lo que se denomina la Memoria Central del sistema. Estudiaremos los parámetros más importantes de una memoria y la división de las memorias de acuerdo con estos parámetros. Analizaremos los diferentes tipos de memorias desde el punto de vista funcional independiente de la tecnología.

PARÁMETROS Y CARACTERÍSTICAS MÁS IMPORTANTES DE UNA MEMORIA

Capacidad

Es la cantidad de información que puede almacenar. Dado que la información se almacena en el sistema binario. la capacidad se mide en la unidad de medida de información en dicho sistema, que es el "bit" .

La capacidad se puede considerar, por lo tanto, igual al numero "N" tota 1 de bits. Pero en genera 1, la información se almacena en grupos de bits denominados "posiciones" o "palabras", formadas por un cierto número "n" de bits accesibles simultáneamente.

El número de palabras o posiciones de una memoria viene dado por lo tanto por el cociente:

m= Nn

A la selección de una determinada posición de memoria para introducir información en ella o leer la que contiene, se la denomina "direccionamiento" de dicha posición. Para que se aproveche al máximo la capacidad de se lección, se hace que "m" sea una potencia de "2".

El número de variables binarias necesarias para poder seleccionar "m" es "b", tal que:

m= 2b

La unidad de capacidad, en lo que se refiere al número de posiciones de memoria se considera igual a 1024 (por ser la potencia de 2 más próxima a 1000) y se la denomina "k".

Para seleccionar 1024 posiciones de memoria se necesitan 10 bits, ya que:

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.

193

Page 195: Manual Datos i 2003[1]

Formas de acceder a las posiciones de memoria

La acción de introducir información (escribir ó grabar) en una posición de memoria, o leer la que contiene, se denomina "acceso a la memoria". Tal como se dijo, nunca es necesario leer o escribir simultáneamente todas las posiciones de una memoria. Por ello existen varias formas de acceso a una posición de memoria, lo que da lugar a la división de las memorias indicadas en la figura 3.

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.

Memorias de acceso aleatorio (RAM = Ramdom Acess Memory)

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 independientemente de su ubicación o situación.

194

Page 196: Manual Datos i 2003[1]

En la figura 4 se representa el esquema de bloques general de una memoria de acceso aleatorio.

Se supone que solamente se puede seleccionar simultáneamente una posición de memoria para leer su contenido o introducir información en ella.

La memoria está organizada en "n", bits cuya información se desea leer o escribir información simultáneamente.

La selección de la posición cuya información se desea leer o escribir se realiza mediante "b" bits en paralelo denominados "bits de dirección".

El número total de posiciones que se puede seleccionar es:

m = 2b

La asignación de las patitas de una pastilla de circuito integrado (IC = Integrated Circuit) de memoria como las especifica el fabricante se indica en la figura 4.

La memoria allí representada tiene la capacidad para almacenar (memorizar) 8 palabras de 4 bits cada una. La pastilla tiene 8 registros individuales "R0, R1, R2 ... R7" y cada registro consta de 4 flip-flop.

Los registros se identifican por los niveles lógicos en los terminales: "A2", "A1" y "A0". Estos bits se denominan bits de dirección y al conjunto de los bits de dirección se los

conoce como "dirección". Cuando "A2 A1 A0 = 000", se accede a 1 registro "R0".Cuando "A2 A1 A0 = 001", se accede al registro "R1".Y así sucesivamente. Como hay tres bits de dirección se pueden seleccionar "2b = 8" registros. Entonces cada uno tiene una dirección y se accede a un registro particular

almacenando los bits de dirección del registro en los terminales de dirección. Los 4 bits que están almacenados, es decir escritos, en un registro direccionado se

presentan en la pastilla de memoria en los terminales de entrada "I3 I2 I1 I0". Para escribir una palabra en el registro, este debe direccionarse, la palabra debe presentarse en la entrada, y deben habilitarse o activarse los terminales de "Habilitación de Escritura" (WE = 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

195

Page 197: Manual Datos i 2003[1]

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:

WE = 0 escribe en memoria y WE = 1 lee de memoria

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

Estructura de una RAM semiconductora

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.

196

Page 198: Manual Datos i 2003[1]

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 las

entradas de datos.Si "CS = 1" y "WE = 1", los flip-flop se conectarán a los terminales de salida, para que

la palabra almacenada pueda ser leída. Comercialmente se disponen de pastillas de Circuito Integrado (IC = Integrated Circuit)

que tienen incorporados "65.536 = 216 bits" ó aún mayor en la actualidad, a un precio bastante bajo.

197

Page 199: Manual Datos i 2003[1]

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.

198

Page 200: Manual Datos i 2003[1]

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.

199

Page 201: Manual Datos i 2003[1]

Memorias pasivas

El parámetro permanencia de la información, indicado en la figura 3, se mide en forma cualitativa por la diferencia entre el tiempo de lectura y el tiempo de escritura. De acuerdo con este parámetro, las memorias de acceso aleatorio se clasifican en memoria de escritura / lectura (R/W) o activas. Se denominan memorias pasivas a aquellas en las que existe gran diferencia entre el tiempo de lectura y el de escritura, el cual es mucho mayor.

A su vez este tipo de memorias se pueden clasificar tal como se indica a continuación: 1- Memorias totalmente pasivas (ROM = Read Only Memories): son aquellas

memorias que nunca pueden ser escritas por el que las utiliza, el cual solamente puede realizar la operación de lectura. La grabación ó escritura la realiza el fabricante. Por lo tanto, para quien la utiliza, el tiempo de escritura se puede considerar infinito y el tiempo de lectura tiene un cierto valor que depende de la tecnología con la cual ha sido fabricada la memoria.

2- Memorias pasivas programables (PROM = Programmable Read Only Memories): Son aquellas cuyo contenido pueden ser escrito por el usuario una sola vez.

3- Memorias pasivas reprogramables, ó memorias pasivas programambles borrables (EPROM = Erasable Programmable Read Only Memories): Son aquellas cuyo contenido pueden, por un procedimiento especial, ser borradas y programadas por el usuario varias veces. La escritura se realiza por un procedimiento especial, el tiempo necesario es varias veces superior al de lectura.

Estas memorias se denominan apropiadamente de solo lectura, ya que las operaciones de borrado y re-escritura no pueden realizarse mientras la memoria no esté trabajando en un sistema digital. La memoria debe extraerse del sistema y su modificación puede llevar horas.

Como la memoria de lectura / escritura, la de sólo lectura también son de acceso aleatorio. Por consiguiente es bastante inconsistente utilizar la etiqueta "memoria de acceso aleatorio" (RAM) para referirse únicamente a las memorias de lectura / escritura y no alas de sólo lectura. Mucha gente a indicado esa inconsistencia, no obstante, todavía se permite esta terminología.

En una ROM el bit almacenado en cualquier posición, no tiene que cambiarse. Por consiguiente, no es necesario almacenar los bits en flip-flop y por ello una ROM puede ensamblarse completamente a partir de circuitos combinacionales. Realmente una ROM no es más que un conversor de código, y por lo tanto, consta de un decodificador y de un

200

Page 202: Manual Datos i 2003[1]

codificador.

Memorias de acceso serie

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.

201

Page 203: Manual Datos i 2003[1]

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.

202

Page 204: Manual Datos i 2003[1]

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

Estas memorias se caracterizan porque la búsqueda de información en la operación de lectura no se realiza indicando una dirección y observando su contenido, sino que se suministra la información ala memoria para observar si ésta la contiene en alguna de sus posiciones.

La información almacenada en cada posición de una memoria asociativa puede estar organizada de dos formas fundamentales:

a- Dividida en dos partes ó campos: Un campo es el de la información que se compara con la que se presenta a las entradas de la memoria en una operación de lectura. El otro campo es el que da como respuesta la memoria cuando existe coincidencia entre el campo de comparación y la información de entrada.

b- Toda la información contenida en cada posición de la memoria se compara con la información de entrada: La memoria da solamente como respuesta en general un bit cuyo estado indica si existe alguna información en el interior de la memoria que es idéntica a la presentada a la entrada.

La estructura asociativa de una unidad de memorias es adecuada para el

203

Page 205: Manual Datos i 2003[1]

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

Hemos visto que generalmente (aunque no necesariamente) una instrucción consta de una parte de operación y otra de dirección. La parte de dirección puede contener la dirección de un operando utilizado en la ejecución de la instrucción. En otras ocasiones la parte de dirección de la instrucción puede contener, no la dirección del operando, sino la dirección donde se encuentra la dirección del operando, en el primer caso la dirección se describe como directa, mientras que en el segundo caso es una dirección indirecta. Esto es lo que se conoce como "Modo de Direccionamiento".

En computadoras, y microcomputadoras se emplea una amplia gama de modos de direccionamiento, por ello vamos a pasar revista a las diferentes técnicas de direccionamiento. Estas equivalen generalmente a una transformación de la parte de dirección de la instrucción en la dirección que se transferirá finalmente al Registro de Selección de la memoria para obtener la información deseada. Llamaremos a esta última "Dirección Efectiva". El tipo de procesamiento que debe sufrir el contenido de la zona de dirección viene especificado, ya sea por el Código de Operación, cuando este impone un tipo determinado, o por la configuración binaria de una parte de la instrucción, que contiene lo que convenimos en llamar las "Condiciones de Direccionamiento".

No todos los procesadores o microprocesadores tienen todos los tipos de direccionamiento, en algunos pueden existir modos que en otros no existen y viceversa.

Debido a estas distintas formas de direccionar los registros de un computador, la instrucción constará de tres partes:

Veremos a continuación los modos de direccionamiento más comun- mente utilizados en los procesadores actuales:

Modo de direccionamiento directo

En el direccionamiento directo, como ya lo señalamos, la instrucción contiene la dirección de la posición de memoria donde se encuentra el operando.

Este direccionamiento exige un ciclo de memoria para obtener el operando. La figura 11 muestra esta situación.

204

Page 206: Manual Datos i 2003[1]

Modo de direccionamiento indirecto

En el direccionamiento indirecto, como también dijimos, la instrucción no contiene la dirección de la posición de memoria donde se encuentra el operando, sino la dirección de la posición de memoria donde se encuentra la dirección del operando.

Por lo tanto, la localización de un operando direccionado indirectamente exigirá dos ciclos de memoria: un ciclo para buscar la dirección efectiva, otro ciclo para buscar el operando, de acuerdo a la figura 12.

Modo de direccionamiento relativo

La dirección relativa no indica la posición de la información en la memoria en valor absoluto, sino que la sitúa en relación a una dirección de referencia. Esta a su vez, está almacenada en un registro, frecuentemente llamado "Registro de Traslación". La dirección efectiva se obtiene sumando la dirección relativa con la dirección de referencia.

Las técnicas de direccionamiento relativo se emplean especialmente para permitir direccionar a toda la memoria. Es así como un calculador cuya palabra es de 16 bits, si se tomasen 8 bits conjuntamente para el Código de Operación y las Condiciones de Direccionamiento, no quedarían más que 8 bits para la dirección. Esto permitiría direccionar "28 = 256" posiciones de memoria, cuando lo normal es que los ordenadores de este tipo poseen muchas posiciones más. Si no queremos pasar aun formato de instrucción de dos palabras, puede emplearse el direccionamiento relativo para alcanzar directamente determinadas zonas de la memoria. Veamos tres ejemplos:

1- Direccionamiento por Base y Desplazamiento En la máquina existe un registro llamado "Registro Base", que contiene la dirección de

referencia (primera dirección de un programa o de una zona de datos). A la información que alberga la parte de dirección de la instrucción se le llama

"Desplazamiento". La dirección efectiva es la suma de la "Base" y el "Desplazamiento". como se muestra

en la figura 13.

205

Page 207: Manual Datos i 2003[1]

Algunos calculadores admiten varios registros de base, La instrucción debe especificar entonces la dirección del Registro Base escogido

2- Oireccionamiento por ReFerencia al Proqrama El contenido del contador de programa sirve de dirección de referencia. Con este

sistema es posible generalmente direccionar dos zonas de memoria a un lado ya otro de la instrucción en curso, según que la parte de dirección de la instrucción se sume o se reste con el contenido del Contador de Programa. La figura 14 muestra este modo de direccionamiento.

3- Oireccionamiento or Yuxta osición Se considera a la memoria dividida en zonas de "2n" palabras llamadas "Páginas". En

genera 1, la parte de di rección de la instrucción contiene "n" bits, por lo que no capacita a la máquina para direccionar más palabras que las que contiene la página (ó dirección de página), y de la parte de dirección de la instrucción, que suministra la dirección dentro de la página.

Este modo se muestra en la figura 15.

206

Page 208: Manual Datos i 2003[1]

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.

4- Complementos acerca del direccionamiento relativo Al menos uno de estos direccionamiento relativos se encuentra en las máquinas de

palabra corta (12. 16 ó 18 bits) donde la zona reservada a la dirección no basta para direccionar a toda la memoria, a no ser que se utilicen instrucciones sobre dos palabras.

Permiten direccionar directamente zonas de memoria (además de las "2n" primeras palabras) sin necesidad de recurrir al direccionamiento indirecto. Las referencias fuera de esta zona hacen necesario un direccionamiento indirecto apoyado en una célula de memoria perteneciente a estas zonas directamente accesibles.

El direccionamiento por base y desplazamiento, lo mismo que un tipo más evolucionado de direccionamiento por página, se utiliza en grandes ordenadores para resolver problemas de asignación de memoria en multiprogramación. En el caso de las PCs se usa un sistema parecido para poder direccionar más memoria.

Modo de direccionamiento indexado

En el direccionamiento indexado, como en el relativo, la parte de dirección de la instrucción contiene un número "N" que puede ser positivo o negativo. Sin embargo, para utilizar el direccionamiento indexado, el computador debe estar equipado con un registro especial (distinto del Contador de Programa) empleado para permitir direccionamiento indexado, y denominado "Registro Indice" (I). La posición de memoria donde se localiza el operando se encuentra mediante la suma "N + I".

La dirección efectiva se obtiene sumando a la parte de dirección de la Instrucción el contenido de un registro de la Unidad centra 1 llamado "Registro Indice", llamándose a menudo a su contenido "Indice".

Este registro admite un cierto número de operaciones, como carga, lectura, incremento o disminución en uno, comparación. El programador lo utiliza para tratar, mediante una sola instrucción en un bucle de programa, datos almacenados vectorialmente en células sucesivas (tablas) de la memoria. El direccionamiento correspondiente es 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

207

Page 209: Manual Datos i 2003[1]

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.

En algunos ordenadores, el Indice se inicializa en "-(n-1)", donde "n" representa el número de los elementos del vector. La dirección especificada en la instrucción es la última del vector. El índice se incrementa en uno a cada pasada y se sale del bucle cuando el índice es cero.

Otras máquinas poseen dos registros índice, uno contiene el índice y el otro el valor máximo de este índice, ambos resultan comparados al momento de la instrucción a fin de bucle y se origina un salto al principio del mismo mientras no se produzcan coincidencias entre los dos valores.

En algunas máquinas también existen registros de autoíndice incrementables en 1 cada vez que son referenciados. En muchos ordenadores pequeños se implantan los índices en posiciones reservadas de la memoria central, con objeto de economizar el costo de los correspondientes registros.

Modo de direccionamiento por registro indirecto

Algunas computadoras que incorporan la facultad del direccionamiento de registro indirecto, tienen un registro especial, a menudo llamado "Puntero" (P) (Pointer Register). Este, registro "P" contiene la dirección del operando, es decir, apunta a la posición de memoria del operando. Una instrucción que invoque realmente direccionamiento de registro indirecto no tiene bits significativos en su parte de dirección. En su lugar, la instrucción completa se incluye en los bits asignados a la parte de operación de la instrucción. Una instrucción típica que utiliza registro de direccionamiento indirecto debería especificar: "Cargar el acumulador con el operando localizado en la dirección de memoria dada en el registro P".

208

Page 210: Manual Datos i 2003[1]

Otros modos de direccionamiento

Otros esquemas comunes para localizar fuentes de operandos o destinos de operandos, denominados "modos de direccionamiento", incluyen los siguientes:

1- Direccionamiento Inmediato

No es propiamente un direccionamiento, puesto que la parte de dirección de la instrucción no contiene la dirección del operando, sino el operando mismo. Así, la instrucción sería: "Cargar al acumulador directo con 37", significa cargar al acumulador con el número 37. La figura 17 muestra este tipo de direccionamiento.

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.

209

Page 211: Manual Datos i 2003[1]

CONCLUSIÓN

210

Page 212: Manual Datos i 2003[1]

BOLILLA V: EL NIVEL DEL

LENGUAJE ENSAMBLADOR

211

Page 213: Manual Datos i 2003[1]

INDICE

BOLILLA V: EL NIVEL DEL LENGUAJE ENSAMBLADOR_______________________210

INDICE__________________________________________________________________211

INTRODUCCIÓN_________________________________________________________212

EL NIVEL DEL LENGUAJE ENSAMBLADOR________________________________213INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR___________________________214

¿Qué es un lenguaje ensamblador?__________________________________________214Formato de una sentencia en lenguaje ensamblador_____________________________215Comparación entre el. lenguaje ensamblador y los lenguajes de alto nivel___________216Afinación de programas__________________________________________________217

EL PROCESO DE ENSAMBLAJE___________________________________________219Ensambladores de dos pasadas_____________________________________________219La primera pasada_______________________________________________________220La segunda pasada______________________________________________________224La tabla de símbolos_____________________________________________________225

MACrOS________________________________________________________________227Definición, llamada y expansión de una macro________________________________227Macros con parámetros___________________________________________________229Implementación de macros en un ensamblador________________________________229

MONTAJE (LINKING) y CARGA___________________________________________230Tareas realizadas por el programa ensamblador________________________________232Estructura de un módulo objeto____________________________________________234Tiempo de ligadura y reubicación dinámica___________________________________235Enlace dinámico________________________________________________________237

CONCLUSIÓN____________________________________________________________240

212

Page 214: Manual Datos i 2003[1]

INTRODUCCIÓN

213

Page 215: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

EL NIVEL DEL LENGUAJE ENSAMBLADOR

En los capítulos 4, 5 y 6 estudiamos tres niveles, los cuales están presentes en la mayoría de las computadoras actuales. Este capítulo trata fundamentalmente de un cuarto nivel que también está presente en casi todas las computadoras modernas: el nivel del lenguaje ensamblador. Dicho nivel difiere considerablemente de los niveles de microprogramación, de máquina convencional y del sistema operativo, debido a que se implementa por traducción y no por interpretación.

Los programas que convierten un programa escrito de un lenguaje a otro lenguaje distinto se llaman traductores. El lenguaje en que está escrito el programa original se llama lenguaje fuente y al que se convierte se llama lenguaje objeto. Ambos lenguajes, el fuente y el objeto, definen niveles. Si contáramos con un procesador que ejecutara directamente los programas escritos en el lenguaje fuente, no habría ninguna necesidad de traducirlos al lenguaje objeto.

La traducción se usa cuando se dispone de un procesador ( lo mismo da que sea físico o un intérprete) para el lenguaje objeto, y no se cuenta con uno para el fuente. Si la traducción se hace correctamente, la ejecución del programa traducido dará exactamente los mismos resultados que daría la ejecución del programa fuente si dispusiéramos de un procesador para él. Por tanto podemos fabricar un nuevo nivel, en el que no hay procesador, si traducimos primero los programas escritos para dicho nivel a un nivel objeto y luego ejecutamos los programas resultantes.

Es importante darse cuenta de la diferencia entre la traducción, por un lado, y la interpretación por otro. En la traducción, el programa original, escrito en lenguaje fuente, no se ejecuta directamente. Lo que se hace es convertirlo en un programa equivalente, llamado programa objeto o módulo objeto, que se ejecuta después de que se ha terminado la traducción. En la traducción hay dos pasos bien definidos:

1. Generación de un programa equivalente en lenguaje objeto. 2. Ejecución del nuevo programa que se ha generado.

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.

INTRODUCCIÓN AL LENGUAJE ENSAMBLADOR

214

Page 216: Manual Datos i 2003[1]

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.

¿Qué es un lenguaje ensamblador?

Un lenguaje ensamblador puro es aquel en que cada sentencia produce exactamente una instrucción máquina. En otras palabras, hay una correspondencia biunívoca entre las instrucciones de máquina y las sentencias del programa en ensamblador. Si cada línea de un programa en ensamblador contuviera una sentencia ensamblador y  si cada palabra de máquina contuviera una instrucción de máquina, entonces un programa de n líneas escrito en ensamblador produciría un programa en lenguaje máquina que ocuparía n palabras.

La razón por la que se usa el lenguaje ensamblador en lugar de programar el lenguaje máquina (octal o hexadecimal) consiste en que es mucho más fácil programar en ensamblador. Es muy diferente usar nombres y direcciones simbólicas que hacerlo en binario u octal. La mayoría de la gente puede recordar que las abreviaturas para la adición, la sustracción, la multiplicación y la división son ADD, SUB, MUL y DIV, pero pocos pueden recordar que las instrucciones máquina (para la PDP-ll) son 24576..57344,28672 y 29184. El programador en lenguaje ensamblador sólo tiene que recordar los nombres simbólicos... ADD, SUB, MUL, DIV, ya que el ensamblador los traduce a las instrucciones máquina. Por el contrario, el programador en lenguaje máquina debe recordar, o consultar constantemente, los valores numéricos.

Los mismos comentarios se aplican a las direcciones. El programador en lenguaje ensamblador puede dar nombres simbólicos a las posiciones de memoria y dejarle al ensamblador la tarea de suministrar los valores numéricos correctos. El programador en lenguaje máquina debe trabajar siempre con los valores numéricos de las direcciones. En consecuencia, nadie programa hoy día en lenguaje máquina, aunque se hacía hace años, antes de que se inventaran los ensambladores.

Los lenguajes ensambladores tienen otra propiedad, además de la Correspondencia uno a uno entre las sentencias en ensamblador y las instrucciones máquina, que los distinguen de los lenguajes de alto nivel. El programador en ensamblador tiene acceso a todos los recursos e instrucciones de la máquina ala que se aplica, pero no el programador en un lenguaje de alto nivel. Por ejemplo, si la máquina tiene un indicador de desbordamiento, el programa en lenguaje ensamblador puede examinarlo; uno en Pascal no puede hacerlo directamente. Si hay conmutadores en la consola del operador, un programa en ensamblador puede leer su estado. Tal programa puede ejecutar todo el juego de instrucciones de la máquina sobre la que se aplica, pero uno en lenguaje de alto nivel no puede hacerlo. En resumen, todo lo que puede hacerse en lenguaje máquina puede hacerse también en ensamblador, pero muchas instrucciones, registros y otras cosas por el estilo no están disponibles para que el programador en lenguaje de alto nivel las use. Los lenguajes para la programación de sistemas suelen ser un híbrido entre ambos tipos, con la sintaxis de un lenguaje de alto nivel pero con las posibilidades de acceso a la máquina de un lenguaje ensamblador.

Es conveniente hacer explícita una diferencia final, la cual consiste en que un programa en lenguaje ensamblador sólo puede correr en una familia de máquinas, mientras que un programa escrito en un lenguaje de alto nivel puede, en potencia, correr en muchas máquinas. La habilidad de poder mover software de una maquina a otra, resulta de gran importancia práctica para muchas aplicaciones.

Formato de una sentencia en lenguaje ensamblador

Aunque la estructura de una sentencia de un lenguaje ensamblador refleja muy de cerca la estructura de la instrucción de máquina que representa, los lenguajes ensambladores para máquinas y niveles diferentes se parecen lo suficiente como para

215

Page 217: Manual Datos i 2003[1]

permitir una explicación detallada del lenguaje ensamblador en general. En la figura 7-1 se presentan fragmentos de programas en lenguaje ensamblador para el 80386 y el 68030, los cuales realizan el cálculo N = I + J + K. En ambos casos la cuenta lo realizan las instrucciones colocadas arriba de los puntos. Las sentencias que están por debajo de los puntos no son representaciones simbólicas de instrucciones de máquina, sino órdenes al ensamblador para que reserve memoria para las variables I, J, K y N. Las sentencias que son Órdenes al ensamblador se llaman seudo-instrucciones.

Campo etiqueta Campo operación Campo operando Campo de comentario

FORMULL: MOV EAX, I ;Guarda I en EAXADD EAX, J ;Suma J a EAXADD EAX, K ;Suma K a EAXMOV N, EAX ;Almacena I + J + K en N...

I: DD 2 ;Reserva 4 byte V inicial 2J: DD 3 ;Reserva 4 byte V inicial 3K: DD 4 ;Reserva 4 byte V inicial 4L: DD 0 ;Reserva 4 byte V inicial 0

(a)

FORMUL: MOVE.L I,DO ;Carga I en DOADD.L J,DO ;Suma J a DOADD.L K,DO ;Suma K a DOMOVE.L DO, N ;Almacena I + J + K en N...

I: DC.L 2 ;Reserva 4 byte V inicial 2J: DC.L 3 ;Reserva 4 byte V inicial 3K: DC.L 4 ;Reserva 4 byte V inicial 4L: DC.L 0 ;Reserva 4 byte V inicial 0

(b)Fig. 7-1. Cálculo de la fórmula N = I + J + K. (a) En un 80386. (b) En un 68030.

Las instrucciones en ensamblador tienen cuatro partes: campo de etiqueta, campo de operación, campo de operandos y campo de comentarios. Las etiquetas, que sirven para dar nombres simbólicos a las direcciones, se necesitan en sentencias ejecutables para que se pueda saltar a ellas. También se requieren en las seudo instrucciones de asignación de memoria (v .g. , DC y DD) para permitir que los datos allí almacenados sean accesibles por medio de un nombre simbólico. Si una sentencia tiene una etiqueta, ésta comienza (por lo general) en la columna 1.

En la figura 7-1(a) se muestran cinco etiquetas: FORMUL, I, J, K y N, mis- mas que aparecen en la figura 7-1(b). Nótese que el lenguaje ensamblador de Motorola requiere que se pongan dos puntos después de cada etiqueta, mientras que en el de lntel no es necesario. Esta diferencia no tiene nada de particular, sólo que los diseñadores de cada ensamblador tuvieron gustos diferentes. Si hubieran trabajado para la otra compañía, el lenguaje ensamblador  de lntel habría usado los dos puntos y el de Motorola no.

El diseñador de cada ensamblador es libre de elegir cualquier convención que desee en esta área. No hay nada en la arquitectura subyacente que sugiera una u otra elección

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

216

Page 218: Manual Datos i 2003[1]

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.

Comparación entre el. lenguaje ensamblador y los lenguajes de alto nivel

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

217

Page 219: Manual Datos i 2003[1]

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

Ciertos estudios han mostrado que, en la mayoría de los programas, un porcentaje muy bajo del código total es el encargado de un gran porcentaje del tiempo de ejecución (Dardner y Heller, 1970) .Es corriente que el 1 % del programa se ocupe del 50 % del tiempo de ejecución y que el 10 % del programa lo sea del 90 % de dicho tiempo. Una situación corriente en un compilador es cuando la búsqueda en la tabla de símbolos se lleva más tiempo que todo el resto de la compilación.

Supongamos que se necesitan lO años-hombre para escribir cierto compilador grande en un lenguaje de alto nivel, y que dicho compilador necesita 100 segundos para compilar cierto programa de prueba. Escribir el compilador en ensamblador completamente requeriría de 50 a 100 años-hombre, debido ala baja productividad de los programadores en ensamblador. Sin embargo, el programa de prueba se compilaría en 33 segundos, ya que un programador inteligente puede mejorar a un buen compilador por un factor de 3. Esta situación se ilustra en la figura 7-2.

Años-hombre necesarios para producir el programa

Tiempo de ejecución del programa en segundos

Lenguaje ensamblador 50 33Lenguaje orientado a problemas

10 100

Método mixto antes de pulirParte critica 10%Resto 90%Total

19

10

9010

100Método mixto después de pulir

Parte critica 10%Resto 90%Total

69

15

301040

Fig. 7-2. comparación entre la programación en ensamblador y en lenguaje orientado a problemas, con ajuste y sin él.

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

218

Page 220: Manual Datos i 2003[1]

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.

219

Page 221: Manual Datos i 2003[1]

EL PROCESO DE ENSAMBLAJE

En las siguientes secciones describiremos brevemente cómo funciona un ensamblador. Aunque cada máquina tiene diferente lenguaje ensamblador, la similitud del proceso de ensamblaje en las diferentes máquinas nos permite describirlo en términos generales.

Ensambladores de dos pasadas

Debido a que un programa en ensamblador consta de una serie de sentencias de una línea, parece natural tener un ensamblador que lea una sentencia, la traduzca a lenguaje de máquina y escriba el código de máquina generado en un archivo y la porción del listado correspondiente, si la hay, en otro. El proceso se repetiría hasta que todo el programa se haya traducido. Por desgracia, este método no funciona.

Considérese la situación en la que la primera sentencia sea un salto a L. El ensamblador no puede ensamblar esta instrucción hasta que conozca la dirección de la sentencia L. La sentencia L puede estar cerca del fin del programa, lo que impide que el ensamblador encuentre la dirección sin leer primero casi todo el programa. Esta dificultad se llama referencia adelantada, porque el símbolo L se ha usado antes de que se haya definido; es decir, se ha hecho referencia aun símbolo cuya definición aparecerá más tarde.

220

Page 222: Manual Datos i 2003[1]

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

La función principal de la primera pasada es construir lo que se llama tabla de símbolos, donde se guardan los valores de todos los símbolos. Un símbolo es una etiqueta o un valor al que se le asigna un nombre simbólico por medio de una seudo-instrucción como

ESPACIO EQU 100

Al asignar un valor a un símbolo que está en el campo de etiqueta de una instrucción, el ensamblador debe conocer la dirección que tendrá dicha instrucción cuando se ejecute el programa. Para conocer la dirección en tiempo de ejecución de la instrucción que se ensambla, el ensamblador mantiene una variable durante el ensamblaje llamada contador de posiciones de instrucción o ILC. Esta variable se pone a O al comienzo de la primera pasada y se le añade la longitud de cada una de las instrucciones que se procesan, como se muestra en la figura 7-3. Este ejemplo es para el 80386; como la diferencia entre ambos no es muy importante, no es necesario dar el ejemplo para Motorola.

Campo etiqueta

Campo operació

n

Campo operando

s

Campo comentarios Longitud instrucció

n

ILC antes sentencia

.

.

.SUSANA: MOV EAX, I EAX = I 5 100

MOV EAX, J EBX = j 6 105MOV EAX, K ECX = K 6 111IMUL EAX, EAX EAX = I * I 2 117IMUL EBX, EBX EBX = J * J 3 119IMUL ECX, ECX ECX = K * K 3 122ADD EAX, EBX EAX = I * I + J * J 2 125ADD EAX, ECX EAX = I * I + J * J + K * K 2 127MOV N, EAX N = I * I + J * J + K * K 5 129JMP YA SALTAR A YA 5 134

221

Page 223: Manual Datos i 2003[1]

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.

Algunos ensambladores permiten que el programador escriba instrucciones con direccionamiento inmediato, aunque no exista ninguna instrucción correspondiente en la máquina real. Tales instrucciones con operando "seudoinmediato" se tratan como sigue. El ensamblador reserva memoria al final del programa para el operando inmediato y genera una instrucción que hace referencia a ella. Por ejemplo, la IBM 370 no tiene instrucciones inmediatas; sin embargo, los programadores pueden escribir:

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.

Símbolo Valor Otra información

SUSANA: 100MARIA: 111MARISA: 125CARMEN: 129

.

.

.

.

.

.

.

.

.Fig. 7-4. Tabla de símbolos para el programa de la figura 7-3.

La tabla de los códigos de operación contiene un elemento por cada código de operación simbólico (nemotécnico) del lenguaje ensamblador. La figura 7-5 muestra parte de una tabla de códigos de operación. Cada elemento contiene el código de operación simbólico, su valor numérico, su longitud y un número de clase que divide los códigos de operación en grupos, conforme al número y tipo de operandos.

Código de operación

Primer operand

o

Segundo operando

Código de operación hexadecimal

Longitud de la instrucción

Clase de instruccione

sAAA -- -- 37 1 6ADD EAX IMMED32 05 5 4ADD REG REG 01 2 19

222

Page 224: Manual Datos i 2003[1]

AND EAX IMMED32 25 5 4AND 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.

223

Page 225: Manual Datos i 2003[1]

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

224

Page 226: Manual Datos i 2003[1]

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

La función de la segunda pasada es generar el programa objeto y, posiblemente, imprimir el listado del ensamblaje. Además, debe producir cierta información necesaria para que el programa ligador enlace procedimientos ensamblados en momentos diferentes. La figura 7-7 muestra un procedimiento para efectuar la segunda pasada.

El procedimiento correspondiente a cada clase de instrucción sabe cuántos operandos puede tener esa clase y llama al procedimiento EvalúaExpresión ( que no se muestra) el número de veces apropiado. El procedimiento EvalúaExpresión ha de convertir la expresión simbólica en un número binario. Encontrará primero los valores de los símbolos y las direcciones de los literales en las tablas respectivas. Una vez que se conocen los valores numéricos, se evalúa la expresión. Hay muchas técnicas con las que se evalúan expresiones aritméticas. Un método (descrito en el capítulo 5) consiste en convertir la expresión en notación polaca inversa y evaluarla mediante una pila.

Una vez que se conoce el valor numérico del código de operación y los valores de los

225

Page 227: Manual Datos i 2003[1]

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

Durante la primera pasada del proceso de ensamblaje, el ensamblador acumula información sobre los símbolos y sus valores en la tabla de símbolos para que la segunda pasada los busque. Hay varias formas de organizar la tabla de símbolos: veremos algunas de ellas en esta sección. Todos los métodos intentan simular una memoria asociativa que, desde el punto de vista conceptual, es un conjunto de pares (símbolo, valor). Dado un símbolo, la memoria asociativa debe producir el valor .

El método más sencillo de realización ( secuencial ) es organizar la tabla como un vector de pares, el primer elemento de los cuales es el símbolo (o apunta a él) y el segundo el valor (o un apuntador a él). Dado un símbolo que buscar, la rutina de la tabla de símbolos simplemente busca en forma lineal en la tabla hasta que lo encuentra. Este método es fácil de programar, pero es lento, ya que en promedio se ha de recorrer la mitad de la tabla.

Otro método de organizar la tabla de símbolos consiste en ordenar los símbolos y usar un algoritmo de búsqueda binaria para encontrarlos. El algoritmo funciona comparando el elemento central de la tabla con el símbolo. Si éste se localiza en orden alfabético por delante de aquél, hay que proseguir la búsqueda en la primera mitad de la tabla, y si está después en la segunda mitad. Si es igual, la búsqueda termina.

Suponiendo que el elemento central de la tabla no es igual al símbolo buscado, al menos sabemos en qué mitad seguir buscando. Ahora se puede aplicar la búsqueda binaria a la mitad apropiada, con lo que se obtendrá la coincidencia o el cuarto de tabla donde seguir buscando. Al aplicar este algoritmo recursivamente, la búsqueda en una tabla de n elementos requerirá unos log2 n intentos. Evidentemente, este método es mucho más rápido que la búsqueda lineal, pero requiere ordenar primero la tabla.

Un método totalmente diferente de simular una memoria asociativa es la técnica denominada codificación por transformación. Este método requiere una función de transformación que haga corresponder a cada símbolo un número entre 0 y k -1. Una de las funciones posibles será hacer el 0 EXCLUSIVO de todos los códigos ASCII de los caracteres (o de palabras que contengan grupos de caracteres) y luego tomar el resto al dividir este resultado intermedio entre k. De hecho, valdrá casi cualquier función de la entrada que dé 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

226

Page 228: Manual Datos i 2003[1]

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.

227

Page 229: Manual Datos i 2003[1]

MACROS

Los programadores de lenguaje ensamblador necesitan repetir frecuentemente grupos de instrucciones dentro de un programa. La forma más sencilla de resolver el problema es escribirlas sin más, pero la verdades que, si el número de sentencias es muy elevado o la secuencia aparece muchas veces en el programa, el procedimiento puede resultar bastante tedioso.

Una alternativa es convertir la secuencia en un procedimiento y llamarlo cada vez que se necesite. Esta estrategia tiene el inconveniente de que requiere una instrucción de llamada y otra de retorno cada vez que se ejecute esta secuencia. Si las secuencias son cortas (por ejemplo, dos instrucciones) pero se usan con bastante frecuencia, la llamada a procedimiento puede disminuir. significativamente la velocidad de ejecución del programa. Las macros proporcionan una solución sencilla y eficiente al problema que plantean las secuencias idénticas o casi idénticas de instrucciones que se usan repetidamente en un programa.

Definición, llamada y expansión de una macro

La definición de macro es un método que permite asignar un nombre a una porción de texto. Después de haber definido una macro, el programador puede escribir el nombre de la macro en vez del trozo del programa. Una macro es, realmente, una abreviatura de un trozo de texto. La figura 7-9(a) muestra un programa en lenguaje ensamblador de la 80386 que intercambia el contenido de las variables P y Q dos veces. Estas secuencias se definen como macros, como se observa en la figura 7-9(b). Después de su definición, cada vez que aparezca CAMBIA, será remplazada por las cuatro líneas siguientes:

MOV EAX,PMOV EBX,PMOV Q,EAXMOV P,EBX

El programador ha definido la macro CAMBIA como abreviatura de las cuatro sentencias anteriores.

MOV EAX, P SWAP MACROMOV EBX, Q EAX, PMOV Q, EAX EBX, QMOV P, EBX Q, EAX...

P, EBX..

MOV EAX, P SWAPMOV EBX, Q .MOV Q, EAX .MOV P, EBX SWAP

(a) (b)

Fig. 7-9. Código en lenguaje ensamblador del Intel 80386 para intercambiar P y Q dos veces. (a) Sin usar macro. (b) Usando una macro.

Aunque los distintos ensambladores usan notaciones ligeramente diferentes para definir macros, todos requieren las mismas partes básicas:

1. Un encabezado de macro que proporciona el nombre de la macro que va a definirse.

2. El texto que forma el cuerpo de la macro. 3. Una seudo instrucción que marque el fin de la definición (por ejemplo, ENDM).

Cuando un ensamblador encuentra una definición de macro, la aísla en una tabla de 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,

228

Page 230: Manual Datos i 2003[1]

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.

Item Llamado a macro

Llamada a procedimiento

Momento en el que se haceDurante el ensamblaje

Durante la ejecución del

programa objetoEl cuerpo se inserta en el programa objeto en todos los sitios donde aparece el nombre

Sí No

Es una instrucción de llamada a procedimiento insertada en el programa objeto

No Sí

Debe usarse una instrucción retorno para devolver el control a la sentencia que sigue a la llamada

No Sí

Número de copias del cuerpo que aparecen en el programa objeto

Una por cada llamada a la

macro1

Fig. 7-10. Comparación entre llamadas a macro y a procedimientos.

Aunque las macros generalmente se expanden en la primera pasada del proceso de ensamblaje, puede ser más simple desde el punto de vista conceptual pensar en un ensamblador con una pasada anterior a la primera, durante la cual se salvan las definiciones de macro y se expanden las llamadas. Desde este punto de vista, el programa fuente se lee y se transforma en otro programa en el que todas las definiciones de macro se han eliminado y en el que todas las llamadas se han sustituido por sus cuerpos. La salida resultante, un programa en lenguaje ensamblador que no contiene macros, se introduce en el ensamblador.

Recuérdese que un programa es una cadena de caracteres, que incluye letras, dígitos, espacios, signos de puntuación y "retornos de carro" (cambio a una línea nueva). El desarrollo de una macro no es ni más ni menos que la sustitución de ciertas subcadenas de esa cadena de caracteres por otra cadena diferente. Las macros no son más que un método que permite manipular cadenas .de caracteres, sin preocuparse de su significado.

229

Page 231: Manual Datos i 2003[1]

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

En la llamada  macro P es el primer parámetro actual y Q el segundo, de ahí que los programas ejecutables que producen las dos secuencias de la figura 7-11 son idénticos.

MOV EAX, P CHANGE MACRO P1, P2

MOV EBX, Q MOV EAX, P1MOV Q, EAX MOV EBX, P2MOV P, EBX MOV P2, EAX...

MOV P1, EBX..

MOV EAX, R CHANGE P, QMOV EBX, S .MOV S, EAX .MOV R, EBX CHANGE P, Q

(a) (b)

Fig. 7-11. Secuencia casi idénticas de instrucciones. (a) Sin macro. (b) Con una macro

Implementación de macros en un ensamblador

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 punto y coma como "control de carro" y el ampersand como símbolo del parámetro formal.

230

Page 232: Manual Datos i 2003[1]

MOV EAX,&Pl; MOV EBX,&P2; MOV &P2,EAX; MOV &PI,EBX;

Dentro de la tabla de definiciones de macros, el cuerpo es simplemente una cadena de caracteres.

Durante la primera pasada del ensamblaje, se buscan los códigos de operación y se expanden las macros. Siempre que el ensamblador encuentra una definición, la almacena en la tabla. Cuando encuentra una llamada, cesa temporalmente de leer del dispositivo de entrada y, en cambio, empieza a leer el cuerpo, que había guardado previamente. Cada vez que se topa con un parámetro formal, lo remplaza por el real. El ensamblador reconoce fácilmente los parámetros formales por la presencia del carácter &.

MONTAJE (LINKING) Y CARGA

La mayor parte de los programas se componen de más de un procedimiento. Los compiladores y ensambladores suelen traducir un procedimiento a la vez y guardan en memoria secundaria el resultado de esta traducción. Antes de que pueda ejecutarse el programa, todos los procedimientos traducidos deben recuperarse y ligarse correctamente. Si no se dispone de memoria virtual, el programa enlazado debe cargarse explícitamente en memoria. Los programas que realizan estas funciones reciben varios nombres, como cargador (Ioader), montador o ligador (linker), cargador montado (linking loader) y editor de enlaces (linkage edítor). La traducción completa de un programa fuente se efectúa en dos pasos, como se ve en la figura 7-12:

1. Compilación o ensamblaje de los procedimientos fuente. 2. Encadenamiento (linking) o montaje de los módulos objeto.

El primer paso lo realiza el compilador 0 el ensamblador y el segundo el montador (linker). La traducción de un procedimiento fuente aun módulo objeto representa un cambio de nivel, ya que el lenguaje fuente y el objeto tienen diferentes instrucciones y notación. El proceso de ensamblado, sin embargo, no representa en realidad un cambio de nivel, ya que la entrada y el resultado del ensamblador son programas para la misma máquina. La función del ensamblador es recoger los procedimientos traducidos y unirlos de tal manera que funcionen como una unidad, a la cual se le llama generalmente módulo ejecutable. La función del cargador es cargar el módulo de carga absoluto en memoria principal. Estas funciones se combinan con bastante frecuencia.

Hay una buena razón por la que los compilado res y ensambladores traducen cada procedimiento fuente en forma independiente. Si un compilador leyera una serie de procedimientos fuente y produjera directamente un programa en lenguaje máquina de modo de dejarlo listo para su ejecución., el cambio de una sentencia en uno de los procedimientos requeriría traducir de nuevo todos los procedimientos fuente.

Si se usa el método de los módulos objeto separados de la figura 7-12, sólo será 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

231

Page 233: Manual Datos i 2003[1]

largo.

232

Page 234: Manual Datos i 2003[1]

Tareas realizadas por el programa ensamblador

Al comienzo de la primera pasada del proceso de ensamblaje, el contador de posiciones de instrucción es puesto a cero. Este paso es equivalente a suponer que el módulo objeto será situado en la dirección (virtual cero durante la ejecución. La figura 7-13 muestra cuatro módulos objeto. En este ejemplo, cada modulo empieza con una instrucción de salto a una instrucción de movimiento de datos dentro de él.

Para ejecutar el programa, el cargador (Ioader)sitúa los módulos objeto en memoria principal, como se ve en la figura 7-14(a). Por lo general, una pequeña porción de la memoria que comienza en la dirección cero se usa en vectores de interrupción, para comunicarse con el sistema operativo y otros propósitos, por lo que los programas deben empezar más arriba. En esta figura hemos elegido (arbitrariamente) empezar los programas en la dirección 100.

El programa de la figura 7-14(a), aunque cargado en la memoria principal, no está listo para ser ejecutado. Consideremos lo que ocurriría si la ejecución comenzase con la instrucción que está al principio del módulo A. El programa no saltaría a la instrucción MUEVE (MOVE), como sería menester, ya que esa instrucción está ahora en la posición 300. En la práctica, todas las referencias a memoria fallarían por la misma razón.

233

Page 235: Manual Datos i 2003[1]

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

234

Page 236: Manual Datos i 2003[1]

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:

Módulo Longitud Dirección de comienzoA 400 100B 600 500C 500 1100D 300 1600

La figura 7-14(b) muestra el aspecto del espacio de direcciones de la figura 7-14(a) de que el ensamblador haya realizado los pasos anteriores.

Estructura de un módulo objeto

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

Tabla de puntos de entrada

Tabla de referencias externas

Instrucciones de máquina y constantes

Lista de reubicación

Fin de módulo

Fig. 7-15. Estructura interna de un módulo objeto producida por un traductor.

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

235

Page 237: Manual Datos i 2003[1]

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.

Tiempo de ligadura y reubicación dinámica

En un sistema de tiempo compartido, un programa puede cargarse en memoria principal, ejecutarse durante un rato, volver a escribirse en memoria secundaria y luego leerse de nuevo en la memoria principal para seguir por donde iba. En un sistema grande con muchos programas, es muy difícil asegurar que un programa se lea de nuevo en las mismas posiciones de memoria todas las veces.

La figura 7-16 muestra lo que ocurrirá si un programa ya re ubicado, como el de la figura 7-14(b), se cargara en la dirección 400 en vez de hacerlo en la 100, donde el ensamblador lo puso originalmente. Todas las direcciones de memoria son incorrectas. Además, la información de reubicación ha sido descartada hace tiempo. Pero, aun cuando la información de reubicación estuviera disponible, seria demasiado grande el costo de tener que re ubicar todas las direcciones cada vez que el programa se vuelva a cargar.

236

Page 238: Manual Datos i 2003[1]

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.

237

Page 239: Manual Datos i 2003[1]

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

En el método de montaje analizado en la Sección 7.4.1, un programa debía .enlazarse antes de su ejecución con todos los procedimientos potencialmente

necesarios. En una computadora con memoria virtual, no se aprovechan a fon- do sus posibilidades si ha de realizar el proceso de enlace previamente a la ejecución. Muchos programas tienen procedimientos a los que no llaman, salvo en circunstancias excepcionales. Por ejemplo, los compiladores tienen procedimientos para traducir sentencias raramente usadas y para tratar condiciones de error que acontecen pocas veces.

Un método más flexible para el enlace de procedimientos compilados por separado consiste en enlazar cada procedimiento en el momento en que se le llama por primera vez. A este proceso se le conoce como enlace dinámico. El cual fue utilizado en primera instancia en el MULTICS y después en el OS/2. Como las dos implantaciones son en cierto modo diferentes, se expondrán ambas.

En el MUL TICS existe un segmento asociado a cada programa denominado segmento

238

Page 240: Manual Datos i 2003[1]

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

Cuando se llame a un procedimiento situado en un segmento diferente, el intento de direccionar con la palabra inválida causará un desvío al enlace dinámico. Este buscará en el directorio de archivos del usuario un procedimiento compilado que tenga el mismo nombre que el situado detrás de la palabra con la dirección inválida. Luego le asignará una dirección virtual, normalmente en un segmento  para él solo, y cambiará la dirección inválida por la dirección virtual recién .asignada, como se indica en la figura 7-17(b). En seguida se 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

239

Page 241: Manual Datos i 2003[1]

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.

240

Page 242: Manual Datos i 2003[1]

CONCLUSIÓN

241

Page 243: Manual Datos i 2003[1]

BOLILLA VI (Parte 1):

PERIFÉRICOS

242

Page 244: Manual Datos i 2003[1]

INDICE

BOLILLA VI (Parte 1): PERIFÉRICOS__________________________________________241

INDICE__________________________________________________________________242

INTRODUCCIÓN_________________________________________________________244

PERIFÉRICOS____________________________________________________________245RESEÑA HISTÓRICA____________________________________________________245INTRODUCCIóN_________________________________________________________245PERlFERICOS DE ENTRADA:_____________________________________________246

TECLADO:___________________________________________________________246Cuidados y advertencias________________________________________________247

MOUSE (RATON)______________________________________________________248Tipos de ratones______________________________________________________249

Ratones Inalámbricos._______________________________________________249Ratones Estacionarios._______________________________________________249

PANTALLAS TÁCTILES:_______________________________________________249BOLAS GIRATORIAS:__________________________________________________249ESCANER____________________________________________________________249

Profundidad de color__________________________________________________249Tipos de escáner:_____________________________________________________250

Escáner de mano:___________________________________________________250Ventaja:_________________________________________________________250Desventajas:_____________________________________________________250

Escáner de Sobremesa:_______________________________________________250Ventajas:________________________________________________________250Desventajas:_____________________________________________________250

Escáner de Rodillo:__________________________________________________250Calibración__________________________________________________________250LECTORES DE CODIGO DE BARRA___________________________________250

TABLETA DIGITALIZADORA___________________________________________251LECTORES DE TARJETAS MAGNETICAS________________________________251LAPIZ OPTICO:_______________________________________________________251PERIFERICOS DE ALMACENAMIENTO:_________________________________252

Discos______________________________________________________________252Discos flexibles_______________________________________________________252

Fiabilidad del soporte._______________________________________________253Facilidad de manejo y almacenamiento.__________________________________253

1. Disco flexible de 5 1/4 pulgadas____________________________________2532. Disco flexible de 3 1/2pulgadas____________________________________253

Disco duro___________________________________________________________253Discos opticos:_______________________________________________________254Cintas magneticas:____________________________________________________255DVD:______________________________________________________________255

Prestaciones del DVD:_______________________________________________256El disco por dentro:__________________________________________________256La compresión MPEG-2:_____________________________________________256

243

Page 245: Manual Datos i 2003[1]

El futuro del DVD:__________________________________________________256PERIFERICOS DE SALIDA:_______________________________________________257

PANTALLAS DE SISTEMAINFORMATICO (Monitor):_______________________257Impresoras____________________________________________________________258

Impresoras con cinta entintada:__________________________________________258Impresora de Bola:__________________________________________________258Impresoras de agujas:________________________________________________259

Impresoras sin cinta entintadas:__________________________________________259Impresoras térmicas:_________________________________________________259Impresoras de inyección de tinta:_______________________________________259Impresoras láser:____________________________________________________259Impresoras Láser de color:____________________________________________259

PERIFERICOS DE COMUNICACION..______________________________________259MODEM______________________________________________________________260

Aspectos técnicos_____________________________________________________260Como usar la Tecnología 56K_________________________________________260

CONCLUSIóN___________________________________________________________261

244

Page 246: Manual Datos i 2003[1]

INTRODUCCIÓN

245

Page 247: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

PERIFÉRICOSRESEÑ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.

La conexión de los periféricos con la computadora se puede realizar de dos formas diferentes:

246

Page 248: Manual Datos i 2003[1]

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.

Existen varios tipos de periféricos: Periféricos de entrada. Periféricos de almacenamiento de la información. Periféricos de salida. Periféricos de comunicación.

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.

Están disponibles tres teclados Macintosh: El apple estándar El apple extendido. El apple ajustable (puede separarse en dos secciones ajustables

a 30° grados) El teclado se divide físicamente en tres bloque de teclas y un grupo de teclas

especiales: 1° “Teclas alfanuméricas” Este grupo de teclas es similar al teclado de una maquilla de escribir estándar: las

teclas del alfabeto, signos de acentuación y puntuación los diez decimales y símbolos especiales.

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

247

Page 249: Manual Datos i 2003[1]

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.

Existen varias tecnologías para la construcción de teclados de computadora, entre los que se destacan:

Teclados Mecánicos Teclados Electrónicos

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 advertenciasSi 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 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

248

Page 250: Manual Datos i 2003[1]

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.

249

Page 251: Manual Datos i 2003[1]

Tipos de ratonesRatones 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 colorEl parámetro expresado en bits, indica el número de tonalidades de color que un píxel

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 .

250

Page 252: Manual Datos i 2003[1]

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ónEstos 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-

LECTORES DE CODIGO DE BARRAUno de los medios más modernos y que está tomando cada vez más auge, de

introducir información en una computadora es por medio de una codificación de barras 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

251

Page 253: Manual Datos i 2003[1]

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

LECTORES DE TARJETAS MAGNETICAS

Los lectores de tarjetas magnéticas leen la información impresa en una banda magnética de manera semejante a como la grabadora lee la música de la cinta.

Tras leer la información de la banda magnética de forma similar a como lee la información la cabeza lectora de un disco duro, el lector de tarjetas envía los datos n forma de bit a la unidad central del sistema de la computadora para su tratamiento.

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

252

Page 254: Manual Datos i 2003[1]

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.

Es evidente la reducción de tiempo que presenta el acceso aleatorio frente al secuencial, pero la utilización de la tecnología de acceso secuencial se debió ala implementación de la cinta magnética, anterior a la puesta en marcha operativa del primer periférico de acceso aleatorio .

En la actualidad, las cintas magnéticas tradicionales se están relegando poco a poco a simples soportes de almacenamiento de datos históricos del sistema informático o de procesos periódicos de copias de seguridad.

DiscosLos 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 flexiblesSon 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 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:

Fiabilidad del soporte. Los discos flexibles con formato de 31 12 pulgadas están mucho mejor protegidos por

un plástico rígido y un escudo, plástico o metálico, que protege una ranura existente en la superficie del material protector del disco (la ventana de lectura) que los discos de 5 1 14

253

Page 255: Manual Datos i 2003[1]

pulgadas, envueltos en un plástico de mucho menos grosor y sin protección en la ventana de lectura

Facilidad de manejo y almacenamiento. La mejor protección de los discos que tienen formato de 31/2 pulgadas, su facilidad

para el manejo habitual y las menores restricciones para su almacenamiento, mientras no sea utilizado el soporte físico, le dan importantes ventajas sobre los discos de 5 114 pulgadas.

El material sobre el que se construyen los disquetes flexibles es un plástico, mientras que, en los discos duros, el soporte físico es una base de aluminio.

La lectura de la información grabada en los discos flexibles se realiza mediante una cabeza lectora que entra en contacto directo con la superficie del disco a través de la ranura de la funda de protección.

1. Disco flexible de 5 1/4 pulgadas Los disquetes de 5 1/4 pulgadas se protegen mediante una cubierta de plástico cuyo

interior es antiestático y autolimpiante. Poseen un agujero central que le sirve para encajar en el mecanismo de rotación, un

pequeño agujero de control que sirve para detectar el comienzo de cada pista y una abertura en la cubierta de plástico que le permite ala cabeza lectora el acceso a los discos. 2. Disco flexible de 3 1/2pulgadas

Poseen una cubierta de plástico mucho más rígida que la de los de 5 1/4, ello aumenta en gran medida la seguridad de los datos que contienen.

El mecanismo de rotación se engancha a dos muescas situadas en la parte inferior de un eje de rotación metálico, que es la única parte del disco que sobre sale del exterior .

En la actualidad se están desarrollando otros formatos de discos flexibles más pequeños que los existentes, que oscilan entre una o dos pulgadas, aunque todavía no se estén comercializando.

Disco duroEl 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:

Pistas: Se denomina pistas a cada una de la circunferencia de placa del disco. Las pistas se dividen en pequeños espacios de similar 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 .

254

Page 256: Manual Datos i 2003[1]

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.

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

255

Page 257: Manual Datos i 2003[1]

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

Prestaciones del DVD: El disco "básico" de DVD consta de una sola cara y una sola capa (equivalente a 4,7

Gb de datos), lo que ya de por si le permite almacenar 133 minutos de vídeo de alta calidad, tres pistas de sonido Dolby Digital y cuatro conjuntos de subtítulos para otros tantos idiomas. Si además se hace uso de las dos caras y las dos capas se llega ya alas 8 horas de vídeo, 8 idiomas simultáneos y 32 subtítulos diferentes.

Al ser un soporte óptico las películas no se deterioran con el uso, y uno siempre obtiene la máxima calidad en pantalla. Incluso mantiene la compatibilidad con los CD de

256

Page 258: Manual Datos i 2003[1]

audio, que podrán escucharse sin problemas en cualquier reproductor . Debido a la gran capacidad de almacenamiento permitirá su uso como backup o

copias de seguridad.

El disco por dentro: Dado que en un CD-ROM podían almacenarse 680 Mb y el DVD llega a almacenar 17

Gb ha hecho falta almacenar la información de forma diferente para dar cabida a tanta cantidad de datos.

Lo primero que se ha hecho ha sido reducir y compactar el tramado de pits o puntos que se asientan sobre la superficie del disco; en el DVD el tamaño de estos puntos se ha visto sustancialmente reducido, así como la distancia existente entre estos dando lugar a una mayor densidad de grabación en un mismo espacio. Para leer estos micro-puntos hace falta un láser de menor grosor que el convencional se pasa de unos 780 mm de longitud de onda del CD-ROM a los de 635 a 650 mm del DVD.

Para mejorar el enfoque y la calibración se ha sustituido el haz infrarrojo por un haz rojo. Al reducir el grosor de la capa de grabación a la mitad se ha permitido dotar a un mismo disco de dos caras y se ha dividido cada cara en dos capas diferentes.

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.

El futuro del DVD: El DVD va a permitir la escritura de discos por medio de unos grabadores llamados

DVD-R. La utilidad de estos discos en el campo de la informática es evidente, pero no lo es

tanto en el campo del vídeo domestico: un usuario solo opondría grabar una sola vez en cada disco, y dado que su especificación solo permite una capacidad de 2,6 Gb la duración se ve limitada a solo una hora de vídeo.

y es aquí donde entra en escena el DVD-RAM sobre los diferentes metales en los discos se puede sobre escribir cerca de 1000 veces.

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.

PANTALLAS DE SISTEMAINFORMATICO (Monitor): Es el periférico más utilizado en la actualidad para obtener la salida de las operaciones

realizadas por la computadora. Las pantallas de los monitores muestran una imagen del resultado de la información procesada por la computadora.

El tamaño de la pantalla de computadora más habituales entre los actuales sistemas microinformáticos suelen ser el de 14 pulgadas, si bien existen tamaños de pantallas diferentes para sistemas informáticos especializados, por ejemplo 21 pulgadas para sistemas informáticos de autoedición. Los sistemas informáticos portátiles suelen tener tamaño de entre 9 y 14 pulgadas.

La imagen formada en la pantalla de la computadora tiene una unidad elemental llamada pixel. Los pixels del monitor forman una matriz de puntos de luz que dibujan la

257

Page 259: Manual Datos i 2003[1]

imagen de cada uno de los caracteres que aparecen en la pantalla de la computadora. Los colores que pueden aparecer en la pantalla de un sistema informático están

determinados por la paleta de colores. Las paletas oscilan entre los cuatro colores básicos de la CGA y 256.000 colores de la SVGA.

Las pantallas de las computadoras pueden tener varios formatos entre los que se pueden destacar:

1. Pantallas de computadoras de rayos catódicos:Este tipo de pantallas de computadora son similares a las pantallas del televisor, pero se diferencian de manera importante en su modo de funcionamiento. Las pantallas de computadora de rayos catódicos son el tipo de tecnología de pantalla de sistemas informáticos más extendidos en la actualidad entre las computadoras comerciales. Las pantallas de computadora de rayos catódicos pueden ser monocromas ( de un solo color, normalmente verde, blanco o ámbar) o policromas. En estos momentos casi todos los sistemas informáticos comerciales se configuran con pantallas de color .

2. Pantallas de computadora de cristal líquido: Las pantallas de computadora de cristal líquido se utilizaron en algunos sistemas informáticos portátiles por su mayor manejabilidad y menor tamaño que las pantallas de rayos catódicos. El mayor inconveniente de este tipo de pantallas de computadora era que debían ser monocromas porque no podían manejar color. En la actualidad se puede ver sobre todo en algunos tipos de calculadoras.

3. Pantallas de computadora de plasma: Son el tipo de pantallas que se están imponiendo actualmente en los sistemas informáticos portátiles, puesto que tiene las misma ventajas que las anteriores, alcanzando una mayor definición y la posibilidad del color.El tamaño lógico de las pantallas de los sistemas informáticos se determinan de forma distintas en dos diferentes modos de trabajo vistos anteriormente en el apartado de las tarjetas gráficas: Modo de texto: Las pantallas del sistema informático sólo pueden mostrar los 128 caracteres definidos por el código ASCII, aunque algunas pantallas de computadora pueden mostrar hasta 256 caracteres por el modo extendido de dicho código. El tamaño lógico de la pantalla de los sistemas informáticos se mide por el número de filas y el de columnas de caracteres que pueden representar en la pantalla de la computadora. El tamaño más expendido es el de 24 o 25 líneas y 80 columnas. 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.

ImpresorasSu 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

258

Page 260: Manual Datos i 2003[1]

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.

Impresoras con cinta entintada: La principal característica de las impresoras de cintas entintadas es un método de

impresión: Una cinta humedecida con tinta que golpea contra el papel por un tipo metálico o un grupo de agujas formando un carácter .

Este tipo de impresora son una evolución tecnológica de los antiguos modelos de máquinas de escribir donde se han mejorado las prestaciones de velocidad y de forma de impresión.

Sus principales ventajas son el bajo costo y la facilidad de construcción, y sus principales inconvenientes son su lentitud y el ruido que causa al golear sobre la cinta para conseguir la impresión.

Es un tipo de impresora antiguo que ha sido retirada de algunos lugares por su lentitud.

Su mecanismo se compone de una rueda alrededor de la cual están colocados los caracteres alfanuméricos que se pueden imprimir .

La impresión se hace cuando una cápsula que tiene un relieve del tipo a imprimir se encuentra enfrentada al papel. Un pequeño punzón golpea contra la cápsula y así al martillar el tipo se imprime el carácter deseado.

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.

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 sin cinta entintadas: Se caracterizan por la tecnología de su método de impresión al no necesitar una cinta

humedecida en tinta para imprimir. Al no producir un impacto para realizar la impresión del carácter, estas impresoras son

mucho más silenciosas. Permiten su uso en lugares de trabajos sin equipos especiales de protección acústicas.

La disminución de los preciso de este tipo de impresoras han determinado su amplia difusión en el mercado.

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

259

Page 261: Manual Datos i 2003[1]

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 de inyección de tinta: Las impresoras de inyección de tinta, también llamada chorro de tinta, utilizan una

especie de cañón a través del cual se envía un chorro de tinta líquida hacia la hoja de papel donde se va a realizado se va a realizar la impresión. Para poder controlar la inyección de la tinta están situadas a cada lado de la boca del cañón de tinta unas placas magnéticas que controlan el chorro de tinta disparado por el cañón hacia el papel para formar el carácter .

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.

Impresoras Láser de color: El funcionamiento de las impresoras láser de color es similar alas impresoras láser en

blanco y negro, pero en lugar de utilizar un solo dispositivo de tinta utiliza tres dispositivos con los colores fundamentales que se imprimen con una mayor o menor saturación sobre el papel para formar el color deseado en ese punto. La velocidad de impresión es algo más lenta que en las impresoras láser de tinta negra, debido a que aquí se deben gestionar tres colores de tinta diferentes.

PERIFERICOS DE COMUNICACION..

MODEMLos 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écnicosLa 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.

260

Page 262: Manual Datos i 2003[1]

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.

Como usar la Tecnología 56K

Para aprovechar todas las ventajas de la tecnología 56 K se necesitan tres cosas: 1) Un módem 56 K

2) Un Proveedor de Servicios de Internet que soporte 56K 3) Una línea telefónica que soporte 56K

Conseguir el módem es muy fácil. En el mercado hay muchos dispositivos de este tipo y cada día aparecen nuevos modelos. En cuanto al segundo punto, muchos ISP ya soportan algunos de los protocolos 56K o planean hacerlo en un futuro cercano.

El tercer requisito, es quizás el más problemático de todos. Para alcanzar la velocidad 56K, solo debe hacer un proceso de conversión analógico / digital entre el ordenador y el ISP. Si hay más de uno, no se podrán utilizar los 56 K y la velocidad de conexión estará limitada a 28.8 o 33.6K.

Para averiguar si nuestra línea telefónica soporta la velocidad de 56K, la única prueba totalmente fiable es conseguir un módem 56K y llamar a nuestro ISP . Cuando se compra un módem hay que asegurarse de que este pueda ser actualizado (preferiblemente mediante un programa software gratuito) para hacerlo compatible con el estándar 56K definitivo. Además, estas actualizaciones permiten mejorar el rendimiento y eliminar errores 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ÓNAl 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

Page 263: Manual Datos i 2003[1]

CONCLUSIÓN

262

Page 264: Manual Datos i 2003[1]

BOLILLA VI (PARTE 2):

TÉCNICAS Y

DISPOSITIVOS DE

ENTRADA SALIDA

263

Page 265: Manual Datos i 2003[1]

INDICE

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)__________266Dispositivos de fichas y de banda perforada____________________________________266Dispositivos de soporte magnético____________________________________________270Impresoras______________________________________________________________270Plotter__________________________________________________________________277La pantalla______________________________________________________________278Terminales______________________________________________________________279Procesos de comunicación para la transmisión de datos a distancia__________________281Otros periféricos__________________________________________________________281Técnicas de entrada/salida (input/output)_______________________________________282

Polling (interrogatorio de tráfico)___________________________________________283Interrupciones (interrupts)________________________________________________285Transferencia DMA_____________________________________________________286

GLOSARIO_____________________________________________________________287

CONCLUSIÓN____________________________________________________________289

264

Page 266: Manual Datos i 2003[1]

INTRODUCCIÓN

265

Page 267: Manual Datos i 2003[1]

APUNTES DE CATEDRA

CARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS – INGENIERIA EN SISTEMAS Cátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003

TECNICAS Y DISPOSITIVOS DE ENTRADA / SALIDA (Input / Ouput)

EL objetivo de este capítulo es explicar los dispositivos más comunes de entrada y salida de datos. Puesto que en el anterior, hablando de las memorias masivas, ya examinamos las principales características de los dispositivos de I/O (Input/Output = entrada/salida) en soporte magnético, no los trataremos en éste.

Aprenderemos las principales técnicas utilizadas en un sistema de ordenador para la gestión de periféricos de entrada/salida (I/O), refiriéndonos a un sistema de microprocesadores. Estas técnicas, en sustancia, son las mismas que las utilizadas en los sistemas de grandes y medianos ordenadores.

Por consiguiente, y para una mayor simplicidad, consideremos de ahora en adelante una configuración estándar para todos los periféricos, que prevea para cada uno de ellos, por lo menos, un registro de estado y un buffer de I/O. El primero, generalmente está constituido por un conjunto de bits que proporciona las informaciones esenciales sobre el estado del periférico (por ejemplo petición de disponibilidad de un dato, buffer ocupado, etc.).

El segundo es un registro de tránsito, de dimensiones variables, dependiendo del tipo de periférico, por el que pasan todos los datos de salida y de entrada.

Además, generalmente, para las operaciones de I/O, en la memoria del ordenador también existe un buffer de I/O (en general, de dimensiones distintas con respecto al del periférico en cuestión) que contiene los datos a transmitir.

DISPOSITIVOS DE FICHAS Y DE BANDA PERFORADA

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

266

Page 268: Manual Datos i 2003[1]

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.

Foto. Perforadora de fichas. (Foto cedida por Honeywell Bull)

267

Page 269: Manual Datos i 2003[1]

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 pequeños agujeros para su arrastre. Se trata, bien de lectoras, bien de perforadoras, o de

268

Page 270: Manual Datos i 2003[1]

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.

Fig. 1. Banda de papel perforada de 8 canales.

269

Page 271: Manual Datos i 2003[1]

DISPOSITIVOS DE SOPORTE MAGNÉTICO

De estos dispositivos ya hemos hablado en el capítulo anterior. Están constituidos por dispositivos de cintas magnéticas, por discos magnéticos rígidos

o flexibles y por tambores. Genéricamente se denominan dispositivos de memoria masiva, pero son en todo caso

dispositivos de entrada/salida (I/O).

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

Page 272: Manual Datos i 2003[1]

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

Page 273: Manual Datos i 2003[1]

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.

Fig. 4. Dispositivo de impresión de cilindro.

Otra clase de impresora del tipo paralelo de impacto es la de barras o de ruedas. En este caso, los caracteres están dispuestos, ya sea sobre barras metálicas que se levantan o se bajan dejando el carácter deseado disponible a la altura de la línea, o bien sobre ruedas giratorias. En la figura 5 se representa el esquema de un dispositivo de impresión de una impresora en serie con cabezal cilíndrico.

272

Page 274: Manual Datos i 2003[1]

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.

Las impresoras de margarita, figura 6, tienen los caracteres en relieve dispuestos en círculo y formando, como su nombre indica, una 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)

Fig. 6. Cabezal de margarita (Foto cedida por Olivetti)

273

Page 275: Manual Datos i 2003[1]

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.

Fig. 7. La margarita en funcionamiento.

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.

Fig. 8. Esquema del dispositivo de impresión en serie por punto.

274

Page 276: Manual Datos i 2003[1]

Fig. 9. Diferentes fases en la formación de la letra "A" con una impresora de aguja.

En la impresora de agujas de funcionamiento en paralelo, con una pulsación se señalan todos los puntos de todos los caracteres relativos a una línea de la matriz. Por lo tanto, se efectúan tantas pulsaciones como líneas tenga la matriz, y se alcanzan velocidades del orden de 2.000 líneas por minuto. Sin embargo, estas impresoras son muy caras.

Para grandes sistemas existen impresoras superrápidas. Citemos las impresoras de chorro de tinta (ink-jet), que pueden alcanzar velocidades de 40.000 líneas por minuto.

Esquemáticamente, su funcionamiento es el siguiente (ver figura 10 ). El cabezal de escritura, constituido por un depósito con un dosificador, se mueve uniformemente a lo largo de toda la hoja. En la posición en la que se tiene que escribir, dosifica la tinta, la cual, después de ser electrizada, gota a gota, será conducida a través de un campo eléctrico sobre el papel para formar el carácter deseado, al igual que sucedía con la impresora de matriz.

Fig. 10. Impresora de chorro de tinta.

La impresora láser consta de un cilindro recubierto de selenio (material aislante en la oscuridad y conductor a la luz), con rotación constante y uniforme, en cuya superficie incide un rayo láser; desviado por un espejo, a lo largo de todo el proceso de impresión (ver figura

275

Page 277: Manual Datos i 2003[1]

11).

Fig. 11. Impresora de rayo láser.

Sólo los puntos de selenio «iluminados» retienen electrostáticamente el polvo de tinta seca (toner) depositada en una determinada franja del cilindro. Después, por medio de compresión y calentamiento se imprime el carácter deseado sobre el papel como un conjunto de puntos. Alcanzan velocidades de 20.000 líneas por minuto.

Entre la gama de impresoras sin impacto y de bajo costo, citamos las impresoras térmicas. El elemento de impresión, ver figura 12, por puntos o por segmentos, imprime en caliente sobre papel especial el carácter deseado. No se consigue una buena nitidez de impresión. Son bastante silenciosas, aunque lentas.

Fig. 12. Impresora térmica de matriz de puntos.

Después de haber hablado de las principales clases de impresoras, volvamos a las consideraciones de carácter general.

Los datos que se tienen que imprimir, codificados según el dispositivo utilizado, deben ser almacenados en un buffer (de impresión), que normalmente tiene la capacidad suficiente para contener una línea.

Es evidente que, si disponemos de una impresora de carácter entero, sólo se puede obtener la impresión del conjunto (set) de caracteres disponibles en la máquina. Por el

276

Page 278: Manual Datos i 2003[1]

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

Fig. 13. Correspondencia entre puntos de impresión y el contenido de los 8 bytes.

PLOTTER

Toman el nombre de plotters aquellas unidades de impresión, no muy rápidas, que permiten dibujar gráficos (ver figura 14).

Fig. 14. Ejemplo de un plotter; arriba a la izquierda, detalle de plumas de 4 colores. (Foto cedida por Calcomp.)

En algunos, el papel, generalmente enrollado, puede desplazarse verticalmente en los dos sentidos, enrollándose o desenrollándose.

Por el contrario, el desplazamiento horizontal es tarea de la pluma (o plumas) de escritura, que puede escribir o elevarse para permitir el desplazamiento sin escribir. También existen plotters en los que la hoja de papel, situada horizontalmente, queda

277

Page 279: Manual Datos i 2003[1]

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

Fig. 15. Conjunto (set) de colores de un apantalla según los componentes de luminosidad: color y saturación. (Foto cedida por Tektronix.)

El número de caracteres que se pueden visualizar depende del tipo de ordenador.

Normalmente de 20 a 80 caracteres por línea y de 20 a 24 líneas. Dichos caracteres o pertenecen al conjunto (set) disponible o, en muchos casos, pueden ser diseñados por puntos por el mismo programador. Generalmente, la pantalla está dotada de posibilidad de giro de la visualización (scrolling); es decir, cuando la pantalla está llena, es posible continuar escribiendo eliminando las líneas superiores para dejar sitio a las nuevas. En algunos sistemas se consigue incluso obtener un giro de visualización (scrolling) hacia abajo, pudiendo de esta forma insertar nuevas líneas en la parte superior.

Generalmente, el área de pantalla está representada en la memoria, es decir, en ésta existe una zona denominada buffer, que consta de tantos bytes como caracteres pueden aparecer en la pantalla, resultando ser así una imagen de ella. Por ejemplo, en una pantalla de 24 líneas, de 80 caracteres cada una, disponemos de 1.920 bytes. En la pantalla de color también existen buffers dedicados a los códigos de colores de los diferentes puntos de la pantalla.

En otra zona dc memoria se conservan las imágenes de todo carácter visualizable (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

278

Page 280: Manual Datos i 2003[1]

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

Se llaman terminales aquellos dispositivos que permiten la comunicación directa (sin utilizar soportes intermedios) con el ordenador por medio de un teclado alfanumérico parecido al de una máquina de escribir (ver figura 16). Existen diferentes tipos de terminales; hablaremos de los terminales de pantalla y de los de escritura. La diferencia entre los dos grupos depende de la manera en la que se visualizan los datos introducidos por el teclado, por pantalla o sobre el papel.

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.

Podemos imaginar un teclado de n x m teclas como una matriz de n líneas por m columnas, en la que la pulsación de una tecla provoca un contacto en el cruce de una línea con una columna. Las líneas de la matriz son líneas de salida de la CPU y las columnas son 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.

279

Page 281: Manual Datos i 2003[1]

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.

Ejemplo de nuevas técnicas de pantalla, gráficas y tridimensionales.

280

Page 282: Manual Datos i 2003[1]

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

Mencionaremos, brevemente, otros tipos de periféricos. Para evitar que los datos pasen por soportes intermedios, como fichas o bandas

perforadas, se han desarrollado dispositivos de entrada basados en la lectura magnética u óptica. En este caso, los documentos originales sirven como entrada al ordenador y el dispositivo de lectura tiene que identificar directamente los símbolos utilizados por el hombre. En el sistema de lectura magnética (MICR = Magnetic lnk Character Recognition), los caracteres deben escribirse en forma estándar, utilizando tinta magnética, y deben situarse en posiciones del documento previamente determinadas. Por el contrario, en la lectura óptica ( OCR = Optical Character Recognition), el documento se escribe con tinta normal y la determinación del carácter sólo se basa en su forma.

El joystick (palanca direccional) es una palanca que puede desplazarse muy rápidamente hacia adelante, hacia atrás, a la derecha y a la izquierda, produciendo el correspondiente desplazamiento de un punto en la pantalla. Existen palancas direccionales (joysticks) con posiciones fijas y otras en las que el movimiento puede ser continuo. Son muy utilizadas en los videojuegos, así como los paddles, que están formados por un mando con un botón que permite el desplazamiento continuo del cursor.

El tablero digitalizador (tablero digital) permite escribir o dibujar con un bolígrafo especial, reproduciéndose el mismo dibujo en la pantalla (ver figura 17). El dibujo producido puede ser visualizado en la pantalla o memorizado en otro dispositivo.

281

Page 283: Manual Datos i 2003[1]

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.

TÉCNICAS DE ENTRADA/SALIDA (INPUT/OUTPUT)

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

Por el contrario, el controlador de pantalla tiene que encargarse de buscar en la tabla

282

Page 284: Manual Datos i 2003[1]

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.

Fig. 18. Las tres técnicas de I / O (Input / Output - Entrada / Salida.)

Polling (interrogatorio de tráfico)

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

Page 285: Manual Datos i 2003[1]

Fig. 19. Ciclo de polling (interrogatorio de tráfico).

El proceso de pregunta y respuesta entre el ordenador y el periférico toma el nombre de protocolo (handshaking). Generalmente, este término indica una clase de comunicación entre los dos dispositivos, en los que a la transferencia de datos se le añaden señales adecuadas denominadas handshake (permiso de tráfico), que comunican la petición de un dato por parte de un dispositivo, la disponibilidad del dato por parte del otro y finalmente su recepción por parte del primero.

Se trata de una comunicación real que representa ya sea una entrada, o una salida de datos para el ordenador. Si el dispositivo está listo para transmitir un dato, el ordenador, antes de leerlo del registro del periférico, tiene que cerciorarse de que esté actualizado, analizando un bit especial del registro de estado del periférico. Análogamente, si el ordenador transmite un dato al periférico tiene que verificar que esté listo para recibirlo, y más tarde controlar que haya recibido dicho dato antes de realizar cualquier otro proceso. Veamos las ventajas y desventajas de esta técnica. Comencemos por estas últimas. El ciclo de polling puede resultar lento, porque si un periférico solicita una tarea inmediatamente después de haber sido interrogado tiene que esperar a que sean interrogados y, eventualmente, se les asigne tareas a todos los demás periféricos, lo que provoca un retraso intolerable en aplicaciones delicadas.

Por otra parte, el polling es una técnica de comunicación software, ya que prácticamente no necesita hardware: de hecho, el proceso de recepción y transmisión se realiza bajo el control del programa.

284

Page 286: Manual Datos i 2003[1]

Interrupciones (interrupts)

Por el contrario, la técnica que aprovecha las interrupciones es mixta: software + hardware adicional, que permite una mayor velocidad para atender a las peticiones. Refiriéndonos al esquema de la figura 20, vemos que el periférico solicita servicios al ordenador por medio de una señal enviada en la línea de interrupciones.

Fig. 20. Técnica de interrupciones (interrups).

El ordenador reconoce la petición (2 en la figura), suspende el programa en ejecución, atiende al periférico (3 en la figura), y vuelve al programa que se había interrumpido.

Veamos más detalladamente cómo se realizan estas operaciones. Cuando la CPU recibe una interrupción, salva el estado actual del programa en ejecución, grabando en una determinada zona de memoria la información necesaria para poder continuar, atendida la interrupción, con la correcta ejecución del programa: dicha información es el contenido del CP (contador de programa), o sea, la dirección de la instrucción con la que se tiene que continuar la ejecución del programa y el contenido del registro de estado, si éste existe. Después de esta operación, que toma el nombre de «salva», se le asigna una determinada rutina al periférico que pidió la interrupción. Una vez concluida la ejecución de la rutina de servicio, el control vuelve al programa interrumpido. Previamente se realiza una operación para restablecer las condiciones que se grabaron en memoria en el momento de la interrupción.

Con esta descripción es fácil entender que se trata de una gestión asíncrona, o sea, no controlada por programa. La gestión de entrada/salida (I/O) de este tipo es más complicada, ya que no se puede prever el momento en el que serán transmitidos los datos.

Además, cuando hay más de un dispositivo conectado, es necesario asignar prioridades de servicio para el caso de peticiones simultáneas. Esto se realiza agrupando todos los dispositivos según niveles de prioridad.

Es necesario saber que la asignación de los niveles de prioridad para los periféricos se determina en la fase de implantación y que una mala elección puede crear graves problemas. La situación ideal se logra conectando un único periférico a cada nivel de prioridad. En este caso, las peticiones simultáneas se ponen en cola y son atendidas según su prioridad. Por el contrario, si más de un dispositivo se asocia a un mismo nivel de prioridad, cuando la CPU recibe una interrupción tiene que poder determinar cuál es el periférico que la provocó, bien por software, bien por hardware.

Esta técnica, aun siendo muy rápida gracias al programa, necesita un hardware complicado y una programación difícil.

285

Page 287: Manual Datos i 2003[1]

Transferencia DMA

Para realizar la transferencia DMA es necesario disponer de un procesador capaz de efectuarla. Se trata de una técnica hardware que utiliza un dispositivo particular para efectuar la transferencia de bloques de datos desde y para la memoria del ordenador, sin interrumpir el programa en ejecución.

Cuando existe una transferencia DMA, la CPU interviene sólo en el momento de lanzar la operación y después la transferencia sigue su proceso de manera autónoma por medio de hardware. Naturalmente, también intervienen el bus de datos y el bus de direcciones. Las operaciones de la CPU sólo se interrumpen momentáneamente para liberar estos buses y poder efectuar la transferencia en DMA. La señal de parada enviada al procesador central se denomina hold, y la contestación desde la CPU, ack (acknowledgement: reconocimiento). Prácticamente, la gestión de las interrupciones (interrupts), que en la técnica anterior las realizaba el procesador central, ahora están a cargo, con el DMA, de un dispositivo particular denominado, precisamente, DMA. En el esquema de la figura 21 se puede ver su funcionamiento.

Fig. 21. Esquema de un 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

Page 288: Manual Datos i 2003[1]

GLOSARIO

Banda perforada

Soporte de papel en forma de cinta en la que se representan los datos, carácter a carácter, por medio de adecuadas combinaciones de perforaciones.

Buffer de I/O

Registro o conjunto de registros de un periférico en el que transitan los datos de entrada y salida. También zona de memoria del ordenador utilizada para realizar las operaciones de I/O.

Código Hollerith

Es el código que se utiliza para representar los caracteres en una ficha con las adecuadas combinaciones de perforaciones.

CursorIndicador luminoso intermitente que se encuentra, a cada instante, en la posición disponible de la pantalla.

DMA (Direct Memory Access- Acceso Directo a Memoria)

Técnica hardware de I/O, gestionada por un dispositivo denominado DMA. Se utiliza para transferencias rápidas de grandes cantidades de datos entre un periférico y la memoria central. No necesita el control de la CPU, sino sólo una cortísima suspensión de su actividad para dejar disponibles los buses en los que se realiza la transferencia de datos.

Ficha perforada

Soporte de papel para el registro de los datos de entrada y perforada salida del ordenador. Cada carácter se puede identificar a través de una determinada configuración de perforaciones en posiciones adecuadas.

Impresión con impacto

Técnica de impresión en la que los caracteres se imprimen sobre el papel por medio del contacto mecánico entre la hoja y el dispositivo de impresión utilizando una cinta entintada.

Impresión sin impacto

Técnica de impresión, que utiliza procesos químicos, magnéticos o eléctricos, en la que no existe el contacto entre el papel y el dispositivo de impresión.

ImpresoraDispositivo de salida que proporciona los resultados de los procesos, impresos sobre hojas de papel, de manera inteligible por el hombre.

Impresoras en paralelo

Imprimen simultáneamente (o casi) todos los caracteres de una línea en diferentes posiciones.

Impresoras en serie

Imprimen, uno tras otro, los caracteres de una línea.

Interfase

Desde el punto de vista de hardware, es el conjunto de dispositivos que permiten la conexión entre ellos de dos o más componentes de un sistema; con referencia al software, es el conjunto de programas que gestionan tales dispositivos.

Interrupciones (interrupts)

Técnica de I/O mixta hardware + software en la que la transferencia de un dato se realiza por la petición de un periférico que interrumpe el proceso del programa en ejecución. En los problemas relativos a la identificación del periférico que demanda tareas y en la definición de prioridad para peticiones simultáneas, es necesario hardware

287

Page 289: Manual Datos i 2003[1]

adicional. El servicio de las demandas tiene carácter software y se realiza por medio de rutinas denominadas de «servicio».

IOCS (Input/Output Control System)

Conjunto de programas estándar generalmente proporcionados por las casas constructoras para la gestión de las operaciones de entrada y salida.

Joystick (palanca direccional)

Es una palanca direccional que puede moverse manualmente para dirigir el movimiento de un punto en la pantalla.

Lectora de fichas

Dispositivo de entrada por medio del cual se introducen en el ordenador los programas y los datos sobre fichas perforadas.

Perforadora de fichas

Dispositivo de salida conectado al ordenador. Los resultados de los procesos se obtienen bajo forma de fichas perforadas.

PlotterDispositivo de salida que, aprovechando el desplazamiento vertical de la hoja de papel y el desplazamiento horizontal de una pluma, realiza la impresión de gráficos y dibujos.

Polling (Interrogatorio de tráfico)

Técnica software de I/O, en la que la transferencia de datos se realiza bajo el control de un programa que interroga cíclicamente a los periféricos. La transferencia se realiza sólo si el periférico que lo demanda es interrogado por el programa.

Registro de estado

Registro interno de un dispositivo (unidad central o periférico) que proporciona, por medio del estado de sus bits, la información acerca del estado del dispositivo. Por ej. la petición de un dato, disponibilidad de un dato, el buffer de I/O ocupado, etc.

Técnicas de I/O

Modalidad de comunicación y transferencia de datos entre los periféricos y la unidad central, con referencia tanto al aspecto hardware como al software.

Terminal

Dispositivo de I/O formado por un teclado alfanumérico por el que se introducen los datos y los programas en el ordenador sin pasar a través de soportes intermedios, o por una impresora o por una pantalla.

288

Page 290: Manual Datos i 2003[1]

CONCLUSIÓN

289

Page 291: Manual Datos i 2003[1]

CONCLUSIÓN FINAL

290

Page 292: Manual Datos i 2003[1]

BIBLIOGRAFÍA

UNLaR - Procesamiento de Datos I – Ciclo 2003Pagina 1http://unlar.estudio3.com.arBIBLIOGRAFIACARRERA: LICENCIATURA EN ANALISIS DE SISTEMAS –INGENIERIA EN SISTEMASCátedra: Procesamiento De Datos IProfesor: Lic. Marcelo MartinezAÑO: 2003BásicaIntroducción a la Informática LL Guillera Aguera EDUNSAOperación Programación de Computadoras M.C. GinzburgLa PC por Dentro M.C. Ginzburg Bibioteca TécnicaSuperiorSistemas de Micro computación Ivan Flores El AteneroOrganización de Computadoras Andrew S. Tanenmaum Prentice HallSistemas Operativos Modernos Andrew S. Tanenmaum Prentice mayPrincipios de Procesamiento de Datos Gordon B. Davis TrillasApuntes de la Cátedra Marcelo Martinez Sitio de la Cátedraen Internet y CopiasApuntes de la Cátedra Claudia Cesarini Sitio de la Cátedraen Internet y CopiasEnciclopedia Audiovisual de Computación Océano MultimediaFundamentos de computadores Digitales Thomas C. BarteeComplementariaMatemáticas para Computación McGraw Hill Seymour LipschutzInformática – Glosario de Términos McGraw Hill Antonio Vaquero y LuisJoyanesPC Interno Boixareu – Editores Data Becker

291