Exponsor

CURSO TÉCNICO INSTALADOR DE ENERGÍA SOLAR TÉRMICA

Visita el siguiente enlace: http://enersolartermica.blogspot.com.es/ ¡No pierdas esta magnifica oportunidad de poder formarte en esta profesión con gran demanda de empleo! Ahora por oferta de lanzamiento y por tiempo limitado puedes adquirir este curso por solo 9,95€, cuando su valor de mercado es de 49€.

lunes, 20 de abril de 2009

PROGRAMACIÓN DEL MICROPROCESADOR ( II )

Obsérvese que en este ejemplo los números binarios 17 y 35 no fueron colocados en los primeros domicilios de la memoria RAM, o sea en los domicilios A00000 y A00001. Esto se debe a que precisamente en estos domicilios es en donde tenemos que depositar las instrucciones del programa que se irá ejecutando en lenguaje de máquina sobre los números que irán a ser sumados. Así, al arrancar con sus operaciones, el microprocesador irá de inmediato al primer domicilio en donde encontrará la primera instrucción a ser ejecutada así como el domicilio de donde deberá tomar el dato binario a ser procesado. El formato básico será el siguiente:


Op-Code - Operando


Si la memoria RAM tiene capacidad para almacenar en cada domicilio una palabra binaria de 15 bits de capacidad, podemos asignar los primeros tres bits de cada palabra para poner allí la instrucción (en lenguaje de máquina) que deberá ser ejecutada, y los siguientes doce bits para poner allí el operando (domicilios de memoria RAM, etc.) sobre el cual se actuará. Esto ya de por sí nos está diciendo que, dentro del microprocesador, además de la unidad ALU, además de los registros internos de uso temporal, además del Contador de Programa, tenemos que tener un decodificador interno que pueda convertir los tres bits iniciales en ocho instrucciones diferentes en lenguaje de máquina, algo como lo que se muestra en el siguiente dibujo:






En el esquema mostrado, podemos ver que cada microinstrucción interna al microprocesador tiene un propósito diferente. Por ejemplo, la microinstrucción 000 denotada como:

LOAD M, R0

indica al microprocesador que hay que tomar un dato de la memoria RAM y depositar (o mejor dicho, cargar, que en inglés se traduce como LOAD) dicho dato en el registro interno R0 del microprocesador. ¿Y de qué domicilio M de la memoria vamos a tomar el dato? Pues precisamente del domicilio especificado por el operando de diez bits, que en este caso será algo como el domicilio 000000000019 (en donde está depositado el número binario 17). Del mismo modo, la microinstrucción 001 denotada como:

LOAD M, R1

indica al microprocesador que hay que tomar otro dato de la memoria RAM y cargar dicho dato en el registro interno R1 del microprocesador.

Por otro lado, la microinstrucción 100 denotada como:

ADD R0, R1

le indica al microprocesador que debe sumar dentro de su unidad ALU el contenido de los registros internos R0 y R1, depositando el resultado en el registro R0.

Por último, la microinstrucción 010 denotada como:

STORE R0, M

le indica al microprocesador que deposite en la memoria RAM el contenido del registro interno R0 del microprocesador, o sea el resultado previo obtenido de la suma de los registros internos R0 y R1. ¿Y en qué domicilio M de la memoria vamos a depositar el dato? Pues nuevamente en el domicilio especificado por el operando de diez bits. Para nuestros propósitos, estas son todas las instrucciones que necesitamos para poder llevar a cabo nuestra suma binaria de los números 17 y 35.

Hay otra microinstrucción de particular interés en el conjunto del Código de Operaciones de este microprocesador. Es la microinstrucción 110 denotada como:

BRA T

la cual indica que se lleve a cabo un salto incondicional hacia el domicilio de la memoria RAM identificado con la letra T, el cual puede ser ya cualquier domicilio de la memoria RAM y no uno que venía de una secuencia en orden. ¿Y qué sucedería si dentro de cierto domicilio de la memoria RAM hubiese una instrucción especificando un salto hacia el mismo domicilio de la memoria? Pues en tal caso, el microprocesador entraría en lo que se conoce como un bucle perpetuo (infinite loop). Estaría saltando todo el tiempo hacia un domicilio de la memoria RAM que le indica un salto incondicional hacia el mismo domicilio en donde se encuentra otra vez con la misma microinstrucción indicándole un salto hacia el mismo domicilio, repitiéndose la secuencia de modo perpetuo.

El ejemplo crudo que acabamos de ver nos demuestra que, antes de que podamos utilizar ventajosamente algo tan sofisticado como un microprocesador, tenemos que invertir una buena cantidad de tiempo en elaborar programas que puedan convertir nuestro lenguaje humano a un lenguaje de máquina que el microprocesador sea capaz de "comprender", y que puedan llevar a cabo también el proceso inverso para que la microcomputadora nos pueda entregar resultados que nosotros seamos capaces de comprender. Estos programas que son capaces de convertir nuestro lenguaje humano a lenguaje de máquina y el lenguaje de máquina a lenguaje humano, así como los programas ejecutables en sí con los cuales la intención primaria se pueda llevar a cabo (operaciones aritméticas, procesadores de palabras, programas de diseño gráfico, etc.) es lo que se conoce comunmente como el software, y requiere la inversión de cientos de miles de horas-hombre para su elaboración. En programas tan sofisticados como Linux y Windows, se han invertido decenas de millones de horas-hombre, literalmente hablando, para poder tener lo que tenemos en la actualidad. Por sí sólo, el microprocesador es un robot "idiota" incapaz de hacer nada. Son los programas los que realmente le pueden sacar amplia ventaja a lo que las maravillas de la microelectrónica nos pueden ofrecer.

El conjunto de ocho microinstrucciones vistas en el esquema del ejemplo anterior es un conjunto extremadamente limitado de instrucciones. Aunque se puede construír una computadora funcional con un conjunto de instrucciones tan limitado, tal esquema sería muy ineficiente para lo que estamos acostumbrados en la actualidad, y en la práctica se desea tener un conjunto mayor de instrucciones disponibles. Y esto es precisamente lo que se ha venido haciendo conforme ha ido evolucionando el microprocesador. Al ir aumentando la densidad de los circuitos integrados, se ha ido ampliando el conjunto de instrucciones disponibles en lenguaje de máquina.

Habiendo agregado ya un decodificador interno de instrucciones al microprocesador de la manera en la que se ha señalado arriba, tenemos ya un esquema completo de lo que cualquier microprocesador (o para el caso general, cualquier computadora) debe tener en su interior:





Como puede verse, todo microprocesador incluye en su interior una Unidad de Lógica Aritmética ALU, varios registros internos que pueden ser implementados con flip-flops o con una memoria interna RAM como se muestra arriba, un registro de instrucciones, el decodificador de las instrucciones, y el Contador del Programa.

Un buen programa ensamblador no solo debe poder convertir nuestro programa fuente o código fuente en instrucciones en lenguaje de máquina que el microprocesador pueda ejecutar, paso a paso, instrucción por instrucción. También nos debe poder dar la capacidad de poder correr un programa en lenguaje de máquina no "de corrido" de principio a fin ejecutando todas las instrucciones de un golpe continuo sino ejecutando cada instrucción deteniéndose al finalizar la ejecución de cada instrucción, dándonos la capacidad de poder "ver" todo lo que está contenido dentro de cada uno de los registros internos del microprocesador, así como el resultado de la ejecución de cada instrucción. Para esto, existen programas emuladores en el mercado en los cuales el programa se escribe en lenguaje ensamblador y se corre en una computadora de escritorio que tenga un programa emulador cargado y trabajando. Se les llama programas emuladores porque debido a la sofisticación de los mismos no es realmente el microprocesador el que está llevando a cabo la ejecución directa de un programa escrito en lenguaje ensamblador sino es un programa mucho más sofisticado que emula las acciones del microprocesador. Es como si el microprocesador estuviera ejecutando las instrucciones directamente aunque de hecho está ejecutando una cantidad mucho mayor de instrucciones que emulan una cosa más rudimentaria que debería estar sucediendo a su nivel.

PROGRAMACIÓN DEL MICROPROCESADOR ( I )

La construcción del microprocesador a través de la integración de circuitos en gran escala, así como la construcción de las unidades periféricas de apoyo, así como la construcción de memorias RAM, de discos duros y demás accesorios que constituyen lo que se comúnmente se conoce como el hardware de la máquina, es tan sólo una parte importante pero no suficiente para poder utilizar un microprocesador ventajosamente. No basta con tener una microcomputadora construída con todos sus componentes esenciales. Queda aún la tarea de poder programarla. Todos los programas que serán ejecutados por el microprocesador eventualmente deben ser cargados en la memoria RAM. Pero estos programas deben ser programas que puedan ser efectuados en el lenguaje que entiende la máquina, en su lenguaje de máquina, en su lenguaje de unos y ceros, en el lenguaje binario.

Podemos, si queremos, construír un sistema microprocesador completo, y podemos intentar programarlo en lenguaje de máquina, en el lenguaje de unos y ceros que puede ser procesado de alguna manera por las tres funciones lógicas básicas. Pero tal cosa se puede convertir en una labor extremadamente pesada. A manera de ejemplo, supóngase que queremos utilizar una microcomputadora para efectuar una adición sencilla, para sumar los números 17 y 35. Normalmente, no utilizaríamos una microcomputadora para algo tan sencillo, nosotros mismos haríamos el cálculo manualmente o inclusive mentalmente. Sin embargo, este crudo ejemplo ilustra los enormes problemas que tenemos que enfrentar para poder utilizar una microcomputadora inclusive para las funciones más elementales. Y debe quedar claro que mientras esto no se haya resuelto, no podremos utilizar el microprocesador para cosas más sofisticadas como un procesador de palabras o como instrumento para ejecutar melodías en formato MP3.

Los números 17 y 35 a ser sumados están en nuestro lenguaje natural, en nuestro sistema decimal. Pero la microcomputadora no entiende absolutamente nada de estas cosas, la microcomputadora sólo "comprende" el lenguaje de los unos y ceros eléctricos, la presencia o la ausencia de un voltaje. Para que podamos obtener la suma de la microcomputadora, primero se vuelve necesario convertir cada uno de los números 17 y 35 al sistema de numeración binaria, precisamente el mismo sistema que estudiamos al principio de esta obra. Nosotros mismos llevaremos a cabo esta conversión, postponiendo por lo pronto la posibilidad de dejarle a la máquina la tarea de que ella misma lleve a cabo la conversión de decimal a binario por nosotros.

Una vez hecha la conversión, tenemos que almacenar estos números binarios en alguna parte de la memoria RAM en donde la microcomputadora los pueda localizar. Si lo hacemos manualmente usando interruptores eléctricos, ello nos llevará algo de tiempo aunque tal cosa se puede hacer.

Pero almacenar los números binarios en la memoria RAM no basta. Tenemos que escribir un programa en lenguaje de máquina que, ejecutando una instrucción tras otra, pueda llevar a cabo las operaciones que produzcan el resultado apetecido. Es aquí en donde necesitamos tener acceso al código de operaciones (op-code) del microprocesador. Desde que los primeros microprocesadores aparecieron en el mercado, cada uno de ellos tiene su propio código de operaciones, y todos ellos lo seguirán teniendo mientras la arquitectura esencical en la cual están basados todas los microcomputadoras (conocida como la arquitectura von Neumann) no cambie.

Usando lenguaje de máquina, un programa tentativo podría ser el siguiente:

(1) Recoger del domicilio A00019 de la memoria RAM el primer dato (el número binario 17) y depositarlo en el registro interno X del microprocesador.

(2) Recoger del domicilio A00020 de la memoria RAM el segundo dato (el número binario 35) y almacenarlo en el registro interno Y del microprocesador.

(3) Sumar mediante una suma binaria en la unidad ALU del microprocesador las palabras binarias almacenadas en los registros X y Y del microprocesador, y depositar el resultado (el equivalente binario del número decimal 52) en el registro interno X del microprocesador.

(4) Sacar la información del registro interno X del microprocesador y depositarlo en el domicilio A00019 de la memoria RAM.

(5) Detener la ejecución del programa, una vez que el resultado ha sido puesto en la memoria RAM.

Obsérvese que, en el interior del microprocesador, al llevar a cabo una suma binaria, destruímos uno de los datos originales, el número binario 17 que estaba en el registro X, depositando en dicho registro el resultado final 52. Y al sacar el resultado hacia afuera, depositándolo en la memoria RAM, destruímos también allí el dato original que había en el domicilio A00019. Esto no es de consecuencia alguna, ya que a fin de cuentas estamos interesados en la obtención de un resultado final que una vez obtenido no requiere conservar los datos originales. Esto es algo muy frecuente en el mundo de la programación. Podemos, si queremos, conservar todos los datos originales. Podríamos haber depositado el resultado final en el domicilio A00021 de la memoria RAM, un domicilio que anteriormente no estaba siendo utilizado. Pero esto de inmediato nos exije tener una memoria RAM de mayor capacidad. En procesamientos más complejos en donde se manejan decenas de miles de datos, el tratar de conservar en la memoria RAM información no indispensable nos puede agotar rápidamente nuestros recursos de memoria rápida. Es por ello que, cuando se requiere conservar alguna información previa, se hace uso de una memoria no tan rápida como la memoria RAM pero sí más permanente, es entonces cuando se hace uso de algo como el disco duro de la máquina. En cualquier microcomputadora o computadora de escritorio o inclusive las super-computadoras más sofisticadas, el usuario siempre verá una interacción intensa entre la memoria RAM disponible y el espacio que hay en el disco duro. El disco duro, con las tecnologías disponibles a la entrada del tercer milenio, siempre ofrece una capacidad mayor y más duradera que la que ofrece la memoria RAM. Pero el disco duro es una memoria extremadamente lenta, en términos de rapidez desde el punto de vista de la máquina. Siempre habrá un compromiso entre el uso de la memoria RAM y el espacio disponible en el disco duro, lo cual en sistemas elaborados requerirá la mirada vigilante del encargado de optimizar el funcionamiento de los sistemas de cómputo que tiene bajo su cuidado; esta es precisamente la tarea del administrador de sistemas.