• No se han encontrado resultados

PROGRAMACIÓN ESTRUCTURADA Y MODULAR EN LENGUAJE C

N/A
N/A
Protected

Academic year: 2019

Share "PROGRAMACIÓN ESTRUCTURADA Y MODULAR EN LENGUAJE C"

Copied!
20
0
0

Texto completo

(1)

UACM

Alejandra Andrade Rodríguez

Diana Cruz Hernández

Liliana Reyes Cabello

(2)
(3)

3

Modelo de Von Neumann

Capítulo

"Las computadoras en el futuro podrían tener 1,000 tubos de vacío y probablemente pesar 1.5 toneladas"

Popular Mechanics Magazine, 1949

1

1.1 INTRODUCCIÓN

Existen diferentes mitos alrededor de las computadoras, uno de los más comunes es creer que “son capaces de pensar”. Nada más lejos de la realidad. Las computadoras son artefactos “tontos” a los que es necesario decirles paso a paso lo que deben hacer, su potencial radica en la cantidad de datos que pueden procesar por segundo, aunada a la capacidad de información que les es posible almacenar. Ahora bien, si las computadoras no son capaces de resolver un problema por sí mismas, entonces ¿cómo podemos instruirlas para que sean capaces de resolver un problema específico? Para que una computadora resuelva un problema requiere de un conjunto de instrucciones escritas en un lenguaje de programación1, lo que comúnmente se denomina programa.

Partiendo de la premisa que “es más fácil comunicarse con una persona a la que conocemos que con un desconocido”, si nuestro fin es comunicarle a la computadora cómo debe solucionar un problema mediante un programa, resulta conveniente conocer los procedimientos que ésta realiza al ejecutarlo.

A lo largo de este capítulo se estudiarán las partes de una computadora, así como el funcionamiento de las mismas, que le permiten la ejecución de un programa. Basándonos en el Modelo de Von Neumann —arquitectura base de las computadoras actuales— describiremos algunos aspectos sustanciales relacionados con las computadoras, por ejemplo ¿qué son?, ¿cómo están constituidas?, ¿cómo almacenan la información?, ¿cómo se comunican?, en esencia, ¿cómo funcionan?

1.2 ESTRUCTURA DE UNA COMPUTADORA

Una computadora es un equipo electrónico —llamado hardware—, que recibe instrucciones en

forma de programas, también llamados software, para resolver diferentes tareas. La computadora recibe datos de entrada proporcionados por el usuario, y los procesa de acuerdo al conjunto de instrucciones definidas por el programa, para obtener y entregar los datos de salida que son el resultado del proceso.

1

(4)

4

Por el momento, podemos considerar a las computadoras como una caja negra2 cuyos datos de salida dependen de la programación y de los datos de entrada, como se observa en la Figura 1.1.

Datos de entrada

COMPUTADORA Datos

de salida

Figura 1.1. La computadora como caja negra

La primera computadora digital totalmente electrónica fue la “ENIAC” (siglas de su nombre en inglés: Electronic Numerical Integrator and Computer), elaborada por John Presper Eckert y John W. Mauchly entre 1942 y 1945. Este invento rompe la atadura que tenía el hardware con la aplicación, pues podría programarse para resolver diferentes problemas que involucraran cálculos. En este sentido, se trataba de un componente de propósito general, en el cual las instrucciones eran introducidas cambiando el cableado, es decir, se sustituían y reconstruían algunas partes del equipo o

hardware para la instalación de cada nuevo programa.

En 1945, el matemático John Von Neumann publicó el artículo First Draft of a Reporter: on the EDVAC, donde consideraba que las instrucciones no debían proporcionarse por medio de cables, ya que resultaba poco práctico; por lo tanto, propuso que el programa fuera almacenado en la memoria principal, al igual que se hacía con los datos. El modelo propuesto para implementar esta innovación se conoce como Arquitectura o Modelo de Von Neumann, el cual representa la base sobre la que actualmente continúan construéndose las computadoras.

La Arquitectura de Von Neumann implica que, tanto el programa como los datos de entrada, deben ser proporcionados por el operador o usuario a través de unidades de hardware llamadas dispositivos de entrada, para después ser almacenados en la memoria. Cuando se ejecuta un programa, la Unidad de Control lee una a una las instrucciones almacenadas en memoria, las interpreta y envía las señales adecuadas a los dispositivos que deben intervenir en la ejecución de las mismas, estos pueden ser la

unidad aritmético lógica, la memoria y los dispositivos de entrada y/o salida. En resumen, el Modelo de Von Neumann consta de las siguientes unidades elementales: la memoria, los dispositivos de entrada / salida y la unidad central de procesamiento, integrada por la unidad aritmética-lógica y la unidad de control, como se muestra en la Figura 1.2.

2

Las consideramos cajas negras porque no podemos ver su contenido; la única información que tenemos acerca de ellas es qué datos de entrada reciben y qué resultados devuelven.

(5)

5

Figura 1.2. Modelo de Von Neumann

A continuación se describe brevemente la función de cada uno de los elementos que integran el Modelo de Von Neumann:

Unidad Central de Procesamiento (CPU, Central Processing Unit), controla y coordina la ejecución de las instrucciones; para ello utiliza la Unidad Aritmético-Lógica, encargada del procesamiento de los datos y la Unidad de Control, para el procesamiento de las instrucciones.

o La Unidad Aritmético-Lógica (ALU, Arithmetic Logic Unit) realiza todas las operaciones aritméticas (suma y resta) y lógicas (operaciones del Álgebra de Boole). Además de los circuitos que le permiten realizar dichas operaciones, la ALU incluye un elemento auxiliar donde se almacenan temporalmente los datos que manipula, conocido como acumulador o registro temporal(TR, Temporary Register).

o La Unidad de Control (CU, Control Unit) se encarga de leer las instrucciones almacenadas en memoria, decodificarlas y después enviar las señales a los componentes que están involucrados en su ejecución, para lo cual tiene dos elementos auxiliares: el Contador del Programa (PC, Program Counter) y el Registro de Instrucción(IR, Instruction Register). En el IR se guarda temporalmente la instrucción que debe ser ejecutada, mientras que en el PC se almacena la dirección de memoria que contiene la siguiente instrucción que se ejecutará.

(6)

6

tiene el inconveniente de ser volátil, pues al apagarse la computadora los datos almacenados se pierden.

La memoria está dividida en varias celdas, en cada una de ellas se puede almacenar únicamente 0 ó 1, a estos valores se les denomina valores binarios oBITs 3(BInary digiT). De este modo, un

bit se considera la mínima unidad de información que una computadora puede almacenar; sin embargo, para poder almacenar un dato o instrucción se requiere de más de un bit. Por esta razón las celdas se agrupan para formar palabras, a cada una le corresponde una dirección de memoria de tal manera que, cuando se desea escribir o leer un dato o una instrucción de la memoria, se debe especificar la dirección dónde se encuentra. En el siguiente capítulo profundizaremos en la forma en la cual se codifican los datos en bits.

La memoria principal de tipo RAM se considera de rápido acceso pues se pueden leer o escribir millones de palabras por segundo; sin embargo, hemos mencionado que la información se pierde una vez que se apaga la computadora. Para resolver este inconveniente, se cuenta con otro tipo de memoria denominada memoria secundaria, en la que se puede almacenar una gran cantidad de información permanentemente —mientras el usuario no la borre. La desventaja de este tipo de dispositivos es que no son tan rápidos como la memoria RAM. Los discos duros, los discos ópticos (CD o DVD), la memoria flash (USB) y las cintas magnéticas, entre otros, son ejemplos de dispositivos de almacenamiento secundario.

 Los dispositivos de entrada y de salida (Input / Output) son responsables de la comunicación con el usuario del sistema. Los dispositivos de entrada permiten introducir en la computadora datos e instrucciones, mismos que son transformados en señales binarias de naturaleza eléctrica para almacenarlas en la memoria. Por otro lado, los dispositivos de salida permiten enviar los resultados a los usuarios de las computadoras, transformando las señales eléctricas binarias en información que éstos puedan comprender. El teclado está considerado como el dispositivo de entrada estándar; pero existen otros del mismo tipo, por ejemplo: el ratón, el escáner, la lectora óptica, el micrófono o la tabla digital. A su vez, el monitor es el dispositivo de salida estándar; otros ejemplos de dispositivos de salida son: la impresora, las bocinas o el plotter.

Todas las unidades de la computadora se comunican enviándose señales mediante un sistema de

buses; cada bus es un conjunto de conductores interconectados que transmiten información entre los diferentes componentes. Existen 3 tipos de buses, dependiendo de la información que transmiten: datos, dirección y control. El bus de datos, como su nombre lo indica, transporta los datos entre los dispositivos de hardware de entrada y / o salida, además de los dispositivos de almacenamiento. El bus de direcciones está vinculado a la unidad de control para leer y guardar datos en la unidad de memoria; se encarga de transmitir la dirección correspondiente al dato en tránsito. El bus de control es usado por la unidad de control para comunicarse con otros dispositivos; transmite comandos desde el CPU y devuelve señales de estado desde el dispositivo.

1.3 ALMACENAMIENTO y EJECUCIÓN DE PROGRAMAS

Para explicar cómo se almacenan los “datos” e “instrucciones” que componen la programación de una computadora, es preciso partir de la definición de estos conceptos:

3

(7)

7

 Un datoes un conjunto de símbolos que describen condiciones, hechos, situaciones o valores. Se caracterizan por no contener ninguna información. Un dato puede significar un número, una letra, una cantidad, una medida, una palabra.

Por ejemplo: 2001, septiembre, 16, 11, 1810. Por sí mismos, los datos no dicen nada; cobran significado al insertarse dentro de un contexto, y es entonces cuando se convierten en información.

 La información es un conjunto de datos estructurados y procesados.

Por ejemplo, de los datos anteriores podríamos obtener la siguiente información: 16 de septiembre de 1810, inicio del movimiento insurgente de la independencia de México; 11 de septiembre de 2001, ataque a las Torres Gemelas de Nueva York

 Una instrucción es un conjunto de símbolos que representan una operación que debe ser ejecutada por la computadora.

Por ejemplo, “Guarda 20”. Esta instrucción almacena en la dirección de memoria ‘20’ el dato que se encuentra en el acumulador. “Imprime x”. Esta instrucción imprime en la pantalla el valor de la variable ‘x’.

Para que los datos y las instrucciones sean almacenados en la memoria, y la unidad de control sea capaz de interpretarlos, deben representarse en lenguaje de máquina; esto es, como cadenas de 1s (unos) y 0s (ceros), como se ilustra en la figura 1.3.

Figura 1.3. Lenguaje de máquina

La razón a lo anterior es que todos los dispositivos de una computadora trabajan con dos únicos estados: activado - desactivado, abierto - cerrado, pasa corriente - no pasa corriente. Sin embargo, el lenguaje de máquina tiene diversos inconvenientes, entre los cuales destaca la dificultad para entenderlo y en consecuencia escribirlo.

Con la finalidad de remediar estos problemas se han desarrollado otros lenguajes de programación que se clasifican en dos tipos: lenguajes de bajo nivel y lenguajes de alto nivel. Los primeros se caracterizan porque sus instrucciones se parecen más a las acciones elementales que ejecuta una

(8)

8

computadora (sumar, restar, guardar en memoria, etc.), mientras que en los segundos, las instrucciones (generalmente escritas en inglés) son más parecidas a un lenguaje natural. Por otro lado, los programas escritos en bajo nivel describen a detalle qué sucede a nivel de hardware; mientras que los programas escritos en un lenguaje de alto nivel lo ocultan, teniendo como ventaja que son más fáciles de entender.4

En síntesis, un programa es un conjunto de instrucciones que describen su funcionamiento, las cuales están escritas en un lenguaje de programación, ya sea de alto o bajo nivel, o lenguaje de máquina. Dependiendo de quién lo ha escrito, y en qué lenguaje está escrito, un programa se conoce como

programa fuente o programa objeto. El programa fuente está escrito por un programador en un lenguaje de programación de alto o bajo nivel, por lo que no puede ser ejecutado directamente por la computadora; sino que debe traducirse a lenguaje de máquina. Para realizar esta tarea se utilizan otros programas dedicados únicamente a traducir instrucciones de un lenguaje de programación específico a cadenas de ceros y unos (figura. 1.4).

Figura 1.4. Programa fuente y programa objeto

De acuerdo al procedimiento que sigan estos programas para traducir un programa fuente, se clasifican en compiladores o intérpretes. Los compiladores traducen todo el programa fuente, generando un programa escrito en lenguaje de máquina llamado programa objeto, que puede ser ejecutado directamente por la computadora. En cambio, los intérpretes traducen y ejecutan instrucción por instrucción; es decir, codifican la instrucción en binario para que la pueda entender la computadora y enseguida la ejecutan. Una vez finalizada la ejecución continúan con la traducción y ejecución de la siguiente, y así sucesivamente hasta terminar todo el programa fuente. En otras palabras, los intérpretes no generan un programa objeto.5

Para ilustrar los conceptos anteriores y con la finalidad de presentar la manera en la que interactúan todas las unidades de una computadora durante la ejecución de un programa, presentamos el siguiente programa fuente escrito en un “lenguaje de alto nivel”. 6

4

A lo largo de este material aprenderemos a utilizar el Lenguaje de Programación C, definido como un lenguaje de alto nivel.

5

En el caso del lenguaje C se utiliza un compilador para traducir los programas fuentes, esto se abordará en el Capítulo 4.

6

Las instrucciones que aparecen en el programa están escritas en pseudocódigo. Este lenguaje no se considera un lenguaje de programación; pero por el momento nos sirve para nuestro propósito. En los capítulos siguientes estudiaremos más sobre el

pseudocódigo y la forma en la cual se puede traducir a Lenguaje C.

#include <stdio.h> main(){ int a,b,s;

printf("Ingresa dos números enteros:"); scanf("%d,%d",&a,&b); s=a+b; printf(“suma=%d”,s); } 1000111100 1111011110 0011101111 1001111011 0111 COMPILADOR

(9)

9

Ejemplo 1.1. El siguiente conjunto de instrucciones calcula la edad de una persona a partir de la fecha de nacimiento y del año actual; incluyendo las instrucciones que leen los datos de entrada e imprimen el resultado.

PROGRAMA FUENTE QUE CALCULA LA EDAD DE UNA PERSONA

1. Imprimir “Ingresa el año actual” 2. Leer fechaAct

3. Imprimir “Ingresa fecha de nacimiento” 4. Leer fechaNac

5. edad ← fechaAct – fechaNac 6. Imprimir “Edad:”,edad

Programa 1.1. Edad de una persona (programa fuente - lenguaje alto nivel)

Los nombres fechaAct, fechaNac y edad utilizadas en el Programa 1.1, hacen referencia a las áreas de memoria en donde se almacenan los datos; a esto se le conoce como variables, ya que los valores guardados pueden cambiar. En caso de que los valores permanezcan fijos se les denomina

constantes.

Antes de definir paso a paso la ejecución de este programa describiremos de manera general la función de cada una de las instrucciones que lo integran.

INSTRUCCIÓN DESCRIPCIÓN

Imprimir <Mesj> Imprime en la pantalla el mensaje indicados en la instrucción,

los cuales están almacenados en la memoria RAM.

Leer <Var> Lee por medio del teclado un dato y lo almacena en la memoria

RAM, en el espacio identificado por Var

<X> ← <Valor>

La flecha representa una asignación; esta acción actualiza la dirección de memoria asignada a X con el dato Valor. En los lenguajes de alto nivel, las direcciones de memoria

se representan por medio de variables7 para hacerlas más legibles.

Entonces, X representa una variable y Valor puede ser el resultado de una operación o el contenido de un registro de la memoria representado con una variable.

Tabla 1.1. Lista de instrucciones en lenguaje de alto nivel

Observa que las palabras encerradas entre mayor y menor que “< >” denota la parte de la instrucción que pueden cambiar, mientras que las palabras que no están encerradas deben escribirse tal cual, por

7

(10)

10

ejemplo, en el programa 1.1 la primera instrucción Imprimir “Ingresa año actual” coresponde a una instrucción de la forma Imprimir <Mesj>.8

De acuerdo con la información anterior, cuando se ejecuta una instrucción del tipo Imprimir

<Mesj> las unidades—de la computadora—que interactúan son: la unidad de control que se encarga

de enviar las señales adecuadas, el monitor (dispositivo de salida) y los buses por los cuales envía los datos. Así la ejecución de una instrucción de la forma Leer <Var> involucra: la unidad de control, los buses y el teclado (dispositivo de entrada). Finalmente, una instrucción de asignación

<X>←<Valor> involucra la unidad de control, los buses y la memoria, en este caso ningún dispositivo de entrada o salida interviene.

En la tabla 1.2 se describen paso a paso las acciones que realiza la unidad de control junto con el resto de las unidades durante la ejecución del programa 1.1, suponiendo que el año de nacimiento de una persona es 1989 y el año actual es 2009.

EJECUCIÓN DEL PROGRAMA 1.1 CALCULA LA EDAD DE UNA PERSONA

# Instrucción Descripción de la instrucción

1.

Imprimir

“Ingresa el año actual”

La unidad de control coordina las acciones necesarias para que el monitor imprima la leyenda “Ingresa el año actual”.

2. Leer fechaAct

La unidad de control coordina las acciones necesarias para que el teclado reciba el valor de la fecha actual, mismo que almacena en la memoria RAM en el espacio de memoria identificado por fechaAct,

.

3.

Imprimir

“Ingresa año de nacimiento”

La unidad de control coordina las acciones necesarias para que el monitor imprima el mensaje “Ingresa año de nacimiento”.

8

Las símbolos “<” y “>” nos servirán para indicar la parte de las instrucciones que puede cambiar. Esta notación la adoptaremos a lo largo del libro.

Ingresa el año actual: _

2009

M e m o r i a RAM

fechaAct

(11)

11

4. Leer fechaNac

La unidad de control coordina las acciones necesarias para que el teclado reciba el valor del año de nacimiento y se almacene en la memoria RAM en el espacio identificado por fechaNac.

5. edad ← fechaActual – fechaNacimiento

La unidad de control envía la señal indicada a la ALU para que realice la resta indicada9 y después almacena el

resultado en el espacio de la Memoria RAM identificado por la variable edad.

6. Imprimir “Edad:”, edad

La unidad de control trae de memoria el valor almacenado en el espacio de memoria identificado por la variable edad y coordina las acciones para que el monitor lo imprima en pantalla.

Tabla 1.2. Ejecución paso a paso del Programa 1.1

En la siguiente sección presentaremos con más detalle que ocurre dentro del CPU cuando se ejecuta una instrucción.

9

Los pasos que se ejecutan en el CPU para realizar la operación se describen más adelante.

Ingresa el año actual: 2009 Ingresa año de nacimiento: _

Ingresa año de nacimiento: 1989

Edad: 20

1989

M e m o r i a RAM

fechaAct

2009

fechaNac

1989

M e m o r i a RAM A L U

2009 - 1989

fechaAct fechaNac edad

2009 1989 20

M e m o r i a RAM

(12)

12

1.4 EJECUCIÓN DE LAS INSTRUCCIONES EN EL CPU

Los lenguajes de bajo nivel están estrechamente relacionados con la parte física del CPU, es por ello que cada procesador tiene su propio lenguaje ensamblador que puede ejecutar. En general una instrucciones en alto nivel se traduce a un conjunto de instrucciones más simples en ensamblador, y son estas instrucciones las que directamente se traducen a lenguaje máquina.

Con la finalidad de entender cómo se procesan los datos y las instrucciones en el CPU, en la tabla 1.3 se propone un conjunto de instrucciones en lenguaje de bajo nivel (para un procesador imaginario). Cabe resaltar que, para escribir instrucciones en bajo nivel, se debe especificar tanto la acción u operación que se quiere realizar seguida de la dirección de memoria en donde se encuentra el dato que se va a operar. Cada una de estas instrucciones tienen una traducción uno a uno a cadenas en lenguaje máquina; sin embargo, por el momento adoptaremos una codificación decimal para hacer más legibles el programa objeto, tomando en cuenta que en el siguiente capítulo se mostrará cómo convertir a binario un número representado en decimal.

INSTRUCCIONES EN BAJO NIVEL

Acción Código Sintaxis general Descripción

Carga 20 Carga <DIR>

Transfiere el dato almacenado en la posición de memoria <DIR> al acumulador de la ALU.

Guarda 02 Guarda <DIR> Guarda el contenido del acumulador

en la posición de memoria <DIR>.

Divide 38 Divide <DIR>

Divide el contenido del acumulador entre el dato almacenado en la posición de memoria

<DIR>.

El resultado queda almacenado en el acumulador.

Multiplica 36 Multiplica <DIR>

Multiplica el contenido del acumulador por el dato almacenado en la posición de memoria <DIR>.

El resultado queda almacenado en el acumulador.

Resta 33 Resta <DIR>

Resta al contenido del acumulador el dato almacenado en la posición de memoria

<DIR>.

El resultado queda almacenado en el acumulador.

Suma 30 Suma <DIR>

Suma al contenido del acumulador el dato almacenado en la posición de memoria

<DIR>.

El resultado queda almacenado en el acumulador.

Alto 70 Alto Indica el fin del programa.

(13)

13 De acuerdo con la sintaxis propuesta en la tabla 1.3, las instrucciones tienen un nombre fijo asociado a una acción particular y todas, excepto Alto, requieren que se especifique la dirección de memoria involucrada en la acción —diferente en cada caso—, la cual se representa de manera general por <DIR>. Asumiremos que cada una de las instrucciones se almacena en una palabra de memoria.

Ejemplo 1.2. En la siguiente tabla se muestra un programa en bajo nivel que es equivalente a la quinta instrucción del programa del ejemplo 1.1. En el cual se realiza la resta del año actual menos el año de nacimiento. Suponiendo que a la variable fechaAct le corresponde la dirección de memoria 00 seguida de la variable fechaNac con dirección 01 y finalmente la variable edad con dirección 02.

PROGRAMA FUENTE ESCRITO EN UN LENGUAJE DE BAJO NIVEL

Carga 00 Resta 01 Guarda 02

Alto

Programa 1.2. Calculo de la edad (programa fuente - lenguaje de bajo nivel)

A continuación se muestra el programa objeto resultado de traducir el programa 1.2 a su codificación decimal, de acuerdo con la tabla 1.3, además de su codificación en lenguaje de máquina, considerando que cada palabra de memoria tiene 16 bits.

PROGRAMA EN LENGUAJE DE BAJO NIVEL QUE CALCULA EL CUADRADO DE UN NÚMERO

Programa objeto codificación decimal

Programa fuente codificación binaria

20 00 00010100 00000000

33 01 00100001 00000001

02 02 00000010 00000010

70 01000110 00000000

Programa 1.3. Calculo de la edad (programa objeto)

De aquí en adelante utilizaremos la codificación decimal propuesta para facilitar la legibilidad. En la siguiente sección se explica cómo se ejecutan las instrucciones de un programa en general.

(14)

14

1. La unidad de control trae de la memoria RAM la instrucción indicada en el contador de programa (PC) y la almacena en el registro de instrucción (IR). Después actualiza el PC con la dirección de memoria donde se encuentra almacenada la siguiente instrucción del programa.

2. La unidad de control decodifica la instrucción del IR, detecta las unidades que deben interactuar para ejecutarla y les envía señales de control para indicarles la acción que deben de realizar. Si la acción requiere un dato que esté en memoria, se hará la lectura correspondiente, utilizando para ello los buses apropiados.

3. Si las instrucciones contienen operaciones lógicas o aritméticas en los datos, este trabajo es asignado a la ALU, la cual realiza la operación con el dato indicados en la instrucción y el dato almacenado en el acumulador. El resultado es almacenado en el acumulador del ALU, perdiéndose con ello el dato anterior.

Para ejemplificar el Ciclo de ejecución, analicemos el proceso que sigue la computadora con las instrucciones del programa 1.2.

Ejemplo 1.3. Supongamos que las instrucciones están almacenadas a partir de la dirección “20”, y que el dato guardado en la dirección “00” es 2008 y en la dirección “01” hay un 1989, tal y como se muestra en la figura 1.5 a).

Dato 2008 1989 … 20,00 33,01 02,02 70

Dirección 00 01 02 20 21 22 23 24 …

a) Estado de la memoria antes de la ejecución

Dato 2008 1989 19 … 20,00 33,01 02,02 70

Dirección 00 01 02 20 21 22 23 24 …

b) Estado de la memoria después de la ejecución

Figura 1.5. Almacenamiento de datos e instrucciones en memoria (vista en decimal)

Recordemos que en realidad lo que hay guardado en memoria es código máquina como en la figura 1.6, sin embargo para facilitarnos la manipulación de los datos los trabajaremos en decimal como aparecen en la figura 1.5.

Dato 00000111 11011000 00000111 11000101 00000000 00010011 00010100 00000000 00100001 00000001 00000010 00000010 01000110

(15)

15

Dirección 00 01 02 20 21 22 23 ---

b) Estado de la memoria después de la ejecución

Figura 1.6. Almacenamiento de datos e instrucciones en memoria (vista en lenguaje de máquina)

Al iniciar el programa, el PC contiene la dirección de memoria de la primera instrucción. De acuerdo con la figura 1.5 a), se inicializa en 20. La primera acción que sigue la unidad de control es almacenar el código de la instrucción “Carga 00” en el IR, y después actualiza el valor de PC con la dirección de la siguiente instrucción, en este caso 22. El siguiente paso es decodificar la instrucción; al hacerlo, detecta que requiere transferir el dato de la dirección 20 al acumulador del ALU, así que envía las señales de control pertinentes.

La ejecución de la instrucción “Multiplica 00” es similar, sólo que además de traer un dato de memoria, le envía la señal correspondiente al ALU para que realice la multiplicación. El resultado de la misma se almacena en el acumulador, y no es hasta que se ejecuta la instrucción “Guarda 01”, que el resultado se almacena en la memoria principal. En la figura 1.5 b) se refleja cómo luce la memoria después de la ejecución del programa.

Lo anterior se resume en la tabla 1.4, en donde se muestra cómo van cambiando los valores almacenados en la memoria, el contador de programa, el registro de instrucción y el acumulador, cada vez que se ejecuta una instrucción del programa 1.1. Por limitaciones de espacio, sólo se muestran las posiciones de memoria donde se almacenan los datos, entendiendo que el contenido de las direcciones donde está almacenado el programa no cambia.

INSTRUCCIÓN ALU

UNIDAD

DE CONTROL MEMORIA

Operación Acumulador IR PC

- - - - 20 -

Carga 00 2008 20 00 21 00 01 02

2008 1989

Resta 01 2008-1985 19 36 00 22 00 01 02

2008 1989

Guarda 02 19 02 01 23 00 01 02

2008 1989 19

Alto - 70 - 00 01 02

2008 1989 19

Tabla 1.4. Estado de los registros y memoria al ejecutar el Programa 1.2

(16)

16

acumulador de la ALU. Asimismo, es notorio que la única acción que afecta el estado de la memoria principal es “Guarda”.

Es importante subrayar que cuando en un programa se utiliza el resultado de una operación, es necesario guardar este resultado en la memoria (a esta acción se le conoce como asignación), ya que el acumulador se actualiza cada vez que se realiza una operación en la ALU, lo cual provoca que el resultado anterior se pierda.

(17)

17

EJERCICIOS

I. Determina si las siguientes afirmaciones son falsas (F) o verdaderas (V):

a) La principal aportación de Von Neumann proponía que tanto el programa como sus datos fueran almacenados en el CPU de la computadora.

( )

b) En la ALU se realizan todos los cálculos aritméticos y todas las comparaciones lógicas.

( )

c) En una celda se pueden almacenar uno o más bits. ( )

d) Los cables que sirven como canales de transmisión y permiten la

comunicación entre los componentes de la computadora se llaman buses.

( )

e) Existen tres tipos de buses: de dirección, de datos y de memoria. ( )

f) La dirección de memoria es un número que identifica a un conjunto de celdas de memoria.

( )

g) En la memoria RAM los datos se almacenan de forma permanente. ( )

h) Las instrucciones escritas en lenguaje de máquina sólo contienen 0s y 1s. ( )

i) En el contador de programa se almacena la dirección de la siguiente instrucción que se debe ejecutar.

( )

j) Siempre que se realiza una operación en el ALU, el resultado se almacena en memoria.

( )

k) La unidad de control se encarga de decodificar las instrucciones. ( )

l) La comunicación con el exterior se realiza por medio de los dispositivos de entrada y salida.

( )

m) En la memoria de tipo ROM se pueden leer y escribir datos. ( )

n) Se denomina programa fuente al conjunto de instrucciones escritas en un lenguaje de programación.

( )

o) El Ciclo Fetch sólo se realiza una vez durante la ejecución del programa. ( )

(18)

18

III. Investiga los siguientes conceptos (anota la bibliografía consultada):

a) Byte b) Variable c) Constante d) Operador

e) Álgebra de Bool f) Expresión g) Algoritmo h) Programa

i) Programa Fuente j) Programa Objeto

k) Lenguaje de Programación l) Compilador

IV. En la siguiente lista, escribe el número correspondiente al esquema del modelo de Von Neumman.

( ) Monitor ( ) Teclado ( ) RAM ( ) DVD

( ) Canal de

Direcciones ( ) Micrófono ( ) Disco 3 ½ ( ) Disco Duro

( ) Impresora ( ) WebCam ( ) Canal de

Control ( )

Canal de Datos

( ) 5+6 ( ) Decodifica

Instrucciones ( ) Bocinas ( ) CD-RW

( ) Coordina y

Controla ( ) 5<8 ( )

Cinta

Magnética ( ) Scaner

2 Memoria

5 Bus

UNIDAD CENTRAL DE PROCESAMIENTO (CPU) 1 Dispositivos

de Entrada 3 (ALU)

6 Dispositivos de Salida 4 Unidad

de Control

(19)

19 V. Considerando el siguiente programa en lenguaje de alto nivel (ver Programa 1.1 y Tabla 1.1), el cual calcula el total a pagar de una compra a la cual se le aplica un porcentaje de descuento indicado por el usuario, indica los elementos del modelo de Von Neumann que intervienen en la ejecución de cada una de las instrucciones:

PROGRAMA FUENTE PARA CALCULAR EL MONTO TOTAL DE UNA COMPRA A LA CUAL SE LE APLICA UN DESCUENTO

1. Imprimir “Ingresa el total de la compra sin descuento” 2. Leer compra

3. Imprimir “Ingresa el porcentaje de descuento (0 a 100)” 4. Leer descuento

5. total ← compra – compra * (descuento / 100) 6. Imprimir total

Programa 1.4. Programa fuente para calcular el monto total de una compra a la cual se le aplica un descuento.

VI. La siguiente tabla muestra un programa en lenguaje de bajo nivel equivalente a la instrucción 5 del programa 1.5 del ejercicio anterior. Suponga que a la variable compra tiene almacenado un 250 y le corresponde la dirección de memoria 10, en la variable descuento hay un 10 y tiene asignada la dirección 11 de memoria, finalmente en la dirección 13 se encuentra un 100. La dirección a partir de la cual se guarda el programa en memoria es la dirección 40

PROGRAMA EN LENGUAJE DE BAJO NIVEL PARA CALCULAR UN DESCUENTO

Programa

Fuente Descripción

Programa objeto

Carga 11 Trae al acumulador el valor del descuento 20 11

Divide 13 Divide descuento / 100 38 13

Multiplica 10 Multiplica el resultado que esta en el

acumulador (descuento/100) por la compra 36 10

Guarda 12 Guarda el valor a descontar en memoria 02 12

Carga 10 Trae al acumulador el valor de la compra 20 10

Resta 12 Resta a la compra el descuento 33 12

Guarda 12 Guarda el resultado de la resta en total 02 12

Alto Termina programa 70

(20)

20

a) Realiza la ejecución paso a paso del programa anterior utilizando la siguiente tabla.

INSTRUCCIÓN ALU

UNIDAD

DE CONTROL MEMORIA

(Dirección)

Operación Acumulador IR PC

40 10 11 12 13

100

Carga 11

10 11 12 13

Divide 13

10 11 12 13

Multiplica 10

10 11 12 13

Guarda 12

10 11 12 13

Carga 10

10 11 12 13

Resta 12

10 11 12 13

Guarda 12

10 11 12 13

Alto

10 11 12 13

b) ¿En qué dirección de memoria se almacena el resultado final?

VII. Utiliza las instrucciones de bajo nivel que se muestran en la tabla 1.3 para crear un programa fuente que realice la siguiente operación.

Figure

Figura 1.1. La computadora como caja negra
Figura 1.2. Modelo de Von Neumann
Figura 1.3. Lenguaje de máquina
Figura 1.4. Programa fuente y programa objeto
+5

Referencias

Documento similar

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Where possible, the EU IG and more specifically the data fields and associated business rules present in Chapter 2 –Data elements for the electronic submission of information

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

In medicinal products containing more than one manufactured item (e.g., contraceptive having different strengths and fixed dose combination as part of the same medicinal

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

Package Item (Container) Type : Vial (100000073563) Quantity Operator: equal to (100000000049) Package Item (Container) Quantity : 1 Material : Glass type I (200000003204)