Universidad de Costa Rica

Universidad de Costa Rica Escuela de Ingeniería Eléctrica Facultad de Ingeniería Generación del material para el curso IE0503 Por: María Teresa Fuentes Chacón Ciudad Universitaria Rodrigo Facio Agosto, 2009 Generación del material para el curso IE0503 Por: María Teresa Fuentes Chacón Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal: Ing. Roberto Rodríguez Rodríguez. Profesor guía Ing. Randolph Steinvorth Fdez. Profesor lector Ing. Gerardo Castro Jiménez. Profesor lector Dedicatoria A mi padre José Fuentes cuyo ejemplo me ha guiado aún después de su muerte. A mi madre Carmen Chacón por sacricarse día a día y brindarme todo lo necesario para mi estudio, asi como mi hermano José Alberto. A mi novio Edgar por su apoyo incondicional en todo momento y a mis compañeros de carrera que se convirtieron en grandes amigos y amigas con los que viví alegrías y tistezas durante todos estos años. iii Reconocimientos A los profesores Dr. Randolph Steinvorth e Ing. Marco Vásquez. que realizaron la primera descripción de la CPUCR y la documentación con conceptos aplicables a cualquier computador. A todos los estudiantes que trabajaron previamente en las distintas descripciones de la CPUCR. Al profesor Dr. Lochi Yu por el material creado en el 2003 y que es mostrado con algunas actualizaciones en el capítulo 1 asi como algunos laboratorios del capítulo 5. iv Índice General Índice General v Índice de guras vi Índice de tablas vii 1. Introducción 1 2. Generación del material para el Curso IE0503. 3 3. LATEX 5 1.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1. Objetivos especícos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Metodología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1. La CPUCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Importancia de la CPUCR . . . . . . . . . . . . . . . . . . . . . . . . 3.1. Guía rápida para el uso de LATEX 3.1.1. Índices . . . . . . . . . . . 3.1.2. Figuras entre texto . . . . 3.1.3. Figuras fuera de texto . . 3.1.4. Tablas simples . . . . . . . 3.1.5. Tablas multicolumna . . . 3.1.6. Tablas multila . . . . . . . . . . . . . . . . . . . . 4. Conclusiones y recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 3 3 5 6 6 7 7 8 8 9 9 10 Bibliografía 11 Anexos 15 A. Material del curso IE0503 15 B. Plantilla para proyectos 91 v Índice de guras 3.1. Logo EIE entre texto a la izquierda. . . . . . . . . . . . . . . . . . . . . . . . 3.2. Logo EIE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vi 6 7 Índice de tablas 3.1. Descripcion de la tabla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Descripción de la tabla multicolumna . . . . . . . . . . . . . . . . . . . . . . 3.3. Descripción de la tabla multila . . . . . . . . . . . . . . . . . . . . . . . . . vii 7 8 8 Resumen El presente proyecto se basa en la necesidad de actualizar la documentación existente para el curso de Estructuras de Computadoras Digitales I, utilizando la herrramienta de edición tipográca LATEX El documento inicia con una reseña de la historia de las computadoras, seguido de una introducción a la arquitectura de un computador y la descripcion del primer microprocesador completamente diseñado en Costa Rica: la CPUCR. Luego en base a la CPUCR se ilustra la programación de computadores en lenguaje ensamblador y el diseño de programas. Finalmente se introducen los temas de jerarquías de memoria, algunos tipos de almacenamiento y sistemas de archivos para dar paso a una serie de ejercicios de laboratorio resueltos para facilitar la comprensión de la materia por parte del estudiante. viii Capítulo 1 Introducción Años atrás, en la Escuela de Ingeniería Eléctrica de la Universidad de Costa Rica se inició el desarrollo de un CPU con nes didácticos, donde se exponían aspectos básicos de arquitectura y programación en ensamblador, con el paso del tiempo se han propuesto versiones mejoradas y métodos de sintetización innovadores. Contar con material actualizado y organizado ha sido una fuerte herramienta en las aulas de escuelas, colegios y universidades; el curso de Estructuras de Computadores Digitales I no es la excepción y la necesidad de actualizar la documentación existente se incrementaba semestre tras semestre. Es por eso que se decidió actualizar el material del curso y preveer futuras modicaciones utilizando el editor de tipografías LATEX que a su vez es un software libre bajo licencia LPPL. 1.1. Ob jetivo Generar el material para el Curso IE0503. 1.1.1. Objetivos especícos 1. Aprender el correcto uso del lenguaje LATEX y utilizar este para la generación de toda la documentación del proyecto. 2. Ordenar mediante parámetros de crecimiento arquitectónico las modicaciones que se han realizado a la CPUCR a lo largo de la historia. 3. Generar el material para el curso IE0503 que incluya de una manera ordenada el crecimiento arquitectónico que tenido la CPUCR. 4. Desarrollar un conjunto de prácticas de laboratorio y ejemplos ilustrativos para desarrollar en el curso. 1 5. Incluir en el material temas referentes a arquitectura actual de microprocesadores, puertos, sistemas de archivos, tecnología y organización de memorias y desarrollo de sistemas secuenciales en lenguajes de descripción de hardware. 1.2. Metodología La elaboración del material para el curso IE0503 fue un proceso que constó de tres partes. La primera, consistió el aprendizaje del lenguaje LATEX y la elaboración de una plantilla sobre la cual se trabajó para generar el material. En la segunda parte, se trabajó en la recopilación de información para actualizar datos, asi como las modicaciones que ha sufrido la CPUCR. Finalmente se logró unir una serie de ejercicios con su respectiva solución para que el estudiante tenga una visión más amplia de como enfrentar problemas comunes propios del tema del curso IE0503. 2 Capítulo 2 Generación del material para el Curso IE0503. 2.1. La CPUCR 2.1.1. Importancia de la CPUCR La CPUCR se puede considerar como uno de los pilares centrales para la enseñanza en el área de las estructuras de computadoras en la Escuela de Ingeniería Eléctrica de la Universidad de Costa Rica. Cuenta con la particularidad de ser el primer microprocesador diseñado totalmente en Costa Rica. Esto sin lugar a duda resulta ser un gran aporte académico, permitiendo el desarrollo didáctico mediante herramientas propias que pueden ser modicas de acuerdo a las necesidades que se presenten y de esta forma no depender de trabajos de otras universidades o incluso empresas. Como el diseño arquitectónico de la CPUCR es muy simple, lo hace ideal para que los estudiantes aprendan la estructura básica de un microprocesador y que de esta forma logren comprender mejor otros circuitos más avanzados posteriormente. La creación de este microprocesador ha producido el desarrollo de lenguajes de ensamblador para el mismo. El SIS es el primer simulador para la versión de la CPUCR de 6 bits y es una herramienta muy utilizada en el curso de estructuras de computadoras para estudiar su comportamiento. Otro aporte importante es que ayuda a entender cómo funcionan los programas de compilación y cómo éstos son capaces de traducir de instrucciones simples a lenguaje binario. Se puede considerar que el mayor aporte que ha dejado la CPUCR es el haber abierto la puerta para la creación de nuevos y diversos proyectos de investigación y desarrollo basados en ella, llevando a un crecimiento de su diseño para tratar de que cada vez sea más robusto. La versión de 8 bits conocida como CPUCR1 es resultado de un proyecto de graduación y en estos momentos se trata de concretar una versión de 32 bits. Se pretenden así mismo 3 agregar funcionalidades que presentan los microprocesadores del mercado como por ejemplo los multiregistros y los pipeline, y en una visión más a futuro se desea que el microprocesador corra un sistema operativo propio basado en software libre. Ya se comenzó a trabajar en nuevos compiladores que utilizan el diseño en sí de la CPUCR para simular los programas compilados, de esta forma se aprovecha más el trabajo de los diseños realizados tanto en el curso como en los distintos proyectos de graduación. Adicionalmente, una práctica muy empleada por grandes compañías es la validación de diseños. Otro proyecto que ha surgido a raíz de la CPUCR es la implementación de un método de validación para la versión de 32 bits, el proyecto dio grandes frutos pero debido a que este diseño no se ha consolidado completamente necesita ser completado en futuros proyectos. Todos estos avances conllevan a otros más signicativos, esa ha sido la mecánica que ha llevado al hombre a lograr cosas inimaginables, en el caso de la CPUCR no es la excepción, porque quien lo podrá saber, es posible que en algunos años este documento se esté leyendo un computador cuya unidad central sea una versión de la CPUCR. 4 Capítulo 3 LATEX LATEX es un lenguaje de composición y producción tipográca, muy utilizado para la realización de trabajos técnicos, académicos y editoriales. Creado en 1984 por Leslie Lamport, quien se basó en el código del programa conocido como TEX de Donald Knuth. A diferencia de un procesador de texto común, un documento escrito en LATEX se basa en la utilización de macros, los cuales son instrucciones que realizan todas las acciones que le dan forma al cuerpo del trabajo. Existen instrucciones para enumerar las páginas, resaltar texto, insertar guras, hacer diagramas, en n casi cualquier cosa que se pueda imaginar. Para lograr esta gran diversidad de funciones se utilizan los llamados paquetes, que no son más que extensiones al código original y que implementan nuevas funcionalidades. La razón del por qué este lenguaje se ha hecho tan popular es que da un resultado impresionante en la calidad de los trabajos, cosa que no es posible lograr de la misma forma con un procesador de texto. Por otra parte libera al usuario de ciertas preocupaciones triviales a la hora de hacer un documento escrito, por ejemplo los distintivos tipos de numeración en un proyecto de graduación, la utilización de referencias a bibliografías, la numeración y titulado de guras asi como de tablas, mediante el uso de instrucciones o comandos que el compilador de LATEX interpreta haciendo todo el trabajo pesado. Esta gran cantidad de funcionalidades y paquetes, hace que el aprendizaje de LATEX pueda complicarse en gran forma. Sin embargo, todos los usuarios que lo ha utilizado concuerdan en que una vez que se haya dominado los elementos básicos, se convierte en una poderosa herramienta. 3.1. ATEX Guía rápida para el uso de L Actualmente si buscamos en internet existen múltiples guias para el uso de LATEX , aca se hará referencia a los detalles más relevantes para el uso de la plantilla elaborada. 5 Para realizar comentarios en LATEX se inicia la línea con el signo de porcentaje: %. Si se desean agregar capítulos adicionales deben ser llamados desde el archivo plantilla.tex, por ejemplo: \include{5/Cap5} Cabe resaltar que hay que crear el archivo ∗.tex que se incluirá e ingresar la ruta en donde se encuentra el archivo sin la extensión: .tex. 3.1.1. Índices Para introducir indices se utiliza el siguiente código: % Indice General \newpage{} \begin{IndiceGeneral} \tableofcontents \end{IndiceGeneral} % Indice de figuras \newpage{} \begin{IndiceDeFiguras} \listoffigures \end{IndiceDeFiguras} % Índice de tablas \newpag
Author:  Paula Montero Vera

7 downloads 98 Views 10MB Size

Recommend Stories


UNIVERSIDAD DE COSTA RICA
UNIVERSIDAD DE COSTA RICA Instituto de Estudios Centroamericanos ANTECEDENTES DE LA INDEPENDENCIADE COSTA RICA Mario Zaragoza Aguado 1973 227 VI

Universidad de Costa Rica
Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laborator

Universidad de Costa Rica
Universidad de Costa Rica Sede Central Ciudad Universitaria Rodrigo Facio Vicerrectoría de Acción Social Sección de Trabajo Comunal: Soluciones Energ

UNIVERSIDAD DE COSTA RICA
RedSismológicaNacional (RSN: UCR-ICE) UNIVERSIDAD DE COSTA RICA ESCUELA CENTROAMERICANA DE GEOLOGÍA RED SISMOLÓGICA NACIONAL (RSN) CENTRO DE INVESTI

Story Transcript

Universidad de Costa Rica Escuela de Ingeniería Eléctrica Facultad de Ingeniería

Generación del material para el curso IE0503

Por: María Teresa Fuentes Chacón

Ciudad Universitaria Rodrigo Facio Agosto, 2009

Generación del material para el curso IE0503 Por: María Teresa Fuentes Chacón

Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal:

Ing. Roberto Rodríguez Rodríguez. Profesor guía

Ing. Randolph Steinvorth Fdez. Profesor lector

Ing. Gerardo Castro Jiménez. Profesor lector

Dedicatoria A mi padre José Fuentes cuyo ejemplo me ha guiado aún después de su muerte. A mi madre Carmen Chacón por sacricarse día a día y brindarme todo lo necesario para mi estudio, asi como mi hermano José Alberto. A mi novio Edgar por su apoyo incondicional en todo momento y a mis compañeros de carrera que se convirtieron en grandes amigos y amigas con los que viví alegrías y tistezas durante todos estos años.

iii

Reconocimientos A los profesores Dr. Randolph Steinvorth e Ing. Marco Vásquez. que realizaron la primera descripción de la CPUCR y la documentación con conceptos aplicables a cualquier computador. A todos los estudiantes que trabajaron previamente en las distintas descripciones de la CPUCR. Al profesor Dr. Lochi Yu por el material creado en el 2003 y que es mostrado con algunas actualizaciones en el capítulo 1 asi como algunos laboratorios del capítulo 5.

iv

Índice General Índice General

v

Índice de guras

vi

Índice de tablas

vii

1. Introducción

1

2. Generación del material para el Curso IE0503.

3

3. LATEX

5

1.1. Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1. Objetivos especícos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Metodología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1. La CPUCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Importancia de la CPUCR . . . . . . . . . . . . . . . . . . . . . . . . 3.1. Guía rápida para el uso de LATEX 3.1.1. Índices . . . . . . . . . . . 3.1.2. Figuras entre texto . . . . 3.1.3. Figuras fuera de texto . . 3.1.4. Tablas simples . . . . . . . 3.1.5. Tablas multicolumna . . . 3.1.6. Tablas multila . . . . . .

. . . . . . .

. . . . . . .

4. Conclusiones y recomendaciones

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

4.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 1 2

3 3

5 6 6 7 7 8 8

9

9 10

Bibliografía

11

Anexos

15

A. Material del curso IE0503

15

B. Plantilla para proyectos

91

v

Índice de guras 3.1. Logo EIE entre texto a la izquierda. . . . . . . . . . . . . . . . . . . . . . . . 3.2. Logo EIE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

vi

6 7

Índice de tablas 3.1. Descripcion de la tabla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Descripción de la tabla multicolumna . . . . . . . . . . . . . . . . . . . . . . 3.3. Descripción de la tabla multila . . . . . . . . . . . . . . . . . . . . . . . . .

vii

7 8 8

Resumen El presente proyecto se basa en la necesidad de actualizar la documentación existente para el curso de Estructuras de Computadoras Digitales I, utilizando la herrramienta de edición tipográca LATEX El documento inicia con una reseña de la historia de las computadoras, seguido de una introducción a la arquitectura de un computador y la descripcion del primer microprocesador completamente diseñado en Costa Rica: la CPUCR. Luego en base a la CPUCR se ilustra la programación de computadores en lenguaje ensamblador y el diseño de programas. Finalmente se introducen los temas de jerarquías de memoria, algunos tipos de almacenamiento y sistemas de archivos para dar paso a una serie de ejercicios de laboratorio resueltos para facilitar la comprensión de la materia por parte del estudiante.

viii

Capítulo 1 Introducción Años atrás, en la Escuela de Ingeniería Eléctrica de la Universidad de Costa Rica se inició el desarrollo de un CPU con nes didácticos, donde se exponían aspectos básicos de arquitectura y programación en ensamblador, con el paso del tiempo se han propuesto versiones mejoradas y métodos de sintetización innovadores. Contar con material actualizado y organizado ha sido una fuerte herramienta en las aulas de escuelas, colegios y universidades; el curso de Estructuras de Computadores Digitales I no es la excepción y la necesidad de actualizar la documentación existente se incrementaba semestre tras semestre. Es por eso que se decidió actualizar el material del curso y preveer futuras modicaciones utilizando el editor de tipografías LATEX que a su vez es un software libre bajo licencia LPPL.

1.1.

Ob jetivo

Generar el material para el Curso IE0503.

1.1.1. Objetivos especícos 1. Aprender el correcto uso del lenguaje LATEX y utilizar este para la generación de toda la documentación del proyecto. 2. Ordenar mediante parámetros de crecimiento arquitectónico las modicaciones que se han realizado a la CPUCR a lo largo de la historia. 3. Generar el material para el curso IE0503 que incluya de una manera ordenada el crecimiento arquitectónico que tenido la CPUCR. 4. Desarrollar un conjunto de prácticas de laboratorio y ejemplos ilustrativos para desarrollar en el curso.

1

5. Incluir en el material temas referentes a arquitectura actual de microprocesadores, puertos, sistemas de archivos, tecnología y organización de memorias y desarrollo de sistemas secuenciales en lenguajes de descripción de hardware. 1.2.

Metodología

La elaboración del material para el curso IE0503 fue un proceso que constó de tres partes. La primera, consistió el aprendizaje del lenguaje LATEX y la elaboración de una plantilla sobre la cual se trabajó para generar el material. En la segunda parte, se trabajó en la recopilación de información para actualizar datos, asi como las modicaciones que ha sufrido la CPUCR. Finalmente se logró unir una serie de ejercicios con su respectiva solución para que el estudiante tenga una visión más amplia de como enfrentar problemas comunes propios del tema del curso IE0503.

2

Capítulo 2 Generación del material para el Curso IE0503. 2.1.

La CPUCR

2.1.1. Importancia de la CPUCR La CPUCR se puede considerar como uno de los pilares centrales para la enseñanza en el área de las estructuras de computadoras en la Escuela de Ingeniería Eléctrica de la Universidad de Costa Rica. Cuenta con la particularidad de ser el primer microprocesador diseñado totalmente en Costa Rica. Esto sin lugar a duda resulta ser un gran aporte académico, permitiendo el desarrollo didáctico mediante herramientas propias que pueden ser modicas de acuerdo a las necesidades que se presenten y de esta forma no depender de trabajos de otras universidades o incluso empresas. Como el diseño arquitectónico de la CPUCR es muy simple, lo hace ideal para que los estudiantes aprendan la estructura básica de un microprocesador y que de esta forma logren comprender mejor otros circuitos más avanzados posteriormente. La creación de este microprocesador ha producido el desarrollo de lenguajes de ensamblador para el mismo. El SIS es el primer simulador para la versión de la CPUCR de 6 bits y es una herramienta muy utilizada en el curso de estructuras de computadoras para estudiar su comportamiento. Otro aporte importante es que ayuda a entender cómo funcionan los programas de compilación y cómo éstos son capaces de traducir de instrucciones simples a lenguaje binario. Se puede considerar que el mayor aporte que ha dejado la CPUCR es el haber abierto la puerta para la creación de nuevos y diversos proyectos de investigación y desarrollo basados en ella, llevando a un crecimiento de su diseño para tratar de que cada vez sea más robusto. La versión de 8 bits conocida como CPUCR1 es resultado de un proyecto de graduación y en estos momentos se trata de concretar una versión de 32 bits. Se pretenden así mismo 3

agregar funcionalidades que presentan los microprocesadores del mercado como por ejemplo los multiregistros y los pipeline, y en una visión más a futuro se desea que el microprocesador corra un sistema operativo propio basado en software libre. Ya se comenzó a trabajar en nuevos compiladores que utilizan el diseño en sí de la CPUCR para simular los programas compilados, de esta forma se aprovecha más el trabajo de los diseños realizados tanto en el curso como en los distintos proyectos de graduación. Adicionalmente, una práctica muy empleada por grandes compañías es la validación de diseños. Otro proyecto que ha surgido a raíz de la CPUCR es la implementación de un método de validación para la versión de 32 bits, el proyecto dio grandes frutos pero debido a que este diseño no se ha consolidado completamente necesita ser completado en futuros proyectos. Todos estos avances conllevan a otros más signicativos, esa ha sido la mecánica que ha llevado al hombre a lograr cosas inimaginables, en el caso de la CPUCR no es la excepción, porque quien lo podrá saber, es posible que en algunos años este documento se esté leyendo un computador cuya unidad central sea una versión de la CPUCR.

4

Capítulo 3 LATEX LATEX es un lenguaje de composición y producción tipográca, muy utilizado para la realización de trabajos técnicos, académicos y editoriales. Creado en 1984 por Leslie Lamport, quien se basó en el código del programa conocido como TEX de Donald Knuth. A diferencia de un procesador de texto común, un documento escrito en LATEX se basa en la utilización de macros, los cuales son instrucciones que realizan todas las acciones que le dan forma al cuerpo del trabajo. Existen instrucciones para enumerar las páginas, resaltar texto, insertar guras, hacer diagramas, en n casi cualquier cosa que se pueda imaginar. Para lograr esta gran diversidad de funciones se utilizan los llamados paquetes, que no son más que extensiones al código original y que implementan nuevas funcionalidades. La razón del por qué este lenguaje se ha hecho tan popular es que da un resultado impresionante en la calidad de los trabajos, cosa que no es posible lograr de la misma forma con un procesador de texto. Por otra parte libera al usuario de ciertas preocupaciones triviales a la hora de hacer un documento escrito, por ejemplo los distintivos tipos de numeración en un proyecto de graduación, la utilización de referencias a bibliografías, la numeración y titulado de guras asi como de tablas, mediante el uso de instrucciones o comandos que el compilador de LATEX interpreta haciendo todo el trabajo pesado. Esta gran cantidad de funcionalidades y paquetes, hace que el aprendizaje de LATEX pueda complicarse en gran forma. Sin embargo, todos los usuarios que lo ha utilizado concuerdan en que una vez que se haya dominado los elementos básicos, se convierte en una poderosa herramienta.

3.1.

ATEX Guía rápida para el uso de L

Actualmente si buscamos en internet existen múltiples guias para el uso de LATEX , aca se hará referencia a los detalles más relevantes para el uso de la plantilla elaborada. 5

Para realizar comentarios en LATEX se inicia la línea con el signo de porcentaje: %. Si se desean agregar capítulos adicionales deben ser llamados desde el archivo plantilla.tex, por ejemplo: \include{5/Cap5}

Cabe resaltar que hay que crear el archivo ∗.tex que se incluirá e ingresar la ruta en donde se encuentra el archivo sin la extensión: .tex.

3.1.1. Índices Para introducir indices se utiliza el siguiente código: % Indice General \newpage{} \begin{IndiceGeneral} \tableofcontents \end{IndiceGeneral} % Indice de figuras \newpage{} \begin{IndiceDeFiguras} \listoffigures \end{IndiceDeFiguras} % Índice de tablas \newpage{} \begin{IndiceDeTablas} \listoftables \end{IndiceDeTablas}

3.1.2. Figuras entre texto Si se desea insertar guras es recomendable que estas estén en formato .jpg guardadas en un carpeta cuya ruta se indicará para que LATEX pueda accesarla e insertarla en el documento después de compilar. Se utiliza el paquete floatflt. \begin{floatingfigure}[r]{4.5cm} \begin{center} \includegraphics[scale=0.8]{./3/FigCap3/logoEIE.jpg} \caption{Logo EIE entre texto a la izquierda.} \label{fig:logoEIE} \end{center} \end{floatingfigure}

Figura 3.1: Logo EIE entre texto a la izquierda.

En el ejemplo anterior la r equivale a right o derecha por lo que la gura se introduce a la derecha del texto, si la cambiamos por l de left o izquierda la gura se introducirá en el lado contrario. Además, se puede indicar el espacio entre texto que de desea para la gura, para el ejemplo dado se ha especicado 4,5 centímetros así como la escala de la gura respecto a su tamaño original. 6

3.1.3. Figuras fuera de texto De la misma manera que para guras entre texto, se utiliza el siguiente código para insertar guras: \begin{figure}[H] \begin{center} \includegraphics[width=0.3\textwidth]{./3/FigCap3/logoEIE.jpg} \caption{Logo EIE} \label{fig:logoEIE} %\ref{fig:logoEIE} \end{center} \end{figure}

Figura 3.2: Logo EIE

3.1.4. Tablas simples Una tabla simple se puede elaborar mediante el siguiente código: \begin{table} \begin{center} \begin{tabular}{|c|r|l|} \hline Titulo1 & Titulo2 & Titulo3 \\ \hline val1 & val2 & val3\\ val4 & val5 & val6 \\ \hline \end{tabular} \caption{Descripcion de la tabla} \end{center} \end{table}

Titulo1 Titulo2 Titulo3 val1 val2 val3 val4 val5 val6 Tabla 3.1: Descripcion de la tabla Nótese que si se utiliza un pipe (|) se esta indicando que se trace la línea vertical. En el ejemplo se utiliza: |c|r|l| lo cual indica que se trazaran las líneas externas e internas verticales de la tabla que que el contenido será alineado al centro c, a la derecha r y a la izquierda l. Cuando se desea trazar una línea horizontal es necesario escribir el comando \hline

7

3.1.5. Tablas multicolumna Una tabla que tenga varias columnas unidas se puede generar mediante el código mostrado a continuación y mediante el comando: \multicolumn{cantidad de celdas}{alineación}{Contenido de las celdas} \begin{table} \begin{center} \begin{tabular}{|l|c|r|} \hline \multicolumn{2}{|c|}{Une celdas 11 y 12} & Celda 13\\ \hline Celda 21 & Celda 22 & Celda 23 \\ \hline \multicolumn{3}{|c|}{Une celdas 31, 32 y 33} \\ \hline \end{tabular} \caption{Descripción de la tabla multicolumna} \end{center} \end{table}

Une celdas 11 y 12 Celda 13 Celda 21 Celda 22 Celda 23 Une celdas 31, 32 y 33 Tabla 3.2: Descripción de la tabla multicolumna

3.1.6. Tablas multila Adicionalmente, algunas ocasiones es necesario unir diferentes las en una tabla, esto se logra mediante el comando: \multirow{cantidad de celdas}{tamaño}{Contenido de las celdas} \begin{table}[H] \begin{center} \begin{tabular}{|l|c|r|} \hline \multirow{2}{*}{Celdas 11 y 21 unidas} & Celda 12 & \multirow{3}{3cm}{Celdas 13, 23 y 33} \\ \cline{2-2} & \multirow{2}{*}{Celdas 22 y 32 unidas} & \\ \cline{1-1} Celda 31 & & \\ \hline \end{tabular} \caption{Descripción de la tabla multifila} \end{center} \end{table}

Celdas 11 y 21 unidas Celda 31

Celda 12

Celdas 13, 23 y Celdas 22 y 32 unidas 33 unidas

Tabla 3.3: Descripción de la tabla multila

8

Capítulo 4 Conclusiones y recomendaciones A continuación se enumeran las principales conclusiones obtenidas con la elaboración de este documento:

4.1.

Conclusiones

I. La implementación del trabajo escrito haciendo uso del lenguaje LATEX fue exitosa, a pesar de que la curva de aprendizaje para la manipulación de la herramienta y la edición del material para el curso de Estructuras de Computadores Digitales I fue bastante lenta debido a la complejidad de LATEX para trabajar en detalles como guras, tablas y variedad de símbolos, sin embargo, es muy utilizado en la edición de artículos académicos y técnicos así como tesis, dado que la calidad tipográca que proporciona. En adición cabe resaltar que se ha facilitado la posibilidad de futuros cambios en el material del curso. II. No fue posible tratar los temas correspondientes a la CPUCR2 y la CPUCR 3, la primera debido a que la documentación está extraviada por lo que no se encuentra disponible en la biblioteca, y para el caso de la CPUCR3 esta se encuentra aún bajo desarrollo, por lo que su diseño y documentación están incompletos. Sin embargo se pudo dar a conocer las diferencias entre la CPUCR0 y la CPUCR1 donde destaca el paso de seis a ocho bits en el bus de datos, además el incremento de doce a dieciséis bits en el bus de direcciones y la reducción de doce a once líneas de control al eliminarse la señal WAIT por limitaciones en silicio. III. Se logró recopilar y presentar la solución de diversas prácticas para el curso de Estructuras de Computadores Digitales I, donde se tratan tópicos correspondientes a programación en ensamblador y análisis de mapas de memoria para la CPUCR.

9

4.2.

Recomendaciones

1. Se recomienda el uso de la herramienta para la elaboración de documentos y trabajos nales. 2. Localizar la documentación perdida de la CPUCR multiregistro (CPUCR2) dado que es un paso relevante en la historia de la evolución de la CPUCR. 3. Unir al documento del curso la documentación de la CPUCR3 en cuanto se tenga una descripción completa.

10

Bibliografía [1] Hamacher, C. - Organización de computadores, quinta edición, McGraw Hill, España, 2003. [2] Hennessy, J. - Organización y diseño de computadores, segunda edicion, McGraw Hill, España, 1995. [3] Parhami, B. - Arquitectura de computadoras, primera edición, McGraw Hill, India, 2007. [4] Stallings, W. - Organización y arquitectura de computadores, sétima edición, Prentice Hall, España,2007. [5] Insertar imágenes en Latex, http://valar.wordpress.com/2004/01/30/ imagenes-enlatex/. [6] Manual de LaTeX, Insertar guras en un documento, http://es.wikibooks.org/wiki/Manual_ de_ LaTeX/Insertar_ guras_ en_ un_ documento. [7] Manual sobre LaTeX, http://foro.simur.org/viewtopic.php?f=26t=166. [8] Tips para usar Latex, http://www.fmat.cl/index.php?showtopic=6460. [9] Insertar mi imagen con latex donde yo quiera, http://ajayu.memi.umss.edu.bo/latexman/weblog/insertar-mi-imagen-latex-dondeyo-quiera. [10] Lopez, J.M. Grácos y color en LaTeX, http://metodos.fam.cie.uva.es/ latex/gracosycolor.pdf.

11

[11] Matthias Andreas. A Demonstration of the pdfpages Package, http://wwwhep2.fzu.cz/tex/texmf-dist/doc/latex/pdfpages/pdf-ex.pdf. [12] Wikipedia, 64 bits, http://es.wikipedia.org/wiki/64_bits. [13] Hurtado, Carlos. El n de la era de los MHz y el inicio de la era MultiCore,http://blogs.intel.com/latininsights/2007/07/el_ n_ de_ la_ era_ de_ los_ mhz_ y.php. [14] Corporate Timeline,http://www.intel.com/museum/corporatetimeline/. [15] Timeline of computing 2000-2009, http://en.wikipedia.org/wiki/Timeline_ of_ computing_ 2000-2009. [16] Apple Product Timeline Map,http://www.scribd.com/doc/176946/Apple-ProductTimeline-Map. [17] AMD's History of us/assets/AMD_Evolution.pdf.

innovation,

http://breakfree.amd.com/en-

[18] Intel Core i7, http://en.wikipedia.org/wiki/Intel_Core_3. [19] García, J.M. Informática para matemáticos, http://www.vc.ehu.es/campus/centros/farmacia/deptos-f/depme/temporal/infomate/infomate.htm. [20] Rodríguez, Noelia. Conceptos avanzados de LaTeX,http://www.elrincondelprogramador.com/ default.asp?pag=articulos/leer.aspid=11. [21] Pakin, Scott. The comprehensive LaTeX Symbol list,http://www.ctan.org/texarchive/info/symbols/comprehensive/symbols-a4.pdf. [22] Botana,Raúl. Tablas tos/tablas/tablas.pdf.

en

Latex,

http://www.lug..uba.ar/

documen-

[23] Historia de los microprocesadores, http://iteso.mx/ miguelbaz/cursos/ arqcomp-200508/presentaciones/cpuhistory.pdf. 12

[24] http://www.icknowledge.com/trends/4004b.jpg. [25] http://www.icknowledge.com/trends/8080B.jpg. [26] http://poshiitabella.les.wordpress.com/2007/10/apple.jpg. [27] http://www.cpu-world.com/CPUs/8086/die/L_Fujitsu-MBL8086-2.jpg. [28] http://www.icknowledge.com/trends/8086_8088B1.jpg. [29] http://www.cpu-galaxy.at/CPU/Intel %20CPU/8088-80286/Intel %2080286 %20sectionDateien/286 %20Core.jpg. [30] http://www.cpu-world.com/CPUs/80386/die/L_Intel-A80386DX-25.jpg. [31] http://i32.tinypic.com/2cd7sds.jpg. [32] http://i32.tinypic.com/2lmnkh4.jpg. [33] http://i32.tinypic.com/2lmnkh4.jpg. [34] http://i26.tinypic.com/b5jo1x.jpg. [35] http://i29.tinypic.com/mwuvm9.jpg. [36] http://i26.tinypic.com/2vinh2r.jpg. [37] http://i25.tinypic.com/29wweb4.jpg. [38] http://muycomputer.com/les/264-10358-FOTO/Intel %20Xeon %208-core %202.jpg. [39] http://i30.tinypic.com/2z3t0gg.jpg.

13

[40] http://i32.tinypic.com/ibmgk3.jpg. [41] http://i25.tinypic.com/15f6sd5.jpg.

14

Anexo A Material del curso IE0503 Material del curso Estructuras de computadores digitales generado con LATEX

!"#$%&"'(' '$ )*&+( ,"-(

!"#$%& '$ ()*$)+$,-& %."/,+"& 0&"#%/&' '$ ()*$)+$,-&

1&/$,+&% 2&,& $% "#,!3 ( 4546

!"#$%"$#&! '( )*+,$"&'*#(! -./."&0(! 1

!"#$# %&!'()*!+$)!$ ,-#)!.- /$0!1.-*+-2 3445

15

2.5.

Índice General

2.6.

Índice General

ii

Índice de guras

v

Índice de tablas

viii

1. Historia de las computadores

1

1.1.

Mecanismos primitivos de cálculo y sus inventores . . . . . . . . . . . . . . .

1.2.

Las Cinco Generaciones de Computadoras Modernas

5

1.2.1.

Primera Generación de Computadoras

. . . . . . . . . . . . . . . . .

5

1.2.2.

Segunda Generación de Computadoras

. . . . . . . . . . . . . . . . .

7

1.2.3.

Tercera Generación de Computadoras . . . . . . . . . . . . . . . . . .

8

1.2.4.

Cuarta generación de Computadoras

. . . . . . . . . . . . . . . . . .

9

1.2.5.

Quinta generación de Computadoras

. . . . . . . . . . . . . . . . . .

10

1.3.

Mercado de las PC-compatibles

. . . . . . . . . . . . . . . . . . . . . . . . .

11

1.4.

Breve reseña sobre los microprocesadores . . . . . . . . . . . . . . . . . . . .

12

2. La CPUCR 2.1.

2.2.

25

Arquitectura de un computador . . . . . . . . . . . . . . . . . . . . . . . . .

25

2.1.1.

Arquitectura de von Neumann . . . . . . . . . . . . . . . . . . . . . .

25

2.1.2.

Arquitectura de Harvard . . . . . . . . . . . . . . . . . . . . . . . . .

26

CPUCR: señales de control . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

2.2.1.

Bus de direcciones (A0 . . . A15 ) . . . . . . . . . . . . . . . . . . . . .

27

2.2.2.

Bus de datos (A0 . . . A7 )

. . . . . . . . . . . . . . . . . . . . . . . .

27

2.2.3.

Línea de reloj (RLJ ) . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

2.2.4.

Línea de reposición (RP S ) . . . . . . . . . . . . . . . . . . . . . . . .

28

2.2.5.

Línea de Lectura/Escritura (L/E ) . . . . . . . . . . . . . . . . . . . .

28

2.2.6.

Línea de referencia a memoria (M )

. . . . . . . . . . . . . . . . . . .

28

2.2.7.

Línea de ciclo de búsqueda (CB )

. . . . . . . . . . . . . . . . . . . .

28

2.2.8.

Línea de ciclo de memoria (CM )

. . . . . . . . . . . . . . . . . . . .

29

2.2.9.

Línea de indicación de detenido (HALT ) . . . . . . . . . . . . . . . .

29

2.2.10. Línea de solicitud de interrupción (IN T ) . . . . . . . . . . . . . . . .

29

2.2.11. Línea de aceptación de interrupción (INTOK ) . . . . . . . . . . . . .

29

2.2.12. Línea de solicitud de acceso directo a la memoria (SDM A) . . . . . .

30

2.2.13. Línea de indicación de buses disponibles (BD ) . . . . . . . . . . . . .

30

2.3.

CPUCR: Memoria principal

. . . . . . . . . . . . . . . . . . . . . . . . . . .

30

2.4.

CPUCR: Registros internos

. . . . . . . . . . . . . . . . . . . . . . . . . . .

31

ii

El contador de programa (PC )

2.4.2.

El acumulador (A)

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

2.4.3.

El registro de estado (S ) . . . . . . . . . . . . . . . . . . . . . . . . .

33

2.4.4.

El puntero de pila (P)

. . . . . . . . . . . . . . . . . . . . .

31

. . . . . . . . . . . . . . . . . . . . . . . . . .

35

CPUCR: Conjunto de instrucciones . . . . . . . . . . . . . . . . . . . . . . .

36

CPUCR: Modos de direccionamiento

40

. . . . . . . . . . . . . . . . . . . . . .

2.6.1.

Direccionamiento inmediato

. . . . . . . . . . . . . . . . . . . . . . .

41

2.6.2.

Direccionamiento absoluto . . . . . . . . . . . . . . . . . . . . . . . .

41

2.6.3.

Direccionamiento indirecto . . . . . . . . . . . . . . . . . . . . . . . .

42

2.6.4.

Direccionamiento relativo

. . . . . . . . . . . . . . . . . . . . . . . .

43

2.6.5.

Direccionamiento implícito . . . . . . . . . . . . . . . . . . . . . . . .

43

2.6.6.

Direccionamiento de acumulador

44

. . . . . . . . . . . . . . . . . . . .

3. Programación de computadores

45

3.1.

Diseño de programas

3.2.

Programación en lenguaje ensamblador . . . . . . . . . . . . . . . . . . . . .

46

3.2.1.

Simbología del lenguaje de máquina . . . . . . . . . . . . . . . . . . .

48

3.2.2.

Simbología para el ensamblador . . . . . . . . . . . . . . . . . . . . .

48

3.2.3.

Operaciones de control . . . . . . . . . . . . . . . . . . . . . . . . . .

51

3.2.4.

Lazos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

3.2.5.

Comparaciones entre números . . . . . . . . . . . . . . . . . . . . . .

53

3.2.6.

Programación con índices

. . . . . . . . . . . . . . . . . . . . . . . .

54

3.2.7.

Subrutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

3.2.8.

Aritmética de Múltiple Precisión

57

3.2.9.

Punto Flotante

1

. . . . . . . . . . . . .

2.4.1.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4. Sistemas de almacenamiento de datos 4.1.

4.2.

4.3.

4.4.

Jerarquía de memorias

45

62

67

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

4.1.1.

Memoria Virtual

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

4.1.2.

Memoria Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

4.1.3.

Memorias estáticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

Características de los medios de almacenamiento . . . . . . . . . . . . . . . .

74

4.2.1.

Medios de almacenamiento . . . . . . . . . . . . . . . . . . . . . . . .

75

4.2.2.

Tiempos de operación

75

4.2.3.

Modos de acceso

4.2.4.

Alterabilidad

4.2.5.

Permanencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Tipos de memorias

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78 79

4.3.1.

Memorias electrónicas de escritura y lectura

. . . . . . . . . . . . . .

79

4.3.2.

Memorias electrónicas dinámicas

. . . . . . . . . . . . . . . . . . . .

80

4.3.3.

Memorias electrónicas de solo lectura . . . . . . . . . . . . . . . . . .

82

4.3.4.

Memorias electrónicas borrables . . . . . . . . . . . . . . . . . . . . .

83

4.3.5.

Discos Flexibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

4.3.6.

Discos Duros

4.3.7.

El disco compacto . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Sistemas de archivos 4.4.1.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86 88

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

Sistema de archivos FAT . . . . . . . . . . . . . . . . . . . . . . . . .

89

iii

4.4.2.

Sistema de archivos NTFS . . . . . . . . . . . . . . . . . . . . . . . .

90

4.4.3.

Sistemas de archivos EXT2, EXT3 y EXT4

90

. . . . . . . . . . . . . .

5. Arquitectura de computadores y diseño de sistemas digitales 5.1.

5.2.

Arquitectura de computadores: aspectos relevantes . . . . . . . . . . . . . . .

6.2.

92

Segmentación (Pipelines) . . . . . . . . . . . . . . . . . . . . . . . . .

92

5.1.2.

Limitaciones de la segmentación . . . . . . . . . . . . . . . . . . . . .

94

5.1.3.

Computadoras con un conjunto de instrucciones complejo . . . . . . .

97

5.1.4.

Computadoras con un conjunto de instrucciones reducido . . . . . . .

97

5.1.5.

Superescalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

5.1.6.

Multiprocesadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

Índice de guras 1.1.

Abaco

. . . . . . . . . . . . . . . . . . . . . . . . . . .

99

1.3.

Blaise Pascal

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

5.2.1.

Lenguajes de descripción de hardware . . . . . . . . . . . . . . . . . .

99

1.4.

Maquina diferencial de Babbage . . . . . . . . . . . . . . . . . . . . . . . . .

2

5.2.2.

Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

1.6.

Maquina analítica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

101

1.7.

Herman Hollerith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.8.

George Boole

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.9.

Alan Turing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

Diseño de sistemas digitales

6. Ejemplos y laboratorios 6.1.

92

5.1.1.

Programas ejemplo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

101

6.1.1.

Operaciones de control . . . . . . . . . . . . . . . . . . . . . . . . . .

101

6.1.2.

Lazos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

103

6.1.3.

Comparaciones entre números . . . . . . . . . . . . . . . . . . . . . .

106

6.1.4.

Subrutina abierta . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

108

6.1.5.

Subrutina cerrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

108

6.1.6.

Aritmética de Múltiple Precisión y en Punto Flotante . . . . . . . . .

112

Laboratorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

117

6.2.1.

Mapas de memoria

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

117

6.2.2.

Programación CPUCR . . . . . . . . . . . . . . . . . . . . . . . . . .

121

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.10. Mark I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.11. ENIAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.13. UNIVAC I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1.14. El transistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

1.15. Robert Noyce

8

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.16. Gordon Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

1.17. Ley de Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

1.19. Steve Wozniak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.20. Computadora portátil Toshiba T1110

10

. . . . . . . . . . . . . . . . . . . . .

10

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

Bibliografía

135

1.21. Palm Pilot 1000

1.22. Procesador 4004 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

Anexos

138

1.23. Procesador 8080 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

A. Historia de las computadoras

138

1.24. Procesador 8086 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

1.25. Procesador 8088 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

1.26. Procesador 80286 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

1.27. Procesador 80386 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

1.28. Procesador 80486 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

1.29. Procesador Pentium I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

1.30. Procesador Pentium Pro 1.31. Procesador Pentium II

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

1.32. Procesador Pentium III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

1.33. Procesador Pentium IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

1.34. Procesador Itanium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.35. Procesador Xeon

23

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.36. Procesador Pentium M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.37. Procesador Dual Core

24 24

1.39. Procesador Core i7 2.1.

iv

23

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.38. Procesador Core 2 Duo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

Estructura de un computador IAS . . . . . . . . . . . . . . . . . . . . . . . .

26

v

2.2.

Estructura de un computador Harvard

. . . . . . . . . . . . . . . . . . . . .

26

5.2.

Secuencia de instrucciones con riesgos de dependencia . . . . . . . . . . . . .

2.3.

CPUCR0

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

5.3.

Entradas a la ALU sin unidad de anticipación

. . . . . . . . . . . . . . . . .

95

2.4.

CPUCR1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

5.4.

Entradas a la ALU con unidad de anticipación . . . . . . . . . . . . . . . . .

95

2.5.

Memoria de la CPUCR1

31

5.5.

2.6.

Registros y entradas/salidas de la CPUCR1

2.7.

Registro de estado (S)

2.8.

Código de instrución

2.9.

Direccionamiento inmediato

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

. . . . . . . . . . . . . . . . . . . . . . . . . . .

42

2.10. Direccionamiento absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

2.11. Direccionamiento relativo

43

2.12. Direccionamiento implícito

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.13. Direccionamiento de acumulador

44

Secuencia de instrucciones segmentada con burbujas insertadas para resolver el riesgo de dependencia de datos. . . . . . . . . . . . . . . . . . . . . . . . .

5.6.

94

96

Secuencia de instrucciones segmentada con anticipación para resolver el riesgo de dependencia de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

96

6.2.

Algoritmo para ordenar tres números en orden ascendente

6.1.

Localizaciones X, Y, Z, A, B y C

. . . . . . . . . .

102

. . . . . . . . . . . . . . . . . . . . . . . .

102

6.3.

Algoritmo para ejemplo de utilización de lazos . . . . . . . . . . . . . . . . .

105

6.4.

Combinaciones posibles de las banderas N, Z, C y V . . . . . . . . . . . . . .

107 108

. . . . . . . . . . . . . . . . . . . . . . . .

44

6.5.

Comparación de números . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.1.

Programación en ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . .

47

6.6.

Ejemplo de subrutina cerrada

. . . . . . . . . . . . . . . . . . . . . . . . . .

109

3.2.

Almacenamiento de datos en memoria

50

6.7.

Subrutina para sumar dos números con PAL palabras de precisión . . . . . .

113

3.3.

Suma múltiple precisión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

6.8.

Algoritmo para una subrutina para multiplicación de dos números sin signo .

116

3.4.

Algoritmo para la multiplicación binaria de seis por tres

. . . . . . . . . . .

60

6.9.

Mapa de memoria para el laboratorio 1 . . . . . . . . . . . . . . . . . . . . .

118

3.5.

Representación en punto otante para la CPUCR

. . . . . . . . . . . . . . .

64

6.10. Mapa de memoria para el laboratorio 2 . . . . . . . . . . . . . . . . . . . . .

119

3.6.

algoritmo para suma de números en punto otante . . . . . . . . . . . . . . .

66

6.11. Diagrama de ujo para programa de laboratorio 2 . . . . . . . . . . . . . . .

121

6.12. Diagramas de ujo para práctica

. . . . . . . . . . . . . . . . . . . . . . . .

127

6.13. Circuito para solucionar ejercicio 5. . . . . . . . . . . . . . . . . . . . . . . .

130

. . . . . . . . . . . . . . . . . . . . .

4.1.

Jerarquía de memorias

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

4.2.

Memoria virtual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

4.3.

Contenido de la memoria asociativa, memoria virtual. . . . . . . . . . . . . .

70

4.4.

Procesador, memoria cache y memoria principal . . . . . . . . . . . . . . . .

70

4.5.

Flujo para la operación de lectura en cache.

71

4.6.

Caches y conexiones externas del procesador Pentium III . . . . . . . . . . .

4.7.

Diagrama de transición de estados del protocolo MESI

. . . . . . . . . . . .

73

4.8.

Celda de una memoria SRAM . . . . . . . . . . . . . . . . . . . . . . . . . .

74

4.9.

Esquema de acceso aleatorio a una memoria

76

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

4.10. Esquema de acceso seudoaleatorio a una memoria 4.11. Esquema de acceso secuencial a una memoria

. . . . . . . . . . . . . . .

72

77

. . . . . . . . . . . . . . . . .

77

4.12. Diagrama de una celda de memoria . . . . . . . . . . . . . . . . . . . . . . .

79

4.13. Arreglo de memoria con direccionamiento coincidente . . . . . . . . . . . . .

80

4.14. Estructura completa de una memoria estática sencilla . . . . . . . . . . . . .

81

4.15. Estructura de una celda dinámica . . . . . . . . . . . . . . . . . . . . . . . .

81

4.16. Memoria dinámica sencilla . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

4.17. Memoria tipo ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

4.18. Memoria tipo PROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

4.19. Memoria tipo EPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

4.20. Dispositivo de almacenamiento USB tipo ash

84

. . . . . . . . . . . . . . . .

4.21. Estructura de un disco exible . . . . . . . . . . . . . . . . . . . . . . . . . .

85

4.22. Estructura interna de un disco duro

. . . . . . . . . . . . . . . . . . . . . .

87

4.23. Estructura y funcionamiento del disco compacto . . . . . . . . . . . . . . . .

88

4.24. Estructura de un sistema archivos FAT

. . . . . . . . . . . . . . . . . . . .

89

4.25. Estructura de un sistema archivos NTFS . . . . . . . . . . . . . . . . . . . .

90

4.26. Estructura de un sistema archivos EXT2 . . . . . . . . . . . . . . . . . . . .

91

5.1.

93

Ejecución de tres instrucciones sin segmentación y con segmentación . . . . .

vi

vii

Nomenclatura ←− (@0143) signica

Ciclo de reloj: es el equivalente a un período

tino. Así por ejemplo A

básico de la señal de reloj.

que el contenido de la localización @0143 se copiará para que sea el nuevo contenido del

Índice de tablas

A: Acumulador

registro A. La operación de movimiento de datos, deja el contenido de la fuente inal-

(A): se reere al contenido del acumulador.

terado. El contenido original del destino se pierde y es sustituido por el contenido de la

2.1.

Signicado de los mnemotécnicos de la CPUCR

2.2.

Conjunto de instrucciones de la CPUCR

2.3.

Ejemplo de ejecución de instrucciones en CPUCR0

2.4.

Instrucciones de la CPUCR

3.1.

Prejos para diferentes bases . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

3.2.

Código de caracteres para la CPUCR . . . . . . . . . . . . . . . . . . . . . .

51

3.3.

Operadores para el ensamblador . . . . . . . . . . . . . . . . . . . . . . . . .

52

3.4.

Representaciones en punto otante

63

6.1.

Comparaciones más usadas entre dos números

6.2. 6.3.

C: Bandera de acarreo

fuente.

↑:

. . . . . . . . . . . . . . . .

38

. . . . . . . . . . . . . . . . . . . .

39

CPU: Unidad Central de Procesamiento o

. . . . . . . . . . . . . .

40

Central Processing Unit por sus siglas en in-

. . . . . . . . . . . . . . . . . . . . . . . . . . .

41

gles.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

107

Ejemplo de subrutinas abiertas

. . . . . . . . . . . . . . . . . . . . . . . . .

109

Ejemplo de macroinstrucciones

. . . . . . . . . . . . . . . . . . . . . . . . .

112

Desapilar. Toma un operando del tope

de la pila y lo transere a un registro, en nuestro caso al acumulador A. Esta transferencia cambia el tope de la pila al siguiente

DI: Dirección de donde se obtiene la instruc-

operando.

ción.

↓: Apilar. Toma el contenido de un registro y

I: Bandera de interrupción

lo transere al tope de la pila. El contenido del registro no se altera en la operación.

M: Dirección efectiva del operando. N: Bandera de signo

∩:

Realiza la función lógica

∪:

Realiza la función lógica

∀:

Realiza la función lógica

”Y”

bit a bit

”O”

bit a bit

”O”

exclusiva

entre dos operandos.

P: Apuntador de pila

entre dos operandos. PC: Contador de programa S: Registro de estado

bit a bit entre dos operandos.

˜: Realiza el complemento a dos del operando.

V: Bandera de rebase

[XX]: Dirección del operando o del contenido XX. [16] se reere a la localización de memo-

=⇒:

ria donde el número 16 está almacenado.

el programa. Normalmente, después que el

La echa de doble línea se utiliza para

representar secuencias de instrucciones en computador ha tomado la instrucción de la

(XXXX):

Contenido

de

la

localización

localización DI, tomará la siguiente instruc-

XXXX, (0143) se reere al contenido de la

ción, por ejemplo, de la localización DI+2.

localización 0143.

Esta secuencia se representa por

=⇒

DI+2.

Sin embargo, si el programa se deriva de la Z Bandera de cero

localización DI a la localización M, será indicado por

←−:

La echa de una línea representa la

operación copia y se utiliza para describir el movimiento de datos entre la fuente y el des-

viii

ix

=⇒

M (léase como váyase a M).

para evitar errores. En 1642, Blaise Pascal, hijo de un recolector de impuestos francés, inventó lo que llamó calculadora numérica de rueda, para ayudar a su padre con sus labores. Esta caja rectangular llamada Pascaline, usaba 8 perillas para sumar cifras de hasta 8 dígitos. Su instrumento uti-

Capítulo 1

lizaba la base de 10 para lograrlo. Si se movía una perilla diez lugares, o una vuelta completa, movía un lugar la perilla siguiente: la cifra de las decenas, y así sucesivamente. Su principal

Historia de las computadores

limitación era que solamente podía sumar, además de que solamente Pascal podía repararlas, sin mencionar que su costo era mayor que el de la mano de obra del personal sustituido. Aquí se comenzó a ver las primeras señales de la tecnofobia, pues muchos matemáticos temían ser reemplazados por las máquinas. En 1694, Gottfried Wilhem von Leibniz, un lósofo y matemáti-

Recopilado por Lochi Yu

co alemán, mejoró el Pascaline creando una máquina capaz de

Actualizado Agosto 2009

multiplicar. Como su predecesor, éste funcionaba con perillas y engranajes. Fue hasta 1820, cuando Charles Xavier Thomas de

Si el automóvil hubiera seguido la misma evolución que la computadora, un Rolls Royce costaría hoy $100, rendiría un millón de millas por galón de combustible, y explotaría una vez por año, matando a todos adentro.

Las computadoras están en todas las áreas de nuestras vidas cotidianas, ahora todo está

Colmar, un francés, inventó una calculadora mecánica capaz de realizar las 4 operaciones aritméticas básicas. Llamado el Aritmómetro, podía sumar, restar, multiplicar y dividir. Con su gran versatilidad, fue usado ampliamente hasta antes de la primera guerra mundial.

tan computarizado que no podríamos vivir sin ellas. ¾Pero de dónde vino toda esta tecnología

Figura 1.3: Blaise Pascal

El comienzo verdadero de la computación, como la conocemos, fue

y hacia dónde va? Para entender mejor el impacto de las computadoras y apreciar su inu-

por un profesor inglés de matemáticas, Charles Babbage (1791-1871).

encia en nuestras vidas, es importante conocer su evolución.

Frustrado por los múltiples errores en los cálculos de la Sociedad Real de Astronomía, exclamó: Deseo por Dios que estos cálculos fuera realizados por vapor!. Esto se debió a que el vapor se estaba utilizando

1.1.

Mecanismos primitivos de cálculo y sus inventores

como fuente de energía para la industria en esa época, pero con esto, se inició la era de automatización de computadoras. En 1812 Bab-

El ábaco emergió hace más de 5 mil años en Asia, y todavía se encuentra en uso, y puede

bage notó una armonía natural entre máquinas y las matemáticas: las

ser considerada la primera computadora. Permite a los usuarios realizar cómputos usando un

máquinas eran óptimas para ejecutar tareas repetidamente y sin er-

sistema de chas sobre alambres. Fue utilizado por los mercantes para realizar sus transac-

Figura

ciones. Pero el uso del papel y lápiz hizo que el ábaco perdiera su importancia.

Maquina

1.4:

ror; mientras que las matemáticas, particularmente la producción de

difer-

tablas matemáticas, requerían sencillamente de una repetición de pa-

encial de Babbage

El Ábaco El valor asignado a cada cha no está determinado por su forma o color, sino por su posición: una cha en una posición particular tiene el valor de 1, en la siguiente línea, tendrá el valor de 10, y el siguiente de 100. Entonces, dos chas colocadas en la primera línea y otra en la siguiente dan el valor de 12. Por este medio, se usan pocas chas para representar números grandes.

Figura 1.1: Abaco

sos.

El problema se centró en la aplicar la habilidad de las máquinas a las necesidades de las matemáticas. Su primer intento de resolver este problema fue en 1822, cuando propuso una máquina que resolviera ecuaciones diferenciales, llamada Máquina Diferencial. Éste era impulsada por vapor, era tan grande como un tren, y podía tener un programa almacenado y ejecutar cálculos e imprimir los resultados automáticamente. Luego de trabajar en la máquina diferencial por 10 años, Babbage decidió trabajar sobre la primera computadora de uso general, que le llamó la Máquina Analítica. La máquina analítica estaba dividida funcionalmente en dos grandes partes: una que ordenaba y otra que ejecutaba las órdenes. La que ejecutaba las órdenes era una versión muy ampliada de la máquina de Pascal, mientras que la otra era la parte clave. La innovación consistía en que el usuario podía, cambiando las

Más de 1000 años después del ábaco, no se logró mayor avance. Para los cálculos complejos, se requería múltiples personas realizando el mismo largo cálculo: esta redundancia era

1

especicaciones de control, lograr que la misma máquina ejecutara operaciones complejas, diferentes de las hechas antes.

2

Además contaba con una sección en donde se recibían los datos para trabajar. La máquina

mente electrónica, que aplicara álgebra de Boole a la circuitería de la computadora. George

seguía las instrucciones dadas por la unidad de control, las cuales indicaban qué hacer con

Boole trabajó en la mitad del siglo 19, en una claricación del sistema binario de álgebra, que

los datos de entrada, para obtener luego los resultados deseados.

establecía que cualquier ecuación matemática podía asignarse como verdadera o falsa. Extendiendo este concepto a circuitos electrónicos en la forma de on u o (encendido o apagado).

Su asistente, Augusta Ada King, fue fundamental para el diseño de esta máquina. Ayudó a revisar los planos, ase-

Atanaso y Berry desarrollaron la primera computadora completamente electrónica en 1940. Su proyecto fue perdiendo sus fondos y eclipsado por otros desarrollos de otros cientícos.

gurar fondos del gobierno inglés, y comunicarle los datos al público. También, su entendimiento de la máquina le

George Boole desarrollo su teoría tratando de describir la lógica con dos acciones básicas: a) Acción 1 Y Acción 2. b) Acción 1 O Acción 2. Fue una curiosidad matemática por casi un siglo, hasta que Claude Shannon en 1930 lo re-descubrió cuando buscaba una manera de describir el comportamiento de circuitos digitales. Es un caso más donde la investigación básica nutre a la investigación aplicada.

permitió crear las rutinas de instrucción que eran administradas a la computadora, haciéndola la primer prograFigura 1.6: Maquina analítica

madora de computadoras en el mundo. En los años 80s, el Departamento de Defensa Estadounidense nombró un lenguaje de programación como ADA, en su honor.

Su máquina impulsada por vapor, nunca fue construida, y se vería primitiva para nuestros estándares actuales. No obstante, delineó los elementos básicos de la computadora de uso general y fue un avance muy importante. Consistía en más de 50 mil componentes, desde tarjetas perforadas, una memoria para 1000 números de hasta 50 dígitos decimales. También

Figura 1.8: George Boole

contenía un molino con una unidad de control que permitía el procesamiento de instrucciones en cualquier secuencia, y dispositivos de salida para producir los resultados impresos. Babbage tomó la idea de tarjetas perforadas de Joseph-Marie Jacquard, que utilizó tarjetas perforadas para controlar los patrones de los hilares.

Mientras tanto, en el Reino Unido, el matemático Alan Turing (1912-1954) presentó en 1936 el trabajo On Computable Numbers, donde describía un dispositivo hipotético, la máquina Turing, que pre-

En 1889, un inventor estadounidense, Herman Hollerith, también aplicó el concepto de Jacquar para la computación. Su primer tarea fue de encontrar una manera más fácil de computar el censo estadounidense. Los censos previos de 1880, tomaban cerca de 7 años para contabilizar, y con su población creciente, se calculaba que tomaría unos 10 años para contabilizar el siguiente censo. A diferencia de Babbage, donde utilizó tarjetas perforadas para instruir a la máquina, Hollerith utilizó las tarjetas para almacenar información, que posteriormente era administrada a otra máquina la cual los compilaba mecánicamente.

sagiaba las computadoras programables. La máquina Turing fue diseñada para efectuar operaciones lógicas, y podía leer, escribir o borrar símbolos escritos en cuadros en una cinta de papel. Este tipo de máquina llegó a conocerse como una máquina de estados, debido a que en cada paso del cómputo, la siguiente acción de la máquina era comparada contra una lista de instrucciones de todos los estados posibles.

Figura Turing

Cada perforación en una tarjeta representaba un número, y combinaciones de dos huecos representaban una letra. Se podían almacenar hasta 80 variables en una tarjeta. En vez de 10 años, los datos del censo fueron contabilizados en solamente 6 semanas, con la máquina de Hollerith. Además de su velocidad, las tarjetas servían como método de almacenamiento y reducían los errores computacionales. Hollerith fundó la Tabulating Machine Company en 1896, para vender su idea al mundo de los negocios. En 1924 ser convirtió en la International Business Machines (IBM). Figura 1.7: Herman En los años siguientes, otros ingenieros lograron otros avances. Van-

Hollerith

nevar Bush desarrolló en 1931 una calculadora para resolver ecuaciones diferenciales. La máquina permitió resolver ecuaciones diferenciales complejas que apremiaban por mucho tiempo los cientícos y matemáticos. La máquina era grande y compleja, difícil de utilizar, pues cientos de perillas eran requeridas para representar los números y las relaciones entre ellas. Para eliminar estas molestias, John V. Atanoso, profesor del Iowa State College y su estudiante de posgrado, Clior Berry, imaginaron una computadora total-

3

4

1.9:

Alan

1.2.

Las Cinco Generaciones de Computadoras Modernas

En la mitad de los 40s, John von Neumann se unió al equipo de la Universidad de Pennsylvania, formulando conceptos de diseño de computadoras que permanecieron centrales a

1.2.1.

Primera Generación de Computadoras

la ingeniería en computación por los siguientes 40 años. Von Neumann junto a los Eckert y

(1945-1956)

Mauchly, diseñaron el EDVAC, Electronic Discrete Variable Automatic Computer en 1945

Con el inicio de la Segunda Guerra Mundial, los gobiernos buscaron desarrollar computa-

permitía parar la computadora en cualquier punto y reiniciar, permitiendo mayor versatili-

doras para explotar su importancia estratégica potencial. Esto aumentó el nanciamiento de

dad a la programación de computadoras. El elemento clave en la arquitectura era la unidad

los proyectos de desarrollo de proyectos y aceleró el progreso tecnológico. En 1941, Konrad

de procesamiento central, que permitía que todas las funciones de la computadora fueran

Zuse, ingeniero alemán, desarrolló la computadora Z3, para diseñar aviones y misiles. La Z3

coordinadas por una misma fuente.

con suciente memoria para almacenar un programa y los datos. Esta memoria almacenada

utilizaba perforaciones en lm y el sistema de numeración binario, basados en 1s y 0s en vez del sistema de numeración decimal. Las fuerzas aliadas hicieron más esfuerzo, y en 1943, los británicos completaron una computadora para descifrar códigos secretos, llamado Colossus. El problema era que no era una computadora de uso general, sino para decodicar mensajes alemanes secretos. Luego, fue mantenida en secreto hasta décadas luego de la guerra. Del lado americano, Howard H. Aiken, ingeniero de Harvard trabajando para la IBM, produjo una calculadora totalmente electrónica en 1944. El objetivo de esta era crear tablas balísticas para la Marina Estadounidense. Era tan grande como media cancha de fútbol y tenía 500 millas de alambrados. El Harvard-IBM Automatic Sequence Controlled Calculator, o Mark I, era una computadora electrónica de relevadores. Usaba señales electromagnéticas para mover las partes mecánicas. La máquina era lenta (duraba 3 a 5 segundos por cálculo)

Figura 1.10: Mark I

e inexible (en que la secuencias de cálculos no podían cambiar), pero podía ejecutar aritmética básica así como ecuaciones complejas. Podía realizar las 4 operaciones básicas, y subrutinas para las funciones trigonométricas y logarítmicas. En 1951, el Universal Automatic Computer, UNIOtra computadora desarrollada por motivos de la guer-

VAC I, construida por Remington Rand (la cual adquir-

ra fue la Electronic Numerical Integrator and Computer

ió la empresa de Eckert y Mauchly), fue de las primeras

(ENIAC), producida entre el gobierno estadounidense y

computadoras disponibles comercialmente para permi-

la Universidad de Pennsylvania. Consistía en 18 mil tu-

tir utilizar estos avances. Uno de los primeros logros

bos al vacío, 70 mil resistencias, 5 millones de uniones

fue que predijo el ganador de la elección presidencial

soldadas en un área de 167 metros cuadrados, y la com-

de 1952 en EEUU, Dwight D. Eisenhower.

putadora consumía 160 KW de potencia eléctrica. Desarrollada por John Presper Eckert y John W. Mauchly,

Figura 1.13: UNIVAC I

el ENIAC sí era una computadora de uso general, 1000 veces más rápida que la Mark I.

La IBM comenzó a fabricar computadoras hasta después de 1950. Previamente solo estaba Figura 1.11: ENIAC

en el negocio de las tarjetas perforadas y automatización en la empresa. Introdujo su computadora IBM 701 en 1952 y eventualmente se vendieron 19 unidades. Mucha gente pensaba

Realizaba saltos condicionales y era programable por medio de cables e interruptores, y

que el mercado era muy limitado para estas máquinas altamente especializadas.

la información era administrado por medio de tarjetas perforadas (se duraba entre media hora y un día entero). En 1949 calculó el valor de la constante p con 2037 decimales, lo cual requirió de 70 horas. Como , entre otras cosas, la máquina iba a reemplazar a un grupo de matemáticas que hacía cómputos numéricos para una ocina especializada del gobierno estadounidense, tomó el nombre de ellas: computadoras.

5

6

Fue el programa almacenable y el lenguaje de programación que le dio a las computadoras la exibilidad para nalmente ser efectivos y productivos para el uso empresarial. El concepto de tener un programa almacenado signicaba que las instrucciones para una función en particular, que estaban dentro de la memoLa primera generación de computadoras era caracterizado por el

ria, podían ser rápidamente sustituidas por otro grupo de instruc-

hecho de que las instrucciones de operación eran hechas a la medida

ciones (otro programa) para efectuar otra función. Una computa-

para tareas especícas, donde la computadora iba a ser utilizada.

dora podía imprimir recibos a clientes y minutos después dis-

Cada computadora tenía un programa en lenguaje de máquina que

eñar productos o calcular pagos. Lenguajes más sosticados de

indicaba su modo de operación. Esto hacía que fuera difícil de pro-

alto nivel como COBOL (Common Business Oriented Language) y FORTRAN (Formula

gramar y limitaba su versatilidad y velocidad. Otras características

Translator) entraron en uso en este tiempo, y se han expandido hasta hoy. Estos lenguajes

distintivas era que utilizaban tubos al vacío, consumiendo mucho es-

reemplazaron el código binario del lenguaje de máquina con palabras, oraciones y fórmulas

pacio, potencia y mantenimiento, pues se quemaban frecuentemente,

matemáticas, haciendo fácil la programación de la computadora. Se crearon nuevos tipos de

obligando a una inspección lenta de todos los tubos.

carreras (programador, analista de sistemas) y toda la industria del software empezó con la

Figura 1.14: El transistor

segunda generación de computadoras.

1.2.2.

Segunda Generación de Computadoras (1956-1963)

1.2.3.

Tercera Generación de Computadoras (1964-1971)

En 1948, la invención del transistor cambió radicalmente el desarrollo de las computadoras. Éste reemplazó los tubos al vacío, en televisores, radios y computadoras. Como resultado, toda la maquinar-

En 1964 Digital Equipment Corporation (DEC) mostró su PDP-8, la

ia electrónica ha estado miniaturizándose desde entonces. El tran-

primera minicomputadora comercial. Fue todo un logro en cuanto al cos-

sistor ha estado en computadoras desde 1956. Las computadoras

to: menos de $20 mil. Aunque los transistores era un mejoramiento sobre

de segunda generación eran más pequeñas, más conables, rápi-

los tubos al vacío, todavía generaban suciente calor como para dañar

das y ecientes que sus predecesoras. Las primeras máquinas que

las otras partes sensibles del computador. Robert Noyce (cofundador de

aprovecharon esto fueron las primeras supercomputadoras, Stretch

Intel con Gordon Moore) trabajaba en Fairchild Semiconductors en 1959,

de IBM y LARC de Sperry-Rand. Ambos fueron creados para mane-

e ideó el plan de construir múltiples transistores en una misma pieza de

jar grandes volúmenes de datos en laboratorios de energía atómica.

silicio. Noyce lo llamó circuito integrado, (IC): Yo era perezoso, no tenía

Eran costosas y no eran tan atractivas. Las computadoras de segun-

sentido poner a gente a soldar todos los componentes cuando se podían

da generación reemplazaron el lenguaje de máquina con lenguaje

fabricar todos juntos.

Figura

1.15:

Robert Noyce

ensamblador, permitiendo códigos abreviados en vez de códigos biYa Jack Kilby de Texas Instruments había intentado solucionar este

narios extensos.

problema: había logrado fabricar componentes discretos en una misma lámina de germanio, pero las interconexiones debían de ser soldadas a A los largo de los 60s, hubo un número de computadoras de segunda generación exitosos,

mano. Este proceso no podía implementarse para producción en masa. El

y utilizados en negocios, universidades, y en el gobierno. Eran de empresas como Burroughs,

circuito integrado constituía transistores en un disco pequeño de silicio.

Contro Data, Honeywell, IBM y Sperry-Rand. Estas computadoras también eran de diseño de

Posteriormente las mejoras en tecnologías de fabricación permitían integrar aún más componentes, haciendo que las computadoras disminuyeran

estado sólido, y contenían transistores en vez de tubos al vacío. Contenían además todos los componentes que asociamos al presente a la computadora moderna: impresoras, almacenaje

Figura

en cinta, disco, memoria, sistemas operativos y programas almacenados. Un ejemplo impor-

Gordon Moore

tante fue el IBM 1401 que era considerado el Modelo T de la industria de la computación. En 1965, la mayoría de empresas grandes procesaban la información nanciera utilizando

1.16:

más de tamaño. Primero Noyce puso dos o tres componentes en un mismo integrado, luego decenas, centenares, y luego millares. Jack Kilby ganó el Premio Nóbel de Física por este desarrollo. Roberto Noyce hubiera sido

premiado también, pero ya había fallecido para entonces.

computadoras de segunda generación.

7

8

Otro desarrollo de tercera generación incluyó el sistema operativo, que permitía que difer-

de LEDs en el pánel. Su aparición en la revista Popular Electronics fue todo un suceso,

entes programas corrieran al mismo tiempo en con un programa central que monitorizaba y

pues representaba que el usuario corriente podía tener su propia computadora y programarla.

coordinaba el sistema con la memoria principal. Las computadoras llegaron entonces al público en general por ahí de los años 70s. Estas minicomputadoras venían con software amigable, con muchas aplicaciones como procesador de palabras, hojas de cálculo, etc. Los pioneros de este campo fueron Commodore, Radio Shack y Apple Computer. En los años 80s, los video juegos como Pac Man y sistemas como la Atari, iniciaron el interés del público por computadoras más sosticadas y más programables. Steve Wosniak programó el sistema operativo, diseñó, construyó la computadora Apple II en 1977 y con ello comenzó la era de computadoras personales de bajo costo y alto volumen.

Figura

1.19:

Steve

Wozniak Figura 1.17: Ley de Moore

1.2.5. 1.2.4.

Quinta generación de Computadoras (1981-actualidad)

Cuarta generación de Computadoras (1971-1981)

En 1981 IBM introdujo su computadora personal (PC) para el uso en el hogar, ocina y escuelas. Posteriormente con el adven-

Luego de los circuitos integrados, la dirección fue de disminuir aún más el tamaño. La in-

imiento de los PC- compatibles o clones, hubo una expansión del

tegración a gran escala integraba cientos de componentes en un solo chip. Ya en los años

uso de la computadora en esas tres áreas. El número de computa-

80s, la Integración a muy gran escala (VLSI) integraba cientos de miles de componentes. La

doras personales en uso pasó de 2 millones en 1981 a 5.5 millones

integración de Ultra gran escala (ULSI) aumentó el número a los millones. Este aumento de

el año siguiente. Diez años después, 65 millones de PCs eran us-

componentes junto con la disminución en el tamaño abarató los costos, e hizo más accesible

adas. Las computadoras fueron disminuyendo de tamaño, pasando a

las computadoras al público en general. También aumentó su potencia, eciencia y conabili-

ser portátiles, y luego a ser de bolsillo. La línea Macintosh de Apple

dad. El chip 4004 de Intel, desarrollado en 1971, siguió un paso más allá al combinar todos los

Computer pasó a ser una de los rivales directos de IBM. Su atractivo

componentes de una computadora en un chip. Ahora un solo microprocesador podía cumplir

era su diseño amistoso, donde el sistema operativo permitía mover

varias demandas según su conguración y programación. Pronto, artículos como hornos de

iconos en la pantalla en vez de escribir instrucciones. El movimiento

microondas, televisores, y automóviles incorporaron microprocesadores.

era controlado por un mouse o ratón, que traducía el movimiento de

Figura putadora

1.20:

Comportátil

Toshiba T1110

la mano a la computadora. El tamaño de las computadoras seguía disminuyendo para el año 1985 Toshiba lanza la T1100, la cual fue conocida como la primer computadora portátil que se vendió masivamente. A nales de los años ochenta el CERN de Ginebra desarrolla el lenguaje HTML y para principios de los años noventa crean el primer servidor web llamado World Wide Web, de esta forma nace la internet. En el año 1996 Palm saca al mercado su primer computador de bolsillo el Pilot 1000, la cual contaba con un procesador de 16 MHz y una memoria ram de 128 Kb. A partir del año 2008 empezaron a salir las llamadas netbooks, computadores ultra ligeras capaces de albergar sistemas operativos completos de igual forma que una PC, pero con ciertas limitaciones en su capacidad. El procesador 8008 fue el sucesor del 4004, y en vez de tener 4 bits, tenía 8. Posteriormente vino el 8080, el cual dio luz al primero computador: el Altair 8800 en 1975. Este computador se programaba con interruptores en el frente y la salida se observaba por medio

9

10

y en vez de producir su propia computadora, empezó a vendérsela a otros fabricantes (a $25 el chip). Pronto, aparecieron múltiples computadoras compatibles con la IBM. Esto inició el mercado de lo que se conocía como las IBM compatibles, posteriormente PC compatibles, o clones. Seguidamente los fabricantes de los clones iban con precios bastante competitivos, aprovechándose de los fabricantes de componentes de teclados, discos duros, tarjetas, de Taiwán y Corea, donde sus precios eran una fracción de los de los estadounidenses. Esto provocó una disminución progresiva de precios, que aumentó la accesibilidad de los equipos para el público en general, el cual le encontró cada vez más usos. La industria del software oreció para lograr aún más dependencia y aumentar más el mercado de las computadoras.

Figura 1.21: Palm Pilot 1000

Mientras las computadoras se volvían más populares en el trabajo, se formaron nuevas maneras de aprovechar su potencial. Se comenzaron a conectar unas a otras, compartir recursos, y a comunicarse. Al contrario de las supercomputadoras donde una computadora potente estaba conectada a muchos terminales, las computadoras en red compartían entre

1.3.

Mercado de las PC-compatibles

La IBM estaba dispuesta a entrar al mercado de las computadoras personales, y dispuso

todas todos los recursos. Utilizando redes locales, conexiones directas y líneas telefónicas, estas redes surgieron y posteriormente creó una red global de computadoras. La Internet es el ejemplo de ello.

de solamente un año para que su equipo de ingenieros en Boca Raton, Florida, lo diseñara. Debido al poco tiempo disponible, se decidió fabricarlo casi completamente de componentes disponibles comercialmente en ese momento. Se decidió utilizar el microprocesador 8086 de Intel, y el sistema operativo MS-DOS de Microsoft (el cual tenía derecho de venderle el sistema operativo a otros fabricantes de computadoras). La única pieza de la computadora, propietaria, o sea que estaba patentada por IBM, era el BIOS. El BIOS signica Basic Input Output System, que es el programa residente en la tarjeta madre del computador que se encarga de servir de puente entre el sistema operativo

1.4.

Breve reseña sobre los microprocesadores

Los procesadores posteriores del 8080 que sacó Intel fueron el 8086, 8088 (versión disminuida del 8086), 80286, 80386, 486, Pentium, Xeon e Itanium. Otros procesadores importantes fueron: 6502 (Apple II y Commodore), los de Motorota 68000, 68020, 68030, 68040, y PowerPC.

y el hardware subyacente. Es el primer programa que corre al encender la computadora y es el encargado de cargar el sistema operativo y de la conguración básica. La IBM estaba conada de la estrategia debido a que había patentado el BIOS y publicado su código fuente. Aún en el caso de que pudieran crear otro BIOS, solamente IBM podría comprar los componentes en tan gran cantidad que sus precios siempre serían los mejores. Además el hecho de haber publicado su código era un arma importante: un programador, luego de haber visto aunque sea una vez ese código, le era extremadamente difícil no reproducir aún parcialmente parte del mismo, violando la patente entonces. La única forma de hacerlo seguramente era que fuera programado por ingenieros que nunca hubieran leído el código.

Procesador: 4004 Fecha de introducción: 1971 Frecuencia Inicial: 108Khz 640 bytes Transistores: 2300 Ancho de vías: 10 micras

En febrero de 1982, tres ingenieros: Rod Canion, Jim Harris, Bill Murto, se reunieron en un restaurante para discutir la creación de una nueva empresa. Los tres eran managers experimentados de Texas Instruments. Sus ideas nalistas fueron dos: un restaurante de comida

Figura 1.22: Procesador 4004

mexicana o una empresa de computadoras. Se decidieron por la segunda opción. Utilizando ingeniería reversa, tomando el BIOS de IBM como una caja negra y estudiando sus entradas y salidas, pero sin ver el código patentado, 15 programadores expertos lograron reproducir un BIOS 100tomó casi un año y 1 millón de dólares. Esta empresa llegaría a conocerse como Compaq Computer, que creó la primera computadora totalmente compatible con la IBM. Posteriormente otra empresa llamada Phoenix Technologies produjo otra versión del BIOS

11

12

Procesador: 8080 Fecha de introducción: 1974 Frecuencia Inicial: 2 MHz

Procesador: 8086

16 KB

Fecha de introducción: 1978

Transistores: 6000

Frecuencia Inicial: 5 MHz

Ancho de vías: 6 micras

Transistores: 29000 Ancho de vías: 3 micrones

Figura 1.23: Procesador 8080

Figura 1.24: Procesador 8086

13

14

Procesador: 8088

Procesador: 80286

Fecha de introducción: 1978

Fecha de introducción: 1982

Frecuencia Inicial: 5 MHz

Frecuencias: 6 a 12MHz

1 MB

16 MB

Transistores: 29000

Transistores: 134000

Ancho de vías: 3 micras

Ancho de vías: 1.5 micrones

Figura 1.26: Procesador 80286

Figura 1.25: Procesador 8088

15

16

Procesador: 80486 Fecha de introducción: 1989 Frecuencias: 25 a 100MHz 4 GB Procesador: 80386

Transistores: 1.2 millones

Fecha de introducción: 1985

Ancho de vías: 0.8 micras

Frecuencias: 16 a 33MHz 4 GB Transistores: 275000

Figura 1.28: Procesador 80486

Ancho de vías: 1 micra

Figura 1.27: Procesador 80386

Procesador: Pentium I Fecha de introducción: 1993 Frecuencias: 66 a 233 MHz Transistores: 3.1 a 4.5 millones Ancho de vías: 0.35 micras

Figura 1.29: Procesador Pentium I

17

18

Procesador: Pentium II Fecha de introducción: 1997 Frecuencias: 233 a 450 MHz Procesador: Pentium Pro

Transistores: 7.5 millones

Fecha de introducción: 1995

Tamaño de transistor: 280nm

Frecuencias: 150 a 200 MHz

Ancho de vías: 0.25 micras

Transistores: 5.5 millones Ancho de vías: 0.35 micras

Figura 1.31: Procesador Pentium II

Figura 1.30: Procesador Pentium Pro

19

20

Procesador: Pentium III

Procesador: Pentium IV

Fecha de introducción: 1999

Fecha de introducción: 2000

Frecuencia Inicial: 450MHz a 1.3 GHz

Frecuencias: 1.4 a 3.7 GHz

Transistores: 28 millones

Transistores: 42 a 178 millones

Tamaño de transistor: 180nm

Tamaño de transistor: 180nm

Ancho de vías: 0.18 micras

Ancho de vías: 0.09 micras

Figura 1.32: Procesador Pentium III

21

Figura 1.33: Procesador Pentium IV

22

Procesador: Dual Core

Procesador: Itanium

Fecha de introducción: 2006

Fecha de introducción: 2001

Frecuencias: 1.3 GHz a 2.8 GHz

Frecuencia Inicial: 733MHz

Transistores: cerca de 410 millones

Transistores: 25 millones

Tamaño de transistor: 65 nm y 45 nm

Ancho de vías: 0.18 micras

Figura 1.37: Procesador Dual Core Figura 1.34: Procesador Itanium

Procesador: Core 2 Duo Fecha de introducción: 2006 Procesador: Xeon

Frecuencias: de 1.06 GHz a 3.33 GHz

Fecha de introducción: 2001

Transistores: 420 millones

Frecuencia Inicial: 1.7GHz

Tamaño de transistor: 65nm y 45nm

Transistores: 42 millones Ancho de vías: 0.18 micras

Figura 1.38: Procesador Core 2 Duo

Figura 1.35: Procesador Xeon

Procesador: Core i7 Fecha de introducción: 2008 Frecuencias: 2.66 GHz a 3.33 GHz

Procesador: Pentium M

Transistores: 731 millones

Fecha de introducción: 2003

Tamaño de transistor: 45nm.

Frecuencias: 900 MHz a 2,26 GHz Transistores: 77 millones Tamaño de transistor: 130nm Ancho de vías: 0.09 micras

Figura 1.39: Procesador Core i7

Figura 1.36: Procesador Pentium M

23

24

Capítulo 2 La CPUCR Con el n de crear un conocimiento básico en el estudio de las estructuras de computadores los ingenieros Dr. Randolph Steinvorth y el Ing. Marco Vásquez describieron la CPUCR utilizando conceptos aplicables a cualquier computador. Figura 2.1: Estructura de un computador IAS

2.1.

Arquitectura de un computador

2.1.1.

Arquitectura de von Neumann

2.1.2.

Arquitectura de Harvard

La arquitectura de John von Neumann fue propuesta en 1945 para un nuevo computador,

El termino proviene de la computadora Harvard Mark I, que almacenaba las instrucciones

el EDVAC (Electronic Discrete Variable Computer) pues cuando se trabajaba con la ENIAC

en cintas perforadas y los datos en interruptores, de manera contraria a la arquitectura de

era extremadamente tedioso cargar y modicar programas. El proceso de programación se

von Neumann, pues, en la arquitectura Harvard se utilizaban dispositivos de almacenamiento

tornaría más fácil si el programa tuviese una forma adecuada como para ser guardado en la

físicamente separados tanto para las instrucciones como para los datos.

memoria junto a los datos, asi, el computador tomaría sus instrucciones leyéndolas de memoria. Para 1946 von Neumann y sus colegas comenzaron el diseño de un nuevo computador de programa almacenado al que llamaron IAS. Un computador con esta arquitectura está compuesto por:

1. Una memoria principal que almacena datos e instrucciones, según las características de la aplicación los programas pueden estar en el computador almacenados en una memoria de solo lectura o bien ser cargados en memoria de lectura/escritura cuando van a ser ejecutados. Además los resultados intermedios, los parámetros utilizados por el programa y los resultados nales deben ser cargados en memoria de lectura/escritura. 2. Una unidad lógica aritmética encargada de realizar operaciones lógicas. 3. Una unidad de control que ejecuta las instrucciones localizadas en la memoria para su posterior ejecución. 4. Puertos de entrada/salida para conectar elementos periféricos gobernados por la unidad de control.

Figura 2.2: Estructura de un computador Harvard

25

26

2.2.

CPUCR: señales de control

2.2.3.

La CPUCR originalmente disponía de un bus de direcciones de 12 líneas, un bus de datos bidirecional de 6 bits y un bus de control de doce líneas. Sin embargo, en el año 2005 los ingenieros Esteban Ortiz Cubero y Warren Alvarado Pacheco se dieron la tarea de generar

Línea de reloj (RLJ )

Esta señal es recibida de una base de tiempos externa (una onda cuadrada de 2MHz que implica un periodo es de 500 ns) que sincroniza las acciones de la CPUCR, dichas acciones se completan en el anco decreciente del ciclo de reloj.

un modelo sintetizable en compuertas estándar de la CPUCR. Esta versión mejorada de la CPUCR disponía de un bus de direcciones de 16 líneas, un bus de datos bidireccional de 8 bits y se redujo el bus de control a once líneas debido a los requerimientos de espacio en silicio, eliminando la señal de WAIT de la descripción original.

2.2.4.

Línea de reposición (RP S )

Se activa en bajo e inicia el funcionamiento de la máquina llevándola a un estado inicial conocido a partir del cual comienza a operar, cancelando inmediatamente cualquier actividad en ejecución e inicializando el contador de programa en cero y poniendo en alto la bandera de inhibición de interrupción (I). Si la línea

RP S

está en alto, la CPUCR ejecuta su primera instrucción el la posición de

memoria @0000 y no acepta interrupciones en ese momento debido a que la bandera I se ha levantado anteriormente, esto permite correr un programa que lleve al sistema a un estado inicial conocido. Usualmente se desea que la línea

RP S

se active automáticamente al encenderse el com-

putador, o manualmente, por medio de un interruptor de contacto momentáneo que permita reponerlo en cualquier momento después del encendido.

Figura 2.3: CPUCR0

Figura 2.4: CPUCR1

2.2.5.

Línea de Lectura/Escritura (L/E )

Mediante la línea L/E la CPUCR le indica a la memoria principal y a los puertos de Adicionalmente a las líneas descritas en las guras 2.3 y 2.4 la CPUCR recibe su alimentación de potencia mediante VCC y REF.

entrada/salida el sentido en que se realizan las transferencias de datos. Un uno lógico indica que el dato se traslada de la memoria o puerto de entrada hacia la CPUCR (lectura), y un cero indica que el dato sale de la CPUCR (escritura).

2.2.1.

Bus de direcciones (A0

. . . A15 )

Originalmente, al solo poseer 12 líneas en el bus de direcciones se podían seleccionar hasta

2.2.6.

Línea de referencia a memoria (M )

4096 posiciones de memoria, al aumentar a 16 líneas del bus de direcciones en la CPUCR1 se

La CPUCR utiliza la línea M con el n de indicar si el valor en el bus de direcciones

tiene la capacidad de seleccionar cualquiera de las 65536 posiciones de memoria. Normalmente

corresponde a una dirección de memoria (M=1) o de puertos de E/S (M=0). Ya que la mayoría

estas líneas las maneja la CPUCR, pero durante el acceso directo a la memoria, la CPUCR

de las transacciones se llevan a cabo con la memoria, la línea M se mantiene generalmente

cede su control al dispositivo que va a realizar la transferencia.

en uno. Solo cuando se ejecuta una instrucción INP o una instrucción OUT es que se realiza una transacción con el espacio de E/S, poniéndose M en cero.

2.2.2.

Bus de datos (A0

. . . A7 )

El bus de datos constaba de 6 líneas para la CPUCR0 y de 8 líneas para la CPUCR1,

2.2.7.

Línea de ciclo de búsqueda (CB )

su utilidad radica en que sirve para trasladar instrucciones y datos entre la CPUCR, la

Durante el ciclo de búsqueda la CPUCR va a memoria para leer el código de la próxima

memoria y los puertos de E/S. El sentido que llevan los datos en el bus lo determina la línea

instrucción a ejecutar. La línea CB se pone en uno para indicar el inicio del ciclo de memo-

de lectura/escritura L/E, cuando la línea se encuentra en alto, se estarán leyendo los datos

ria en que esto se va a realizar. Con esta señal es posible detectar, externamente esta situación.

de la memoria, si por el contrario la línea se encuentra en bajo, se escribirán los datos en la memoria. El bus de datos también es cedido a un dispositivo externo durante la operación de acceso directo a la memoria.

Un caso en donde se puede utilizar CB es para sincronizar la lectura de los códigos de instrucción de uno o varios coprocesadores trabajando en conjunto con la CPUCR. El ciclo de búsqueda es fácilmente detectado por los coprocesadores y éstos pueden entonces observar en el bus de datos si la instrucción que viene es de ellos o pertenece a la CPUCR.

27

28

2.2.8.

Línea de ciclo de memoria (CM )

Todas las transacciones, ya sean instrucciones o datos, involucran un acceso al espacio memoria o un acceso al espacio de E/S. Este proceso se le generaliza con el nombre de ciclo de memoria. La línea CM le indica a los dispositivos externos a la CPUCR el inicio de un ciclo de memoria. Todos los ciclos de memoria contienen dos ciclos de reloj, CM identica al primero tomando un valor lógico de uno.

pueden completar la operación dentro del microsegundo que se dispone en el ciclo de memoria.

Línea de indicación de detenido (HALT )

Cuando la línea de salida HALT esta en alto la CPUCR está indicando que se acaba de ejecutar una instrucción HLT. En este caso la CPUCR esta totalmente detenida, por lo que no se ejecuta ninguna instrucción más y no se responde a ninguna petición externa a través de las líneas

IN T

y

SDM A.

Todas las otras líneas, incluyendo los buses de datos y direc-

ciones, permanecen en su estado al ejecutarse la instrucción HLT. La única forma de iniciar la operación de la CPUCR es mediante una operación de reposición. Esta línea se conectaría directamente a una luz indicadora para que el usuario de la CPUCR se percate de la situación. El mecanismo que provee la instrucción HLT con la línea de salida HALT resulta útil para que el procesador aborte todo tipo de actividad una vez que detecta una condición de error fatal en el sistema.

2.2.10.

Línea de solicitud de interrupción (IN T )

operan con este tipo de transferencia y la forma activarla es por nivel bajo.

IN T

puede ponerse en cero en cualquier momento y la CPUCR reconocerá la

solicitud únicamente después de terminar de ejecutar la presente instrucción y si la bandera I se encuentra en cero. El estado

IN T =0

entonces debe permanecer hasta que la CPUCR

reconozca la solicitud y sea vericada por medio de la señal INTOK.

2.2.11.

aligerando considerablemente el tiempo de respuesta, en situaciones donde varios dispositivos hacen uso del mecanismo de interrupción. La sincronización para esta operación se establece con la señal INTOK.

Línea de solicitud de acceso directo a la memoria (SDM A)

Esta entrada se activa con un nivel lógico de cero con el propósito de solicitar a la CPUCR que se libere el bus de direcciones, el bus de datos y las líneas L/E, M y CM para establecer una transferencia de datos directa entre algún dispositivo periférico y la memoria. La solicitud de DMA ("Direct Memory Access") es reconocida hasta que se termina la ejecución de la presente instrucción y si no hay una solicitud de interrupción pendiente (IN T =0). Si existe una solicitud de interrupción, esta es atendida primero, saltando a la rutina de servicio de interrupción y ejecutando la primera instrucción. Una vez ejecutada la primera instrucción se atiende la solicitud de DMA. Cuando la solicitud de DMA es reconocida, la línea BD se pone en uno al mismo tiempo que la CPUCR pone en tercer estado sus salidas del bus de direcciones, bus de datos, L/E, M y CM. El dispositivo puede entonces hacer uso de esas líneas para iniciar el acceso directo a la memoria. Mientras el dispositivo mantenga

SDM A

en cero, éste tendrá el control de

transferencias en el computador y la CPUCR estará detenida. Una vez que

SDM A=1

la

CPUCR tomará control de nuevo y continuará su operación normal.

La función de esta línea es recibir las solicitudes de interrupción de los periféricos que

La línea

el dispositivo que genera la interrupción puede suministrar directamente el vector necesario,

2.2.12.

Esta señal es útil para realizar transacciones de datos con dispositivos lentos, que no

2.2.9.

las posiciones de memoria @7700 y @7701. Mediante un esquema de asignación de prioridades,

Línea de aceptación de interrupción (INTOK )

La línea de salida INTOK indica que se acepta la solicitud de interrupción y marca los dos ciclos de memoria donde la CPUCR está adquiriendo el vector de interrupción. Cuando

Debido a este modo de funcionamiento, los dispositivos que soliciten DMA no deben prolongar su dominio del bus por mas de unos cuantos ciclos de memoria. Esto con el propósito de lograr que el dispositivo que solicitó el servicio de interrupción sea atendido oportunamente.

2.2.13.

Línea de indicación de buses disponibles (BD )

La salida BD es activa en nivel alto y sirve para indicar a los dispositivos que solicitaron DMA que su solicitud ha sido atendida. Una vez que BD=1 el bus de direcciones, el bus de datos y las líneas L/E, M y CM son puestos en tercer estado por la CPUCR. El dispositivo que solicitó el acceso directo a la memoria debe entonces hacer uso de las líneas cedidas para iniciar sus transacciones con la memoria. Mientras el dispositivo mantenga

SDM A=0 la SDM A

CPUCR mantendrá su condición de buses disponibles. Vea la descripción de la línea para más detalles.

INTOK se hace uno el periférico que pidió la interrupción debe remover su solicitud. Esto sirve para evitar que la subrutina de atención a interrupciones reconozca la solicitud que está procesando como una solicitud nueva. Si el dispositivo no está diseñado para eliminar su solicitud de esa manera, entonces le corresponde a la subrutina de servicio de interrupción borrar la solicitud antes de admitir nuevas interrupciones.

2.3.

CPUCR: Memoria principal

La memoria principal está compuesta de un gran número de palabras o localizaciones. Cada localización de memoria tiene una dirección. Si la memoria tiene 4096 palabras, sus direcciones serán 0, 1, 2, . . . , 4095. Una palabra o localización puede usarse para almacenar

INTOK se puede usar también para tener un sistema de interrupciones vectorialmente dirigido. Normalmente el único vector de interrupciones que tiene la CPUCR se adquiere de

29

un número binario (dato) o una instrucción del programa, codicada en forma binaria. Las instrucciones de un programa se almacenan en la memoria en localizaciones sucesivas. El

30

computador lee una instrucción de la memoria y la ejecuta. Entonces, lee la próxima instruc-

4095 direcciones)

ción y realiza otra operación y así sucesivamente. En algunos computadores la memoria es dividida en bloques iguales llamados páginas.

Para la CPUCR1 existe otro registro interno muy similar al PC, llamado RDR, que determina en realidad la próxima dirección a la que apunta el bus de datos.

El tamaño de la página varía de un sistema a otro y está la mayor parte de las veces condicionado a las necesidades de la CPU, para la CPUCR0 el tamaño de la memoria es de 4K palabras de 6 bits cada una (1K=1024), dividido en 64 páginas de 64 palabras cada una y para la CPUCR1 se tienen páginas de 256 posiciones de memoria con un bus de datos de 16 bits, es posible direccionar hasta 65536 posiciones de memoria, cada una con 8 bits.

Figura 2.6: Registros y entradas/salidas de la CPUCR1

2.4.2.

El acumulador (A)

El acumulador es el componente principal para la manipulación de datos. Este registro tiene la función de almacenar el resultado de operaciones lógicas y aritméticas, calculadas en la ALU, que involucran uno o dos operandos a la vez. En muchas de las arquitecturas de Figura 2.5: Memoria de la CPUCR1

computador, uno de los operandos proviene del acumulador y el segundo de la localización de memoria especicada por la instrucción. El resultado de la operación se mantiene usualmente en A. El computador puede probar el resultado en A para determinar si contiene

2.4. 2.4.1.

CPUCR: Registros internos El contador de programa (PC )

Al nal de la ejecución de cada instrucción, el contador de programa PC (del inglés Program Counter"), contiene la dirección de la localización de memoria que almacena la próxima instrucción del programa. Este registro sigue la ejecución del programa e incrementa el contador de programa durante la ejecución de cada instrucción. Finalmente, el PC contiene la dirección que apunta a la siguiente instrucción por ejecutarse. En algunos casos, el contenido de PC puede ser cambiado por el mismo programa, transriendo la ejecución de instrucciones

alguna condición especial, por ejemplo si es cero, negativo, positivo etc. y tomar diferentes decisiones basado en el resultado de la prueba. El tamaño del acumulador no se determina tan fácilmente como en el caso del PC, sino que depende de una serie de factores relacionados entre si. Como regla general, cuanto mayor sea su tamaño, se puede procesar en forma simultánea más información de cualquier tipo. Por lo tanto, se evidencia que el tamaño de A condiciona características del computador tales como su velocidad de ejecución, la precisión de sus operandos y en forma indirecta el formato de sus instrucciones. Sin embargo un acumulador grande requiere de mucha circuitería lo cual afecta considerablemente el costo total del computador, lo que lleva al eterno dilema de los ingenieros de ajustar convenientemente rendimiento y costo.

en otra sección del programa. Para tener acceso a un espacio total de memoria de 64k palabras es necesario un total de 16 bits en el registro PC. De esta forma se pueden generar direcciones del 0 al 65535 inclusive (anteriormente 4K palabras con 12 bits en el registro PC donde se podían generar de 0 a

31

El tamaño en bits del acumulador, determina el ancho de la memoria principal y esta es una de las características más importantes de una CPU. Los tamaños de palabra más frecuentes que se encuentran son 4, 8, 16, 32, 64 y 128 bits. La CPUCR1 ha sido rediseñada

32

para tener 8 bits en el acumulador, pues anteriormente se tenían solo 6 bits. Existen otras conguraciones de CPU que contienen un grupo de registros de uso general que duplican las funciones del acumulador. En estos computadores, se pueden realizar operaciones aritméticas no solamente entre los registros y alguna localización de memoria, sino entre los mismos registros. Esto permite gran exibilidad a la hora de hacer un programa y en ciertas ocasiones hasta se pueden mantener todas las variables del programa dentro de los registros de la CPU aumentando así la velocidad de ejecución del mismo.

2.4.3.

El registro de estado (S )

complemento a dos.

La bandera de rebase (V) Esta bandera sirve para detectar condiciones de rebase en operaciones aritméticas con signo. En forma general, el bit más signicativo de una palabra, bit 7, representa el signo de la magnitud contenida en los bits restantes, bits 6 a 0. Un 1 en el bit más signicativo, equivale a un signo negativo y un cero a un signo positivo. Los números con signo se representan en notación complemento a dos. La condición de rebase se presenta cuando el resultado de una operación tiene un valor

Este registro tiene la función de almacenar información importante para la programación, generalmente referente al contenido del acumulador o al estado de la CPU.

mayor que el que se puede contener en ocho bits, de -127 a +128. La bandera V se pone en 1 cuando se genera un llevo de la posición A6 a la posición A7, o de la posición A7 a la bandera de llevo C exclusivamente.

En la CPUCR, el registro de estado S (del inglés status), es un registro formado por ocho ip ops, cuatro de los cuales retienen información acerca del resultado de la última operación con el acumulador, y el restante se utiliza para memorizar una acción de control pertinente a la CPU. Los primeros cuatro son, según la Figura 2.2, los ip ops de: signo, N; rebase, V; cero, Z y acarreo, C. El último se llama ip-op de inhibición de interrupción I.

La bandera de cero (Z) Cuando todos los bits del acumulador se encuentran en cero, esta bandera se pone en 1.

La bandera de acarreo (C) El ip-op C, se utiliza como una extensión del acumulador para almacenar el acarreo

Comúnmente se les reere también como banderas de condición y se utilizan para tomar decisiones durante la ejecución del programa.

o debo que genera la posición A7 en las operaciones que superan su capacidad de números positivos de 8 bits. También, se utiliza para conectar en lazo, el dígito más signicativo y el menos signicativo de A. Este lazo se puede utilizar para desplazar el contenido de A hacia la izquierda o a la derecha, bajo control de programa.

La bandera de interrupción (I) Sirve para permitir o prohibir la interrupción externa del programa que se está ejecutando. En situaciones especiales, es necesario que un dispositivo externo interrumpa la ejecución del presente programa para que se le brinde atención inmediata. Como un ejemplo se podría citar una unidad de discos que está buscando los datos pedidos por la CPU; en el momento que se encuentran, la CPU debe tomarlos o de lo contrario se perderán, por causa de la rotación que lleva el disco y no volverán a estar disponibles sino hasta la siguiente vuelta. La interrupción permite a la CPU dejar el curso normal de sus labores para atender una situación especial.

Figura 2.7: Registro de estado (S)

También se puede dar el caso contrario: el computador está realizando una labor especial y no desea ser interrumpido. La bandera de interrupción I sirve para habilitar o inhibir las interrupciones a la CPUCR.

La bandera de signo (N) El contenido de esta bandera es copia el del bit más signicativo del acumulador. Este bit representa el signo del número en el acumulador si se interpreta como un número en

33

34

2.4.4.

El puntero de pila (P)

Es necesario recordar que los datos apilados bajo control de programa se desapilan en

La pila es un conjunto bien denido de posiciones de memoria, en la cual los datos entran (se apilan) y salen (se desapilan), siguiendo la regla El último que entra es el primero que sale . En inglés se le conoce como stack y la regla es Last In First Out o LIFO. Su función primordial es la de servir como medio para almacenar la dirección de retorno después de la ejecución de una subrutina. Las posiciones de memoria de la pila son direccionadas a partir

una secuencia inversa a la que fueron almacenados: Si el programa apila los datos U, V, X, Y y Z en ese orden, cuando los desapile, los deberá leer en el orden Z, Y, X, V y U. También es claro que, si al momento de salto o de retorno a una subrutina, el número de apilaciones no es igual al número de desapilaciones realizadas en esa subrutina, se perderá el control del programa, debido a información sobrante o faltante en la pila.

de un registro especial generador de direcciones llamado el apuntador de pila o puntero de la pila (P). Este registro es controlado automáticamente por la CPU para que el acceso a la

2.5.

CPUCR: Conjunto de instrucciones

pila se realice según la regla antes mencionada. Los computadores contienen una gran variedad de instrucciones determinadas según el Durante los accesos a la pila, la CPU se encarga de incrementar el puntero de la pila de-

diseño de la CPU. Generalmente se clasican de diferentes maneras, una de las cuales es

spués de cada escritura y lo decrementa antes de cada lectura. Este proceso, causa el efecto

clasicar las instrucciones basadas en la parte del computador a la que se reere la instrucción,

de último que entra, primero que sale. Sin embargo, el mismo efecto se obtiene si la CPU

o bien basado en la función que realiza cada instrucción. Por ejemplo:

decrementa el apuntador después de cada escritura y lo incrementa antes de cada lectura. La diferencia radica en el hecho de que la pila crece hacia posiciones de memoria más altas

X

Instrucciones de Referencia a Memoria: Se distinguen por el hecho de que dirigen el computador para proceder en una lo-

(positivamente) en un caso, y en sentido opuesto (negativamente) en el otro. Después de un

calización de memoria particular. La instrucción le dice al computador cual es esa

acceso a la pila, el puntero contiene una dirección que apunta hacia la próxima localización

dirección. Por ejemplo, ADD @0300 dirige el computador para obtener un operando de

disponible para almacenar un dato.

la localización @0300.

La pila de la CPUCR tiene un crecimiento positivo, y después de accesarla, el apuntador contiene la dirección de la próxima localización disponible para apilar un dato. Además, el

X

Instrucciones de Referencia a Registros:

puntero de pila, P, es de 8 bits y limita la pila a solo 256 posiciones, ubicadas automática-

Esta instrucciones realizan una variedad de operaciones sin necesidad de referirse a una

mente por la CPUCR en la última página de la memoria (página $FF). La ubicación de la

localización de la memoria. Por ejemplo, CLA es una instrucción que se reere única-

base de la pila, es decir, la primera localización disponible en la pila, no es necesariamente

mente al acumulador.

la primera posición de memoria de la página $FF, ésta se puede escoger usando la instrucción TAP, cuando se ha cargado previamente A con el valor deseado. En otras CPUs la pila puede ubicarse en cualquier parte de la memoria principal y el programador puede asignarle

X

equipo periférico. Por ejemplo, las instrucciones INP y OUT transeren datos entre el acumulador de la CPUCR y los dispositivos de entrada/salida:

El almacenamiento y recuperación de datos de la pila se produce bajo control de programa, o automáticamente bajo control de la CPU. Bajo control de programa, se utilizan las

INP PUERTO OUT PUERTO

instrucciones PHA y PHS para apilar los contenidos del registro A y del registro S respectivamente. Las instrucciones PLA y PLS toman el dato ubicado en la cumbre de la pila (lo desapilan) y lo depositan en A o S según sea el caso. El almacenamiento automático de datos en la pila, se produce cuando se salta a una subrutina de atención de interrupción o cuando

Instrucciones de Referencia a E/S: Las instrucciones de E/S realizan la transferencia de datos entre el computador y el

el tamaño que considere necesario para la aplicación que está desarrollando.

X

equivale a A

←− (P U ERT O) ←− (A)

equivale a PUERTO

Movimiento de datos, instrucciones lógicas y aritméticas:

se ejecuta la instrucción de salto a subrutina JSR. En ambos casos, se apila la dirección de

Estas instrucciones tienen que ver con el movimiento de información entre el registro

la siguiente instrucción a ejecutar al retornar de la pila.

de trabajo y la memoria principal. La instrucción debe especicar la dirección del movimiento, la fuente y el destino del dato. Las operaciones lógicas y aritméticas tienen

La ejecución de JSR, consiste en apilar la parte alta y luego la baja del valor del PC

que ver con operaciones entre dos operandos. La instrucción debe especicar el tipo de

que, al ir la CPU ejecutando la instrucción JSR, ya se encuentra apuntando a la próxima

operación, la fuente y el destino. La fuente mantiene el primer operando y el destino el

instrucción. Una vez apilada esta dirección, se produce el salto al inicio de la subrutina.

segundo operando. Luego de la operación el contenido de la fuente se mantiene igual y el destino guarda el resultado, es usual se utilizar como destino el acumulador.

Las instrucciones de regreso de interrupción RTI y regreso a subrutina RTS, causan durante su ejecución, una recuperación automática de datos de la pila, leyendo primero la parte baja y luego la parte alta de la dirección de retorno, para reponerlas al contador de programa.

X

Instrucciones de control: Estas instrucciones estan vinculadas la modicación del curso normal del programa y la alteración del estado de la CPU, por ejemplo las instrucciones de salto condicional e incondicional.

35

36

X

Instrucciones de subrutina: Tienen que ver con la transferencia de ejecución del programa principal a un subprograma y con el retorno desde este, al programa principal.

X

Instrucciones de referencia a registros: Las intrucciones de este tipo tienen que ver únicamente con un operando y se reeren a la modicación de los registros internos de la CPU.

En la tabla 2.1 se presentan los mnemotécnicos del conjunto de instrucciones de la CPUCR y su signicado en español y en la tabla 2.2 se especica el funcionamiento de cada una de las instrucciones y su relación con las banderas de condición. La última columna de la tabla 2.2 indica cuales son las banderas de condición que podría modicar la instrucción al ser ejecutada. La bandera Z se pondrá en 1 si el valor del acumulador es cero, de otra forma se pondrá en cero. En operaciones aritméticas sin signo, la bandera C se pondrá en 1 cuando el resultado supere 255. La bandera de acarreo funciona también como bandera de "debo.en forma complementada. Es decir, que con la operación SUB la bandera de acarreo se pone en 1 si el resultado es mayor o igual a cero y se borra para indicar un debo, si el resultado es menor que cero. La bandera de rebase V, debe ser considerada solamente cuando se realizan operaciones con signo, donde el bit más signicativo indica el signo de la magnitud representada en los bits restantes de la palabra. En las operaciones ADD y SUB, la bandera de rebase se pone en 1 cuando el resultado supera +127 o -128, de otra forma se borra. La bandera C no tiene signicado real en operaciones con números representados en complemento a 2. Todas las operaciones aritméticas con signo se realizan en complemento a 2. Es decir, los números negativos se representan como el complemento a 2 del número positivo de la misma magnitud. Para ilustrar el funcionamiento de las instrucciones, se presenta en la tabla 2.3 un programa de ejemplo en el que ahora no interesa su sentido lógico. En las primeras dos columnas se enumeran las instrucciones del programa y las localizaciones en que se encuentran. Obsérvese que todas las direcciones están codicadas en octal. En las columnas restantes se detalla el contenido del registro S, el acumulador y las dos localizaciones de memoria que se manipulan en el programa. La primera la de la tabla muestra el contenido inicial de los registros de interés. Al ejecutarse LDA @1523, el contenido de A se sustituye por el contenido de la posición @1523. Esta instrucción eventualmente modica las banderas N y Z que en este caso permanecen inalteradas. La siguiente instrucción, complementa el contenido de A, provocando la alteración del registro de status, debida al cambio del signo del dato en el acumulador. El lector puede comprobar los resultados producidos por la ejecución del resto del programa haciendo uso de la Tabla 2.2. Merece aclaración adicional el funcionamiento de las instrucciones ROL y ROR, pues estas

Mnemotécnico Inglés ADD AND BCC BCS BEQ BMI BNE BPL BVC BVS CLA CLC CLI CPA DCA HLT INA INP JMP JSR LDA NOP ORA OUT PHA PHS PLA PLS ROL ROR RTI RTS SEC SEI STA SUB TAP TPA

ADD AND Branch if Carry Clear Branch if Carry Set Branch if EQual Branch if MInus Branch if Not Equal Branch if PLus Branch if V Clear Branch if V Set CLear Accumulator CLear Carry ag CLear I ag ComPlement Accumulator DeCrement Accumulator HaLT INcrement Accumulator INPut JuMP Jump SubRoutine LoaD Accumulator No OPeration OR Accumulator OUT PusH Accumulator PusH Status PuLl Accumulator PuLl Status ROtate Left ROtate Right ReTurn from Interrupt ReTurn from Subroutine SEt Carry ag SEt Interrupt ag STore Accumulator SUBtract Transfer A to P Transfer P to A

Tabla 2.1: Signicado de los mnemotécnicos de la CPUCR

instrucciones realizan una rotación del acumulador con la bandera C. Al ejecutarse, todo el contenido del acumulador se desplaza un bit a la izquierda o a la derecha, según sea el caso, utilizando la bandera de acarreo para cerrar el lazo, ejemplos de su operación, se encuentran en las localizaciones @514 y @524 del programa ejemplo de la tabla 2.3.

37

Acción

Suma Y lógica Salta si C=0 Salta si C=1 Salta si acumulador es 0 Salta si acumulados es negativo Salte si acum. distinto de 0 Salte si acum. es positivo Salte si V=0 Salte si V=1 Borre el acumulador Borre la bandera C Borre la bandera I Complemente el acumulador Decremente el acumulador Deténgase Incremente el acumulador Entrada Salte Salte a subrutina Cargue el acumulador No opere O lógica Salida Apile el acumulador Apile el registro S Desapile el acumulador Desapile el registro S Rotación a la izquierda Rotación a la derecha Regrese de interrupción Regrese de subrutina Ponga la bandera C a 1 Ponga la bandera I en 1 Almacene el acumulador Reste Transera A a P Transera P a A

38

N - - Z - - - - N V - Z C N V - Z C 1 N - - Z N - - Z - - - - N - - Z - - - - - - - - - - - - N V I Z C - - I - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - N - - Z N - - Z N V - Z C N V - Z C 2 N - - Z C N - - Z C - - - - N - - Z - - - - C - - - - C - - I - - - I - N - - Z - - - - -

@0500-@0502 @0503 @0504 @0505-@0507 @0510 @0511-@0513 @0514 @0515-@0517 @0520 @0521-@0523 @0524 @0525-@0527 @0530

LDA @1523 CPA INA STA @1523 CLA SUB @1523 ROL ADD @7701 DCA AND @7701 ROR ORA @1523 HLT

Estado Acumulador Contenido Contenido N-VIZC de @1523 de @7701 101000 101000 001000 001000 001000 001010 100000 000001 000001 000001 000011 100000 100000 100000

101010 100011 011100 011101 011101 000000 100011 000110 000010 000001 000000 100000 111101 111101

100011 100011 100011 100011 011101 011101 011101 011101 011101 011101 011101 011101 011101 011101

111100 111100 111100 111100 111100 111100 111100 111100 111100 111100 111100 111100 111100 111100

Tabla 2.3: Ejemplo de ejecución de instrucciones en CPUCR0

2.6.

CPUCR: Modos de direccionamiento

Se llaman modos de direccionamiento, a los diferentes métodos que tiene la CPU para obtener los operandos de la memoria principal. La forma general usada hasta ahora en in-

si C=0 no ha ocurrido un debo

Sin embargo, esta es solamente una de las formas de obtener o direccionar el operando de la memoria. Según veremos, tanto el número de operaciones distintas que puede realizar una CPU como sus modos de direccionamiento, están condicionados por el tamaño del código de instrucción. En la CPUCR, el código de instrucción siempre ocupará una posición de

=ACARREO,

memoria y está dividido en dos partes como lo muestra la Figura 2.8.

2 Idem

1 DEBO

Entrada/Salida

Referencia a registros

Control

Subrutina

LDA STA ADD SUB AND ORA PHA PLA HLT NOP PHS PLS RTI JMP BEQ BNE BCS BCC BPL BMI BVS BVC JSR RST CLA CPA INA DCA ROL ROR TAP TPA SEC CLC SEI CLI INP OUT

2,3 3 2,3 2,3 2,3 2,3 1 1 1 1 1 1 1 3 2 2 2 2 2 2 2 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2

strucciones de referencia a memoria es la siguiente:

Movimiento de Datos, Aritméticos y lógicos

Tipo de instrucción

Mnemotécnico

Número de palabras

Operación realizada A ←− (M ) M ←− (A) A ←− (A) + (M ) A ←− (A) − (M ) A ←− (A) ∩ (M ) A ←− (A) ∪ (M ) (A) ↓ ↑A Detenga la CPUCR =⇒ DI Operación nula =⇒ DI + 1 (S) ↓ ↑S ↑ P C; I ←− 0; =⇒ (P C) =⇒ M (Z)=1 =⇒ M ; (Z) = 0 =⇒ DI + 2 (Z)=0 =⇒ M ; (Z) = 1 =⇒ DI + 2 (C)=1 =⇒ M ; (C) = 0 =⇒ DI + 2 (C)=0 =⇒ M ; (C) = 1 =⇒ DI + 2 (N)=0 =⇒ M ; (N ) = 1 =⇒ DI + 2 (N)=1 =⇒ M ; (N ) = 0 =⇒ DI + 2 (V)=1 =⇒ M ; (V ) = 0 =⇒ DI + 2 (V)=0 =⇒ M ; (V ) = 1 =⇒ DI + 2 DI+3 ↓; =⇒ M ↓ P C; =⇒ (P C) A ←− 00 A ←− (A)0 A ←− (A) + 1 A ←− (A) − 1 A ←− A6 ... A0 , C; C ←− A7 A ←− C, A7 ... A1 ; C ←− A0 P ←− (A) A ←− (P ) C ←− 1 C ←− 0 I ←− 1 I ←− 0 A ←− (P U ERT O) PUERTO ←− (A)

Banderas alteradas

Localización Instrucción

Tabla 2.2: Conjunto de instrucciones de la CPUCR Figura 2.8: Código de instrución

Los tres bits menos signicativos de la palabra, denen el modo de direccionamiento de la instrucción y los bits 3, 4 y 5 determinan el código de operación. En los casos que se requiera,

39

40

Tipo de direccionamiento (D2-D0 octal) Inmediato Absoluto Relativo Indirecto Implícito Acumulador Control Entrada/Salida

Código de operación (D7-D3 octal) 0 1 2 3 4 5 6 7

0 LDA LDA BEQ LDA



CLA TPA INP

1



STA BNE STA



CPA TAP OUT

2 ADD ADD BCS ADD SEC INA RTI

3 SUB SUB BCC SUB CLC DCA RTS

4 AND AND BMI AND SEI ROL HLT

5 ORA ORA BPL ORA CLI ROR NOP









dirección en la que se desea efectuar la operación y luego se guarda la parte alta. 6

7

8 ... F





• • • • • • • •

JMP BVS JMP



JSR BVC JSR



PLA PLS

PHA PHS





Por ejemplo un STA $5000 guarda el contenido del acumulador en la posición $5000.

EJEMPLO: La instrucción ADD indirecta es @23.

Tabla 2.4: Instrucciones de la CPUCR

la instrucción se completará con una o dos palabras denominadas DESPLAZAMIENTO D, a partir de la(s) cual(es) se puede calcular LA DIRECCION EFECTIVA del operando. Esto quiere decir, que el valor numérico del desplazamiento no es necesariamente igual a la dirección del operando, en cuyo caso, se le emplea como un medio que permitirá determinar su localización. Figura 2.9: Direccionamiento inmediato

Modo de direccionamiento Direccionamiento inmediato

Bits menos signicativos 000

Direccionamiento absoluto

001

Direccionamiento relativo

010

Direccionamiento indirecto

011

Direccionamiento implícito

100

Direccionamiento de acumulador

101

2.6.3.

Direccionamiento indirecto

El direccionamiento indirecto cuenta también con tres palabras en su estructura. Las instrucciones de este tipo aceptan como argumentos direcciones de memoria, sin embargo la gran diferencia radica en que la dirección que se le suministra a la instrucción no es la posición nal, sino más bien una dirección indirecta, la cual se crea a partir del contenido del argumento.

Los valores 110 y 111 no se usan para denir un tipo de direccionamiento, sino que se combinan con los códigos de operación para denir otras operaciones que puede realizar la CPUCR. La Tabla 2.4 muestra todos los códigos de instrucción de la CPUCR.

2.6.1.

Direccionamiento inmediato

El modo inmediato está conformado por instrucciones de únicamente dos palabras de longitud, la primer palabra corresponde al código de instrucción y la segunda corresponde a un valor constante. Un ejemplo es la instrucción LDA $54, mediante la instrucción anterior se carga el valor $54 en el acumulador.

2.6.2.

Direccionamiento absoluto

Las instrucciones con direccionamiento absoluto están formadas por tres palabras. A diferencia que el direccionamiento inmediato, se hace referencia a una posición de memoria la cual

Figura 2.10: Direccionamiento absoluto

por ser de un tamaño de 16 bits se ocupa dos posiciones de memoria para guardar su dirección. Primero se guarda el código de instrucción posteriormente se coloca la parte baja de la

41

Sea el caso de la instrucción ADD ($5000). Si se supone que el contenido de $5000 es

42

$01 y el contenido de $5001 es $25, el valor absoluto de la dirección será $2501, por ende el contenido de esta nueva dirección es el que se sumará posteriormente al acumulador.

2.6.4.

Direccionamiento relativo

Este tipo de direccionamiento es utilizado por las instrucciones de salto condicional, el argumento es el valor de un desplazamiento en complemento a dos. Debido a las limitaciones que presenta el complemento a dos no se podrá hacer saltos de más de 130 posiciones hacia adelante (ir incrementando el contador de posición) y 126 posiciones hacia atrás (ir decrementando el contador de posición).

Figura 2.12: Direccionamiento implícito

2.6.6.

Direccionamiento de acumulador

En este grupos se encuentran todas las instrucciones que tienen que ver con operaciones hacia el acumulador y de igual forma que las implícitas solo están formadas por una palabra. Ejemplo: CLA, CPA, INA, DCA, ROL, ROR, PLA, PHA.

Figura 2.11: Direccionamiento relativo

Por ejemplo si se tiene el contador de programa con el valor de $0005 y se da la instrucción BCC $05, si la bandera de acarreo del registro de estados está en cero se produce el salto, por lo que la CPUCR procede a sumar el valor $05 al PC, esto equivale a un salto de cinco posiciones hacia adelante. Si el valor hubiese sido $F1, se hubiera realizado un salta hacia atrás de 3 posiciones de memoria, ya que $F1 es $03 en complemento a dos.

2.6.5.

Direccionamiento implícito

Las instrucciones de este modo de direccionamiento están formadas por una única palabra, la cual corresponde al código de instrucción. Algunas instrucciones son: SEC, CLC, SEI, CLI.

Figura 2.13: Direccionamiento de acumulador

43

44

como bien dice el refrán: "divide y vencerás". Un método conocido con el cual se puede generar un programa en forma modular en tan solo seis pasos es:

Capítulo 3

1.

Especicación del problema. Este paso es fundamental para conocer exactamente cuál es el problema que se desea resolver. La especicación debe ser sucientemente precisa para dar una buena idea de

Programación de computadores

los datos que se requieren y cómo se deben manipular.

2.

Por ejemplo: variables de entrada o de salida, constantes, vectores, matrices, punteros,

información, investigación cientíca, control de plantas industriales, procesamiento digital de

tablas, etc. Con esta lista se sabrá qué elementos debe manipular el programa para

señales, etc. Cualquier computador puede realizar estas aplicaciones si es programado ade-

llegar al resultado deseado.

cuadamente. Algunos computadores son más ecientes para ciertas tareas pero todos pueden programarse para realizar cualquier trabajo. La generación de los "programas adecuados.es entonces una función vital para la utilidad del sistema computador. En este capítulo veremos

Especicación de las estructuras de datos. En este paso se enumeran los tipos de datos que van a ser utilizados en el programa.

Un computador es una herramienta de uso general; se puede utilizar en procesamiento de

3.

ciertas técnicas comunes de programación de computadores.

Denición del formato de las estructuras de datos. La forma en que se manipulen los elementos del paso anterior es función directa del formato que tengan las estructuras de datos denidas. El formato incluye la denición

3.1.

de cómo se almacenan las estructuras de datos en memoria; por ejemplo, número de

Diseño de programas

palabras usadas para representar una variable, modo de almacenar arreglos de datos, punteros utilizados, etc.

No existen leyes ni fórmulas que nos sinteticen un programa único para una determinada aplicación. Cada programador tiene sus gustos y defectos que inuyen directamente en el programa que realiza por lo que se puede considerar un arte, sin embargo, este proceso artís-

4.

Especicación del algoritmo.

tico se puede ordenar para que la elaboración de programas sea lo menos frustrante posible.

En este punto se hace una descripción, preferiblemente con diagramas de ujo o con

La construcción modular de programas, reune tres ventajas que con el tiempo son apreciadas

algún pseudolenguaje de programación, del algoritmo que se desea usar.

por cualquier programador. 5.

X

Buscar la modularidad lógica del algoritmo.

La realización de un programa complejo se limita a completar una serie de programas

Una vez obtenido el algoritmo se deben indicar las operaciones que se realizarán con

mucho más sencillos.

cada una de las estructuras de datos presentadas en los pasos anteriores. Cada bloque en el diagrama de ujo del algoritmo puede considerarse como un módulo lógico del

X

algoritmo. Una vez terminado el programa cualquier corrección o cambio que se deba hacer es más fácil de localizar y efectuar. 6.

X

Repetir los pasos 1 a 5 en los módulos que se formen. Cada módulo puede luego ser analizado siguiendo los pasos 1, 2, 3, 4 y 5 hasta que todos

El programa es más fácil de comprender y su documentación es más sencilla de realizar.

los módulos obtenidos tengan la sencillez deseada. La programación de cada módulo entonces es trivial y menos propensa a errores.

A este tipo de enfoque también se le conoce con el nombre de "top-down programming"que signica programación de arriba hacia abajo. Un problema determinado es observado primero desde

”arriba"para

tener una visión panorámica y ver que detalles deben resolverse. Cada

3.2.

Programación en lenguaje ensamblador

detalle es a su vez observado para ver que otros detalles se implican. Este proceso se va profundizado hasta que todos los "detalles por resolver"son triviales. El programa consiste ahora

La programación de la CPU de cualquier computador se debe realizar en su respectivo

en una serie de programitas triviales que una vez unidos solucionan el problema complejo,

lenguaje de máquina. La forma más eciente de hacerlo es con la ayuda de un ensamblador.

45

46

El programa ensamblador traduce un programa escrito simbólicamente, llamado programa

de nuevo y luego se debe ensamblar el texto corregido para generar un nuevo programa

fuente, en otro programa escrito en binario, llamado programa objeto como se ilustra en la

objeto ya corregido.

gura 3.1. El programa fuente no puede ser ejecutado por la CPU directamente y por eso se le traduce con el programa ensamblador. El programa ensamblador utiliza como datos de entrada el programa fuente y genera como datos de salida el programa objeto. La CPU sólo puede ejecutar programas objeto ya que estos vienen escritos en binario.

Todo programa ensamblador consta de dos tipos de simbología. Aquella simbología que corresponde a la usada por el lenguaje de máquina de la CPU y la simbología que utiliza el ensamblador para indicar operaciones propias.

3.2.1.

Simbología del lenguaje de máquina

Todos los símbolos mnemotécnicos descritos en el capítulo anterior forman parte de la Figura 3.1: Programación en ensamblador

simbología del lenguaje de máquina. Se necesitan símbolos adicionales para distinguir el modo de direccionamiento usado. Los

Para poner en marcha la ejecución de un programa fuente en lenguaje ensamblador hay que seguir los siguientes pasos:

modos de direccionamiento relativo, implícito y acumulador no necesitan distinción ya que el código de instrucción en sí, dene el modo respectivo. Todos los saltos condicionales utilizan direccionamiento relativo y no existen otras in-

1.

Escritura y edición del programa fuente. El programa fuente en realidad es un texto que se debe de almacenar en el computador. El texto se escribe y se corrige con la ayuda de un editor de texto. El editor de texto se

strucciones que lo utilicen. Un caso distinto es la instrucción LDA que tiene tres modos de direccionamiento.

debe traer a la memoria del computador, u=junto al texto que se está escribiendo, para trabajar en el programa fuente. El programador, mediante un dispositivo de entrada

Caso Modo de direccionamiento

Instrucción

(teclado), le suministra al editor de texto los caracteres que serán parte del programa

A

Direccionamiento absoluto

LDA

fuente. Cualquier corrección que se deba hacer sobre el texto también se hace a través

B

Direccionamiento indirecto

LDA (ADDRESS )

del teclado. Una vez que se termina de escribir el programa fuente se puede dejar en

C

Direccionamiento inmediato

LDA #CON ST

ADDRESS

memoria o se puede almacenar en disco.

2.

Casos:

Ensamblaje del programa fuente. Para poder realizar la traducción del programa fuente, debe cargarse el programa ensamblador en la memoria del computador. El editor de texto ya no es necesario y puede ser removido de la memoria. El programa fuente debe permanecer accesible al programa ensamblador ya que este utiliza al primero como sus datos de entrada. Si hay suciente memoria disponible, el programa fuente puede permanecer en ella; de lo contrario el

A) Si se quiere cargar el acumulador con el contenido de la dirección ADDRESS. B)

Si se desea traer al acumulador el contenido de la localización de memoria cuya

dirección está almacenada en

ADDRESS

y

ADDRESS +1.

programa fuente puede suministrarse desde afuera si este fue almacenado en disco o en una memoria USB, CD, DVD u otro al terminar con el editor. Finalmente la salida del programa ensamblador es el programa objeto.

3.

Puesta en marcha del programa objeto. El programa objeto se puede almacenar directamente en memoria si hay suciente espacio o externamente en otro medio de almacenamiento de datos, se debe tener el programa objeto en memoria para poder indicarle a la CPU que lo comience a ejecutar.

C) Si la constante se llama CON ST el valor

3.2.2.

entonces la instrucción carga al acumulador con

CON ST .

Simbología para el ensamblador

Nombres

Un computador con suciente memoria es capaz de tener todos los programas alma-

Los nombres son usados para representar valores numéricos, pero se pueden usar para

cenados simultáneamente logrando así que todo el proceso se pueda realizar con más

identicar direcciones, etiquetas, variables y constantes. Cada nombre puede tener, en el ca-

rapidez. Si se debe corregir el programa fuente, es necesario utilizar el editor de texto

so de la CPUCR, hasta ocho caracteres alfanuméricos siempre que el primero sea una letra.

47

48

Carácter Base

Algunos ejemplos son:

Ninguno $ @

VOLT1, VOLT2, X123, Y234, Y0, PRIMEROS

% ”

Contador de posición

10 - Decimal 16 - Hexadecimal 8 - Octal 2 - Binario Alfanumérico

Tabla 3.1: Prejos para diferentes bases

El contador de posición, indicado en el programa fuente con el símbolo de asterisco "*", le indica al ensamblador la posición de memoria en que se encuentra. Con el contador de posición se va contabilizando la dirección de cada instrucción en el programa porque se actualiza su valor con cada instrucción que se traduce. De esta forma se logra asignar direcciones

valor de sen(α) para un conjunto nito de valores de

verdaderas a cada etiqueta denida en el programa. También se puede usar para iniciar los

forma que se almacene en memoria con el programa que se va a ejecutar. Estas son las

valores de constantes y asignar direcciones especícas a ciertos operandos.

constantes en tiempo de ejecución.

α. Esta tabla debe denirse de tal

El ensamblador reconoce una constante en tiempo de ejecución cuando se encuentra el

Constantes

comando WRD (de WoRD), o el comando DBWRD (de DouBle WoRD) seguido por la

Hay dos tipos de constantes que se pueden generar en un programa en lenguaje ensamblador:

constante a almacenar. WRD almacena una constante de precisión sencilla, es decir 8 bits, mientras que DBWRD almacena palabras de 16 bits (dos posiciones de memoria consecutivas, parte baja primero).

La constante se almacenará en memoria en la dirección que tenga presente el contador

1. Constantes en tiempo de ensamble: Estas constantes tienen validez únicamente durante el ensamble del programa fuente.

de posición del ensamblador, cada vez que se almacena una constante se incrementa el

Por ejemplo: se puede denir el valor numérico 12 con el símbolo DOCE con sólo hacer

contador de posición en uno para WRD y en dos para DBWRD. Supongamos que el

la asignación:

contador de posición del ensamblador contiene la dirección @1234, entonces las asignaciones mostradas a continuación resultan en el almacenamiento de datos en memoria de la forma que muestra la gura 3.2.

DOCE = 12 De esta forma en vez de usar el número 12 se puede usar su símbolo y el resultado será el mismo en el programa. La ventaja es más aparente cuando se considera la siguiente situación: Supóngase que los datos tomados de una unidad de disco, se pueden leer a partir de la posición de memoria @3456. Cada vez que se debe hacer referencia a esta zona de memoria hay que repetir el número @3456 en el programa. Esto presenta dos

WRD @52 DBWRD @3365 WRD @10

inconvenientes. Primero, el número es difícil de recordar y segundo, si por algún motivo

Figura

esta dirección debe cambiarse entonces hay que buscar en el programa todos aquellos

memoria

3.2:

Almacenamiento

de

datos

en

lugares en que aparece @3456 para hacer la modicación. Si hacemos la asignación

DATDISCO = @3456 es más fácil recordar el símbolo y si luego hay que modicar su valor basta con modi-

Las constantes numéricas pueden ser expresadas en distintas bases numéricas o como caracteres alfanuméricos. El tipo de base se especica con un prejo al número, como se indica en la tabla 3.1.

car la asignación únicamente. Por ejemplo para cargar el número 48 decimal al acumulador se puede hacer de cuatro formas distintas: 2. Constantes en tiempo de ejecución: Cuando se requieren constantes que se puedan usar durante la ejecución del programa, como cuando se usa una tabla de datos. En un programa que calcule el seno de un ángulo

α

puede ser conveniente tener una tabla almacenada en memoria que nos de el

49

LDA #48 LDA #$30 50

D2-D0 Octal 0 1 2 3 4 5 6 7

0

Esp ! ” #

% &

'

(D7-D3 octal) 1 2 3 4 5 6 7

( ) * + , . /

0 1 2 3 4 5 6 7

8 @ H P X 9 A I Q Y : B J R Z ; C K S AL < D L T Ret = E M U Inc > F N V Brr ? G O W Ecp

Operador Operación

8 ... F

+ < > =

• • • • • • • •

Tabla 3.2: Código de caracteres para la CPUCR

suma resta selección de parte baja selección parte alta asigna el valor de la derecha al símbolo de la izquierda

Tabla 3.3: Operadores para el ensamblador

Sin la alternativa de tomar decisiones, el programa estaría compuesto de un número de instrucciones que se ejecutarían secuencialmente en el orden en que se encuentran almace-

LDA #@60 LDA # %110000 En el caso de las constantes alfanuméricas la constante numérica a la que se convierte el carácter es su equivalente en binario según lo indica la tabla 3.2. Por ejemplo, la instrucción LDA

#”A”

carga el número @41 en el acumulador.

En la tabla 3.2 se debe entender los siguientes términos: Esp = Espacio.

nadas en memoria, sin posibilidad de modicar la secuencia. En la escritura de un programa con operaciones de control deben resolverse tres problemas:

Colocación de etiquetas Las decisiones siempre tienen más de una salida. En general para cada salida podría ser necesario escribir un programa separado. Cada programa de datos debe tener su nombre o etiqueta mediante la cual se pueda hacer referencia a él. Esto corresponde a la dirección simbólica del inicio del programa.

AL = avance a la siguiente línea. Ret = devuélvase al inicio de la línea. Inc = borre pantalla y vaya a la primera columna de la primera línea. Brr = retroceda una posición y borre el caracter que ahi se encuentra. Ecp = abre la posibilidad de introducir secuencias de caracteres de control.

Prueba El programa puede hacer decisiones y ramicaciones mediante las instrucciones de control. Estas instrucciones no afectan o transmiten el dato, simplemente prueban alguna condición y guían el programa en secuencias jas o variables.

Operadores Con el uso de ciertos operadores se puede facilitar mucho la creación de constantes y direcciones. La tabla 3.3 nos muestra los operadores permitidos. Su evaluación es estrictamente

Elección de una vía de solución

de izquierda a derecha sin paréntesis y todos con igual prioridad. Los operadores de selección

Cuando se analiza la prueba, el programa debe dirigirse a una entre varias posibles ram-

de palabra permiten escoger la parte alta o la parte baja de una constante de doble precisión

icaciones, dependiendo del resultado de la prueba. Hablando en términos de programación

o una dirección para cargarla al acumulador o a cualquier posición de memoria.

se debe realizar un salto hacia la etiqueta que corresponde a la solución que se debe seguir.

3.2.3.

3.2.4.

Operaciones de control

Lazos

Una de las características más importantes de un computador, es su capacidad de tomar

Un lazo de programa es un conjunto de instrucciones que es ejecutado repetitivamente.

decisiones. La habilidad de tomar decisiones permite escribir un programa compuesto de un

Frecuentemente el computador debe realizar la misma tarea pero en diferentes conjuntos de

cierto número de ramicaciones, en donde cada una de ellas se ejecuta si se satisfacen cier-

datos. En este caso, el programa se puede repetir en el lazo, en vez de repetir el mismo

tas condiciones. El programa entonces se semeja a un árbol y deja de ser una secuencia de

conjunto de instrucciones en cada conjunto de datos.

instrucciones en línea recta. En general un lazo de programa requiere cuatro pasos diferentes:

51

52

Inicio

comparar como se desee, con respecto a cero.

El inicio es la parte del programa antes del lazo que se encarga de preparar los parámetros del lazo.

3.2.6.

Programación con índices

Frecuentemente, se desea operar sobre una lista de datos. Se realiza una operación en el

Procesamiento

primer dato de la lista, luego la misma operación en el segundo dato y así sucesivamente. De

Esta es la parte principal del programa de lazo y es donde se realiza el trabajo que deseamos que haga el computador.

esta forma, en la i-ésima iteración el programa toma el i-ésimo dato, Di, de la lista de datos y realiza la operación F(Di). Seguidamente, se modica el subíndice i para que este apunte al siguiente dato de la lista y se realice sobre éste la operación F.

Avance de lista

Existen computadores que proveen uno o varios registros especiales para ser usados como índices de lista en un programa. A estos registros, se les puede incrementar, decrementar o

El lazo realiza la operación con una lista de datos. La operación se realiza con el primer

transferir sus contenidos con instrucciones especiales de la CPU.

elemento de la lista, luego con el segundo y asi sucesivamente. Los registros índice permiten el uso de direccionamiento por índice, en el que la dirección efectiva, es la suma de la dirección base que trae la instrucción y el número almacenado en

Prueba y direccionamiento

el registro índice. Una instrucción de este tipo, podría tener la forma:

El lazo debe ejecutarse una serie de veces y en cada una se debe comprobar si se ha com-

LDA TABLA, X

pletado el total de veces que se ha de operar, en cuyo caso se sale del lazo. La terminación del lazo se puede efectuar de dos formas:

donde se le indica a la CPU, que el operando que debe cargar al acumulador, está en la

X

dirección que resulta al sumar la dirección TABLA, con el contenido del registro índice X. A través de la cuenta: En este modo existen dos posibilidades, la primera es que se carga

Puede existir más de un registro índice; en tal caso, se podrían realizar operaciones sobre

al contador el número de eventos con cero y en cada ejecución del lazo se incrementa

varias listas. Para el caso de la CPUCR no se tiene registros índice y por lo tanto, tampoco

al contador. Se prueba cuándo se alcanza la cuenta nal y sale del lazo. En la segunda

instrucciones que los utilicen.

posibilidad, se carga al contador con la cuenta nal y se decrementa hasta llegar a cero.

X

A través de un dato especial: El nal de la lista de datos se puede marcar con un dato que únicamente se usa para este propósito. Por ejemplo, si se sabe que una lista de datos puede tener cualquier número, excepto el cero, entonces el cero es un buen candidato para indicar el n de la lista. El lazo se concluye al encontrar el indicador que se seleccionó.

3.2.7.

Subrutinas

Una subrutina, es una parte de un programa que resuelve por sí misma alguna operación básica. El propósito principal de escribir una subrutina, es usarla en diferentes puntos en el mismo programa o copiarla de un programa a otro. El desarrollo de una subrutina, es igual al de un programa y se recomienda el uso de la

3.2.5.

Comparaciones entre números

Muy frecuentemente el programador se encuentra en la necesidad de determinar si el resultado de una operación aritmética es mayor, mayor o igual, igual, menor o igual o menor

programación modular, siguiendo los mismos pasos enumerados en la sección 3.1. No existe un tamaño denido para una subrutina; puede usar solo unas cuantas posiciones de memoria, o varios miles de instrucciones, estas se pueden clasicar en subrutinas abiertas y en subrutinas cerradas.

que cero. Estas condiciones se evalúan en forma distinta dependiendo de cómo se están interpretando los números: sin signo o con signo (en complemento a dos). Las únicas instrucciones que pueden hacer uso completo de estas condiciones en la CPUCR, son ADD y SUB, porque sólo ellas alteran todas las banderas aritméticas, a saber, N, Z, C y V.

Subrutina abierta Una subrutina abierta es aquella que al insertarla en un programa se le realizan modicaciones para una parte especica del programa y según las variables con las que trabaja.

La instrucción SUB, además es útil para comparar dos números, ya que efectúa la resta

De este modo, se logran transferir los datos y resultados entre el programa principal y la

de un número en memoria con el contenido del acumulador. El resultado, se puede luego

subrutina. La codicación de la subrutina abierta varía según cambien sus argumentos. La

53

54

transferencia de argumentos es más eciente, ya que no se requiere de posiciones especiales de almacenamiento.

El paso de parámetros a subrutinas, puede hacerse por medio de los registros de la CPU, directamente a memoria, indirectamente a memoria, implícitamente, o por una combinación de ellos. A su vez, el paso directo o indirecto, puede hacerse mediante la pila.

Un macroensamblador puede crear subrutinas abiertas automáticamente pues es un programa ensamblador que soporta macroinstrucciones.

X

Paso de parámetros por medio de registros en la CPU Este paso de parámetros se realiza cuando el programa pasa y/o lee los parámetros de

Subrutina cerrada

la subrutina, por medio de los registros internos de la CPU. Para la CPUCR el registro utilizado para este n sería el acumulador, siendo el paso de parámetros por medio de

Una subrutina cerrada es aquella que se encuentra fuera del programa principal y es us-

registros conveniente cuando se debe pasar un dato que se almacena en una sola palabra.

ada sin modicar su codicación. Se almacena una sóla vez en memoria, y debe ser puesta en ejecución desde diferentes lugares de la secuencia de un programa mediante la instruc-

En algunas arquitecturas de CPUs, se dispone de varios registros de uso general que

ción JSR (que obliga a abandonar la secuencia normal del programa, para ir a la parte de

pueden ser empleados para realizar esta función, permitiendo pasar varios argumentos

memoria donde se encuentra la subrutina y ejecutarla), antes de que la subrutina se ejecute

a una subrutina.

la dirección de la instrucción que sigue después de JSR debe guardarse en la pila asi la CPU puede recuperar la secuencia normal de programa al regresar de la subrutina mediante la instrucción RTS que se coloca como la instrucción nal en la subrutina, pues RTS toma la dirección guardada en la pila y la carga en el contador de programa continuando con la

X

Paso de parámetros directamente a memoria El paso de parámetros directo a memoria, se realiza cuando el programa pasa a y/o

secuencia del programa.

lee los parámetros de la subrutina, mediante posiciones jas de memoria. Este procedimiento se emplea en la CPUCR, cuando se tienen unos pocos parámetros de una o dos

La subrutina cerrada, toma los operandos o argumentos de entrada y coloca los resultados

palabras.

o argumentos de salida de posiciones jas de memoria, es por eso que al llamar a ejecución una subrutina cerrada, es necesario cargar los argumentos de entrada en aquellas posiciones usadas por la subrutina, una vez que se está ejecutando la subrutina coloca los resultados

X

Paso de parámetros indirectamente a memoria

siempre en el mismo lugar, independientemente de la parte del programa de que fue llamada.

Este procedimiento hace uso de punteros que indican dónde se encuentran los datos

Los resultados, pueden entonces leerse y colocarse en las posiciones de memoria deseadas.

de entrada y los datos de salida, por lo que no se pasa el dato sino una dirección que

Este último paso es obligatorio si se deseara preservar los resultados, ya que serán cambiados

apunta a la localización del dato. El paso de parámetros indirectamente a memoria se

por otros valores cuando se llame de nuevo la subrutina desde un lugar distinto del programa.

utiliza cuando los parámetros son unidades compuestas por varias palabras de memoria

Esta manera de manejar los operandos de entrada y salida, es lo que permite que la subrutina

localizadas sucesivamente, como en el caso de números de múltiple precisión, vectores

se escriba una sola vez y se ejecute saltando a ella desde diferentes lugares del programa.

(conjunto de datos arreglados en forma de tablas unidimensionales), matrices (conjuntos de vectores) o simplemente datos heterogéneos arreglados en posiciones sucesivas de memoria.

Resumiendo las dos diferencias marcadas entre la subrutina abierta y la subrutina cerrada son:

X

Paso de parámetros por la pila

1. La subrutina cerrada no se inserta en aquellas partes del programa donde se utilice,

En este procedimiento la pila es usada como medio para pasar parámetros de entrada

sino que más bien es un ente aislado, independiente del curso que sigue el programa y

o salida. Simplemente se apilan los datos o las direcciones donde se localizan, para los

se debe saltar fuera del programa principal para ejecutar la subrutina cerrada.

parámetros de entrada, el destinatario deberá leerlos teniendo el cuidado de recordar que la dirección de retorno se encuentra en el tope de la pila y que luego de la lectura, debe continuar en el tope y la pila deberá haber sido disminuida en el espacio usado

2. En la subrutina cerrada la transferencia de variables y resultados se lleva a cabo a

por los parámetros, este tipo de cuidado debe tomarse también al recibir parámetros

través de posiciones de memoria dedicadas para ese uso, debido a esto, la subrutina

de salida.

cerrada toma más tiempo al ser utilizada que una subrutina abierta, pero por otro lado,

A diferencia de la CPUCR existen microprocesadores que disponen de un registro asoci-

la subrutina abierta emplea más posiciones de memoria, ya que cada vez que se utiliza

ado a la pila con direccionamiento por índice, que permite extraer los datos de la pila sin

se copia toda su codicación. Sin embargo, esto no es necesariamente cierto en todos

necesidad de instrucciones de desapilado y además, disponen una instrucción de retorno

los casos y el análisis de su uso se deja como lo requiera el programador.

especial, RTS N, donde N es el número de palabras de pila que ocuparon los parámetros. Esta instrucción lee primero la dirección de retorno y luego le resta N al puntero de pila.

55

56

X

Paso implícito de parámetros

Con signo: 0, 4 294 967 295 Sin signo: -2 147 483 648,0,2 147 483 647

El paso de un parámetro en forma implícita se usa cuando el parámetro puede tomar unos pocos valores. La subrutina en un caso como este, tiene varios puntos de entrada y asume un valor distinto para el parámetro por cada punto de entrada.

Esta forma de representación, se conoce como precisión múltiple. Para trabajar con estas representaciones, se requiere que la programación tome en cuenta la naturaleza multipalabra de los números y la forma de enlazar una operación de palabra a palabra es con el acarreo.

Macroinstrucciones

Por ejemplo, para sumar dos números representados con cuatro palabras de 8 bits cada

La macroinstrucción es una instrucción compuesta de varias instrucciones de máquina del

uno, se sigue el procedimiento que se muestra en la Figura 3.3. Primero se suman las palabras

computador, se puede colocar en cualquier parte del programa fuente y sirve para indicar-

menos signicativas de los operandos. La suma se almacena en la posición que corresponde

le al programa ensamblador su denición, una vez que se denidas las macroinstrucciones

a la palabra menos signicativa del resultado, pero de la suma pudo haberse producido un

simplemente se llaman por su nombre y se indican los argumentos con los que va a oper-

rebase del acumulador, por lo que se suma el contenido de la bandera de acarreo con la

ar. El macroensamblador, se encarga de crear la subrutina abierta según la denición de la

suma del siguiente par de palabras de los operandos. En esta forma, la bandera de acarreo

macroinstrucción y sus argumentos, y luego la inserta en la posición del programa que indicó

enlaza las sumas de cada una de las palabras que conforman el número. El acarreo que re-

el usuario.

sulte al sumarse las palabras más signicativas, es el llevo de la suma total de los dos números.

El comando MACRO, seguido del nombre de la subrutina y luego de sus argumentos, especica el inicio de la macroinstrucción y el comando FINMAC, especica el nal de la denición de la macroinstrucción. El cuerpo de la subrutina, debe colocarse entre estos dos comandos. Durante el proceso de ensamblaje, el ensamblador tomará todas las deniciones de las macroinstrucciones y construirá un diccionario de ellas. Figura 3.3: Suma múltiple precisión.

3.2.8.

Aritmética de Múltiple Precisión

Una de las aplicaciones más comunes de los computadores, es el procesamiento de datos numéricos pues representa una vía ecaz y precisa de solucionar problemas matemáticos.

Desplazamiento a la izquierda Esta subrutina, gira una posición a la izquierda todos los bits de un número de múltiple

Una palabra de m bits puede representar números sin signo en el ámbito de:

precisión. El bit menos signicativo del número adquiere el valor que tenía originalmente la bandera de acarreo, mientras que el bit más signicativo pasa a ser el nuevo contenido de la

0, ( 2m - 1 ) O para números con signo en el ámbito de:

-( 2m−1 ), 0, ( 2m−1 - 1 ) Para una palabra de ocho bits como las de la CPUCR1 los ámbitos son:

misma bandera.

Desplazamiento a la derecha A diferencia de la subrutina anterior, el número gira hacia la derecha. El bit más signicativo de la palabra asume el valor que originalmente tenía la bandera de acarreo, mientras que el menos signicativo, se convierte en el nuevo valor de esa bandera. Para realizar correctamente la operación, se debe comenzar con la palabra más signicativa del número.

Con signo: 0,256 Sin signo: -128,0,127 Cuando se trabaja con datos numéricos, es frecuente usar más de una palabra para representar un número binario, ya que con solo una palabra, el tipo de cálculo que se puede

Complemento a dos Para realizar un complemento a dos, primero complementa a uno el número y luego le

realizar es muy limitado. Sin embargo, si utilizamos cuatro palabras de 8 bits, los ámbitos

suma uno.

de representación serían:

Se hace palabra por palabra, antes de iniciar el lazo se setea la bandera del llevo, luego comienza por la palabra menos signicativa, se complementa y luego se le suma la bandera

57

58

de llevo, se hace lo mismo para las siguientes palabras, solo que para estas la bandera de acarreo ahora contiene el llevo generado de la suma que se realizó con las palabras anteriores.

Multiplicación binaria N bits sin signo, produce a lo más, un resultado que 2N bits para representarse. Esto se puede demostrar, multiplicando el número más N bits por si mismo, es decir:

La multiplicación de dos números de requiere

grande de

N (2

− 1) ∗ (2N − 1) = (22N − 1) ∗ (2N +1 − 2)

El primer término, requiere de

2N

bits para almacenarse, mientras que el segundo, es solo

una pequeña fracción del primero y por lo tanto, no altera el número de bits que se necesitan. Además, el producto nunca generará un llevo más allá de los

2N

bits.

Para realizar la multiplicación, hay dos métodos: 1. Se suma uno de los operandos a si mismo un número de veces igual al valor del otro

Figura 3.4: Algoritmo para la multiplicación binaria de seis por tres

operando

2. Usar el procedimiento que se emplea al evaluar una multiplicación a mano.

El algoritmo puede realizarse utilizando cuatro posiciones de memoria como se ve en la Figura 3.4. El producto se almacena en dos posiciones llamadas PROD. El multiplicador y

La primera opción es la más fácil, pero también la más ineciente pues su tiempo de ejecución depende del valor de los operandos. Para realizar una multiplicación con el algoritmo que se emplea al desarrollarla a mano el multiplicador se va evaluando de derecha a izquierda. Si el bit que se observa es uno, el multiplicando desplazado se suma a los productos parciales anteriores. Si el bit es cero, no se suma nada, pero se mantiene el desplazamiento correspondiente. Por ejemplo, en la multiplicación de seis por tres:

el multiplicando, ocupan MPDR y MPDO respectivamente. El bit LLEVO, corresponde a la bandera de acarreo de la CPU. Una vez que se han almacenado los operandos en MPDR y MPDO, se pone en cero las posiciones de PROD y la bandera de llevo. En el paso 3, se realiza una rotación a la derecha en MPDR, quedando así el primer bit a evaluar del multiplicador en el LLEVO. Se prueba el LLEVO y como contiene un uno, se le suma el multiplicando a PROD (véase paso 4). Se puede observar que la suma se realiza sobre la palabra más signicativa de PROD. Esto se debe a que así, se facilita el desplazamiento y las sumas posteriores de los productos parciales. En el paso 5, se rota PROD hacia la derecha, lo cual equivale a que el siguiente producto parcial quede desplazado a la izquierda en la siguiente suma. Además, como las sumas de los productos parciales pueden generar acarreos, el desplazamiento a la derecha asegura que este no se pierda como en los pasos 7 y 8. Todo el procedimiento anterior se puede resumir en los siguientes cuatro pasos:

1. Rote a la derecha el MPDR para evaluar el siguiente bit en la bandera de acarreo.

El primer bit a evaluar del multiplicador es uno, lo cual nos produce un 110 como primer producto parcial, para el segundo bit del multiplicador, también se tiene el mismo producto

2. Si LLEVO=1, sume MPDO a la parte más signicativa de PROD. Si LLEVO=0, no le sume nada.

parcial, pero se le desplaza una posición a la izquierda, para tomar en cuenta que este producto parcial es una potencia de dos mayor que el anterior. El proceso se continúa siempre realizando el desplazamiento correspondiente, hasta que se evalúen todos los bits del multiplicador.

59

3. Rote a la derecha las posiciones PROD, para que el siguiente producto parcial quede desplazado un lugar a la izquierda al sumarse.

60

4. Si ya se evaluaron todos los bits del MPDR, termine, de lo contrario váyase al paso 1.

registro de 12 bits se desplaza hacia la izquierda, introduciendo un cero en el bit menos signicativo de DIVDEND. De esta forma el dividendo va apareciendo, poco a poco, en RESIDU

El algoritmo que se acaba de presentar, se puede modicar para economizar la mitad del almacenamiento empleado en PROD. Al respecto, se puede observar que cada vez que PROD se desplaza, MPDR ya se desplazó, por lo que queda un bit vacante en su posición más signicativa. Entonces MPDR se podría usar como la parte menos signicativa de PROD. Una vez que se han evaluado todos los bits de MPDR, su contenido será la parte inferior de PROD, también se puede extender el algoritmo a números de precisión múltiple. Esto se efectúa con sencillez incorporando las rutinas de múltiple precisión que se presentaron en la sección pasada. Las rotaciones y las sumas que demanda el algoritmo se podrían entonces sustituir por llamadas a las correspondientes subrutinas de múltiple precisión, cargando previamente los argumentos necesarios. Si P es el número de palabras de N bits que representan un operando, CONT se debe cargar con el número PxN.

donde se compara con el divisor. El propósito de la comparación es determinar si la porción del divisor que se encuentra en RESIDU es sucientemente grande para que se le pueda restar DIVSOR. Esto se logra vericando que la condición "DIVSOR es menor o igual a RESIDU.es verdadera. Si es así se ejecutan las instrucciones enmarcadas entre las sentencias IF y END IF. La resta realizada corresponde, en realidad, a una resta donde se le quita al dividendo el valor contenido en DIVSOR, multiplicado por una potencia de dos. En este caso las seis iteraciones tratan de realizar las siguientes restas:

Iteración 1: (dividendo) - (DIVSOR ∗ 25 )

Iteración 2: (dividendo) - (DIVSOR ∗ 24 )

Iteración 3: (dividendo) - (DIVSOR ∗ 23 ) Iteración 4: (dividendo) - (DIVSOR ∗ 22 )

División binaria El algoritmo de la división binaria de números positivos es muy similar al de la multiplicación pero en vez de realizar sumas se utilizan restas repetidas del divisor al dividendo.

Algoritmo para división de dos números positivos Inicie CONT a 6 Inicie RESIDU a 0 DO WHILE CONT sea mayor que 0 Decremente CONT en 1 Desplace RESIDU y DIVDEND hacia la izquierda tal que el bit menos significativo de DIVDEND reciba un cero y el bit más significativo de DIVDEND pase a ser el menos significativo de RESIDU. IF DIVSOR es menor o igual a RESIDU THEN RESIDU := RESIDU - DIVSOR Incremente DIVDEND en 1 END IF END DO-WHILE Donde CONT es un contador que contiene el número de bits en el dividendo, RESIDU es una variable que contiene el residuo al nal de la división, DIVDEND y DIVSOR contienen al dividendo y al divisor respectivamente y el resultado de la división queda almacenado en DIVDEND.

Iteración 5: (dividendo) - (DIVSOR ∗ 21 )

Iteración 6: (dividendo) - (DIVSOR ∗ 20 ) Si una de las restas anteriores es posible entonces se hace y se contabiliza el hecho incrementando el resultado en 1. El resultado se desplaza a la izquierda en cada iteración logrando así que se tome en cuenta la potencia de dos que multiplica a DIVSOR en la resta. Nótese que el rol de DIVDEND es doble. Por un lado sostiene los bits menos signicativos del dividendo y por otro lado sostiene los más signicativos del resultado. En la sexta iteración el dividendo ha sido trasladado a RESIDU y DIVDEND contiene el resultado.

Raíz cuadrada de múltiple precisión Un problema más interesante consiste en desarrollar una subrutina para extraer la raíz cuadrada a un número de múltiple precisión sin signo, para esto se toma el número y se le restan sucesivamente los números impares, uno a uno, empezando por uno y en orden ascendente, hasta que el resultado sea negativo. La raíz cuadrada del número, es decir el resultado, es igual al número de restas que no provocaron un resultado negativo. Así por ejemplo, para obtener la raíz de 4, primero le restamos uno y el resultado da 3; luego a este

El algoritmo comienza por almacenar un 6 en CONT indicando el número de bits del dividendo. El residuo a este punto es cero. El lazo principal está enmarcado por la sentencia DO WHILE y la sentencia END DO-WHILE. Las operaciones dentro de este lazo se llevarán a cabo mientras la condición del DO WHILE sea verdadera. Esta condición es que ÇONT

resto, le quitamos el siguiente número impar y el resultado es cero. Si intentamos quitarle 5, (que es el siguiente número impar) al resto, que es cero, el resultado dará negativo. Así que la raíz cuadrada del número es 2, ya que se realizaron dos restas que no provocaron un resultado negativo.

sea mayor que 0". El lazo entonces se ejecutará un número de veces igual al número de bits del dividendo.

3.2.9.

Dentro del lazo lo primero que se hace es decrementar a CONT en 1 para contabilizar el número de iteraciones del lazo y las variables RESIDU y DIVDEND se manipulan como un

Punto Flotante

Los números en formato de punto otante están denidos como el producto de dos valores:

único registro de 12 bits donde RESIDU es la parte mas signicativa. En cada iteración este

Número en punto flotante = M x rE

61

62

Número Representación 510

= = = = =

1012

5.00 E+0 0.05 E+2 500. E-2 101.02 E+0 0.1012 E + 112

= 5.00 x 100 = ( 0x10−1 + 5x10−2 )102 = ( 1x2−1 + 0x2−2 + 1x2−3 )23 Figura 3.5: Representación en punto otante para la CPUCR

Tabla 3.4: Representaciones en punto otante

Donde, M es la mantisa y contiene los dígitos signicantes del número; r es la base en que se representa el número y E es el exponente a que se eleva la base e indica la magnitud de

217. E-2

21.7 E-1

2.17 E+0

.217 E+1

.021 E+2

.002 E+3

los dígitos signicantes de la mantisa. Un posible formato para almacenar números de punto otante en la CPUCR podría ser Por ejemplo, la tabla 3.4 muestra diferentes representaciones en punto otante para el

el siguiente:

número cinco. Este tipo de representación numérica tiene dos ventajas cuando se compara con la repre-

1. El exponente se almacena en una palabra, donde el bit más signicativo es el signo.

sentación en múltiple precisión:

Esto proporciona valores extremos en el exponente binario entre -128 y +127.

1. La posibilidad de poder representar números fraccionales manejando el signo del expo-

2. Para representar la mantisa, se pueden utilizar tres palabras de 8 bits, siendo el bit más

nente.

signicativo de la palabra más signicativa el signo de la mantisa. Los valores extremos quedarán entre -131072 y +131071. El punto binario siempre estará implícitamente a la derecha del bit de signo de la mantisa como se indica en la Figura 3.5.

2. La posibilidad de poder representar un amplio ámbito de valores con un número mínimo de posiciones de memoria.

El número puede ser almacenado en posiciones consecutivas de memoria empezando por El número de bits usados para la mantisa determina la precisión con que se representa el número, además, la precisión del número es igual al número de dígitos signicativos que este tiene y el número de bits que denen el exponente, determinan las magnitudes máximas y mínimas que se pueden representar con la precisión dada por la mantisa.

Ejemplo Se desea expresar en punto otante el número 2,1704. Si la precisión que se tiene para la man-

la parte menos signicativa de la mantisa hasta el exponente. Cualquier operación aritmética sobre un número representado en punto otante debe considerar dos factores:

X

Todos los operandos involucrados deberán ser normalizados para valerse de la mayor precisión que pueda representar la mantisa.

tisa y exponente es de un dígito decimal, donde se pierden los valores decimales del número y el ámbito de valores máximo y mínimo positivos distintos de cero que es posible representar será de +9E +9 a +1E -9 por lo que se podría representar en una de las siguientes formas:

X

La operación aritmética a realizarse no solo afecta la mantisa sino que el exponente debe corregirse según lo amerite.

2 E+0

.2 E+1

Normalización de números en punto otante Ahora, si se aumenta la resolución del número a tres dígitos al aumentar el número de

Con el n de que las rutinas de aritmética en punto otante operen con el mayor grado

localizaciones de memoria para la mantisa, perdiéndose dos decimales y el número de órdenes

de exactitud posible, el valor de cada número debe ajustarse a su representación normalizada

de magnitud sigue estando entre -9 y +9, por lo que el número podría representarse en una

antes de realizar las operaciones. Un número está representado en forma normalizada cuando

de las siguientes formas:

su dígito más signicativo es un número diferente de cero.

63

64

Para normalizar un número, se desplaza la mantisa a la izquierda hasta que se eliminen los ceros. Por cada desplazamiento a la izquierda, el exponente se debe decrementar para mantener el valor real del número. Al nal de este desplazamiento el exponente se corrige para tomar en cuenta el número de lugares corridos hacia la izquierda.

Suma de números en punto otante Un algoritmo para realizar la suma de números en punto otante se muestra en la gura 3.6. La suma se realiza con el acumulador de punto otante, a partir de ACUMPF, y un operando de punto otante, a partir de OPNDPF. El resultado queda en el acumulador de punto otante. A partir de ahora nos referiremos simplemente al acumulador y al operando, en el entendido que se trata de los correspondientes de punto otante. Al inicio del algoritmo se pregunta si el acumulador es cero. Si es cero entonces se transere el operando al acumulador y se regresa. Si el acumulador no es cero pero el operando si lo es, entonces el resultado ya está en el acumulador y se puede regresar. En la mayoría de los casos tanto el acumulador como el operando van a ser distintos de cero. Si sus exponentes son iguales entonces se puede proceder a realizar la suma de inmediato. Si los exponentes son distintos se debe trasladar el mayor de los números de punto otante al acumulador y el menor debe permanecer como el operando. Esto prepara a ambos números para el resto de los pasos del algoritmo y debe recordarse que el acumulador siempre contiene al mayor de los dos. Cuando los exponentes son distintos, la diferencia entre ellos no debe exceder al número de bits disponibles para la magnitud de la mantisa. En nuestro caso esto es 17. Es decir, si el exponente del número en el acumulador es 18 unidades mayor que el exponente del número en el operando, entonces el operando es demasiado pequeño para afectar la mantisa del acumu-

Figura 3.6: algoritmo para suma de números en punto otante

lador y el resultado de la suma ya se encuentra en el acumulador. Si esta diferencia es menor o igual a 17 entonces el contenido del operando debe tomarse en cuenta para realizar la suma. La suma sólo se puede llevar a cabo cuando los dos exponentes son iguales. Previo a la suma, debe desplazarse la mantisa del operando hacia la derecha un número de veces igual a la diferencia que existe entre los dos exponentes. De esta forma se alinea el operando al acumulador. Puesto que el desplazamiento a la derecha provocaría la pérdida de bits en la mantisa del operando, la operación debe realizarse a cuádruple precisión, es decir, utilizando

en precisión cuádruple utilizando sus respectivas extensiones: ACUMEXT y OPNDEXT. Finalmente se realiza la suma de las dos mantisas. Una vez hecha la suma, se llama a la subrutina que realiza la normalización del número en el acumulador y luego se regresa con el resultado solicitado.

a la palabra OPNDEXT como la cuarta palabra de la mantisa. Durante el desplazamiento, el bit menos signicativo de OPNDPF pasaría a ser el bit más signicativo de OPNDEXT. Una vez alineado el operando, se puede proceder a la suma. La suma se lleva a cabo usando las dos mantisas en precisión cuádruple, cuando los dos exponentes son iguales. En esta operación se considera que las mantisas tienen cuatro palabras en vez de tres. Las palabras menos signicativas son ACUMEXT y OPNDEXT y las más signicativas son ACUMPF+2 y OPNDPF+2, respectivamente. Como la suma puede generar un llevo, y para evitar tener que probar esta condición, se desplazan ambas mantisas a la derecha una posición más y se incrementan ambos exponentes. Las mantisas se desplazan

65

66

Capítulo 4 Sistemas de almacenamiento de datos 4.1.

Jerarquía de memorias

Ya se ha hablado acerca de la arquitectura básica de un microprocesador y su gran utilidad a la hora de hacer operaciones matemáticas, pero es importante recordar que para que esto sea posible es necesario que se cuente con medios en donde las operaciones e instrucciones

Figura 4.1: Jerarquía de memorias

sean guardadas físicamente. Los medios de almacenamiento de datos suelen clasicarse de acuerdo a su velocidad y costo monetario, a esto se le conoce como jerarquía de memorias. En la gura 4.1 el primer grupo de almacenamiento que se puede observar es el concerniente a los registros de control la CPU, acá se almacenan los algoritmos que controlan el funcionamiento de la CPU. Con ella, la unidad de control es capaz de interpretar las instrucciones en binario que la CPU lee de la memoria principal. Aquí también se almacenan las secuencias de operaciones elementales que son necesarias para realizar una operación como ADD, STA, JMP si fuese el caso de la CPUCR. Algunos computadores no tienen una memoria de control como tal, pero requieren de cierto almacenamiento, para llevar el estado en que se encuentra la unidad de control en la CPU. En este grupo se puede encontrar los registros de almacenamiento de resultados, que en el caso de la CPUCR son el acumulador, el puntero de pila, el contador de programa y el registro estados, entre otros.

secundaria. Este tipo de almacenamiento posee una de las mayores capacidades alcanzado el orden de los terabytes, es decir miles de gigabytes de capacidad. En los discos duros se encuentran instalados los sistemas operativos y demás programas. El último nivel corresponde a los dispositivos extraíbles como el oppy, el disco compacto, el DVD, las memorias USB extraíbles, el Blu-ray con una capacidad de almacenamiento de hasta 50 GB. Estos medios por lo general son los más baratos pero no cuentan con la increíble velocidad que tienen las memorias caché por ejemplo.

4.1.1.

Memoria Virtual

La memoria virtual es una técnica que se utiliza para que un sistema aparente tener más

La memoria caché es una memoria sumamente rápida y cara, su objetivo es guardar las instrucciones más utilizadas por el CPU y de esta forma aumentar la eciencia del computador. La memoria principal, es aquella que es directamente accesible a la CPU por medio de sus instrucciones. En el caso de la CPUCR, nos referimos al arreglo de 65536 palabras de 8 bits que podemos manipular con las instrucciones, LDA, INA ,PHA ,etc. Esta memoria es el núcleo principal en el sistema de almacenamiento de un computador, ya que únicamente los programas almacenados en ella pueden ser ejecutados por la CPU. Inclusive, los datos en memoria principal, son casi los únicos que la CPU tiene disponibles para manipular directamente.

memoria principal o RAM que lo que realmente tiene. Debido a que en muchas ocasiones es imposible para un computador mantener todos los procesos guardados en memoria principal. Con la aparición de la multitarea este problema se agravó aún más. A un bloque de memoria virtual se le denomina página, por lo que a un fallo en memoria virtual se denomina fallo de página, con la memoria virtual la unidad central de procesamiento (CPU) genera una dirección virtual que se traduce en una dirección sica que se utiliza para acceder a memoria principal. Para un computador que cuente con un bus de direcciones de 32 bits, el máximo de memoria que puede acceder es de 4096 megabytes o 4 GB. Una memoria de ese tamaño en la

Debido a que la memoria principal tiene la característica de ser volátil, el almacenamiento de datos en forma permanente no es posible en ella, por este motivo se recurre a la memoria

67

actualidad es muy común y barata, pero en los años noventa era sumamente cara, por este motivo el método de memoria virtual se hizo extremadamente útil, ya que en el computador

68

se colocaba una cantidad de memoria pequeña y resto se simulaba mediante memoria virtual.

del número de bloque en la memoria asociativa no tendrá éxito. Está condición genera una interrupción en la CPUCR ya que el programa que se estaba ejecutando sólo podrá contin-

Este tipo de método se puede implementar mediante Hardware o Software. Lo más sen-

uar si se carga el bloque que se necesita. La CPUCR entonces ejecuta un programa que se

cillo desde el punto de vista de un programador es que se haga por Hardware, para esto se

encarga de buscar el bloque en memoria secundaria, de trasladarlo a una zona de memoria

hace uso del memoria asociativa. Por software depende del programa en que se implemente,

principal y de cambiar el contenido de la memoria asociativa para que indique en que bloque

el sistema operativo como Microsoft Windows posee un sistema de memoria virtual propio y

físico se encuentra el bloque recién traído. Todo bajo la suposición que en la CPUCR esté car-

GNU/Linux implementa un área de intercambio que el usuario debe de crear previamente,

gado un sistema operativo capaz de realizar dicha tarea, o bien una subrutina de de búsqueda.

para librar a la memoria principal de procesos que no se estén utilizando en ciertos momentos. El contenido de la memoria asociativa es como se indica en la gura 4.3. Las etiquetas Pero para comprender mejor el funcionamiento de la memoria virtual se tomará por ejem-

todas son distintas, del 0000 al 1111, y corresponden a los 16 bloques físicos en memoria

plo a la CPUCR, esta vez se supondrá que en vez de contar con 16 líneas de direccionamiento

principal. El campo de datos es de 14 bits, con lo cual se puede almacenar cualquier número

se tienen 24. Lo que da un espacio de memoria de 16 megabytes. Si cada bloque del sistema de

del 0 al 16383. Conforme se van cargando bloques a memoria principal, los correspondientes

almacenamiento virtual es de 1024 palabras y queremos mantener un máximo de 16 de estos

números se van registrando en las posiciones de datos de la memoria asociativa. Cuando se

bloques en memoria principal, entonces la CPUCR deberá tener 16384 palabras de memoria

llena la memoria asociativa y se necesita traer un nuevo bloque, se busca cual bloque de

física, la gura 4.2 muestra la estructura del ejemplo.

memoria física ha sido usado menos. Este se restituye a memoria secundaria y entonces se trae el nuevo bloque a ocupar su lugar.

Figura 4.3: Contenido de la memoria asociativa, memoria virtual.

4.1.2.

Memoria Cache

La función de la memoria cache es incrementar la velocidad de accesos a la memoria principal, debido a que la memoria cache es una memoria pequeña y veloz que contiene una Figura 4.2: Memoria virtual

copia de partes (bloques) de la memoria principal. Cuando el procesador solicita una palabra a memoria principal se trae todo el bloque que la contiene a cache, a causa del fenómeno de localidad es usual que se hagan referencias futuras a otras palabras del mismo bloque.

El corazón del sistema está en la memoria asociativa. Aquí se guarda una tabla que indica en que bloque de memoria física se encuentra una determinada dirección lógica. La dirección que genera la CPUCR sale en las 24 líneas de dirección. Las 10 líneas menos signicativas dan la dirección dentro de las 1024 posiciones que contiene cualquier bloque. Las 14 líneas más signicativas dan un número de bloque de los 16384 que se encuentran almacenados en memoria secundaria. La memoria asociativa toma el número de bloque lógico y lo traduce a un número de bloque físico. El número de bloque físico y las 10 líneas menos signicativas de la dirección de la CPUCR constituyen la dirección física que se busca.

Figura 4.4: Procesador, memoria cache y memoria principal

Si el bloque lógico que se pide no se encuentra en memoria física entonces la búsqueda

69

70

Para ilustrar un poco mejor este comportamiento se ejemplica mediante una operación de lectura en donde el procesador genera una dirección RA de la palabra que se desea leer, si la palabra esta contenida previamente en cache se entrega al procesador, de lo contrario el bloque que contiene dicha palabra es llevado a la cache y posteriormente la cache la entrega al procesador, estas dos acciones se realizan en forma paralela, como es común de observar en las organizaciones de cache actuales.

Figura 4.6: Caches y conexiones externas del procesador Pentium III

X

Cache L1 de instrucciones: contiene instrucciones de la RAM que fueron decodicadas.

X

Cache L1 de datos: contiene información de la RAM, así como información utilizada recientemente durante el funcionamiento del procesador.

Cache L0 Figura 4.5: Flujo para la operación de lectura en cache.

Los accesos al cache de nivel uno (L1) consumen cerca del 27 % de la energía en el procesador, se ha logrado reducir este consumo mediante el caché de nivel cero pues este evita un acceso al caché de nivel uno.

Existen varios niveles de memoria caché, la caché L1 se encuentra ubicada dentro del

Además si un acceso crea un hit en el caché de nivel cero, el siguiente acceso ira nuevamente

microprocesador por lo que muchas veces complica el diseño del mismo, su capacidad oscila

al cache de nivel cero, si por el contrario el acceso produce un miss en el caché de nivel cero,

en el orden de los kilobytes. La caché L2 se encuentra entre el microprocesador y la memoria

el siguiente acceso se hará al caché de nivel uno.

principal y es más lenta que la L1, además la cache L3 y la victim cache.

Cache L3

Victim cache El victim cache es la adición de un pequeño caché totalmente asociativo entre el caché L1

El cache de nivel 3 o L3 de caché soporta capacidades de 4 MB o incluso 6 MB, sin

y la memoria principal, cuando se produce un miss los bloques de caché que son descartados

embargo solo los microprocesadores más nuevos soportan este tipo de memoria.

se envían al victim cache en caso de que sean requeridos nuevamente en corto tiempo.

Cache L2

Pentium III.

A manera de ejemplo, la gura 4.6 representa los dos niveles de cache presentes en el

El cache de nivel dos es un intermediario entre el procesador con su caché interna y la RAM, además es de mayor capacidad que el cache de nivel uno, puede acceder rápidamente a la RAM aunque no tan rápido como la caché nivel uno.

Políticas de escritura El proceso de escritura en cache se da directamente, se tiene que para trasladar información de la cache a la RAM, hay dos políticas de escritura fundamentales:

Cache L1

1. Write-back: La información se escribe directamente en la caché, sin actualizar la RAM

El cache de nivel uno es conocido también como cache interno, por estar ubicado muy cerca del procesador, se compone de dos partes:

71

y cuando una posición de cache debe ser utilizada por otra posición de RAM diferente, su contenido se traslada a la RAM, asegurando la coherencia entre ambas memorias.

72

2. Write-througth: En esta modalidad cada vez que se escribe en una línea de caché, se actualiza la RAM, haciendo accesos continuos a la RAM decrementando el rendimiento.

4.1.3.

Memorias estáticas

La estructura de una memoria estática se basa en los ips-ops y biestables, tiene como gran característica que los datos que contienen no tienen que ser refrescados constantemente

Protocolo MESI

a diferencia de las memorias dinámicas, sin embargo estos datos son volátiles y se pierden

Actualmente existen sistemas con más de un procesador, así que para proporcionar co-

cada vez que la alimentación es quitada.

herencia, la cache de datos implementa un protocolo conocido como MESI que incluye dos bits de estado para representar cada uno de los cuatro estados que se muestran en la gura

La memoria estática de acceso aleatorio que se construye a base de transistores MOSFET, se dice que son de acceso aleatorio ya que su información puede ser accesada en cualquier

4.7.

orden, no importa dónde en que posición se encuentre el dato deseado.

Figura 4.7: Diagrama de transición de estados del protocolo MESI

X

Modicado (Modied) La línea de cache ha sido modicada y es distinta a su valor en memoria principal, así que los datos están disponibles solo en esa cache.

X

Exclusivo (Exclusive)

Figura 4.8: Celda de una memoria SRAM

Como mínimo una celda SRAM ocupa 4 transistores para formar un biestable que almacene cada bit, en gura 4.8 los transistores M2, M4, M1 y M3 forman dicho elemento. La señal WL controla el modo de operación de la celda. Cuando se quiere realizar una escritura se activa la señal de control WL y se coloca el

BL

el dispositivo escribe el valor contrario. Para el proceso

La línea de cache tiene el mismo contenido que en memoria principal y no está presente

valor deseado en la línea BL, en

en ninguna otra cache.

de lectura se ponen en uno los buses de datos y luego se activa WL, al ocurrir esto el valor contenido base a BL y su valor contrario a

X

BL. A parte de estos dos modos de funcionamiento

la celda cuenta con un estado de reposo, en el cual el dato se mantiene siempre y cuando esté

Compartido (Shared)

alimentado.

La línea de cache tiene el mismo contenido que en memoria principal y puede estar contenido en otra cache.

X

4.2.

No válido (Invalid)

Características de los medios de almacenamiento

Los medios de almacenamiento poseen ciertas características que los hacen diferenciarse

La línea de cache no contiene datos válidos.

73

entre ellos:

74

1. Medio de almacenamiento.

4. Alterabilidad.

vez realizado el acceso a la localidad deseada, el dato que se encuentra ahí es destruido por

2. Tiempos de operación.

5. Permanencia.

el proceso de lectura y debe ser luego restituido. En estos casos, el tiempo de acceso viene

3. Modo de acceso.

6. Costo.

seguido por un tiempo de restitución y por lo tanto

tC

es mayor que

tA .

W B= tC

A continuación se procederá a explicar los principales detalles de cada uno de estos puntos, para que de esta manera se comprenda más a fondo estos dispositivos.

(4.1)

Donde w es el número de bits que se toman simultáneamente en un acceso a la memoria. La cantidad de B viene dada en bytes por segundo.

4.2.1.

Medios de almacenamiento

Existes diferentes medios físicos para el almacenamiento de datos. Los primeros fueron los del tipo mecánico, mediante la posición de engranajes era posible guardar datos. Luego

4.2.3.

Modos de acceso

vinieron los magnéticos, las primeras computadoras a partir de los años cincuenta utilizaban

La forma en que se puede acceder a una memoria es un factor determinante tanto el pre-

largas cintas en donde se guardaban los resultados de las distintas operaciones matemáticas,

cio como en la velocidad de la misma. Existen modos de accesos aleatorios, seudoaleatorio,

este mismo método se uso para el famoso oppy.

secuencial y asociativo.

A partir de los años noventa comenzaron a salir los discos compactos, los cuáles caracterizaron a los medios ópticos, estos presentaban la gran ventaja de ser más conables en cuanto a la seguridad de los datos, ya que los medios magnéticos eran muy vulnerables a los cambios climáticos y a los campos electromagnéticos. Para el comienzo del nuevo milenio los medios extraíbles basados en memorias EEPROM no volátiles se hicieron populares para el almacenamiento de datos, no se les utiliza única-

Acceso aleatorio La memoria con acceso aleatorio permite que sus posiciones sean accesadas en cualquier orden sin alterar el tiempo de acceso. Para que esto sea posible es necesario que cada posición de memoria cuente con un dispositivo de escritura y lectura lo que aumente su complejidad y costo.

mente para computadoras si no también para otros dispositivos.

4.2.2.

Tiempos de operación

Relacionados con este parámetro existen tres cantidades que se utilizan para describir una memoria:

1. El tiempo de acceso 2. El tiempo de ciclo

tA Figura 4.9: Esquema de acceso aleatorio a una memoria

tC

3. La razón de transferencia de datos B. La gura 4.9 muestra como mediante la lógica de selección es posible acceder a cada El tiempo de acceso para una memoria con acceso aleatorio, es el tiempo transcurrido entre el momento en que se le presenta a la memoria la dirección de la localización deseada

bloque de forma independiente. Debido al costo que tienen este tipo de memorias la capacidad de los mismos son muy pequeñas.

y el momento en que aparece el dato en la salida de la memoria. Para memorias con acceso distinto al aleatorio, el tiempo de acceso viene dado por el tiempo transcurrido entre el momento en que se solicita un dato y el momento en que es encontrado; sin que esto signique que el dato se haya leído. Este proceso generalmente incluye la interacción entre el hardware de la memoria y un software especial que maneja a la memoria desde el computador. El tiempo de ciclo nos indica el tiempo mínimo posible entre dos accesos consecutivos a la memoria. En ciertos casos el tiempo de

Acceso seudoaleatorio El modo de acceso seudoaleatorio reduce en forma signicativa la cantidad de transductores

1

que utiliza para acceder a los datos almacenados. Sin embargo la velocidad entre las

1 Dispositivos

electrónicos encargados de realizar la escritura y lectura en una memoria.

ciclo es igual al tiempo de acceso. Sin embargo, en memorias con lectura destructiva, una

75

76

operaciones se ve afectada considerablemente.

Como se ve en la gura 4.11 un único transductor está encargado de acceder a cada posición de memoria, por lo que tendrá que pasar por cada una hasta encontrar la que realmente desea utilizar.

Acceso Asociativo El contenido de una posición de memoria asociativa tiene dos componentes: la etiqueta y los datos. La etiqueta hace la misma función que la dirección en los otros tipos de acceso. Puede haber más de una etiqueta por posición. Los datos son únicamente información adicional y no pueden ser usados para direccionar la memoria. Las memorias del tipo caché utilizan este tipo de acceso, esta alto desempeño va de la mano con la complejidad y el costo de producción de la mismas por ende como se había mencionado, la capacidad de las mismas es limitado. Figura 4.10: Esquema de acceso seudoaleatorio a una memoria

4.2.4. Por ejemplo en la gura 4.10 se puede apreciar que dos transductores se encargan de leer 16 posiciones de memoria, por lo tanto este tipo de medio de almacenamiento puede contar con mayores capacidades que los de acceso aleatorio, y a un menor precio.

Alterabilidad

No todos los tipos de memoria son de lectura y escritura. El aspecto de la alterabilidad corresponde a la disponibilidad de cambiar el contenido dentro de una medio de almacenamiento. A partir de esta característica se pueden diferenciar dos tipos memorias las ROM (Read Only Memory ) y las RAM Random Access Memory, en el primer tipo únicamente es posible introducir datos una única vez, y luego éstos solo estarán disponibles para la lectura.

Acceso secuencial

Para la memoria RAM es posible realizar escrituras y lectura todas las veces que se desean

Las memorias de acceso secuencial cuentan con la gran ventaja que su capacidad puede

limitado únicamente por la vida útil del dispositivo.

ser muy grande y su costo muy bajo, sin embargo la velocidad de lectura o escritura es mucho más bajo que cualquier cosa.

4.2.5.

Permanencia

Ya que se ha hablado un poco acerca de la alterabilidad de algunos tipos de memorias es importante señalar la duración que tienen los datos en las mismas. Tres características que pueden presentar los datos de cierto medio de almacenamiento son:

1. Volatibilidad 2. Estabilidad

Volatibilidad Este aspecto se reere a cuánto tiempo puede permanecer cierto dato dentro de un dispositivo, dependiendo básicamente de la alimentación que tenga el aparato aparato, un claro ejemplo es la memoria RAM o memoria principal de un computador, una vez que la computadora sea apagada toda la información contenida es borrada. Figura 4.11: Esquema de acceso secuencial a una memoria

77

78

Estabilidad

que permite reducir el tamaño del decodicador, el

Se pueden diferenciar dos tipos: las memorias estáticas, en las cuales los datos permanecen en forma constante hasta que se les altere o se corte el suministro eléctrico (si fuesen volátiles) y las memorias dinámicas, en estas los datos se están refrescando continuamente ya que la capacidad de retención de los mismos es corto.

4.3.

direccionamiento coincidente.

Con este método de direccionamiento una celda es seleccionada si en ella coinciden las salidas activas de dos decodicadores de dirección. Un decodicador produce las líneas de selección X y el otro produce las líneas de selección Y. En la gura 4.13 se puede apreciar un arreglo de memorias con direccionamiento coincidente.

Tipos de memorias

En esta sección se vera un poco más a fondo los tipos de memorias que hay si su modo de funcionamiento.

4.3.1.

Memorias electrónicas de escritura y lectura

Las memorias de escritura y lectura en medio electrónico tienen como unidad elemental estructural el ip op, el cual es capaz de mantener un dato y cambiarlo dependiendo de las entradas que se le den. Al colocar un 1 lógico en la entrada S, se pone la salida Q también en uno. Un 1 en R restituye el valor de Q a cero. En ningún caso debe llevarse las entradas S y R simultáneamente a 1 ya que no es posible saber cual sería el resultado.

Figura 4.13: Arreglo de memoria con direccionamiento coincidente

Además del arreglo de memorias, los dispositivos actuales cuentan con más lógica para controlar el tráco de datos dentro y fuera de la memoria. Un ejemplo se ve en la gura 4.14. Figura 4.12: Diagrama de una celda de memoria La señal CS, Chip Select, al ponerse en 1 lógico habilita las salidas del decodicador de direcciones y permite que la salida de datos pueda ser habilitada por un R/W=1 y OD =O. Si Además del ip-op, una celda básica de memoria debe contar con una lógica de selección

CS=O el decodicador de direcciones no selecciona ninguna palabra del arreglo de palabras

la cual controle el funcionamiento de la misma, como por ejemplo en el diagrama mostrado

y la salida de datos permanece en tercer estado. La entrada OD , Output Disable negado,

en la gura 4.12 se puede apreciar que la línea R/W dene la dirección de la transferencia

pone la salida de datos en un estado de alta impedancia (lo que se conoce también como

una vez que se selecciona la celda. Cuando R/W= 1 se lee de la celda, el dato aparece en la

tercer estado), cuando tiene un uno lógico. Gracias a esto, la salida de datos puede separarse

salida O. El dato en la entrada I es escrito en la celda cuando R/W= 0 y se selecciona la celda.

de la entrada sin que hayan çhoques"de datos.

A la hora de pensar en una arregle de celdas para conformar una memoria se puede optar por dos maneras de hacer el direccionamiento de la mismas. El primer tipo es el

cionamiento lineal,

direc-

acá la lógica de selección del arreglo de celdas es controlada por un

4.3.2.

Memorias electrónicas dinámicas

decodicador, sin embargo este circuito se vuelve cada más grande y complejo al aumentar

Cuando se habló acerca de la estabilidad de algunos tipos de medios de almacenamiento

el tamaño del arreglo. Debido a estos inconvenientes existe un método de direccionamiento

se mencionó el término de memorias dinámicas. Una de las mayores ventajas que presentan

79

80

Figura 4.14: Estructura completa de una memoria estática sencilla

con respecto a otros tipos es su precio y su bajo consumo de energía. La gura 4.15 muestra la estructura elemental de una celda para una memoria dinámica, consta de principalmente de un transistor y un capacitor el cual contiene el dato lógico, uno Figura 4.16: Memoria dinámica sencilla

si se encuentra cargado y cero si está descargado.

4.3.3.

Memorias electrónicas de solo lectura

Las memorias de solo lectura cuentan con la características de que su información no es volátil como es el caso de las memorias dinámicas y algunas estáticas. Se pueden encontrar cuatro variedades de memorias de sólo lectura.

Memorias ROM En una memoria ROM los datos son escritos al momento de su fabricación, y nunca más es posible alterar esos datos sin destruir el dispositivo.

Figura 4.15: Estructura de una celda dinámica

Debido a las fugas que presenta el capacitor por medio del transistor, es necesario que el dato se esté actualizando constantemente, para esto se requiere de una circuitería extra que se encargue de este trabajo. En la gura 4.16 se ve que una celda amplicadora de censado AS, compara el valor que cada celda de memoria y restituye el dato leído. Además gracias a otras señales como R/W y CE, es posible controlar la dirección del ujo de datos y la actividad del circuito respectivamente.

81

82

y EEPROM entre otros.

Memorias EPROM La programación de una memoria EPROM se realiza de la misma manera que con la memoria PROM. Sin embargo con la EPROM se puede revertir el proceso de grabación utilizando una luz ultravioleta, debido a que las celdas que las componen Figura 4.17: Memoria tipo ROM

Su estructura se compone de una celda capaz de almacenar únicamente un 1 lógico, para representar un cero simplemente no se coloca la celda.

son foto sensibles provocando una descarga de la misma retornando de nuevo a un valor de cero. La gura 4.19 muestra un chip que contiene una memoria EPROM, se aprecia una ventana translúcida exponiendo el circuito, esto es para que se pueda utilizar un rayo de luz Figura 4.19: Memoria tipo

ultravioleta en él.

EPROM

Memorias PROM Las memorias PROM son programables por el usuario. La programación se lleva a cabo alimentando la memoria con un voltaje mayor al de operación al mismo tiempo que se manipulan las líneas de dirección y de datos. Una vez programada, la PROM es irreversible por lo que no hay cabida para errores.

Memorias EEPROM y Flash La memoria EEPROM (Electrically Erasable Programmable Read Only Memory ) esta constituida por un transistor CMOS de compuerta otante, al cual se le puede modicar su estado eléctricamente, lo que lo hace mucho más práctico que las memorias tipo EPROM. Este tipo de memoria tuvo una gran aceptación, incluso dio a paso para la creación de las famosas memorias ash. Éstas poseen un tipo más avanzado de EEPROM, permitiendo velocidades mayores de transmisión de datos y mayor densidad de los mismos. Las memorias ash son tan usadas actualmente que se las pueden encontrar en cámaras fotográcas, reproductores de música y dispositivos de almacenamiento portátiles entre otros. De hecho a partir de es tipo de memorias se están empezando a crear los llamados discos de estado sólido, que pretenden en un futuro reemplazar a los discos duros convencionales.

Figura 4.18: Memoria tipo PROM

La gura 4.18 muestra como se compone una celda para memorias PROM, como se puede apreciar cuenta con un transistor y un fusible, cuando se quiere colocar un 1 en la celda simplemente se deja intacta la celda, pero si lo que se quiere es un cero lógico se rompe el fusible cortando así el paso de la alimentación VCC a la salida. Figura 4.20: Dispositivo de almacenamiento USB tipo ash

4.3.4.

Memorias electrónicas borrables

A parte de las memorias ROM y PROM, existes otras en las que es posible alterar los datos previamente guardados, entre estos tipos se pueden distinguir las EPROM, EAPROM

83

84

4.3.5.

Discos Flexibles

El disco exible esta hecho de mylar

que su división se realiza en el momento en que se le da formato al disco. La pista entonces 2

grueso recubierto con una capa de óxido magnético

de hierro igual a la que se usa en la mayoría de las cintas de grabación para sonido, sin embargo su consistencia es más dura. Los discos vienen en varios tamaños: 8 pulgadas (20 cm), 5.25 pulgadas (13 cm) y 3.5 pulgadas (9 cm). Las capacidades típicas de almacenamiento son entre 100 Kbytes y 1.4 Mbytes.

puede dividirse en el número de sectores que sea necesario de acuerdo al criterio de diseño que tenga prioridad. Anteriormente existían los discos hard sectored cuya división en sectores venía determinada por una secuencia de huecos equidistantes que se encontraba en el perímetro del círculo donde está el hueco de índice. Los discos hard sectored solo tenían el número de sectores que indicaban estos huecos, haciéndolos poco adaptables a otras aplicaciones e incompatibles entre sistemas con distinto número de sectores. Rápidamente perdieron popularidad y dejaron de usarse. A pesar que aún se les continúa usando los discos exibles se están volviendo obsoletos y las unidades lectoras se están reemplazando por dispositivos lectores de memorias tipo ash.

4.3.6.

Discos Duros

Los discos duros son medios de almacenamiento con gran capacidad, hasta el momento no existe otro tipo de dispositivo que lo pueda superar en cuanto a este aspecto. Los discos duros más grandes alcanzan capacidades de hasta 2000 GB. La estructura de un disco duro consiste principalmente en un arreglo de platos a los que se le pueden escribir y borrar datos de forma magnética, por cada plato se encuentran las cabezas o transductores de lectura y escritura. Un motor en corriente directa se encarga de hacer girar los discos, de igual forma las cabezas lectoras se pueden mover hacia el centro y hacia afuera de los platos. En la gura 4.22 es posible apreciar de mejor forma las partes de este dispositivo. El cerebro de la unidad lo conforma el circuito impreso, en él se encuentra los controladores necesarios para coordinar todas las acciones.

Figura 4.21: Estructura de un disco exible

El disco se encuentra dentro de una cubierta protectora de plástico para evitar que sus supercies se ensucien o rayen. Este sobre está recubierto por dentro de un material suave que disminuye el roce con el disco y limpia su supercie cuando gira. El sobre tiene un oricio por donde la cabeza de grabación y reproducción puede acceder a la información que se encuentra en la supercie del disco. La información en los discos se almacena en anillos concéntricos llamados pistas. Existen 77 pistas en los discos de 8 pulgadas y de 35 a 80 pistas en los discos de 5.25 y 3.5 pulgadas. Cada pista a la vez se divide en un cierto número de sectores. La división de las pistas en sectores se realiza normalmente en la modalidad soft sectored, es decir de sectores suaves, ya

2 Tereftalato

de Polietileno, es un tipo de plástico muy utilizado para la fabricación de botellas y algunos

textiles.

85

86

4.3.7.

El disco compacto

El disco compacto o CD es un medio de almacenamiento óptico, está compuesto básicamente de distintas capas de distintos materiales como el policarbonato, aluminio, entre otros. Su capacidad es 500 veces mayor que la de un oppy (700MB), sin embargo es menor a la de los discos duros actuales.

Figura 4.23: Estructura y funcionamiento del disco compacto

En la gura 4.23 se aprecia a grandes rasgos la estructura descrita anteriormente, la capa donde se encuentran presenta hundimientos y zonas lisas, un 1 lógico se representa mediante un transición de una zona lisa a uno de estos hundimientos o viceversa, si no se presenta Figura 4.22: Estructura interna de un disco duro

ninguna transición el dato se lee como un 0 lógico. Una unidad de disco compacto o CDROM cuenta con un láser capaz de incidir en la cara del disco y detectar los cambios en la supercie del mismo mediante la reexión del rayo.

Los discos duros se pueden clasicar de acuerdo a su velocidad en la transmisión de datos. Entre los más importantes se pueden encontrar:

Existen unidades que cuentan con dos tipos de láser, el encargado de realizar el proceso lectura y otro capaz de modicar la supercie del disco o en otras palabras escribir en el mismo.

1. IDE :La velocidad de transferencia de estos tipos de discos puede alcanzar hasta 133 MB/s (megabytes por segundo), fue el primer tipo de discos que salió al mercado. Actualmente se están volviendo obsoletos. 2. SCSI: Sin duda alguno los discos tipos SCSI son los más costosos, utilizados principal-

Con el pasar de los años los materiales y las unidades de lectura/escritura han ido cambiando dando origen a nuevos medios ópticos de mayor capacidad y velocidad. El DVD (Disco versátil digital) tiene una capacidad de hasta 8 GB y más recientemente el Blue-ray con capacidades de hasta 50 GB, más de 70 veces la capacidad de un disco compacto.

mente en servidores, estos discos pueden presentar velocidades de 640 MB/s. 3. SATA: Este tipo es el más reciente, y poco a poco va desplazando al IDE e incluso al SCSI, su velocidad puede llegar hasta los 1.5 GBps.

87

88

4.4.

Sistemas de archivos

partición es de 2 GB. En el sistema FAT 32 es posible tener particiones de hasta 8 terabytes.

Los sistemas de archivos son formas de organización que se utilizan en muchos dispositivos de almacenamiento, con el n de hacer de manera más eciente el manejo de los cheros dentro de los mismos.

4.4.2.

Sistema de archivos NTFS

Una de las grandes diferencias que presenta el sistema de archivos NTFS con respecto a En dispositivos como los discos duros, la información no necesariamente se encuentra

los FAT es su alto nivel de seguridad. Con la aparición del sistema operativo Windows NT se

localizada toda junta, más bien en la mayoría de los casos los archivos se encuentran seg-

introdujo este nuevo sistema, que soporta particiones hasta de 256 terabytes. La gura 4.25

mentados por toda la unidad, es ahí donde el sistema de archivos juega su papel en decir

muestra la estructura de una partición formateada en NTFS.

que fragmento pertenece a un chero dado y cual es su jerarquía, es decir, en qué carpeta se encuentra contenido. La eciencia en operaciones básicas de los sistemas operativos tales como copiar, mover y buscar depende de la capacidad y estructura del sistema de archivos que se esté usando. En la actualidad cada sistema operativo cuenta con sus sistemas de archivos, por ejemplo Microsoft utiliza los sistemas FAT y NTFS y los sistemas del tipo Unix como GNU/LINUX o SOLARIS hacen uso de EXT2, EXT3, EXT4 y REISERFS. Figura 4.25: Estructura de un sistema archivos NTFS

4.4.1.

Sistema de archivos FAT

De igual forma que en el FAT el sector de arranque contiene información del sistema.

El sistema de archivos FAT por sus siglas en inglés (File Allocation Table ), es un sistema muy básico en el que la capacidad de la unidad de almacenamiento.

También es utilizada para cargar los archivos iniciales del sistema operativo. La tabla de archivos principal o Master File Table, conforma un índice con información de cada archivo de la partición, tal como la carpeta donde se encuentra, el nivel de seguridad que tiene dicho

La gura 4.24 muestra la estructura de un volumen o partición.

archivo y por supuesto los punteros a los bloques en los que está contenido el mismo. En los archivos de sistema están contenidos cheros que no son accesibles para los usuarios y que tienen que ver con el funcionamiento del mismo sistema. Como se había mencionado anteriormente, el NTFS permite tener mayor control sobre los archivos de una determinada partición, es posible establecer permisos de escritura o un determinado usuario y de lectura a otro.

Figura 4.24: Estructura de un sistema archivos FAT

4.4.3.

Sistemas de archivos EXT2, EXT3 y EXT4

El sistema de archivos EXT2 fue el que más éxito obtuvo en los sistemas operativos Unix. La estructura de un sistema de archivos es la siguiente:

Su introducción se dio en el año 1993 y su diseñador fue Rémy Card. Su estructura se basa en grupos de bloques de datos, los cuales están conformados por:

Sector de arranque: En esta sección se encuentra almacenada información que utiliza el sistema para acceder al volumen. Tablas de asignación de archivos FAT: Básicamente contiene un índice con las direcciones que los bloques que conforman una partición y además contiene información del estado físico de los mismos. Esta tabla se repite para evitar pérdidas de todo el sistema si la primera se daña. Carpeta raíz y demás archivos: Acá se contiene la información básica de los archivos contenidos, como lo es la fecha de creación, tamaño del chero, último acceso entre otros. En el FAT16 la dirección de cada clúster es de 16 bits por lo que la capacidad máxima de una

89

90

Capítulo 5 Arquitectura de computadores y diseño de sistemas digitales Figura 4.26: Estructura de un sistema archivos EXT2

Un súper bloque, donde se guardan lo archivos necesarios para el arranque del sistema, este se encuentra copiado en cada grupo de bloques. Los descriptores de grupo de bloques se encuentra en cada grupo como el súper bloque, contienen información de los grupos de bloques de la partición. Los mapas de bits tanto de bloques como de inodos y la tabla de inodos conforman una especie de índice para la localización los archivos. Los inodos con-

5.1. 5.1.1.

Segmentación (Pipelines)

La segmentación (Pipelining) es clave para hacer procesadores más rápidos hoy en día y consiste en la ejecución de múltiples instrucciones a la vez, basándose en cuatro pasos:

tienen información de cada archivo tal como: el propietario del chero, los permisos y fecha 1.

de creación de los mismos.

Arquitectura de computadores: aspectos relevantes

Búsqueda (Fetch): Buscar la instrucción de la posición indicada por el contador de programa.

El sistema EXT3, conservó la estructura del EXT2 pero se le implementó la funcionalidad conocida como bitácora o en inglés journaling. Gracias a esto fue posible mantener la inte-

2.

3.

Ejecución (Execute): Ejecutar la instrucción.

4.

Escribir (Write): Escribir el resultado en el registro destino.

El en el sistema EXT2 se utilizaba la herramienta fsck (le system check ), con el inconveniente que se tenía que analizar toda la partición cuando habían incongruencias en el sistema de archivos. Pero con EXT3 no era necesario leer todo la partición, ya que todas las modicaciones de los cheros son previamente guardadas en registros, los cuales son fácilmente recuperables en caso de fallo.

Decodicación (Decode): Almacenar la instrucción en un registro de instrucciones, decodicarla e incrementar el contador del programa.

gridad de los sistemas incluso aún cuando se presentaban pérdidas de potencia en los equipos.

La ejecución de cada una de las etapas no interere con la ejecución de las demás. Sin embargo, esto puede llevarlo a pensar erróneamente creyendo que el pipeline va a

Desde el año 2006 se comenzó a trabajar en una nueva versión de la familia de archivos

extended, el EXT4 y que aún se encuentra en desarrollo, sin embargo para diciembre del 2008 fue incorporado al kernel de Linux. Entre las mejoras que presenta están: mayor capacidad para el tamaño de las particiones, el cual pasó de 32 terabytes a 1 exabyte (un billón de gigabytes), mejor velocidad en el acceso de archivos y chequeo de los mismos, así como un sistema que procura que los archivos se vayan guardando continuamente lo más que sea posible.

acelerar la ejecución de una instrucción, por lo que hay que resaltar que la segmentación no acelera la ejecución de una instrucción pero si de un conjunto de instrucciones. El ejemplo más conocido y de fácil entendimiento es el método presentado por Henry Ford en la línea de producción de automóviles con empleados especializados para cada labor y divididos en grupos, así los encargados de la construcción del chasis no tienen conocimiento de pintura u otra labor del proceso de construcción del vehículo y mientras cada equipo trabaja en su especialidad, los otros equipos esperan que el anterior termine para empezar, si cada equipo tardara una hora en realizar su trabajo un automóvil estaría listo en cuatro horas. Al querer mejorar la producción de la fábrica, es posible incrementar el rendimiento de cada grupo, si se duplicara se producirían el doble de automóviles, pero no es suciente debido a que no se optimizan recursos y la calidad de vida de los empleados disminuiría, ante esto una buena idea sería crear una nueva línea de ensamblaje, pero esto llevaría a altos costos de

91

92

5.1.2.

inversión y mantenimiento. Analizando los casos anteriores suena interesante la idea de trabajar en paralelo, con los

Limitaciones de la segmentación

Riesgos por dependencia de datos (data hazards)

mismos equipos especializados de trabajo; así mientras un equipo está en la etapa de insta-

Para el caso expuesto en la gura 5.1 las tres instrucciones ejecutadas eran independientes,

lación del motor, otro equipo puede ir construyendo un nuevo chasis, los equipos no esperan

por lo que ninguna utilizaba datos calculados por otra instrucción, pero si se diera el caso?

a que el anterior termine y mantienen un ritmo de trabajo constante, produciendo un carro

Es ahí cuando se producen errores por dependencias de datos, por ejemplo:

por hora, en lugar de uno cada cuatro horas.

sub and or add sw

Este brillante método es utilizado de manera análoga para la ejecución de instrucciones en un computador. Por ejemplo, supongamos que se tiene la instrucción cargar palabra:

lw

y que esta instrucción tiene un tiempo total de ejecución de 800 picosegundos, además se

$2,$1,$3 $12,$2,$5 $13,$6,$2 $14,$2,$2 $15,100($2)

# # # # #

sub escribe al registro $2 el operando $2 depende de sub el segundo operando $2 depende de sub primer y segundo operando dependen de sub el indice $2 depende de sub

cuenta con el siguiente código:

lw $1,100($0) lw $2,200($0) lw $3,300($0) Nótese que sin el uso de la segmentación el tiempo de ejecución de las tres instrucciones es de:

800 ps x 3 = 2400 ps = 2.4 ns Y con el uso de la segmentación el tiempo de ejecución de la instrucción es el mismo pero el de ejecución del grupo de instrucciones se reduce a 1400 ps, como se muestra en la gura 5.1. Un concepto importante que cabe aclarar en este momento es que al número de etapas que posee el pipeline es conocido como la profundidad del pipeline. A simple vista todo lo descrito anteriormente luce maravilloso pero no hay que dejar pasar por alto las limitaciones de la segmentación que se enumeran más adelante. Figura 5.2: Secuencia de instrucciones con riesgos de dependencia

Existen diversas formas de evitar estos problemas de dependencia tales como las detenciones y la anticipación.

X

Detenciones Consiste en detener las instrucciones en la segmentación insertando burbujas hasta que se resuelva el riego, como se ilustra en la gura 5.5.

X

Anticipación En este caso se toman las entradas a la ALU desde cualquier registro de segmentación, con ayuda de multiplexores y utilizando un control con lo que se pueden ejecutar las instrucciones sin necesidad de burbujas, entonces se utilizan los resultados temporalmente sin esperar que los registros sean escritos como se muestra en la gura 5.6.

Figura 5.1: Ejecución de tres instrucciones sin segmentación y con segmentación

93

94

Figura 5.5: Secuencia de instrucciones segmentada con burbujas insertadas para resolver el riesgo de dependencia de datos. Figura 5.3: Entradas a la ALU sin unidad de anticipación

Figura 5.6: Secuencia de instrucciones segmentada con anticipación para resolver el riesgo de dependencia de datos.

Riesgos por saltos Figura 5.4: Entradas a la ALU con unidad de anticipación

Como se ha visto anteriormente, con la segmentación se busca una instrucción nueva con cada ciclo de reloj, pero en el caso de los saltos existe un retardo en determinar la instrucción que se va a tomar pues es hasta en la etapa de memoria que se decide si el salto se va a tomar o no. En este caso se presentan dos soluciones:

95

96

X

Detenerse hasta que se complete el salto por completo, lo cual produce que se pierdan

7. La unidad de gestión de memoria (Memory Management Unit) solo puede usarse una

varios ciclos de reloj en la ejecuci[on de instrucciones.

X

Suponer que no se realiza el salto, en este caso se continua avanzando con el ujo de

dirección de dato por cada instrucción. 8. Se tienen cinco o más bits para un campo designado de registro entero, por lo que se pueden reverenciar explícitamente al menos 32 registros enteros.

instrucciones y si se determina que el salto debe hacerse, entonces se descartan las instrucciones que se habían buscado y decodicado.

9. Se tienen cuatro o más bits para un campo designado de registro de punto otante, por lo que se pueden reverenciar explícitamente al menos 16 registros de punto otante.

Excepciones Para explicar el riesgo de las excepciones se utilizara un ejemplo, asumiendo que la instrucción

add $1,$2,$1

presenta un desbordamiento aritmético, en ese caso se transere el

Existe la idea de que los diseños RISC y CISC pueden sacar provecho de la inclusión de características de ambos en un mismo diseño.

control a la rutina de excepciones después de ejecutada dicha instrucción para evitar que un valor no válido sea reejado en los registros o en la memoria, luego se va a la posición de la rutina de excepción y se permite que uyan las instrucciones que siguen después del add y se comienza a buscar instrucciones a partir de la nueva dirección.

5.1.3.

Computadoras con un conjunto de instrucciones complejo

5.1.5.

Superescalar

Un procesador superescalar maneja más de una instrucción por ciclo de reloj con una estructura segmentada, conteniendo las siguientes etapas: 1. Lectura (fetch)

CISC: Complex Instruction Set Computer

2. Decodicación (decode)

Casi todas las arquitecturas CISC destacan por la microprogramación, lo cual signica

3. Lanzamiento (dispatch)

que cada instrucción de máquina es interpretada por un microprograma localizado en una memoria en el circuito integrado del procesador, las instrucciones son largas y de longitud desigual.

5. Escritura (writeback)

Mediante una serie de microinstrucciones almacenadas en una ROM interna de la máquina se decodican internamente y se ejecutan las instrucciones compuestas, para esto se requieren varios ciclos de reloj o al menos un ciclo por microinstrucción.

5.1.4.

4. Ejecución (execute)

Computadoras con un conjunto de instrucciones reducido RISC: Reduced Instruction Set Computer

Por otro lado, el procesamiento de instrucciones RISC requiere instrucciones cortas, del mismo tamaño y que pueden ser procesadas más rapidamente.

6. Finalización (retirement) El procesamiento superescalar no altera el modelo de programación por lo que es transparente al programador, es decir, se cree que está ocurriendo una ejecución secuencial cuando en realidad se está haciendo una ejecución en paralelo.

5.1.6.

Multiprocesadores

Hasta hace pocos años todos los computadores hacían uso de un único microprocesador de uso general. Actualmente es posible encontrar diferentes marcas de microprocesadores de dos incluso más núcleos que permiten mejorar el desempeño del computador al ejecutarse varios hilos que corresponden a un mismo proceso o a procesos diferentes.

1. Tamaño típico de la instrucción: 4 bytes. Dentro de las características de los multiprocesadores se destaca: 2. Reducido número de modos de direccionamiento. 3. No se usa direccionamiento indirecto que requiera hacer accesos a memoria para conseguir la dirección de memoria del operando.

X

Hay dos o más procesadores similares.

X

Los procesadores comparten la memoria principal asi los dispositivos de entrada y salida, están conectados de manera que los accesos tarden el mismo tiempo para cualquier

4. No se direcciona más de un operando de memoria por instrucción.

procesador.

5. No hay operaciones que combinen la carga u almacenamiento con cálculos aritméticos.

X

Los procesadores están en capacidad de realizar las mismas funciones.

6. Las instrucciones de carga o almacenamiento no permiten una alineación de datos

X

El sistema está controlado por un sistema operativo integrado que permite la interacción

arbitraria.

entre los microprocesadores.

97

98

Esta arquitectura presenta un problema de coherencia de cache, pues los microprocesadores comparten la memoria principal, pero cada uno cuenta con su propia memoria cache, así que cuando un microprocesador escribe en una dirección de memoria lo hace sobre su caché, de manera que si otro microprocesador tiene almacenada la misma dirección de memoria en su caché trabajará con una copia errónea del dato almacenado.

or U_or (y,asel,bsel); endmodule Como se puede apreciar el multiplexor está conformado por dos compuertas AND, una OR y un inversor, las cuales están conectadas por las variables del tipo wire. Primero se declara el tipo de la compuerta, que puede ser not, or o and, le sigue el nombre que se le

5.2.

Diseño de sistemas digitales

5.2.1.

Lenguajes de descripción de hardware

quiera dar para diferenciarla de las demás y por último entre paréntesis se declara la salida y las entradas.

Descripción por comportamiento

Existen diversos lenguajes de descripción de hardware, que permiten el análisis y diseño de un circuito electrónico, para el caso del estudiante de Ingeniería Eléctrica de la Universidad de Costa Rica resultará muy familiar el uso Verilog en diversos cursos de su carrera.

En esta forma un circuito es construido haciendo mediante la descripción del funcionamiento de sus componentes, y no por su estructura física. Por ejemplo si quisiera obtener la suma lógica de dos entradas A y B, no se implemente haciendo uso de la compuerta básica OR, si

5.2.2.

no que se representaría mediante la suma aritmética A + B.

Verilog

Verilog es un lenguaje por medio del cual se puede describir en forma completa un circuito

El siguiente código corresponde a un multiplexor de dos entradas.

digital y es muy utilizado para realizar simulaciones y diseños. El programa Verilog fue creado en el año 1985 por Phil Moorby y durante cinco años fue código privado. Debido a presiones externas que se generaban por su gran potencial, la empresa Cadence Design Systems decidió liberarlo. En el año de 1991 se funda la OVI, Open Verilog International, para mejorar el desarrollo del mismo implementando diversos simuladores. La IEEE planteó un estándar para este lenguaje que comenzó a regir en 1995. Un circuito en Verilog puede estar escrito estructuralmente o por comportamiento.

Descripción estructural

module mux_using_assign( din_0 , // Entrada 1 din_1 , // Entrada 0 sel , // Selector de entradas mux_out // Salida ); //-----------Entradas--------------input din_0, din_1, sel ; //-----------Salida--------------output mux_out; //------------Variables Internas-------wire mux_out; //-------------Código----------------assign mux_out = (sel) ? din_1 : din_0; endmodule

//Fin del módulo

En el modo estructural se describe el circuito utilizando las compuertas básicas de los circuitos digitales como las AND, OR, XOR, XNOR, entre otras. Interconectándose entre sí

A diferencia de la descripción estructural, la implementación del circuito en sí se base en

por medio de cables que son previamente declarados. Este modo es bastante preciso ya que

única linea. En donde la salida mux_out toma el valor de la entrada din_1 si la señal sel

presenta el circuito como tal y como es si fuese construido, sin embargo para modelos muy

está en uno, de lo contrario toma el valor de la entrada din_0.

grandes se vuelve bastante tedioso y difícil de entender. Por ejemplo si se quisiera describir un multiplexor de dos entradas a un salida el código sería el siguiente:

module mux_2to1_gates(a,b,sel,y); //-----------Entradas--------------input a,b,sel; //-----------Salida--------------output y; //------------Variables Internas-------wire sel,a_sel,b_sel; //------------Declaración de las compuertas lógicas-------not U_inv (inv_sel,sel); and U_anda (asel,a,inv_sel), U_andb (bsel,b,sel); 99

100

Capítulo 6 Ejemplos y laboratorios 6.1.

Programas ejemplo

Los ejemplos presentados serán codicados en lenguaje de máquina de la CPUCR; la extensión de estos conceptos a otros sistemas computador, es directa una vez que se conoce la arquitectura del sistema y su conjunto de instrucciones.

6.1.1.

Operaciones de control

Un ejemplo de la estructura del programa con operaciones de control como la presentada en la sección 3.2.3 puede darse con tres números sin signo que están almacenados en las variables X, Y y Z respectivamente. Al colocarlos en orden ascendente en las variables A, B

Figura 6.2: Algoritmo para ordenar tres números en orden ascendente

y C. El mayor de ellos quedará almacenado en C.

6. En la codicación de este programa se han hecho varias suposiciones. Primero, las lo-

Solución:

calizaciones X, Y, Z, A, B y C se han ubicado en las direcciones que aparecen en la

Se utilizará la programación modular siguiendo los pasos de la sección 3.1 para resolver

Figura 6.1. Además el inicio del programa se escogió arbitrariamente en @0203.

el problema.

1. El problema se especica con el enunciado.

2. Datos de entrada X,Y y Z. Datos de salida A,B y C.

Figura 6.1: Localizaciones X, Y, Z, A, B y C

3. El formato de estas estructuras de datos se puede ver en la Figura 6.1.

4. El algoritmo se puede observar en la Figura 6.2.

5. Los bloques del algoritmo son lo sucientemente sencillos para comenzar a codicarlos de inmediato.

101

Código: Programa para ordenar tres números en orden ascendente * A B C

= = = =

@0400 * * + 1 * + 2

;Inicie contador de posicion ;variable A en dirección @0400 ;variable B en dirección @0401 ;variable C en dirección @0402 102

TEMP = * + 3 ;variable TEMP en dirección @0403 * = @0200 ;reinicie contador de posición X = * ;variable X en dirección @0200 Y = * + 1 ;variable Y en dirección @0201 Z = * + 2 ;variable Z en dirección @0202 * = * + 3 ;contador de posición a @0203 INICIO LDA X ;INICIO está en @0203 SUB Y BCC PROG1 ;compare magnitudes de X y Y LDA X STA B ;X va a B LDA Y STA A ;Y va a A JMP PROG2 ;continue ;------------------------------------------------PROG1 LDA X STA A ;X va a A LDA Y STA B ;Y va a B ;------------------------------------------------PROG2 LDA Z SUB B BCC PROG3 ;compare magnitudes de Z y B LDA Z ;Z es el mayor, póngalo en C STA C FIN HLT ;fin del programa ;------------------------------------------------PROG3 LDA B ;ZM con signo se pueden observar en la Figura 6.5.

105

106

Figura 6.4: Combinaciones posibles de las banderas N, Z, C y V

Resultado de (A)-(M)

Igual a cero Mayor que cero Menor que cero Mayor o igual a cero Menor o igual a cero

Números sin signo Z=1 Z'C = 1 C' = 1 C=1 Z+C' = 1

Números con signo

Z=1 Z'(NV+N'V') = 1 N'V+NV' = 1 NV+N'V' = 1 Z+N'V+NV' = 1

Tabla 6.1: Comparaciones más usadas entre dos números

Figura 6.5: Comparación de números

6.1.4.

Subrutina abierta

Un ejemplo de una subrutina abierta que calcula el valor promedio de dos valores A y B, almacenando el resultado en la localización C. También, se muestra como se inserta la misma Es importante observar, que los resultados que se obtienen después de realizar la operación

subrutina en un programa para operar con distintos argumentos.

SUB, se tabulan, en la Figura 6.4, como resultados con signo. En el mapa de Karnaugh para los operandos sin signo, se presenta la condición ME, menor que cero, que se reere al signo del resultado. Si no se requiere tomar en cuenta el signo del resultado, todas estas condiciones cambiarían de ME a MA, siendo la única diferencia, la condición del llevo, C. Cuando C=1, el resultado de la resta no se ha salido del ámbito de números positivos que se está usando. Una resta de 5 en 20, causaría un llevo igual a 1. Por otro lado, si C=0, la resta ha causado que el resultado quede fuera del ámbito de números positivos que el acumulador puede representar. Cuando la operación realizada es una suma (ADD), la interpretación de los mapas de la Figura 6.4 es distinta. Si se tiene únicamente operandos positivos, sin signo, la suma de ellos sólo puede dar un resultado positivo; por lo tanto, se debe seguir la interpretación del mapa

Código de la subrutina: PROM LDA A ADD B ROR STA C

6.1.5.

Subrutina cerrada

En la Figura 6.6 se ve el ejemplo de la Tabla 6.2 adaptado a subrutinas cerradas.

de Karnaugh según se discutió en el párrafo anterior. Además, la condición de igual a cero ya no es la misma. Cuando se realiza una suma, el acumulador puede llegar a cero por dos razones: se sumó cero con cero o se sumaron dos números que rebasaron la capacidad del acumulador y lo pusieron a cero. En el primer caso, el llevo resulta cero y sale la condición N=0, V=0, Z=1 y C=0; la cual se encuentra marcada con una X. Esta condición, sí es válida para la operación ADD, pero no existe para la operación SUB. El segundo caso es la condición IG, que ya se encuentra marcada en ambos mapas. Cuando se suman números con signo, el mapa de Karnaugh correspondiente se interpreta tal y como aparece en la Figura 6.4 y con la inclusión de la nueva condición de igual a cero que se acaba de discutir.

107

108

Subrutina

Algoritmo

PROM LDA A ADD B ROR STA C Haga: X3 = (X1+X2)/2 •••

Codicación •••

LDA X1 ADD X2 ROR STA X3 •••

LDA Y1 Haga: ADD Y2 Y3 = (Y1+Y2)/2 ROR STA Y3 •••

•••

LDA seguida de una instrucción STA. Esto implica que por cada dato de una palabra que se desea movilizar entre el programa principal y la subrutina, se ocupan seis palabras de programa, lo que implica que manteniendo esta relación para cualquier número de datos se observa una ineciencia en el uso del espacio de memoria. La pila permite manejar el anidamiento de subrutinas gracias al mecanismo que permite salir de primero al último que entra, por lo que se dice que una subrutina H está anidada en otra M, cuando H es llamada desde M. El anidamiento se puede llevar al nivel de profundidad que permite el tamaño de la pila, por ejemplo, un anidamiento es de quinto nivel, si cinco subrutinas están anidadas entre sí: B llama a C, C a D, D a E y esta a su vez llama a F, siendo B y F las de menor y mayor profundidad respectivamente. Las direcciones de retorno se van almacenando una después de la otra en el orden de llamado, quedando en la cumbre de la pila, la dirección de retorno de la subrutina que llamó a la que está anidada

Haga: Z3 = (Z1+Z2)/2

LDA Z1 ADD Z2 ROR STA Z3

•••

•••

regresar al programa que originó el primer llamado. En este momento, la pila queda total-

Tabla 6.2: Ejemplo de subrutinas abiertas

más profundamente. Cuando se termina de ejecutar esta última, se regresa al siguiente nivel, recuperándose dos posiciones de la pila, conforme se van terminando de ejecutar subrutinas, se van recobrando las direcciones de retorno en el orden inverso en que se almacenaron, hasta mente "desprovista"de cualquier dirección de retorno.

Paso de parámetros directamente a memoria En el ejemplo de la Figura 6.6, las posiciones de memoria A y B, se emplean para almacenar los datos de entrada, y el acumulador se usa para pasar el dato de salida de la subrutina. En este caso, se combinan dos formas de pasar parámetros:

X

Directamente a memoria para los datos de entrada

X

Por medio de los registros de la CPU para los datos de salida.

Paso de parámetros indirectamente a memoria Se desea hacer una subrutina BORRAR, para borrar (poner en cero) una sección de memoria de longitud variable. Código de la subrutina:

* = @0326 DIRFTE = * * = *+2 CONT = * * = @400 Figura 6.6: Ejemplo de subrutina cerrada

Observe como se deben transferir las variables de entrada y resultados entre el programa principal y la subrutina, esto junto a los saltos y el retornos de la subrutina aumentan el tiempo de ejecución. Cada dato que se transere a la subrutina, ocupa una instrucción de

109

;Borre posición apuntada por DIRFTE BORRAR CLA STA (DIRFTE) ;Borre posición ;Incremente (DIRFTE) INCR DIRFTE ;Decremente (CONT) DECR CONT ;¾CONT=0? LDA CONT 110

ORA CONT+1 BNE BORRAR RTS

Denición

Codicación

MACRO PROM A,B,C • LDA A • ADD B PROM X1,X2,X3 ROR • STA C • FINMAC PROM Y1,Y2,Y3

;Salte si (CONT) y ;(CONT+1) no son 0. ;Hecho

En este caso tenemos un solo tipo de datos sobre los cuales operar y ningún parámetro de salida (la salida en este caso consiste en obtener una sección de memoria borrada). El bloque de memoria a borrar es en realidad un dato de múltiples palabras ordenadas en posiciones

• •

sucesivas, por lo que, se cargará en una palabra de doble precisión, un puntero que indique su posición de inicio. Además, debe cargarse en una posición de memoria, o en el acumulador,

PROM Z1,Z2,Z3

el número de palabras del bloque, que nos indique, cúantas posiciones de memoria debemos

• •

borrar en realidad. En cualquiera de los dos casos, el tamaño de palabra impone un límite máximo de 64 palabras. Obviamente, si se deseara un valor mayor, no será posible usar el acumulador y deberemos emplear un dato en memoria de doble precisión.

Tabla 6.3: Ejemplo de macroinstrucciones

La dirección del bloque la tomará la subrutina de DIRFTE (@0326) y la longitud del bloque de la variable de doble precisión CONT (@0330). Como se puede apreciar, al nalizar la subrutina BORRAR, quedan alterados los contenidos de DIRFTE y CONT. Si se desea utilizar la subrutina en otro bloque de memoria es necesario colocar los valores requeridos en DIRFTE y CONT para que la subrutina funcione correctamente de nuevo.

Paso implícito de parámetros

MACRO INCR VALOR LDA VALOR INA STA VALOR BNE LISTO+3 LDA VALOR+1 INA LISTO STA VALOR+1 FINMAC

MACRO DECR VALOR LDA VALOR BNE SIGUE LDA VALOR+1 DCA STA VALOR+1 LDA VALOR SIGUE DCA STA VALOR FINMAC

Código de la subrutina:

El uso de las macroinstrucciones del código anterior simplicaría mucho la construcción

ROTDE4 ROTDE3 ROTDE2 ROTDE1

ROR ROR ROR ROR RTS

de programas que utilicen punteros y contadores de dos palabras. Este procedimiento, se puede generalizar construyendo otras macroinstrucciones, proporcionando así ventajas que resultan evidentes: el programador escribe menos, su programa es más legible y le permite insertar información variable en pequeños paquetes de programación. Esto puede extender-

La subrutina anterior rota el acumulador 1, 2, 3 o 4 veces, dependiendo del punto de

se hasta la denición de un nuevo lenguaje, cuyas instrucciones están denidas mediante

ingreso. En este caso, se pasa implícitamente el número de veces que se rotará el acumulador.

macrointrucciones. Es posible denir instrucciones tales como

Para rotar el acumulador tres veces, se hace el llamado JSR ROTDE3, si por el contrario se

ELSE”,

”FOR-NEXT”

”DO

WHILE”,

”IF-THEN-

y otras denidas en los lenguajes de alto nivel.

desea rotar el acumulador cuatro veces se hace el llamado JSR ROTDE4. Como el ensamblador crea un diccionario con las macroinstrucciones al encontrar la codicación de la Tabla 6.3, consulta dicho diccionario y luego sustituye la codicación.

Macroinstrucciones La tabla 6.3 presenta el ejemplo de la sección 6.1.4 modicado para utiliza macroinstrucciones.

6.1.6.

Aritmética de Múltiple Precisión y en Punto Flotante

En este ejemplo se realizará una subrutina que suma dos números representados con PAL En el siguiente código se han codicado como macroinstrucciones, las subrutinas para

palabras cada uno (PAL

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.