5 Arquitectura y programación de ordenadores 1 INTRODUCCION Existe una gran variedad de sistemas que pueden recibir correctamente el nombre de computador, desde microprocesadores de un solo chip, y de bajo coste, a computadores que cuestan decenas de millones de euros. Esta variedad es patente no sólo en costes, sino también en tamaño, prestaciones y aplicaciones. La rapidez de los cambios, que ha caracterizado siempre a la tecnología de computadores, continúa sin pausa. Estos cambios cubren todo los aspectos de la tecnología de computadores, desde la tecnología subyacente de circuitos integrados, usados para construir componentes de computadores, hasta el creciente uso de conceptos de organización paralela para combinan esos componentes. A pesar de la variedad y rapidez de los cambios en el campo de los computadores, se aplican sistemáticamente ciertos conceptos fundamentales. La aplicación de estos conceptos depende del desarrollo dual de la tecnología y de los objetivos, en cuanto a precio y aplicaciones, de diseñador. La intención es ofrecer un concienzudo análisis de los fundamentos de arquitectura y organización de los computadores y relacionar estos, con materias de diseños actuales. 6 Arquitectura y programación de ordenadores 1.1 ORGANIZACIÓN Y ARQUITECTURA Cuando se describe un computador, frecuentemente se distingue entre arquitectura y organización del computador. Aunque es difícil dar una definición precisa para estos términos existe un consenso sobre las áreas generales cubiertas por cada uno. La arquitectura de computadores se refiere a los atributos de un sistema visibles para un programador, que tienen un impacto directo en la ejecución lógica de un programa. La organización de computadores se refiere a las unidades funcionales y sus interconexiones, que dan lugar a especificaciones arquitectónicas. Entre los ejemplos de atributos arquitectónicos se encuentran el conjunto de instrucciones, el número de bits utilizados para representar varios tipos de datos (por ejemplo, números y caracteres), los mecanismos de entrada y salida y las técnicas para direccionamiento de memoria. Entre los atributos de organización se incluye en aquellos detalles de hardware transparentes al programador, tales como señales de control, interfaces entre computador y los periféricos y la tecnología de memoria usada. Para poner un ejemplo, una cuestión de diseño arquitectónico es si el computador tendrá la instrucción de multiplicar. Una cuestión de organización es si esa instrucción será implementada por una unidad especializada en multiplicar, o por el mecanismo que haga un uso iterativo de la unidad de suma del sistema. La decisión de organización puede estar basada en la frecuencia prevista del uso de la instrucción de multiplicar, la velocidad relativa de las dos aproximaciones, y el coste y el tamaño físico de una unidad especializada en multiplicar. Históricamente, y aún hoy en día, la distinción entre arquitectura y organización ha sido importante. Muchos fabricantes de computadores ofrecen una familia modelos, todos con la misma arquitectura, pero con diferencias en cuanto a la organización. Consecuentemente, los diferentes modelos de la familia tienen precios y prestaciones distintas. Más aún, una arquitectura puede sobrevivir muchos años, pero su organización cambia con la evolución de la tecnología. Un ejemplo destacado de ambos fenómenos es la arquitectura IBM Sistema/370. Esta arquitectura apareció por primera vez en 1970 e incluía varios modelos. Un cliente con 7 Arquitectura y programación de ordenadores necesidades modestas podía comprar un modelo más barato y lento, y si la demanda se incrementaba, cambiarse más tarde a un modelo más caro y rápido sin tener que abandonar el software que ya había sido desarrollado. A través de los años, IBM ha introducido muchos modelos nuevos con tecnología mejorada para reemplazar modelos más viejos, ofreciendo al consumidor mayor velocidad, precios más bajos o ambas cosas a la vez. Estos modelos más nuevos conservaban la misma arquitectura, para proteger así la inversión en software del consumidor. Podemos destacar que la arquitectura del Sistema/370, con unas pocas mejoras, ha sobrevivido hasta hoy en día, como la arquitectura de la línea de grandes productos de computación IBM. En una clase de sistemas, los llamados microcomputador es, la relación entre arquitectura y organización es muy estrecha. Los cambios en la tecnología no sólo influyen en la organización, lo que también dan lugar a la introducción de arquitecturas más ricas y potentes. Generalmente, hay menos requisitos de compatibilidad, generación generación, para estas pequeñas máquinas. Así, hay más interacción entre las decisiones de diseño arquitectónicas y de organización. Un ejemplo interesante de éstos a los computadores de repertorio reducido de instrucciones (RISC, Reduced Instrution Set Computer). 1.2 ESTRUCTURA Y FUNCIONAMIENTO Un computador es un sistema complejo; los computadores de hoy en día contienen millones de componentes electrónicos básicos. ¿Cómo podríamos describir los claramente?. La clave está en reconocer la naturaleza jerárquica de la mayoría de los sistemas complejos, incluyendo el computador. Un sistema jerárquico es un conjunto de sus sistemas interrelacionados, cada uno de los cuales, a su vez, se organiza en una estructura jerárquica, hasta que se alcanza el nivel más bajo del su sistema elemental. La naturaleza jerárquica de los sistemas complejos es esencial, tanto para su diseño como para su descripción. El diseñador necesita tratar solamente con un nivel particular del sistema a la vez. En cada nivel, el sistema consta de un conjunto de componentes y sus interrelaciones. El 8 Arquitectura y programación de ordenadores comportamiento en cada nivel depende sólo de una caracterización abstracta y simplificada del sistema que hay en el siguiente nivel más bajo. De cada nivel, al diseñador importa la estructura y funcionamiento: Estructura: el modo en que los componentes están interrelacionados. Funcionamiento: la operación de cada componente individual como parte de la estructura. En términos de descripción tenemos dos opciones: empezar por lo más bajo y construir una descripción completa, o comenzar con una visión desde arriba y descomponer el sistema en sus partes. La experiencia a partir de muchos campos nos ha enseñado que la descripción de arriba a abajo es la más clara y efectiva. Comenzaremos con los componentes principales del sistema, describiendo su estructura y funcionamiento, y seguimos, sucesivamente, hace capas más bajas de la jerarquía. Funcionamiento Tanto la estructura como el funcionamiento de un computador son, en esencia, sencillos. En términos generales, sólo hay cuatro funciones básicas que un computador pueda llevar a cabo: Procesamiento de datos Almacenamiento de datos Transferencia de datos Control El computador, por supuesto, tiene que ser capaz de procesar datos. Los datos pueden adoptar una gran variedad de formas, y el rango de los requisitos de procesador es amplio. Sin 9 Arquitectura y programación de ordenadores embargo, veremos que hay sólo unos pocos métodos o tipos fundamentales de procesado de datos. También es esencial que un computador almacene datos. Incluso si el computador esta procesando datos al vuelo (es decir, si los datos se introducen y se procesan, y los resultados se obtienen inmediatamente), el computador tiene que guardar temporalmente, al menos aquellos datos con los que está trabajando en un momento dado. Así, hay al menos una función de almacenamiento de datos a corto plazo. Con igual importancia, el computador lleva a cabo una función de almacenamiento de datos a largo plazo. El computador almacena ficheros de datos para que se recuperen y actualicen en un futuro. El computador tiene que ser capaz de transferir datos entre el mismo y el mundo exterior. El entorno de operación del computador se compone de dispositivos que sirven bien como fuente o como destino de datos. Cuando se reciben o se llevan datos a un dispositivo que está directamente conectado con el computador, el proceso se conoce como entrada-salida (E/S), y este dispositivo de recibe el nombre de periférico. El proceso de transferir datos a largas distancias, desde o hacía un dispositivo remoto, recibe el nombre de comunicación de datos. Finalmente, se debe haber un control de estas tres funciones. Este control es ejercido por el/los ente(s) que proporciona(n) al computador instrucciones. Dentro del computador, una unidad de control gestiona los recursos del computador y dirige las prestaciones de sus partes funcionales en respuesta a estas instrucciones A este nivel general de discusión, el número de operaciones posibles que pueden ser realizadas es pequeño. El computador puede funcionar como un dispositivo de transferencia de datos, simplemente transfiriendo datos de un periférico o línea de comunicaciones a otro. También puede funcionar como un dispositivo de almacenamiento de datos, contactos transferidos desde un entorno externo al almacén de datos del computador (leer) y viceversa (escribir). 10 Arquitectura y programación de ordenadores Estructura El computador es una entidad que y entre actúa de alguna manera con sus entorno externo. En general, todas sus conexiones con el entorno externo puede ser clasificadas como dispositivos periféricos o de comunicación. Diremos algo sobre ambos tipos de conexiones. En su nivel más alto hay cuatro componentes estructurales principales : Unidad de procesamiento (CPU, Central Procesing Unit): controla el funcionamiento del computador y acabó sus funciones de procesamiento de datos. Frecuentemente se le llama simplemente procesador. memoria principal: almacena datos. E/S: transfiere datos entre computador y entorno externo. Sistema de interconexión: es un mecanismo que proporciona la comunicación entre la CPU, la memoria principal y la E/S. 11 Arquitectura y programación de ordenadores COMPUTADOR M.P. E/S Interconexión interna CPU CPU Puede que haya uno o más de cada uno de estos componentes. Tradicionalmente, ha habido sólo una CPU. En los últimos años, ha habido un uso creciente de varios procesadores en un solo sistema. El componente más interesante y, de algún modo, el más complejo es la CPU; sus principales componentes estructurales son: Unidad de control: controla el funcionamiento de la CPU y, por tanto, del computador. Unidad Aritmético-Lógica (ALU, Arithmetic Logic Unit): lleva a cabo las funciones de procesamiento de datos del computador. Registros: proporcionan almacenamiento interno a la CPU. Interconexiones CPU: son mecanismos que proporcionan comunicación entre la unidad de control, la habló y los registros. 12 Arquitectura y programación de ordenadores CPU ALU Registros Bus interno UC 1.3 EVOLUCIÓN Y PRESTACIONES DE LOS COMPUTADORES 1.3.1 La primera generación: Los tubos de vacío ENIAC El ENIAC (Electronic Numerical Integrator And Computer), diseñado y construido bajo la supervisión de John Mauchly y John tres Presper Eckert en la Universidad de Pennsyvania, fue el primer computador electrónico de propósito general del mundo. El proyecto fue una respuesta al necesidades militares en tiempo de guerra de los Estados Unidos. El laboratorio de investigación de balística del ejército, una agencia responsable del desarrollo de tablas de tiro y de trayectoria de nuevas armas, tenía dificultades para elaborarlas con exactitud y dentro de un plazo de tiempo razonable. Sin estas tablas de tiro, las nuevas armas y piezas de artillería eran inútiles para los artilleros. 13 Arquitectura y programación de ordenadores El laboratorio empleo a más de 200 personas, la mayoría mujeres, las cuales, utilizando calculadoras de mesa, resolvían es ecuaciones balísticas necesarias. La preparación de las tablas para una sola arma le habría llevado a una persona muchas horas, incluso días. Mauchly, un catedrático de ingeniería eléctrica de la universidad de Pennsylvania, y Eckert, uno de sus alumnos del licenciatura, propusieron construir un computador de propósito general, usando tubos de vacío, para utilizarlo en las aplicaciones de la BRL (Ballistics Research Laboratory). El 1943, esta proposición fue aceptada por el ejército, y se comenzó a trabajar en el ENIAC. La la máquina que construyeron era enorme, pesaba treinta toneladas, ocupaba 15.000 pies cuadrados y contenía más de 18.000 tubos de vacío. Cuando funcionaba, consumía 140 kw de potencia. También era bastante más rápida que cualquier computador electrodomésticos, ya que era capaz de actuar 5000 sumas por segundo. El ENIAC era una máquina de final, y no binario. Es decir, los hombres estaban representados en forma decimal y aritmética se realizaba también el sistema decimal. Su memoria consistía en 20 acumuladores, cada uno capaz de contener un número decimal de diez dígitos. Cada dígito estaba representado por un anillo de diez tubos de vacío. En un momento dado, sólo uno de los tubos de vacío estaba en estado ON, representando uno de los diez dígitos. Uno de los mayores inconvenientes del ENIAC era que tenía que ser programado en los manualmente mediante computadores y conectando y las conectando cables. El ENIAC se terminó en 1946, demasiado tarde para ser utilizado durante la guerra. En lugar de eso, su primera misión fue realizar una serie de cálculos complejos, que se usaron para ayudar a determinar la viabilidad de la bomba H. En uso del ENIAC para una función distinta de aquella para la que fue construido ,mostró su naturaleza de propósito general. Así,1946 marcó el comienzo de la nueva era de los computadores electrónicos, culminando años de esfuerzos. El ENIAC siguió funcionando bajo la dirección del BRL hasta 1955, cuando fue desmontado. 14 Arquitectura y programación de ordenadores La máquina de von Neumann: IAS La tarea de cargar y modificar programas para el ENIAC era extremadamente tediosa. El proceso de programación podría ser más fácil si el programa se representaba en una forma adecuada para ser guardado en la memoria junto con los datos. Entonces, un ordenador podría conseguir sus instrucciones leyéndolas de la memoria, y se podría hacer a modificar un programa colocando los valores en una zona de memoria. Esta idea, conocida como concepto de programa-almacenado, se atribuye a los diseñadores del ENIAC, sobre todo al matemático John von Neumann, que era asesor del proyecto ENIAC. La idea fue también desarrollada, aproximadamente el mismo tiempo, por Turing. la primera publicación de la idea fue en una propuesta de von Neumann para un nuevo computador en 1945 ,el EDVAC (Electronic Discrete Variable Computer). En 1946, von Neumann y sus colegas empezaron, en el instituto para estudios avanzados de Princeton, el diseño de un nuevo computador de programa-almacenado, que llamaron IAS. No completado hasta 1952, es el prototipo de todo una serie computadores de propósito general. La siguiente figura muestra la estructura general del computador IAS. ALU Memoria Equipos de Principal E/S Unidad de Control 15 Arquitectura y programación de ordenadores Este consta de: Una memoria principal, que almacene tanto datos como instrucciones. Una unidad aritmético-lógica (ALU), capaz de hacer operaciones con datos binarios. Una unidad de control, que interpreta las instrucciones de memoria y provoca su ejecución. Un equipo de entrada-salida (E/S) dirigido por la unidad de control . Brevemente, a continuación se describen los elementos básicos citados previamente: CPU: es la parte del ordenador encargada de ejecutar las operaciones. Operaciones que incluye fundamentalmente movimiento de datos, operaciones aritméticas y lógicas, y de control del flujo de la ejecución. En la mayor parte de los ordenadores actuales, la CPU se construye en un único circuito integrado, denominado también microprocesador. Memoria: permite el almacenamiento de los datos y las instrucciones con las que trabaja el procesador. El término de memoria se suele utilizar para hacer referencia la memoria principal de la ordenador, frente a lo que sería una memoria secundaria, que es como se suele denominar a los sistemas de almacenamiento masivo como como los discos, cintas, CD-ROM, DVD, etc.. En un ordenador, prácticamente siempre aparecen espacios asociados a memoria ROM (Read Only Memory), cuya información no puede modificar la CPU, y es información que se conserva entré el apagado y el encendido del ordenador, y memorias RAM (Random Accsee Memory), cuyo contenido lo puede consultar y actualizar la CPU, pero su información se pierde cuando no se las alimenta eléctricamente. Dispositivos de entrada/salida: la comunicación del ordenador con el exterior se realiza mediante dispositivos de entrada/salida. Mediante estos dispositivos, la CPU autónoma y ofrece información del exterior. Cada dispositivo físicos (pantalla, discos, impresoras, etc..) se comunica con la CPU a través de un controlador específico para ese dispositivos. 16 Arquitectura y programación de ordenadores Estos componentes se conectan mediante líneas eléctricas, denominadas buses, y se clasifican como bus de datos, bus de direcciones y bus de control y aparte CPU, memoria se controladores se construyen a partir de circuitos digitales (puertas lógicas, codificadores, decodificadores, desplazadores, contadores, etc.). Su construcción suele hacerse empleando un único circuito integrado para almacenarlos a todos (por ejemplo, un microprocesador) o empleando un conjunto de circuitos digitales básicos, y a menudo algunos más complejos, interconectados en un circuito impreso. Salvo raras excepciones, todos los computadores de hoy en día tienen la misma estructura general y funcionamiento que la indicada en las máquinas de von Neumann. Por tanto, merece la pena describir brevemente la manera de operar del computador IAS. La memoria del IAS consiste en 1000 posiciones de almacenamiento, llamadas palabras, de 40 dígitos binarios (bits) cada una. Tanto los datos como las instrucciones se almacena ahí por tanto, los números se puede representar en forma binaria y cada instrucción tiene también un código binario. La figura 2.2 muestra estos formatos. Cada número se representa con un bit de signo y 39 bits de valor. Una palabra puede contener también dos instrucciones de 20 bits, donde cada instrucción consiste en un código de operación de 8 bits (codop) específica la operación que se va a realizar, y una dirección de 12 bits, que indica una de las palabras de la memoria (numeradas de 0 a 999). 17 Arquitectura y programación de ordenadores 01 39 a) Palabra número Bit de signo 0 8 Codop 19 20 Dirección 28 Codop 39 Dirección b) Palabra Instrucción La unidad de control dirige el IAS captando instrucciones de la memoria y ejecutándolas una a una. Tanto la unidad de control como la ALU, contiene posiciones de almacenamiento, llamadas registros, definidos de la siguiente manera: Registro temporal de memoria (MBR , Memory Buffer Register): contiene una palabra que debe ser almacenada en la memoria, o es usada para recibir una palabra procedente de la memoria. Registro de dirección de memoria (MAR ,Memory Address Register): específica la dirección en memoria de la palabra que va a ser escrita o leída en MBR. Registro de instrucción (IR, Instruction Register): contiene los 8 bits del código de operación de la instrucción que se va a ejecutar. Registro temporal de instrucción ( IBR, Instruction y Buffer Register): empleado para almacenar temporalmente la instrucción contenida en la parte derecha de una palabra en memoria. Contador de programa (PC ,Program Counter): contiene la dirección de la próxima pareja de instrucciones que va a ser captada de la memoria. 18 Arquitectura y programación de ordenadores Acumulador (AC) y multiplicador cociente (MQ, Multiplier Quotient): se emplean para almacenar operándos y resultados de operaciones de la ALU temporalmente. Por ejemplo, el resultado de multiplicar dos números de 40 bits es un número de 80 bits; los 40 bits más significativos se almacenan en el AC y los menos significativos en el MQ. CPU Unidad aritmético-lógica MQ AC Equipo de E/S Circuitos aritmético-lógicos MBR Instrucciones y datos IBR PC IR MAR Circuitos de control Señales de control Memoria principal Direcciones Unidad de control de programa Estructura expandida del computador IAS El IAS, opera ejecutando repetidamente un ciclo instrucción. Cada ciclo constará de dos subciclos. Durante el ciclo de captación, el codop de la siguiente instrucción es cargado en el IR, y la parte que contiene la dirección se almacena en el MAR. Esta instrucción puede ser captada desde el IBR, o puede de ser obtenida de la memoria cargando una palabra en el MBR, y luego en IBR, IR y MAR. 19 Arquitectura y programación de ordenadores Una vez que el codop está en el IR, se lleva a cabo el ciclo de ejecución. Los circuitos de control interpretan el codop y ejecutan las instrucciones, enviando las señales de control adecuadas para provocar que los datos se transfieran o que la ALU realice una operación. El computador IAS tiene un total de 21 instrucciones, algunas de las cuales se indican en la Tabla1. El tipo de instrucciones del IAS se muestra en esta tabla, sin embargo aprovechamos aquí para nombrar las instrucciones típicas que incluye cualquier CPU, que se pueden dividir en los siguientes grupos: Transferencia de datos: se emplea para mover información entre los diferentes espacios (registros, memoria, registros de controladores de entrada/salida). Aunque algunas CPU restringen los movimientos (8086 y los procesadores RISC no permiten movimientos de memoria a memoria), otros permiten cualquier combinación (ortogonalidad). También se incluyen operaciones específicas de entrada/salida o de acceso a los espacios de pila. Aritméticas: instrucciones que realizan operaciones aritméticas, negaciones de signo,sumas, restas, multiplicaciones, divisiones de operándose enteros (con y sin signo), en coma flotante, etc.. También aparecen a veces instrucciones de comparación, que se suele utilizar con las de salto condicional. Lógicas y de desplazamientos: estas instrucciones implementan operaciones lógicas bit a bit entre los operandos, incluyéndose operaciones como AND, OR, XOR, NOT, desplazamientos izquierda o derecha y rotaciones a izquierda o derecha. Manejo de bits: estas son instrucciones que permite modificar o consultar bits de un operando de forma individual. Control del programa: estas son instrucciones que permite modificar el flujo de ejecución de un programa. Entré ellas se incluyen los saltos condicionales o incondicionales, las llamadas y retornos de subrutina, las comprobaciones de errores y los desvíos al sistema operativo. 20 Arquitectura y programación de ordenadores Control de el procesador: así se incluyen instrucciones específicas del procesador, como instrucciones que dejan parado el procesador, lo dejan bloqueado hasta que aparezca una interrupción; instrucciones que no hacen nada, o instrucciones que consultan o modifican registro de propósito específico dentro del procesador (por ejemplo, palabras de estado). Miscelánea: aparecen también instrucciones que facilitan el manejo de cadenas de caracteres o instrucciones que facilitan la compartición de memoria entre varios procesadores. Tabla1 Tipo de Codop Instrucción Transferencia de datos Representación Descripción simbólica 00001010 LOAD MQ Transferir el contenido del registro MQ al acumulador AC 00001001 LOAD MQ,M(X) Transferir el contenido de la posición de memoria X a MQ Salto incondicional 00001101 JUMP M(X,0:19) Captar la siguiente instrucción de la mitad izquierda de M(X) 00001110 JUMP M(X,20:39) Captar la siguiente instrucción de la mitad derecha de M(X) Salto condicional 00001111 JUMP + M(X,0:19) Si el número en el acumulador no es negativo, captar la siguiente instrucción de la mitad izquierda de M(X) Aritmética 00001000 JUMP + M(X,20:39) ……. de la mitad derecha de M(X) 00000101 ADD M(X) Sumar M(X) a AC; colocar el resultado en AC 00000110 SUB M(X) Restar M(X) a AC; colocar el resultado en AC Modificación de direcciones 00010010 STOR M(X,8:19) Reemplazar el campo de dirección de la izquierda de M(X) por los doce bits de la derecha de AC 00010011 STOR M(X,28:39) Reemplazar el campo de dirección de la derecha de M(X)… Microinstrucciones del ordenador IAS 21 Arquitectura y programación de ordenadores 1.4 LENGUAJE MÁQUINA: OPERANDOS Y DIRECCIONAMIENTO Las instrucciones ejecuta la CPU se almacenan en la memoria del ordenador, de donde las extrae el procesador y las ejecuta de forma secuencial, a menos que se produzca algún salto. En una memoria sólo se pueden almacenarse secuencias de bytes cuyos contenidos son ceros o unos, esas combinaciones y secuencias deben estar organizadas de forma que tengan algún sentido para la CPU y sean reconocidas por esta. El conjunto de las posibles combinación de que reconoce la CPU es lo que se denomina lenguaje máquina, y suelen ser diferentes para cada familia de CPU. Las instrucciones que ejecuta la CPU son, en general, operaciones aritméticas (sumas, restas, multiplicaciones, etc.), lógicas (AND, OR, NOT, etc), movimiento de datos de unos espacios a otros y control de flujo (saltos condicionales, incondicionales, comparaciones...). Esas instrucciones suelen trabajar con unos operándos que la CPU pueda tomar de sus registros (espacios para almacenar datos dentro de la propia CPU) o de la memoria. La forma en que se especifica de donde se deben tomar los datos es lo que se llama el modo de direccionamiento. Programas en lenguaje máquina Como se ha dicho, el lenguaje máquinas es aquel que la CPU es capaz de reconocer y ejecutar. Una secuencia de instrucciones de este lenguaje máquina, almacenado en la memoria del ordenador, podrá representar un programa en lenguaje máquina. Un programa es una secuencia de ceros y unos que, en función de las instrucciones que incluya y el orden en que éstas aparezcan, a la que la CPU vaya obteniendo unos resultados, que pueden parecerse o no a los que el programador pretendía conseguir. Un ejemplo de programa en lenguaje máquina almacenado en la memoria de un ordenador con un procesador hipotético podría ser el de la siguiente figura. En el se lleva una constante con valor 6 a la posición 5 de memoria, y a continuación se introducen en un bucle en el que restara uno al contenido de la posición 5 hasta que ésta se haga 0. 22 Arquitectura y programación de ordenadores Dirección de memoria Binario Decimal 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 15 0 Poner 6 0001 0110 Restar 1 0100 0001 Si última op. Programa 0011 xxxx En dir 0101 De dir 0101 0 1001 xxxx 5 xxxx Salta 4 xxxx Salta a Dato 5 0100 Dir 1 xxxx xxxx 0001 xxxx xxxx xxxx Parar 0000 Formato deInstrucción: Cog. opera Dato inme. Direc. Direc. opera. salto En este programa aparece una secuencia de instrucciones (no hay nada almacenado entre estas instrucciones) El procesador irá ejecutando una tras otra. Son instrucciones en general sencillas (comparándolas con las de los lenguajes de alto nivel como Fortran, C, VisualBasic, etc...). 23 Arquitectura y programación de ordenadores En general, las instrucciones suelen organizarse en campos, normalmente de tamaño variable y que no siempre aparecen en todas las instrucciones. El ejemplo planteado es muy regular y ortogonal, algo deseable, pero que no es la norma. Otra característica común a todos los lenguajes máquina es que cada instrucción contiene todo lo que la CPU necesita para poder ejecutarla, estando muy claro el límite entre ellas. La CPU siempre puede ejecutar cualquier instrucción en un momento dado. Cualquier secuencia de instrucciones podrá ser ejecutada por el procesado (salvo caso muy excepcionales), aunque los resultados pueden ser impredecibles. Esta característica hace que la ejecución de las CPU sea bastante sistemática y lleve asociado un ciclo de ejecución parecido en todas ellas: 1. Extraer instrucción de la memoria. 2. Decodificarlas, de terminar la operación a realizar y extraer los operando. 3. Ejecutarla instrucción y almacenar resultados. 4. Volver a uno. A pesar de que es el lenguaje máquinas el que realmente se ejecuta en la CPU, espera químicamente imposible representar un programa de cierta complejidad en este lenguajes. Para poder escribir los programas, nos apoyamos en herramientas como los compiladores, intérpretes o en sembradores, cuya función es producir los programas escritos en lenguaje de alto nivel, o ensamblador, a lenguajes máquina, siendo estas traducciones las que realmente ejecuta el procesador. Para poder ejercer un programa en un caso general, además de editarlo, se deben seguir estos pasos: 24 Arquitectura y programación de ordenadores 1. Compilar cada una de las unidades que lo compongan (pudiendo estar cada unidad escrita en diferentes lenguajes de alto nivel o ensamblador). Los compiladores o ensambladores generaran ficheros objetos, en los que se incluyen instrucciones en lenguaje máquina que ejecutan operaciones equivalentes a las sentencias de los ficheros fuente, además de otra información que se empleara en la siguientes fases. 2. Enlazar el conjunto de ficheros objeto que componen un programa. El enlanzador general un fichero (fichero ejecutable) que contendrá un programa en lenguaje máquina, con información adicional que permita cargarlo en memoria (datos sobre el espacio que ocupan los datos del programa y el código, partes del código que hay que retocar cuando se carga el código o información que emplean los depuradores de programas). 3. Cargar el programa ejecutable (el lenguaje máquina) en memoria y hacer que la CPU no ejecute la carga de el programa La suele realizar el sistema operativo de la máquina, llevando las instrucciones máquina contiene el fichero ejecutable a memoria. Una vez cargado, le cederá control, ejecutando una instrucción de saltó a la dirección donde se ha cargado el programa. Hasta ese momento, la CPU estaba ejecutando instrucciones de los programas que componen el sistema operativo. A partir de ahora ejecutará las del programa. Como se ve, para poder ejecutar un programa se deben ejecutar otros programas (compilador, enlanzador, sistema operativo), que, a su vez, habrán sido escritos en lenguaje este alto nivel y compilados y enlazados, a menudo con técnicas de programación cruzada (en una máquina diferente y con otros compiladores y enlanzadores) o similares. Un programa en ensamblador es básicamente un conjunto de instrucciones de un lenguaje simbólico, en el que en general cada instrucción se hace corresponder con una instrucción de las que es capaz de reconocer el procesador (salvo algunas instrucciones o directivas dirigidas al ensamblador para que realice la traducción de una forma determinada). Además de poder emplear nemotécnicos para representar las operaciones, los espacios de datos se presentarán de forma simbólica (de forma parecida a como se declaran variables en 25 Arquitectura y programación de ordenadores un lenguaje de alto nivel), con lo que se evita tener que trabajar directamente con direcciones de memoria. Esos espacios se representan mediante etiquetas, que también se emplean para representar direcciones donde se tienen almacenadas instrucciones. Es importante resaltar que una instrucción ensamblador se corresponde con la instrucción en lenguaje máquina, empleándose el lenguaje ensamblado como una forma más amigable de representar el lenguaje máquina. Al representar de forma más clara la misma idea, se facilita la escritura de programas de cierta complejidad. Sin embargo, las instrucciones siguen siendo tan sencillas como las del lenguaje máquina y, sobre todo, poco estructuradas, lo que hace que sea poco el software que se escriba en ensamblador, y se limite en general a operaciones muy dependientes de la máquina con la que se trabaja, dejando el resto a los lenguajes de alto nivel. Otro problema más de estos programas es la poca portabilidad entre máquinas con procesadores de diferente tipo. 1.4.1 Operandos En este apartado se comentarán los operandos empleados por instrucciones máquina y la forma que emplean las instrucciones para representarlos. La mayor parte de las instrucciones de un ordenador manipulan datos, esos datos residen en los operandos, que aparecen descritos en las instrucciones que procesa la CPU. En general los operandos con los que trabajan las instrucciones son de 3 clases, en función de su ubicación: espacios de memoria, registros de la CPU y registros de controladores de entrada/salida. Desde un punto de vista más particular, se pueden clasificar por el tipo de información que almacenan: Direcciones, números, caracteres y datos lógicos. normalmente, cada palabra o cualquier otra unidad direccionable (byte, media palabra, etc.) es tratada como una unidad de datos individual. Sin embargo, a veces es útil considerar una unidad de n bits, elemento elementos o datos de 1 bit, donde cada elemento tiene un valor 1 ó 0. Cuando los datos son vistos de esta manera, se consideran datos lógicos. 26 Arquitectura y programación de ordenadores Tipos de datos en Pentium II El Pentium II puede tratar tipos de datos de 8 (byte),32 (palabra doble) y 64 (palabra cuádruple) bits de longitud. Para posibilitar una flexibilidad máxima en las estructuras de datos, y una utilización eficiente de la memoria, las palabras no tienen por qué estar alineadas con las direcciones pares de memoria, ni las palabras dobles alineadas con las direcciones divisibles por cuatro, y las cuatro pares con direcciones divisibles por ocho. Sin embargo, cuando se accede a los datos a través de un bus de 32 bits, su transferencia tiene lugar en unidades de palabras dobles, empezando en direcciones divisibles por cuatro. El procesador convierte las peticiones, valores no alineados, en una secuencia de peticiones adaptada a la forma de transparencia en el bus. Como en todas las máquinas Intel 80X86, el Pentium II emplea el estilo "litte-endian"; es decir: el byte menos significativo es almacenado en la dirección más bajas. El byte, la palabra, la palabra doble y la cuádruple, son referidas como tipos generales de datos. Además, el Pentium II admite una variedad impresionante de tipos de datos específicos, que son reconocidos y procesados mediante instrucciones concretas. La Tabla II resume estos tipos. El tipo coma flotante se refiere realmente a un conjunto de tipos utilizados por la unidad de coma flotante, y que son procesados mediante instrucciones de coma flotante. Los enteros están en representación de complemento a dos y puede ser de 16,32 ó 64 bits. Los enteros decimales empaquetados se almacenan en representación signo-magnitud con 18 dígitos en el rango de 0 a 9. Las tres representaciones en coma flotante se ajustan al estándar IEEE 754. Tipos de datos en el PowerPC El PowerPC puede manejar tipos de datos de 8 (byte),16 (media palabra),32 (palabra) y 64 (palabra doble)bits de longitud. Algunas instrucciones requieren que los operandos de memoria estén alineados con una frontera de 32 bits. Sin embargo, en general no es necesario 27 Arquitectura y programación de ordenadores el alineamiento. Una característica interesante del PowerPC es que puede utilizar bien estilo "litte-endian" o el "big-endian"; es decir, el byte menos significativo puede estar almacenado, bien en la dirección más baja, o bien en la más alta. El byte, la media palabra, la palabra y la palabra doble, son tipos de datos generales. El procesador interpreta el contenido de un elemento de datos dado dependiendo de la instrucción. El procesador de coma flotante cifra reconoce los siguientes tipos de datos: Byte sin signo: puede utilizarse para operaciones lógicas o para aritméticas con enteros. Se carga de memoria en un registro general, completando con ceros hacia la izquierda hasta la longitud total del registro. Media palabra con signo: como antes, pero para cantidades de 16. Media palabra con signo: utilizados para operaciones aritméticas; cargardo en memoria completando el signo hacia la izquierda hasta la longitud total del registro (es decir, se repite el bit de signo en todas las posiciones vacantes). Palabra sin signo: utilizado para operaciones lógicas y como puntero de direcciones. Palabra con signo: utilizado para operaciones aritméticas. Palabra doble sin signo: utilizado como puntero de direcciones. Cadena de bytes: de este 0 hasta 128 bytes de longitud. Además, el por PowerPC admite tipos de datos en coma flotante de pretensión simple y doble definidos en el estándar IEEE . 28 Arquitectura y programación de ordenadores Tabla II Tipo de datos Descripción General Posiciones de byte, de palabra( 16 bits), de palabra doble y cuádruple, con contenido binario arbitrario Entero Un valor binario con signo contenido en un byte, una palabra o una palabra doble, representado en complemanto a dos Ordinal Un entero con signo contenido en un byte, una palabra o una palabra doble Decimal codificado en binario (BCD) Representación de un dígito BCD en el rango de 0 a desempaquetado 9, con un dígito en cada byte BCD empaquetado Representación empaquetada de dos dígitos BCD en un byte; valor en el rango de 0 a 99 Puntero de proximidad Una dirección efectiva de 32 bits que representa el (Puntero cercano) desplazamiento dentro de un segmento. Utilizado para todos los punteros en una memoria no segmentado y para referencias dentro de un segmento en una memoria segmentado. Campo de bits Una secuencia contigua de bits en la que cada posición de bit se considera como unidad independiente. Una cadena de bits puede comenzar en cualquier posición de cualquier byte y puede contener hasta 232-1 bits Cadena de bytes Una secuencia contigua de bytes, de palabras, o de palabras dobles, que contiene de 0 hasta 232-1 bytes Coma flotante Enteros de una palabra con 16 bits de precisión, enteros cortos con precisión de 32 bits, enteros largos con precisión de 64 bits, BCD empaquetado de dieciocho dígitos de precisión, precisión simples de 24 bits de precisión doble precisión de 3 bits y precisión ampliada con precisión de 64 bits Tipos de datos en el Pentium II 29 Arquitectura y programación de ordenadores 1.4.2 Direccionamiento Se suelen utilizar 12 modos de direccionamiento básicos, clasificados en 5 grupos: 1.4.2.1. Direccionamientos de acceso directo a registro . 1.4.2.2. Direccionamiento de acceso directo a memoria 1.4.2.4. Direccionamiento relativo 1.4.2.5. Direccionamiento implícito. 1.4.2.1. Direccionamientos de acceso directo a registro A Direccionamiento de registro Especifica el operando fuente y el operando destino. Los registros deben ser del mismo tamaño. ej. MOV DX, CX MOV CL, DL. B Direccionamiento inmediato Un dato de 8 o 16 bits se especifica como parte de la instrucción. p.ej. MOV CL, 03H. Aquí el operando fuente está en modo inmediato y el destino en modo registro. 1.4.2.2. Direccionamientos de acceso directo a memoria. A Direccionamiento directo La dirección efectiva (EA) de 16 bits se toma directamente del campo de desplazamiento de la instrucción. El desplazamiento se coloca en la localidad siguiente al código de operación. Esta EA o desplazamiento es la distancia de la localidad de memoria al valor actual en el segmento de datos (DS) en el cual el dato está colocado. Ej. MOV CX, START. START puede definirse como una localidad de memoria usando las pseudoinstrucciones DB o DW. 30 Arquitectura y programación de ordenadores B Direccionamiento de registro indirecto. La dirección efectiva EA está especificada en un registro apuntador o un registro índice. El apuntador puede ser el registro base BX o el apuntador base BP; el registro índice puede ser el Indice Fuente (SI) o el Indice Destino (DI). Ej. MOV (DI),BX. C Direccionamiento base EA se obtiene sumando un desplazamiento (8 bits con signo o 16 bits sin signo) a los contenidos de BX o BP. Los segmentos usados son DS y SS. Cuando la memoria es accesada, la dirección física de 20 bits es calculada de BX y DS, por otra parte, cuando la pila es Accesada, la dirección es calculada de BP y SS. Ej. MOV AL, START (BX). el operando fuente está en modo base, y la EA se obtiene sumando los valores de START y BX. D Direccionamiento indexado. EA se calcula sumando un desplazamiento (8 o 16 bits) a los contenidos de SI o DI. Ej. MOV BH,START (SI). E Direccionamento base indexado. EA se calcula sumando un registro base (BX o BP), un registro índice (DI o SI), y un desplazamiento (8 o 16 bits). Ej. MOV ALPHA (SI)(BX),CL. Este direccionamiento proporciona una forma conveniente para direccionar un arreglo localizado en la pila. 31 Arquitectura y programación de ordenadores F Direccionamiento con registros índice Este modo usa registros índice. La cadena de instrucciones automáticamente asume que SI apunta al primer byte o palabra del operando destino. Los contenidos de SI y DI son incrementados automáticamente (poniendo a 0 DF mediante la instrucción CLD) o decrementados (poniendo a 1 DF mediante la instrucción STD) para apuntar al siguiente byte o palabra. El segmento del operando fuente es DS y puede ser encimado. El segmento del operando destino debe ser ES y no puede ser encimado. Ej. MOVS BYTE. 1.4.2.3. Direccionamiento de acceso a puertos E/S Hay dos tipos de direccionamiento usando puertos: directo e indirecto. En el modo directo, el número de puerto es el operando inmediato de 8 bits, lo cual permite accesar puertos numerados del 0 al 255. Ej. OUT 05H,AL. En el modo indirecto, el número de puerto se toma de DX, permitiendo así 64K puertos de 8 bits o 32K puertos de 16 bits. Las transferencias E/S de 8 y 16 bits deben hacerse vía AX y AL, respectivamente. 1.4.2.4. Direccionamiento relativo En este modo el operando se especifica como un desplazamiento de 8 bits con signo, relativo al PC. Ej. JNC START. Si C=0, entonces el PC se carga con PC+el valor de START. 1.4.2.5. Direccionamiento implícito Las instrucciones que usan esta modo no tienen operandos. Ej. CLC.