Componentes Del Microprocesador

COMPONENTES DEL MICROPROCESADOR Un microprocesador es un circuito donde se encuentran integrados una serie de bloques qu

Views 105 Downloads 4 File size 166KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

COMPONENTES DEL MICROPROCESADOR Un microprocesador es un circuito donde se encuentran integrados una serie de bloques que le permiten realizar las funciones para las que ha sido fabricado. Los bloques fundamentales son: • Unidad de control (Control Unit) • Unidad aritmético lógica • Registros internos. • Buses internos. • Interrupciones. El funcionamiento básico de un microprocesador consiste en leer y ejecutar paso a paso todas y cada una de las órdenes programadas por el diseñador del sistema. El proceso de funcionamiento es el siguiente: 1. - El microprocesador, al iniciarse, como todos los sistemas secuenciales, se inicializará en una posición de memoria definida, desde donde empieza el proceso. 2. - El sistema lee el dato que hay en esa posición y lo envía a la unidad de control. 3. - La unidad de control decodifica la instrucción y la ejecuta dando las señales adecuadas. 4. - Se incrementa el contador de programa (registro interno que se encarga de indicar a qué posición de memoria hay que ir). 5. - Y se vuelve a repetir desde el punto 2 y así sucesivamente hasta que una señal exterior interrumpa el proceso. Unidad de control (Control Unit) Se podría decir que es el cerebro del microprocesador, ya que genera todas las señales tanto de control interno como externo. A él le llegan unos códigos (una combinación de bits) que son decodificados y ejecutados. Estos códigos, en general, pueden ser instrucciones de los siguientes tipos: 1. - La realización de una operación aritmético-lógica. En este caso además de la instrucción, hay que indicar al sistema dónde se encuentran los datos a operar. 2. - Cargar o leer datos. Esto puede servir para leer datos como temperatura, posición de una pieza, etc. O bien accionar un motor, visualizar datos a través de led o visualizadores, etc. 3. - Saltos o interrupciones. Mediante este tipo de instrucciones, el microprocesador hace que el programa siga en otra zona de memoria o que realice lo que se llama una subrutina. La subrutina no es más que un programa con una función especifica y que se ejecuta desde varias posiciones. Cuando termina de ejecutarse la subrutina, el microprocesador regresa a la posición siguiente a la que estaba cuando se produjo la interrupción. Registros internos. Dentro del microprocesador hay una serie de memorias que, al estar internas, éste maneja de forma especial. Estas posiciones de memoria interna llamadas registros, pueden tener una utilidad general o una utilidad específica. Los registros más generalizados son:

1. - Registros de datos. Son los utilizados para las operaciones aritmético-lógicas, manipulación de datos, etc. 2. - Registros de direcciones. Son aquellos que el microprocesador utiliza para acceder a una posición del mapa de memoria. Hay fundamentalmente tres: A.- Contador de programa, es el registro que normalmente se utiliza para leer o escribir datos del programa. B.- Puntero de pila, es el registro que el microprocesador utiliza para guardar y recuperar datos de uso fundamentalmente interno. El registro define la posición de memoria donde se encuentra dichos datos. C.- Registros índices, son utilizados para acceder a posiciones de memoria de forma relativa. 3. - Registro de estado, es un registro en el cual cada bits da una información especifica como puede ser que la última operación a dado resultado positivo, negativo, ha sido cero. Etc. Buses internos. Al igual que para direccionar memorias y leer datos, es necesario que se organicen buses, internamente también son necesarios para acceder a las diferentes partes del circuito. Vectores. Cuando en un sistema de microprocesador se da una dirección de memoria, es necesario hacerlo en varias posiciones de memoria. Estas son función del número de líneas que posea el bus de datos y el de direcciones. En el caso del microprocesador R6502, el bus de direcciones lo forman 16 líneas y el de datos 8. Por tanto, para tener una dirección en memoria, es necesario escribirla en dos posiciones consecutivas. Se dice que en estas posiciones tenemos un vector (dirección). El R6502 forma un vector colocando en primer lugar el byte de menor peso y a continuación el de mayor peso. Si en la posición 2102 y 2103 hay un vector, la dirección resultante será 5234. Interrupciones. Todos los microprocesadores disponen de unas entradas especiales para interrumpir la secuencia de programa y realizar un programa especial. Estas líneas se utilizan solo para casos especiales. Microprocesador 6502. Bloques internos Dentro de la amplia gama de microprocesadores que hay en el mercado, se va a analizar el R6502; aunque es un modelo antiguo cumple los objetivos de este libro. 1. - la unidad de control con sus circuitos asociados: bloque de interrupciones, control de tiempos y el registro P. a.- Las interrupciones son tres: - Entrada de inicialización (/R/E/S), se activa cuando le llega un nivel bajo (0) bloqueando el funcionamiento del microprocesador hasta que esta señal no cambia hacia un nivel alto. En ese instante el microprocesador lee los datos que hay en las direcciones FFFC h y FFFD h (vector de reset), los carga en el contador de programa (PCL y PCH respectivamente) y empieza a funcionar leyendo el código de operación que hay en esa dirección. - /I/R/Q. Es una interrupción enmascarable, es decir, se puede programar para que la atienda o para que no lo haga según le interese al programador. Se activa al

recibir un nivel bajo; en ese momento termina de realizar la instrucción que estuviera realizando y seguidamente interrumpe la secuencia del programa para realizar una subrutina. La dirección de esta subrutina está en las direcciones FFFE h y FFFF h. Una vez realizada la subrutina, el microprocesador continúa realizando el programa en el mismo punto en que lo dejó. - /N/M/I. Es una interrupción no enmascarable (la atiende siempre); realiza una función similar a la de la /I/R/Q. La dirección de la subrutina está en las direcciones FFFA h y FFFB h. b.- El registro de estado está compuesto por ocho bits, donde cada uno actúa indicando si se cumple o no una condición. 2. - Registros. Como se aprecia tiene los siguientes registros: a.- Registros índice X e Y. Los utiliza para acceder a unas posiciones de memoria de forma que el contenido de estos registros, normalmente, hay que sumarlos con otro dato y ello nos da la dirección final. b.- Puntero de pila S. Es utilizado para el manejo de una zona de memoria como pila, donde el microprocesador guarda y recoge datos temporales necesarios para su funcionamiento. En el R6502, esta zona es la comprendida entre el 0100 h y el 01FF h (página uno). c.- Registro A o acumulador. Es un registro de datos, lo utiliza para transferir o recibir datos y para casi todas las operaciones con la unidad aritmético-lógica. d.- Los registro del contador de programa PCL y PCH. Son dos porque los registros son de 8 Bits y se necesitan 16 bits para direccionar toda la memoria. 3 - Unidad aritmético-lógica (ALU). Realiza las siguientes operaciones: suma, resta, incremento, decremento, giro y rotaciones. ARQUITECTURA BÁSICA. R6502. Buses. Una de las características de los microprocesadores, es que los datos, direcciones y otras líneas de control pueden ser compartidas por diferentes circuitos, por lo que hay que organizarlos como buses. En un sistema de microprocesadores hay tres buses: 1. - Bus de direcciones. Por el se selecciona la posición de memoria o el dispositivo al que se va a escribir o leer los datos. La dimensión o número de líneas que lo componen, depende del microprocesador que utilicemos. 2. - Bus de datos. Es el conjunto de líneas por donde se transmiten los datos. A los microprocesadores se les suele dividir en función del número de bits que forman el dato. Inicialmente eran de 4 bits; después se fueron fabricando circuitos con mayor capacidad como los de 8, 16, 32 y 64 bits. Esta evolución ha sido forzada por la informática, que cada vez necesita unas prestaciones mayores. Industrialmente se siguen utilizando los de 8 y 16 bits. 3. - Bus de Control. Además de datos y direcciones, hay otras líneas que sirve para controlar el sistema. Una de esas líneas es la de reset (inicialización del microprocesador) Arquitectura básica del microprocesador.

En un sistema con microprocesador existen fundamentalmente los siguientes componentes: Memoria ROM. Contiene el programa de control del sistema, dependiendo del microprocesador que se use; puede estar en cualquier lugar del mapa de memoria o en una zona determinada. Por ejemplo, en el R6502, una ROM debe de ocupar la parte alta, ya que es allí donde se encuentran los vectores de reset e interrupciones (FFFA h, FFFB h, FFFC h, FFFD h, FFFE h Y FFFF h). Memoria RAM. Memoria donde el sistema puede contener datos o el programa. Dependiendo del microprocesador que utilicemos puede utilizar una o varias zonas del mapa de memoria. El R6502, debe de tener memoria RAM al menos en la página uno (0100 h a 01FF h), ya que esa zona la utiliza el registro S necesaria y obligatoriamente para guardar datos. Circuitos de entrada-salida (I/O devices). Circuitos que permiten la comunicación entre el microprocesador y el exterior. Aquí se pueden incluir visualizadores, teclados, convertidores analógico-digital (A/D) o digital-analógico (D/A), etc. Además de estos elementos fundamentales en cualquier sistema, debe de haber el circuito oscilador, que es el que va sincronizando el funcionamiento del sistema y el circuito de inicialización, que activará una de las líneas de control (entrada de inicialización del microprocesador). ARQUITECTURA CISC La tecnología CISC (Complex Instruction Set Computer) nació de la mano de Intel, creador en 1971 del primer microchip que permitiría el nacimiento de la informática personal. Más concretamente, sería en 1972 cuando aparecería el 8080, primer chip capaz de procesar 8 bits, suficiente para representar números y letras. Con la posibilidad de colocar todos los circuitos en un solo chip y la capacidad de manejar número y letras nacería la cuarta generación de ordenadores, la de los conocidos como PC u ordenadores personales. Los microprocesadores CISC tienen un conjunto de instrucciones que se caracteriza por ser muy amplio y permitir operaciones complejas entre operandos situados en la memoria o en los registros internos. Este tipo de arquitectura dificulta el paralelismo entre instrucciones, por lo que en la actualidad la mayoría de los sistemas CISC de alto rendimiento implementan un sistema que convierte dichas instrucciones complejas en varias instrucciones simples, llamadas generalmente microinstrucciones. La microprogramación es una característica importante y esencial de casi todas las arquítecturas CISC. La microprogramación significa que cada instrucción de máquina es interpretada por un microprograma localizado en una memoria en el circuito integrado del procesador. Las instrucciones compuestas son decodificadas internamente y ejecutadas con una serie de microinstrucciones almacenadas en una ROM interna. Para esto se requieren de varios ciclos de reloj, al menos uno por microinstrucción. Es así entonces como los chips CISC utilizan comandos que incorporan una gran diversidad de pequeñas instrucciones para realizar una única operación. Cuando el sistema operativo o una aplicación requiere de una de estas acciones, envía al procesador el nombre del comando para realizarla junto con el resto de información complementaria que se necesite. Pero cada uno de estos comandos

de la ROM del CISC varían de tamaño y, por lo tanto, el chip debe en primer lugar verificar cuanto espacio requiere el comando para ejecutarse y poder así reservárselo en la memoria interna. Además, el procesador debe determinar la forma correcta de cargar y almacenar el comando, procesos ambos que ralentizan el rendimiento del sistema. El procesador envía entonces el comando solicitado a una unidad que lo descodifica en instrucciones más pequeñas que podrán ser ejecutadas por un nanoprocesador, una especie de procesador dentro del procesador. Y al no ser las instrucciones independientes, pues son instrucciones menores procedentes de la descodificación de una instrucción mayor, sólo puede realizarse una instrucción cada vez. A través de la compleja circuitería del chip, el nanoprocesador ejecuta cada una de las instrucciones del comando. El desplazamiento por esta circuitería también ralentiza el proceso. Para realizar una sola instrucción un chip CISC requiere de cuatro a diez ciclos de reloj. Entre las bondades de CISC destacan las siguientes: • Reduce la dificultad de crear compiladores. • Permite reducir el costo total del sistema. • Reduce los costos de creación de sftware. • Mejora la compactación de código. • Facilita la depuración de errores. Ejemplo de microprocesadores basados en la tecnología CISC: • Intel 8086, 8088, 80286, 80386, 80486. • Motorola 68000, 68010, 68020, 68030, 6840. ARQUITECTURA RISC Buscando aumentar la velocidad del procesamiento se descubrió en base a experimentos que, con una determinada arquitectura de base, la ejecución de programas compilados directamente con microinstrucciones y residentes en memoria externa al circuito integrado resultaban ser mas eficientes, gracias a que el tiempo de acceso de las memorias se fue decrementando conforme se mejoraba su tecnología de encapsulado. La idea estuvo inspirada también por el hecho de que muchas de las características que eran incluidas en los diseños tradicionales de CPU para aumentar la velocidad estaban siendo ignoradas por los programas que eran ejecutados en ellas. Además, la velocidad del procesador en relación con la memoria de la computadora que accedía era cada vez más alta. Debido a que se tiene un conjunto de instrucciones simplificado, éstas se pueden implantar por hardware directamente en la CPU, lo cual elimina el microcódigo y la necesidad de decodificar instrucciones complejas. La arquitectura RISC funciona de modo muy diferente a la CISC, su objetivo no es ahorrar esfuerzos externos por parte del software con sus accesos a la RAM, sino facilitar que las instrucciones sean ejecutadas lo más rápidamente posible. La forma de conseguirlo es simplificando el tipo de instrucciones que ejecuta el procesador. Así, las instrucciones más breves y sencillas de un procesador RISC son capaces de ejecutarse mucho más aprisa que las instrucciones más largas y

complejas de un chip CISC. Sin embargo, este diseño requiere de mucha más RAM y de una tecnología de compilador más avanzada. La relativa sencillez de la arquitectura de los procesadores RISC conduce a ciclos de diseño más cortos cuando se desarrollan nuevas versiones, lo que posibilita siempre la aplicación de las más recientes tecnologías de semiconductores. Por ello, los procesadores RISC no solo tienden a ofrecer una capacidad de procesamiento del sistema de 2 a 4 veces mayor, sino que los saltos de capacidad que se producen de generación en generación son mucho mayores que en los CISC. Los comandos que incorpora el chip RISC en su ROM constan de varias instrucciones pequeñas que realizan una sola tarea. Las aplicaciones son aquí las encargadas de indicar al procesador qué combinación de estas instrucciones debe ejecutar para completar una operación mayor. Además, los comandos de RISC son todos del mismo tamaño y se cargan y almacenan del mismo modo. Al ser estas instrucciones pequeñas y sencillas, no necesitan ser descodificadas en instrucciones menores como en el caso de los chips CISC, pues ya constituyen en sí unidades descodificadas. Por ello, el procesador RISC no gasta tiempo verificando el tamaño del comando, en descodificarlo ni en averiguar cómo cargarlo y guardarlo. El procesador RISC puede además ejecutar hasta 10 comandos a la vez pues el compilador del software es el que determina qué comandos son independientes y por ello es posible ejecutar varios a la vez. Y al ser los comandos del RISC más sencillos, la circuitería por la que pasan también es más sencilla. Estos comandos pasan por menos transistores, de forma que se ejecutan con más rapidez. Para ejecutar una sola instrucción normalmente les basta con un ciclo de reloj. Entre las ventajas de RISC tenemos las siguientes: • La CPU trabaja mas rápido al utilizar menos ciclos de reloj para ejecutar instrucciones. • Utiliza un sistema de direcciones no destructivas en RAM. Eso significa que a diferencia de CISC, RISC conserva después de realizar sus operaciones en memoria los dos operandos y su resultado, reduciendo la ejecución de nuevas operaciones. • Cada instrucción puede ser ejecutada en un solo ciclo del CPU Ejemplo de microprocesadores basados en la tecnología CISC: • MIPS, Millions Instruction Per Second. • PA-RISC, Hewlett Packard. • SPARC, Scalable Processor Architecture, Sun Microsystems. • POWER PC, Apple, Motorola e IBM. • Procesadores: CISC y RISC • Los procesadores se agrupan hoy en dos familias, la más antigua y común de las cuales es la "CISC" o "Complex InstructionSet Computer": computador de set complejo de instrucciones. Esto corresponde a procesadores que son capaces de ejecutarun gran número de instrucciones pre-definidas en lenguaje de máquina (del orden del centenar). • Desde hace unos años se fabrican y utilizan en algunas máquinas procesadores "RISC" o "Reduced Instruction Set Computer",es decir con un número reducido de instrucciones. Esto permite una ejecución más rápida de las instrucciones pero requierecompiladores (o sea traductores automáticos de

programas) más complejos ya que las instrucciones que un "CISC" podríaadmitir pero no un "RISC", deben ser escritas como combinaciones de varias instruciones admisibles del "RISC". Se obtieneuna ganancia en velocidad por el hecho que el RISC domina instrucciones muy frecuentes mientras son operaciones menosfrecuentes las que deben descomponerse. • Dentro de muy poco los usuarios dejaran de hacerse la pregunta ¿ RISC O CISC ?, puesto que la tendencia futura, nos lleva a pensar que ya no existiran los CISC puros. • Hace ya tiempo que se ha empezado a investigar sobre microprocesadores "hibridos", es decir, han llevado a cabo el que las nuevas CPU's no sean en su cien por cien CISC, sino por el contrario, que estas ya contengan algunos aspectos de tecnologia RISC. Este proposito se ha realizado con el fin de obtener ventajas procedentes de ambas tecnologias (mantener la compatibilidad x86 de los CISC, y a la vez aumentar las prestaciones hasta aproximarse a un RISC), sin embargo, este objetivo todavia no se ha conseguido, de momento se han introducido algunos puntos del RISC, lo cual no significa que hayan alcanzado un nivel optimo. • Realmente, las diferencias son cada vez mas borrosas entre las arquitecturas CISC y RISC. Las CPU's combinan elementos de ambas y no son faciles de encasillar. Por ejemplo, el Pentium Pro traduce las largas instrucciones CISC de la arquitectura x86 a microoperaciones sencillas de longitud fija que se ejecutan en un nucleo de estilo RISC. El UltraSparc-II de Sun, acelera la decodificacion MPEG con unas instrucciones especiales para graficos; estas instrucciones obtienen unos resultados que en otros procesadores requeririan 48 instrucciones. • Por lo tanto a corto plazo, en el mercado coexistiran las CPU's RISC y los microprocesadores hibridos RISC - CISC, pero cada vez con diferencias mas difusas entre ambas tecnologias. De hecho, los futuros procesadores lucharan en cuatro frentes : • -Ejecutar mas instrucciones por ciclo. • -Ejecutar las instrucciones en orden distinto del original para que las interdependencias • entre operaciones sucesivas no afecten al rendimiento del procesador. • -Renombrar los registros para paliar la escasez de los mismos. • -Contribuir a acelerar el rendimiento global del sistema, ademas de la velocidad de la • CPU. • A continuacion pasaremos a comentar brevemente algunas de las CPU's, recien salidas o proximas a salir: • 3. Kripton - 5 O K5 De Amd • Estado Actual : Muestras comerciales. • Velocidad Prevista : 120 Mhz • Rendimiento Estimado : Entre 109 y 115 SPECint92. • Proceso de Fabricacion : CMOS de tres capas de metal. • Tamaño de la Tecnologia de Proceso : 0'35 micras • Ventajas Tecnologicas : • Microarquitectura superescalar de cuatro vias • Nucleo de tipo RISC desacoplado

• Ejecucion especulativa con reordenacion de instrucciones • Desventajas Tecnologicas : • Velocidades de reloj inferiores a las inicialmente previstas • Las extensas pruebas de compatibilidad han retrasado el lanzamiento • Donde Consultar : http : // www.amd.com • 4. Pentium pro de intel • Estado Actual : Inicios de produccion. • Velocidad Prevista : 150 Mhz • Rendimiento Estimado : Entre 220 SPECint92; 215 SPECfp92 • Proceso de Fabricacion : BiCMOS. • Tamaño de la Tecnologia de Proceso : 0'6 micras • Ventajas Tecnologicas : • Paquete multichip que integra una cache secundaria de 256 KB que se comunica con la CPU a la misma velocidad del procesador • Microarquitectura superescalar con reordenacion de instrucciones • Superpipelines incluidos para permitir altas velocidades de reloj. • Desventajas Tecnologicas : • Alto precio de fabricacion del paquete multichip • Microarquitectura optimizada para software de 32 bits, que tienen rendimiento pobre con codigo de 16 bits • Consumo de energia y disipacion de calor totalmente inapropiadas para ordenadores portatiles • Donde Consultar : http : // www.intel.com • 5. Mips • Estado Actual : Primeras pruebas de produccion • Velocidad de reloj Prevista : 200 Mhz • Rendimiento Estimado : 300 SPECint92 y 600 SPECfp92 • Proceso de Fabricacion : CMOS • Tamaño de la Tecnologia de Proceso : 0'35 micras • Ventajas Tecnologicas : • Este chip de 64 bits tiene cinco pipelines funcionales, por lo que puede llegar a ejecutar cinco instrucciones por ciclo de reloj. Con dos unidades de coma flotante de precision doble, el R10000 esta optimizado para sostener un alto rendimiento de coma flotante. • Desventajas Tecnologicas : • Para optimizar el rendimiento, la memoria cache secundaria externa tiene que fabricarse con costosa tecnologia ¿ COMO SURGE EL RISC ? • Los ordenadores etiquetados como CISC gozan de los privilegios y defectos del microcodigo. La CPU es considerablemente mas rapida que la memoria principal. Esto significa que conviene manejar un amplio abanico de instrucciones complejas cuyo significado equivalga al de varias instrucciones simples, disminuyendo asi los accesos a memoria. A esto se le añade la tandencia de aumentar el grado de complejidad de las instrucciones para acercarlas a los lenguajes de alto nivel.

• Sin embargo, como resultado de icertos estudios en los que se examino la frecuencia de utilizacion de las diferentes instrucciones, se observo que el 80 % del tiempo era consumido por solo el 20 % de las instrucciones, con prioridad de los almacenamientos (STORE), cargas (LOAD) y bifurcaciones (BRANCH). • Instrucciones mas usadas • Esto significa que se poseian soberbias memorias de control cuyo contenido era muy poco utilizado. Se estaba penalizando la velocidad de respuesta en aras de tener informacion poco util. • La alternativa RISC se basa en esto y propone procesadores cableados con un repertorio simple de instrucciones sencillas y frecuentes; todo codigo complejo puede descomponerse en varios congeneres mas elementales en los que, para evitar los terribles efectos sobre los retardos de la memoria principal (MP), se recurre a numerosos registros y a memorias cache. Un registro es una unidad de almacenamiento enclavada en la CPU y, por tanto, tan rapida como esta. Las memorias cache son pequeñas memorias de alta velocidad, se alimentan de la MP, de la que toman la informacion que esta siendo mas frecuentemente utilizada. Otro de los objetivos del RISC fue lograr que a cada instruccion correspondiera un solo ciclo de reloj, a excepcion, de aquellos casos que hay que mover datos. • - Disminuye la probabilidad de fallo. • - Reduce el tamaño de la CPU, que puede entonces albergar mas recursos (registros). • - Facilita el diseño. • - Permite maquinas mas compactas y con menor consumo. • - A menor complejidad... menor coste. • Aun asi con todos los datos obtenidos a favor y en contra del CISC y del RISC, hay que tener en cuenta otro factor importante : la eficacia del software. • 10. Compiladores optimizados del risc • Es cierto que un procesador RISC es mas veloz que uno CISC, pero tambien lo es que, al ser mas simples las instrucciones, necesita mas de estas para emular funciones complejas, por lo que los programas son mas largos y voluminosos. Es decir, el codigo objeto generado, ocupa mas memoria y, al ser mas extenso, emplea mas tiempo • en ser procesado. Los partidarios argumentan que el factor volumen de memoria incide poco en el precio,ademas estiman que el aumento de codigo no toma dimensiones importantes por el uso de coprocesadores y compiladores optimizados. • Los segundos destacan dos aspectos : • 1.- Al existir menor variedad en el codigo generado, el proceso de compilacion es mas rapido. El motivo es que hay menor numero de reglas y posibilidades entre las que elegir ( no existira la disyuntiva de construir la misma accion por diferentes caminos, solo habra una forma unica ) evitando la exploracion de grandes tablas de instrucciones en busca del sujeto correcto. • " En un ordenador convencional, la misma instruccion de lenguaje de alto nivel puede ejecutarse de diversa formas, cada una con sus inconvenientes y ventajas, pero en el RISC solo hay una forma de hacer las cosas " • 2.- Al traducir los lenguajes de alto nivel mediante unidades de extrema simplicidad, se incremente la eficiencia. Si se emplean instrucciones potentes se

corre el riesgo de no aprovecharlas en su totalidad y potencia, menor es la adaptacion a los diferentes casos particulares • 11. ¿ Risc o cisc ? • El conflicto surge al evaluar las ventajas netas ¿ que es mas apropiado, usar muchas instrucciones de un solo ciclo aprovechadas al maximo, o pocas de multiples pasos de reloj en las que existe infrautilizacion ? • La cuestion, es que hasta el momento, el estudio de prestaciones de ambas tecnologias, nos ha llevado a concluir que hoy en dia los RISC obtienen mas prestaciones, es decir, son mas potentes y rapidos que los CISC. Sin embargo, el mercado se ha decantado por la tecnologia CISC en cuanto a volumen de ventas. ¿ Por que ? • 1.- Por experiencia propia, podemos comprobar que un CISC tiene un coste "razonable", que es alcanzado a nivel de usuario. Esto mismo, no ocurre con los RISC, que por el contrario tienen un coste elevado, por esto mismo esta tecnologia ha sido enfocada a ventas a nivel de empresa y equipos de gama alta. • 2.- La utilidad que se le de a la maquina es muy importante, ya que el usuario debe de encontrar un nivel optimo en cuanto a calidad - precio. Y por que pagar mas si realmente no se le va a sacar partido al cien por cien. • 3.- El software utilizado es otro de los factores importantes, dado que un RISC no utiliza el mismo software que un CISC. Estos ultimos, por lo general tienen un software mas asequible. • 4.- Dada la compatibilidad hacia atras de la familia CISC x86, los usuarios han podido renovar sus equipos sin por ello tener que abandonar software que ya conocian, y reutilizar sus datos. Asi mismo, los fabricantes han tenido en cuenta este factor, puesto que seguir con otra linea de procesadores suponia no solo un cambio muy radical, sino que ademas podia llevar un riesgo en cuanto a ventas. • Estos son algunos de los motivos. Sin embargo, tambien hay que tener en cuenta el conflicto de intereses de algunos fabricantes, asi como la opinion de distintas revistas, algunas de ellas asociadas a diferentes marcas. • Se estan estudiando las tendencias futuras, como pueden ser los hibridos, mejoras en los microprocesadores CISC, mejoras en los RISC, ...

CLASIFICACION DE LOS LENGUAJES DE PROGRAMACIÓN LENGUAJE MÁQUINA: El lenguaje máquina es el único que entiende directamente la computadora, ya que esta escrito en lenguajes directamente inteligibles por la máquina (computadora), utiliza el alfabeto binario, que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios). Sus instrucciones son cadenas binarias (cadenas o series de caracteres de dígitos 0 y 1) que especifican una operación y, las posiciones (dirección) de memoria implicadas en la operación se denominan instrucciones de máquina o código maquina. Fue el

primer lenguaje utilizado en la programación de computadoras, pero dejo de utilizarse por su dificultad y complicación, siendo sustituido por otros lenguajes más fáciles de aprender y utilizar, que además reducen la posibilidad de cometer errores. El lenguaje máquina es el conocido código binario. Generalmente, en la codificación de los programas se empleaba el sistema hexadecimal para simplificar el trabajo de escritura. Todas las instrucciones preparadas en cualquier lenguaje máquina tienen por lo menos dos partes. La primera es el comando u operación, que dice a las computadoras cual es la función que va a realizar. Todas las computadoras tienen un código de operación para cada una de las funciones. La segunda parte de la instrucción es el operando, que indica a la computadora donde hallar o almacenar los datos y otras instrucciones que se van a manipular, el número de operándoos de una instrucción varia en distintas computadoras. Ventajas del lenguaje máquina: posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de programación. Desventajas del lenguaje máquina: dificultad y lentitud en la codificación. Poca fiabilidad. Gran dificultad para verificar y poner a punto los programas. Los programas solo son ejecutables en el mismo procesador (CPU). En la actualidad, las desventajas superan a las ventajas, lo que hace prácticamente no recomendables a los lenguajes máquina. LENGUAJES DE BAJO NIVEL: Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. El lenguaje ensamblador es el primer intento de sustituir el lenguaje maquina por otro más similar a los utilizados por las personas. Este intenta desflexibilizar la representación de los diferentes campos. Esa flexibilidad se consigue no escribiendo los campos en binario y aproximando la escritura al lenguaje. A principios de la década de los 50 y con el fin de facilitar la labor de los programadores, se desarrollaron códigos mnemotécnicos para las operaciones y direcciones simbólicas. Los códigos mnemotécnicas son los símbolos alfabéticos del lenguaje maquina. La computadora sigue utilizando el lenguaje maquina para procesar los datos, pero los programas ensambladores traducen antes los símbolos de código de operación especificados a sus equivalentes en el lenguaje maquina. En la actualidad los programadores no asignan números de dirección reales a los datos simbólicos, simplemente especifican donde quieren que se coloque la primera localidad del programa y el programa ensamblador se encarga de lo demás, asigna localidades tanto para las instrucciones como los datos. Estos programas de ensamble o ensambladores también permiten a la computadora convertir las instrucciones en lenguaje ensamblador del programador en su propio código maquina. Un programa de instrucciones escrito en lenguaje ensamblador por un programador se llama programa fuente. Después de que el ensamblador convierte el programa fuente en código maquina a este se le denomina programa objeto. Para los programadores es más fácil escribir instrucciones en un lenguaje ensamblador que en código de lenguaje maquina pero es posible que se requieran dos corridas de computadora antes de que se puedan utilizar las instrucciones del programa fuente para producir las salidas deseadas.

El lenguaje de bajo nivel es el lenguaje de programación que el ordenador puede entender a la hora de ejecutar programas, lo que aumenta su velocidad de ejecución, pues no necesita un intérprete que traduzca cada línea de instrucciones. Visto a muy bajo nivel, los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador. Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son, a menudo, difíciles de aprender. Más importante es el hecho de que los programas escritos en un bajo nivel sean altamente específicos de cada procesador. Si se lleva el programa a otra maquina se debe reescribir el programa desde el principio. Ventajas del lenguaje ensamblador frente al lenguaje máquina: mayor facilidad de codificación y, en general, su velocidad de calculo, ahorran tiempo y requieren menos atención a detalles. Se incurren en menos errores y los que se cometen son más fáciles de localizar. Tanto el lenguaje maquina como el ensamblador gozan de la ventaja de mínima ocupación de memoria y mínimo tiempo de ejecución en comparación con el resultado de la compilación del programa equivalente escrito en otros lenguajes. Los programas en lenguaje ensamblador son más fáciles de modificar que los programas en lenguaje máquina. Desventajas del lenguaje ensamblador: dependencia total de la maquina lo que impide la transportabilidad de los programas (posibilidad de ejecutar un programa en diferentes máquinas). El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Machintosh. La formación de los programadores es más compleja que la correspondiente a los programadores de alto nivel, ya que exige no solo las técnicas de programación, sino también el conocimiento del interior de la maquina El programador ha de conocer perfectamente el hardware del equipo, ya que maneja directamente las posiciones de memoria, registros del procesador y demás elementos físicos. Todas las instrucciones son elementales, es decir, en el programa se deben describir con el máximo detalle todas las operaciones que se han de efectuar en la maquina para la realización de cualquier proceso. Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se centran básicamente en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos. Vistos a muy bajo nivel, los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador.

Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son a menudo difíciles de aprender. Más importante es el hecho de que los programas escritos en un bajo nivel sean altamente específicos de cada procesador. Si se lleva el programa a otra máquina se debe reescribir el programa desde el principio. Lenguaje ensamblador (le): Este intenta deflexibilizar la representación de los diferentes campos, esa flexibilidad se consigue no escribiendo los campos en binario y aproximando la escritura al lenguaje LENGUAJES DE ALTO NIVEL: Estos lenguajes son los mas utilizado por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho mas fácil que los lenguajes máquina y ensamblador. Un programa escrito en lenguaje de alto nivel es independiente de la máquina (las instrucciones no dependen del diseño del hardware o de una computadora en particular), por lo que estos programas son portables o transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificación en diferentes tipos de computadoras. Son lenguajes de programación en los que las instrucciones enviadas para que el ordenador ejecute ciertas órdenes son similares al lenguaje humano. Dado que el ordenador no es capaz de reconocer estas ordenes, es necesario el uso de un intérprete que traduzca el lenguaje de alto nivel a un lenguaje de bajo nivel que el sistema pueda entender. Por lo general se piensa que los ordenadores son máquinas que realizan tareas de cálculos o procesamiento de texto. La descripción anterior es sólo una forma muy esquemática de ver una computadora. Hay un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. Existe también una relación compleja entre los lenguajes de alto nivel y el código máquina. Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como “IF CONTADOR=10 THEN STOP” pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a diez. Por desgracia para muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una forma rígida y sistemática. Los lenguajes de alto nivel, también denominados lenguajes evolucionados, surgen con posterioridad a los anteriores (lenguaje máquina, lenguajes de bajo nivel o ensamblador) con los siguientes objetivos, entre otros: Lograr independencia de la maquina, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador, que es suministrado por el fabricante, para obtener el programa ejecutable en lenguaje binario de la maquina que se trate. Además, no se necesita conocer el hardware especifico de dicha maquina. Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje maquina, ya que se utilizan palabras (en ingles) en lugar de cadenas de símbolos sin ningún significado aparente.

Incluir rutinas de uso frecuente, como las de entrada / salida, funciones matemáticas, manejo de tablas, etc., que figuran en una especie de librería del lenguaje, de manera que se puedan utilizar siempre que se quiera sin necesidad de programarlas cada vez. Ventajas de los lenguajes de alto nivel: el tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes. La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos, nombres de las instrucciones tales como READ, WRITE, PRINT, OPEN, etc. Las modificaciones y puestas a punto de los programas son más fáciles. Reducción del costo de los programas. Transportabilidad. Permiten tener una mejor documentación. Son más fáciles de mantener. Por lo general se piensa que los ordenadores son máquinas que realizan tareas de cálculos o procesamiento de textos. La descripción anterior es sólo una forma muy esquemática de ver una computadora. Hay un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. Existe también una relación compleja entre los lenguajes de alto nivel y el código máquina. Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a 10. Por desgracia para muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una forma rígida y sistemática. Desventajas de los lenguajes de alto nivel: incremento del tiempo de puesta a punto al necesitarse diferentes traducciones del programa fuente para conseguir el programa definitivo. No se aprovechan los recursos internos de la maquina que se explotan mucho mejor en lenguajes máquina y ensambladores. Aumento de la ocupación de memoria. El tiempo de ejecución de los programas es mucho mayor. Se puede decir que el principal problema que presentan los lenguajes de alto nivel es la gran cantidad de ellos que existen actualmente en uso, además de las diferentes versiones o dialectos que se han desarrollado de algunos de ellos. Es difícil establecer una clasificación general de los mismos, ya que en cualquiera que se realice habrá lenguajes que pertenezcan a mas de uno de los grupos establecidos. Una clasificación muy extendida, atendiendo a la forma de trabajar de los programas y a la filosofía con que fueron concebidos, es la siguiente: • Lenguajes imperativos. Utilizan instrucciones como unidad de trabajo de los programas (Cobol, Pascal, C, Ada). • Lenguajes declarativos. Los programas se construyen mediante descripciones de funciones o expresiones lógicas (Lisp, Prolog). • Lenguajes orientados a objetos. El diseño de los programas se basa mas en los datos y su estructura. La unidad de proceso es el objeto y en el se incluyen los datos (variables) y las operaciones que actúan sobre ellos (Smalltalk, C++). • Lenguajes orientados al problema. Diseñados para problemas específicos, principalmente de gestión, suelen ser generadores de aplicaciones. • Lenguajes naturales. Están desarrollándose nuevos lenguajes con el principal objetivo de aproximar el diseño y construcción de programas al lenguaje de las personas.

Otra clasificación que se puede hacer es la de atendiendo al desarrollo de los lenguajes desde la aparición de las computadoras, que sigue un cierto paralelismo con las generaciones establecidas en la evolución de las mismas: • Primera generación. Lenguajes maquina y ensambladores. • Segunda generación. Primeros lenguajes de alto nivel imperativo (FROTRAN, COBOL). • Tercera generación. Lenguajes de alto nivel imperativo. Son los mas utilizados y siguen vigentes en la actualidad (ALGOL 8, PL/I, PASCAL, MODULA). • Cuarta generación. Orientados básicamente a las aplicaciones de gestión y al manejo de bases de datos (NATURAL, SQL). • Quinta generación. Orientados a la inteligencia artificial y al procesamiento de los lenguajes naturales (LISP, PROLOG). Para la mejor compresión se harán unas definiciones: Programa: es un conjunto de instrucciones escritas en un lenguaje de programación que indican a la computadora la secuencia de pasos, para resolver un problema. Código fuente: esta creado en algún lenguaje de alto nivel, por lo que es entendido 100% por el ser humano. Este debe estar complementado por su documentación o manuales donde se indica el desarrollo lógico del mismo. Código objeto: es creado por los compiladores y nos sirve como enlace entre el programa fuente y el ejecutable. Arquitectura básica Una PC embebida posee una arquitectura semejante a la de un PC. Brevemente éstos son los elementos básicos: Microprocesador Es el encargado de realizar las operaciones de cálculo principales del sistema. Ejecuta código para realizar una determinada tarea y dirige el funcionamiento de los demás elementos que le rodean, a modo de director de una orquesta. Memoria En ella se encuentra almacenado el código de los programas que el sistema puede ejecutar así como los datos. Su característica principal es que debe tener un acceso de lectura y escritura lo más rápido posible para que el microprocesador no pierda tiempo en tareas que no son meramente de cálculo. Al ser volátil el sistema requiere de un soporte donde se almacenen los datos incluso sin disponer de alimentación o energía. Caché Memoria más rápida que la principal en la que se almacenan los datos y el código accedido últimamente. Dado que el sistema realiza microtareas, muchas veces repetitivas, la caché hace ahorrar tiempo ya que no hará falta ir a memoria principal si el dato o la instrucción ya se encuentra en la caché. Dado su alto precio tiene un tamaño muy inferior (8–512 KB) con respecto a la principal (8–256 MB). En el interior del chip del microprocesador se encuentra una pequeña caché (L1), pero normalmente se tiene una mayor en otro chip de la placa madre (L2). Disco duro

En él la información no es volátil y además puede conseguir capacidades muy elevadas. A diferencia de la memoria que es de estado sólido éste suele ser magnético. Pero su excesivo tamaño a veces lo hace inviable para PC embebidas, con lo que se requieren soluciones como unidades de estado sólido. Otro problema que presentan los dispositivos magnéticos, a la hora de integrarlos en sistemas embebidos, es que llevan partes mecánicas móviles, lo que los hace inviables para entornos donde estos estarán expuestos a ciertas condiciones de vibración. Existen en el mercado varias soluciones de esta clase (DiskOnChip, CompactFlash, IDE Flash Drive, etc.) con capacidades suficientes para la mayoría de sistemas embebidos (desde 2 MB hasta más de 1 GB). El controlador del disco duro de PC estándar cumple con el estándar IDE y es un chip más de la placa madre. Disco flexible Su función es la de almacenamiento, pero con discos con capacidades mucho más pequeñas y la ventaja de su portabilidad. Normalmente se encontraban en computadora personal estándar pero no así en una PC embebida. Llevan varios años en total desuso en PC comunes. BIOS-ROM BIOS (Basic Input & Output System, sistema básico de entrada y salida) es código que es necesario para inicializar la computadora y para poner en comunicación los distintos elementos de la placa madre. La ROM (Read Only Memory, memoria de sólo lectura no volátil) es un chip donde se encuentra el código BIOS. CMOS-RAM Es un chip de memoria de lectura y escritura alimentado con una pila donde se almacena el tipo y ubicación de los dispositivos conectados a la placa madre (disco duro, puertos de entrada y salida, etc.). Además contiene un reloj en permanente funcionamiento que ofrece al sistema la fecha y la hora. Chipset Chip que se encarga de controlar las interrupciones dirigidas al microprocesador, el acceso directo a memoria (DMA) y al bus ISA, además de ofrecer temporizadores, etc. Es frecuente encontrar la CMOS-RAM y el reloj de tiempo real en el interior del Chip Set. Entradas al sistema pueden existir puertos para mouse, teclado, vídeo en formato digital, comunicaciones serie o paralelo, etc. Salidas del sistema puertos de vídeo para monitor o televisión, pantallas de cristal líquido, altavoces, comunicaciones serie o paralelo, etc. Ranuras de expansión para tarjetas de tareas específicas que pueden no venir incorporadas en la placa madre, como pueden ser más puertos de comunicaciones, acceso a red de computadoras vía LAN (Local Area Network, red de área local) o vía red telefónica: básica, RDSI (Red Digital de Servicios Integrados), ADSL (Asynchronous Digital Subscriber Loop, Lazo Digital Asíncrono del Abonado), Cable, etc. Un PC estándar suele tener muchas más ranuras de expansión que una PC embebida. Las ranuras de expansión están asociadas a distintos tipos de bus: VESA, ISA, PCI, NLX (ISA + PCI), etc.

Hoy en día existen en el mercado fabricantes que integran un microprocesador y los elementos controladores de los dispositivos fundamentales de entrada y salida en un mismo chip, pensando en las necesidades de los sistemas embebidos (bajo coste, pequeño tamaño, entradas y salidas específicas, etc.). Su capacidad de proceso suele ser inferior a los procesadores de propósito general pero cumplen con su cometido ya que los sistemas donde se ubican no requieren tanta potencia. Los principales fabricantes son STMicroelectronics (familia de chips STPC), AMD (familia Geode), Motorola (familia ColdFire) e Intel. En cuanto a los sistemas operativos necesarios para que un sistema basado en microprocesador pueda funcionar y ejecutar programas suelen ser específicos para los sistemas embebidos. Así nos encontramos con sistemas operativos de bajos requisitos de memoria, posibilidad de ejecución de aplicaciones de tiempo real, modulares (inclusión sólo de los elementos necesarios del sistema operativo para el sistema embebidos concreto), etc. Los más conocidos en la actualidad son Windows CE, QNX y VxWorks de WindRiver. DEBUG Nota: "Bug" significa fallo, defecto en un programa; "debug" significa depurar (escrutar y eliminar fallos). La palabra ha quedado como verbo (depurar), de la que han derivado otras. Por ejemplo: "Debugger" (depurador). Por extensión, todos los programas y utilidades que sirven para escudriñar los datos y el código a bajo nivel, se identifican genéricamente con esta denominación. §1 Sinopsis DEBUG.EXE es un ejecutable que, hasta 2001, acompañó a todas las versiones de MS-DOS, a partir de la 2.0, y de Windows [1]. Es sin duda un programa antiguo pero de enorme potencial didáctico para el principiante. En adelante nos referiremos a él como debug simplemente. Se trata de una utilidad interactiva de exploración de bajo nivel, pero que también puede utilizarse para ciertas funciones. Por ejemplo, como un tosco traductor de sentencias ensamblador a lenguaje máquina. Como todos los programas de su tipo, debe utilizarse con cierto cuidado. En especial si utiliza el comando W [4] (se puede borrar todo un disco duro con un simple comando erróneo). Para utilizarlo basta invocarlo desde MS-DOS o desde una ventana DOS de Windows. Aunque en este último caso algunas de sus funcionalidades más interesantes nos estarán vetadas. Nota: Es importante recordar que muchos usos de estas utilidades de bajo nivel, requieren un funcionamiento stand-alone. Es decir, fuera de un Sistema Operativo multi usuario, ya que éstos encapsulan y ocultan (virtualizan) muchos aspectos del hardware. Opciones Una vez que el programa está en ejecución, el indicador ("prompt") es un guión "-", indicando que el "Shell" ( H1.7.1w3) espera recibir órdenes. Para salir basta

pulsar una Q. Como muchos programas de su género, sus comandos empiezan por una letra o combinación de ellas (pueden usarse indistintamente mayúsculas o minúsculas) y ciertos parámetros opcionales (no es imprescindible separar la letra de opción de los parámetros opcionales que siguen). La opción más sencilla es la interrogación ?, cuyo resultado es una lista resumida de las opciones disponibles: ensamblar A [dirección] comparar C dirección de intervalo volcar D [intervalo] escribir E dirección [lista de valores] llenar F lista de intervalos ir G [=dirección] [direcciones] hex H valor1 valor2 entrada I puerto cargar L [dirección] [unidad] [primer_sector] [número] mover M dirección de intervalo nombre N [nombre_ruta] [lista_argumentos] salida O byte de puerto proceder P [=dirección] [número] salir Q registrar R [registrar] buscar S lista de intervalos seguimiento T [=dirección] [valor] desensamblar U [intervalo] escribir W [dirección] [unidad] [primer_sector] [número] asignar memoria expandida XA [#páginas] desasignar memoria expandida XD [identificador] asignar páginas de memoria expandida XM [Lpágina] [Ppágina] [identificador] mostrar estado de la memoria expandida XS La mayoría de los comandos de debug ejecutan una acción y vuelven al indicador del shell, pero si es un comando largo, como puede ser mostrar un trozo grande de código, puede detenerse pulsando CTRL-Pausa o interrumpirse con CTRL-C para volver al shell. Una característica poco conocida, es que debug puede aceptar entradas desde un fichero "Script", que puede ser un simple fichero de texto ASCII en el que cada comando esté separado del anterior por un INTRO. Después del último, que debe ser una "Q" para salir de debug, es conveniente dejar una línea en blanco pulsando INTRO dos veces. Las líneas pueden contener comentarios. Cualquier cosa a partir del carácter punto y coma (;) hasta el final de la línea, será ignorado. ; esto es un comentario D ; aquí se mostrará algo...

Suponiendo que tengamos un fichero "Script" de nombre Ordenes.txt, puede ser utilizado como entrada para debug mediante un comando de redirección en la siguiente forma: DEBUG < Ordenes.txt También puede conseguirse que el programa redireccione la salida hacia un fichero que puede ser inspeccionado más tarde. Aunque tiene la dificultad de tener que trabajar "a ciegas", puede ser de utilidad en determinadas circunstancias. Por ejemplo, cuando se desea un volcado de determinadas zonas de la memoria. En el caso anterior podría obtenerse un fichero Result.txt con el siguiente comando: DEBUG < Ordenes.txt > Result.txt REPRESENTACIÓN DE DATOS NUMÉRICOS EN EL ORDENADOR. COMA FIJA Y COMA FLOTANTE: Todos los datos el ordenador los representa en sistemas basados en el sistema binario, ya que sólo utiliza dos estados estables. Los números reales se clasifican en tres tipos:  Enteros.- Positivos y negativos.  Racionales.- Se pueden expresar como cociente de dos enteros.  Irracionales.- Resto de números que no pueden expresarse como cociente de dos enteros. Cualquier conjunto de números reales es infinito, por lo que, dadas las limitaciones del espacio material de representación de las computadoras, no es posible representar a todos. Por el mismo motivo, serán irrepresentables los números irracionales, que precisan de un número infinito de bits. Generalmente, en una computadora se asigna un número fijo de n bits para representar un número, siendo n el tamaño de la palabra, u otro tamaño privilegiado. Esta limitación define el rango de representación, o sea, los límites. Consecuentemente, los números racionales se expresarán con un número finito de cifras fraccionarias, lo que dará lugar a una cierta precisión en la representación. Dada esta limitación de bits, existen diversos métodos de representar los datos numéricos que optimizan la utilización de estos bits para determinadas aplicaciones. Vamos a estudiar los llamados métodos posicionales, en los cuales los números se representan en dígitos sucesivos, teniendo cada dígito un peso o valor que depende del lugar donde se encuentra. Los pesos son potencias sucesivas de una base. El valor de un número X formado por los dígitos: xn...x3x2x1x0.x-1x-2...x-m tomando como pesos las potencias sucesivas de una base r será: X = xnrn + ... + x3r3 + x2r2 + x1r1 + x0r0 + x-1r-1 + x-2r-2 + ...+ x-mr-m = Por ejemplo, el número 913.4 en base 10 (r = 10), se puede descomponer: 913.4 = 9 x 102 + 1 x 101 + 3 x 100 + 4 x 10-1

El número binario 1011, se descompondrá: 1011 = 1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 = 11(10 Los dígitos xi son siempre positivos y menores que la base (0 " xi < r). En el sistema decimal, con r = 10; 0 " xi < 10 y en el sistema binario con r = 2; 0 " xi < 2. Si dos bases r1 y r2 cumplen la condición r1 = , entonces: (xn... x2 x1x0.x-1x-2...x-m)(r1 = (ak...a2a1a0.a-1a-2...a-v)(r2 siendo: aj = (xpj+p-1 xpj+p-2... xpj+1 xpj). De esta propiedad se deduce que los dígitos de la base r1 se obtienen agrupando los dígitos de la base r2 en grupos de longitud p, empezando a partir del punto decimal. Cada una de estas cadenas de la base menor es un número de la base mayor. Esta propiedad se puede aplicar para pasar un número binario a octal, agrupando los bits de 3 en 3, o a hexadecimal, agrupando los bits de 4 en 4. Por ejemplo para pasar a hexadecimal el número 101101110.1011(2 agrupamos las cifras en los siguientes grupos: 1 0110 1110 1011 con lo que obtendríamos 16E.B(16 A veces, un número racional tiene una representación exacta en una base, mientras que en otra es de tipo periódica; por ejemplo: (1/5)(10 = 0.2(10 = 0.0011001100110011...(2 Al tener que encajar los números en un tamaño fijo de n bits, se trunca o pierde el periodo y el ordenador produce resultados con un cierto error. A continuación se estudian los métodos más corrientes de representación de enteros y racionales en el sistema posicional, que pueden dividirse en los siguientes grupos:  Coma fija sin signo. Binario puro sin signo. Enteros Positivos.  Coma fija con signo. Binario puro con signo. Enteros.  Coma fija con complemento restringido a la base. Complemento a uno. Enteros.  Coma fija con complemento a la base. Complemento a dos. Enteros.  Coma fija BCD. Enteros.  Coma flotante. Racionales. En todos los formatos supondremos que estamos trabajando en base 2 y que el número de bits que tiene una palabra (es decir el número de bits con los que opera el ordenador) es n. Coma fija sin signo. Binario puro sin signo. Es el formato más simple para representar números enteros positivos y responde a la siguiente forma: Si las cifras del número entero X son xn-1xn-2...x2x1x0, El valor de X es: X = 2n-1xn-1 + 2n-2xn-2 + ...+ 22x2 + 21x1 + 20x0 = El rango de valores que admite un número X expresado en este formato es: 0 " X < 2n Modificando el bit menos significativo, el número variará en una unidad, y, por tanto, la precisión es de una unidad. Este formato tiene el inconveniente de que, al realizar sumas, se puede perder el bit más significativo del resultado cuando no cabe en el tamaño de la palabra

(desbordamiento). El ordenador puede disponer de un mecanismo para avisar cuando se produce esta eventualidad. Coma fija con signo. Binario puro con signo. Es igual al formato anterior, pero reservando un bit para indicar el signo. Este bit, si es un 0, define al número como positivo y si es un 1, como negativo. El mayor número, en valor absoluto, que se puede formar teniendo en cuenta que uno de los n bits es el de signo, es 2n-1-1. Por tanto el rango es: -(2n-1-1) " X " (2n-1-1). Representación de números en Coma Flotante: La coma flotante aparece para la representación de números reales con un rango de representación mayor que el que nos ofrece la representación en coma fija, permitiendo el tratamiento de números muy grandes y muy pequeños. Se basa en la representación en notación científica comúnmente utilizada en matemáticas, en la que una cantidad se representa de la forma: No=mbc Donde: No = Número representado m = Mantisa (fracción con signo) b = Base de exponenciación o raíz c = Exponente o característica (número entero con signo) Un número en esta notación tiene infinitas representaciones, de las que se toma como representación del mismo la denominada normalizada, que es aquella en la que la mantisa no tiene parte entera y la primera cifra o dígito a la derecha de la coma es distinta de 0, salvo en la representación del número 0. Por ejemplo, representación de 123,4 con base 10. 123,4 = 123,4 x 100 = 12,34 x 101 = 1,234 x 102 = 0,1234 x 103 representación normalizada Ejemplo, utilizando base 2: 123, = 123,4 x 20 = 61,7 x 21 = 30,85 x 22 = 15,425 x 23 = 7,7125 x 24 = 3,85625 x 25 = 1,928125 x 26 = 0,9640625 x 27 representación normalizada Cada fabricante de ordenadores define para la arquitectura de sus máquinas un formato de coma flotante para lo que se denomina simple precisión, donde el

número de bits corresponde a una palabra, y otro para la doble precisión, donde se utiliza una doble palabra. En general, se suelen seguir las siguientes reglas: El exponente se representa en las notaciones MS o exceso a 2N-1, siendo un número entero con signo. La mantisa es un número real normalizado (sin parte entera) con la coma implícita a la izquierda representada en MS, C-1 o C-2. El signo suele estar situado en el bit de más a la izquierda. La base de exponenciación también denominada raíz es una potencia de 2 determinada por el fabricante (2, 8 o 16). Existen muchos formatos de representación en coma flotante, variando la longitud de la palabra del computador, la base de exponenciación, el número de bits reservados para la mantisa y para el exponente, el sistema de representar la mantisa y el exponente, etc. La coma flotante para cada caso viene determinada por el fabricante, siendo las definiciones más comunes: - Para simple precisión (en computadores de 32 bits de palabra): SIGNO EXPONENTE MANTISA 31 30 23 22 0 1 bit 8 bits 23 bits signo mantisa - Para doble precisión (doble palabra de 64 bits): SIGNO EXPONENTE MANTISA 63 62 52 51 0 1 bit 11 bits 52 bits

signo mantisa El rango de representación en la coma flotante tiene la siguiente forma: mNN MNN 0 mNP MNP mNN mínimo número negativo que podemos representar y que se corresponde con: mNN = -máxima mantisa x base máximo exponente. MNN máximo número negativo que se corresponde con: MNN = -mínima mantisa x base -máximo exponente. mNP mínimo número positivo, que se corresponde con: mNP = mínima mantisa x base -máximo exponente. MNP máximo número positivo que se corresponde con: MNP = máxima mantisa x base máximo exponente. Es estas representaciones además de existir huecos (números no representables) entre dos cualesquiera, existen cuatro zonas en las que no se pueden representar los números existentes en ellas. Estas zonas son: Desbordamiento positivo: Números mayores que MNP. Subdesbordamiento positivo: Números entre 0 y mNP. Subdesbordamiento negativo: Números entre MNN y 0. Desbordamiento negativo: Números menores que mNN. Por ejemplo, un computador de 32 bits utiliza el siguiente formato para registrar números en coma flotante con simple precisión: Los bits del 23 al 30 para el exponenete, que se representa en exceso a 128 Los bits del 0 al 22 para la mantisa normalizada, que se representa en C-1 con el punto a las izquierda. El bit 31 para el signo de la mantisa. Base de exponenciación 2. El 0 se representa con todos los bits a 0. Formatos Estándar: Los formatos de coma flotante normalizados para computadores de 32 bits según el estándar IEEE P754 son:

Para simple precisión: SIGNO EXPONENTE MANTISA 31 30 23 22 0 1 bit 8 bits 23bits signo mantisa exceso fracción en binario puro Para doble precisión (doble palabra de 64 bits): SIGNO EXPONENTE MANTISA 63 62 52 51 0 1 bit 11 bits 52 bits signo mantisa exceso fracción en binario puro SISTEMAS DE CODIFICACIÓN: Información, en su sentido más amplio, se puede considerar como un conjunto de datos con significado propio constituido por cadenas de caracteres (cifras, letras y caracteres especiales) que para ser tratados de forma automática por medio de un computador necesitan ser físicamente transformados a un código manejable por ellos. La información que necesita ser tratada por un ordenador se presenta en un determinado sistema de representación que utiliza un alfabeto(entrada) y por medio de un sistema de codificación la transformaremos en información codificada que utiliza su correspondiente alfabeto de salida y que será directamente reconocible y tratable por el equipo. Todo sistema de codificación lleva consigo un código que se define como la ley de correspondencia biunivoca entre los datos que se van a representar y su codificación.

En los computadores se utilizan sistemas de codificación binarios numéricos de los que ya hemos visto algunos (BCD natural, por ejemplo), y alfanuméricos. - Código Alfanuméricos: Son códigos utilizados por los ordenadores para guardar y transmitir información, así como para enviar órdenes entre dispositivos. En ellos podemos definir las siguientes características: Conjunto de caracteres: Las 10 cifras del sistema decimal (0 al 9) Las letras del alfabeto (mayúsculas y minúsculas) Los signos de puntuación (, . : ; + * /). Los caracteres de control (órdenes entre dispositivos) Longitud de un código binario. Es el número de bits que utiliza para codificar un carácter. Número máximo del conjunto de caracteres. En estos códigos, en general, se representa cada carácter por medio de 8 bits, con lo cual, todo tipo de información puede ser utilizada internamente formando cadenas de bytes sucesivos que representan cadenas de caracteres. Los primeros códigos utilizados fueron los de 6 bits que permitían la representación de 64 caracteres. Estos eran: 26 mayúsculas 10 numéricos 28 especiales Más tarde se pasó a los 7 bits, entro los que podemos citar el código ASCII (American Estándar Code for Information Interchange). En la actualidad se utilizan exclusivamente códigos de 8 bits, entre los que podemos citar el código EBCDIC (Extended Binary Coded Decimal Interchange Code) y el ASCII extendido