DIRECCIONAMIENTO Y REGISTROS Los modos de direccionamiento de una arquitectura son el conjunto de sintaxis y métodos que usan las instrucciones para especificar una dirección de memoria, ya sea la dirección objeto de una referencia a memoria o la dirección de salto de una bifurcación. TIPOS DE DIRECCIONAMIENTO POSIBLES Dependiendo de la arquitectura, ciertos modos de direccionamiento pueden estar disponibles solo para algunas de las instrucciones que hacen referencia a la memoria. Los campos de dirección en un formato de instrucción típica son relativamente pequeños Inmediato La forma más simple de direccionamiento, en el cual el operando en realidad esta presente en la instrucción: Operando = A Este modo puede ser utilizado para definir y utilizar constantes o poner valores iniciales a las variables. Típicamente el número se almacenara en forma de complemento a dos; el bit más a la izquierda del campo de operando se utiliza como bit de signo. Cuando el operando es cargado en un registro de datos, el bit de signo se extiende a la izquierda para el tamaño completo de la palabra. Su ventaja es que no se requiere otra referencia de memoria más que la de captación de instrucción para obtener el operando, por lo tanto se elimina un ciclo de memoria o cache en el ciclo de instrucción. Su desventaja es que el tamaño del número se restringe al tamaño del campo de dirección, que, en la mayoría de los conjuntos de instrucciones es pequeña comparada con la longitud de palabra. Inmediato Extendido Este modo de direccionamiento como su nombre lo indica es una extensión del Direccionamiento Inmediato, este tipo de direccionamiento permite cargar con un dato de 16 bits a un registro par y obtiene la dirección donde continua el procesamiento en forma inmediata. Este modo de direccionamiento lo utilizan las instrucciones del grupo "cargar 16 bits" y del grupo de instrucciones "saltos, llamadas y regresos", (JP, CALL y RET). El primero de los dos bytes del dato o de la dirección contiene los bits menos significativos (LSB) y el segundo byte contiene los bits más significativos (MSB). Implícito En este modo, llamado también inherente, el operando se especifica en la misma definición de la instrucción. El modo implícito se usa para hacer referencia a operandos de dos tipos: Registros: En el caso de que el código de operación se refiera en particular a un registro. Operandos en la pila: En el caso de que la operación se realice siempre sobre el dato situado en la cima de pila. El primer caso es típico de las organizaciones de un solo acumulador. Generalmente en un ordenador de este tipo todas las instrucciones que actúan sobre el acumulador utilizan direccionamiento implícito. En el segundo caso están la mayoría de las instrucciones de los ordenadores con organización de pila. Estas operaciones llevan implícitos los operandos que son los elementos de la cima de pila. Esto se debe a que en este tipo de máquinas la mayoría de las operaciones no tienen campos de dirección. También están en este caso las instrucciones PUSH y POP de la mayoría de los ordenadores cuyo operando implícito también es, como en el caso anterior, la cima de pila. Relativo Para el direccionamiento relativo, el registro implícitamente referenciado es el PC, así que la dirección de instrucción actual se agrega al ampo de dirección para producir el EA, comúnmente el campo de dirección se trata como un número a complemento dos para la operación, por lo tanto, las direcciones efectivas para un desplazamiento relativo a la dirección es la instrucción. El direccionamiento relativo explota el concepto de localidad; Si hay más referencias de memoria están relativamente cerca de la instrucción que se ejecuta, entonces el uso de direccionamiento relativo guarda bits de dirección en la instrucción. En las direcciones de salto, este tipo de direccionamientos permite reducir el numero de bytes para especificar la dirección y reducir así el largo del programa, se usa el byte que sigue al código operacional relativo para especificar un desplazamiento a partir del valor actual del contador de "programa más dos", el resultado de la operación es una dirección a la cual el programa salta para continuar el procesamiento en esta nueva dirección. El direccionamiento relativo permite el acceso a 256 localidades alrededor de la dirección de la siguiente instrucción, el valor del operando es un valor con signo entre +128 y -127, tomando como punto de partida del desplazamiento a la localidad de memoria donde esta la siguiente instrucción. Este modo se usa en la CPU Z80 únicamente con el grupo de instrucciones de salto, permitiendo saltos condicionales o incondicionales que se obtienen de la resta o la suma respectivamente, del contador de programa actual más el operando Absoluto Absoluto corto: Este modo de direccionamiento se basa en una palabra de extensión de la que se obtiene la dirección del operando una vez que se le ha extendido el signo hasta 32 bits. Por tanto este direccionamiento se puede utilizar dentro de los 32 kbytes primeros de la memoria (0000-7FFF) y dentro de los 32 kbytes finales (FF8000-FFFFFF). Absoluto largo: Este modo de direccionamiento utiliza dos palabras de extensión de las que se obtiene la dirección del operando por concatenación, situando la primera como parte alta de la dirección y la segunda como parte baja Indexado En este modo de direccionamiento, la dirección del operando se calcula sumando un registro de la CPU al campo de operando, este registro es un registro específico para este uso llamado registro índice. En los ordenadores con organización de registros generales, el registro índice puede ser cualquiera de los registros de la CPU. En los ordenadores en que el contador de programa es considerado como un registro de uso general (PDP 11 y VAX) el modo relativo es un caso particular del direccionamiento indexado. A la cantidad que hay que sumar al registro índice para conseguir la dirección del operando también se le llama desplazamiento u offset. Este modo de direccionamiento es especialmente útil para el direccionamiento de vectores y matrices en bucles ya que, si se quieren direccionar elementos consecutivos del vector o matriz, basta mantener en el desplazamiento la dirección del primer elemento e ir incrementando el registro índice. También sirve para acceder de forma relativa a elementos de vectores cercanos a uno dado, para ello, se carga la dirección del elemento de referencia en el registro índice y después se accede mediante direccionamiento indexado, con el desplazamiento adecuado, al anterior, al siguiente, etc., esto mismo también es aplicable a pilas, en que, en ocasiones, hay que acceder a datos cercanos, por encima o por debajo, al dato señalado por algún apuntador. Una consecuencia de todo esto es una modalidad de direccionamiento indexado de que disponen algunos ordenadores, denominada autoindexación, que hace que el registro índice sea incrementado o decrementado en el tamaño del operando antes o después de acceder al mismo. Los ordenadores que poseen autoindexación incorporan los modos de direccionamiento descritos en los dos apartados siguientes. En algunos ordenadores existen variantes del direccionamiento indexado en que se obtiene la dirección del operando sumando el contenido de varios registros con el desplazamiento, esto puede servir para especificar el comienzo de un vector mediante un desplazamiento respecto a un registro y el elemento del vector mediante un registro índice. Directo En este modo, el ampo de dirección contiene la propia dirección del operando: EA = A Se utilizaba comúnmente en las primeras generaciones de computadoras, pero ha caído en desuso, requiere solamente una referencia de memoria y no cálculos especiales; la limitación obvia es que provee solamente un espacio de dirección limitado. Indirecto Con direccionamiento directo, la longitud del campo de dirección es usualmente menos que la longitud de palabra, por lo tanto limitando el rango de dirección. Una solución es tener el campo de dirección refiriendo a la dirección de una palabra en memoria, la cual contendrá una dirección con máxima longitud del operando, esto es el direccionamiento indirecto. EA = (A) Los paréntesis son interpretados con significado de “contenido de”. La ventaja de este enfoque es que para una longitud de palabra N, un espacio de memoria de 2N estará disponible, sin embargo la desventaja es que la ejecución de instrucción requiere dos referencias de memoria para captar el operando: una para obtener su dirección y otra para obtener su valor. A pesar de que el número de palabras que pueden ser direccionadas es igual a 2N el número de diferentes direcciones efectivas que pueden ser referenciadas en un tiempo esta limitado a 2k, donde k es la longitud del campo de dirección. Comúnmente no es una gran restricción y puede ser manejada; en un ambiente de memoria virtual, todas las posiciones de direcciones efectivas pueden confinarse a página 0 de cualquier proceso. Porque el campo de dirección de una instrucción es pequeño, naturalmente producirá direcciones directas de números bajos, lo que aparecerá en la página 0. (La única restricción es que el tamaño de la página debe ser igual o más grande que 2k).Cuando un proceso esta activo, habrá referencias repetidas a página 0, causando que permanezca en memoria real; por lo tanto una referencia a memoria indirecta involucrará en su mayoría una página predeterminada en ves de dos. Una variante raramente utilizada es direccionamiento indirecto multinivel. EA = (...(A)...) En este caso, un bit de una dirección de palabra completa es una marca indirecta (I), si el I bit es 0, entonces la palabra contiene EA, si es 1, otro nivel de indirección se invoca. No parece que haya una ventaja en particular para este enfoque, pero su desventaja es que tres o más referencias de memoria pueden ser requeridas para captar un operando. REGISTRO Es similar al direccionamiento, la única diferencia es que el campo de dirección se refiere a un registro en lugar de direcciones de memoria principal. EA = R Comúnmente, un campo de dirección que referencia registros tendrá de 3 a 5 bits, para un total de 8 a 32 registros de propósito general puedan ser referenciados. Los grupos de instrucciones que utilizan este tipo de direccionamiento de registro, son los de aritmética y lógica de 8 bits y de 16 bits como son: • • • • • Rotar Girar Poner en uno Poner en cero y Probar bits Las ventajas de este modo son que solo un campo de dirección pequeño se necesita en la instrucción, y que no se requiere referencia a memoria. Su desventaja es que el espacio de dirección es muy limitado. Registro Indirecto La dirección especifica el registro que contiene la dirección del operando. Es útil cuando las direcciones de estructuras de datos se conocen en el momento de la corrida, porque las direcciones pueden ser calculadas con instrucciones y almacenadas en un registro. Desplazamiento Un poderoso modo de direccionamiento que combina las capacidades del direccionamiento directo y direccionamiento de registro indirecto, se le conoce por una variedad de nombre dependiendo del contexto en que se use, pero el mecanismo básico es el mismo. EA = A + (R) Este modo requiere que la instrucción tengo dos campos de dirección, al menos uno explicito. El valor contenido en un campo de dirección (valor = A) es utilizado directamente. El otro campo de dirección, o una referencia implícita basada en el opcode, se refiere a un registro cuyo contenido son agregados a A para producir la dirección efectiva. Tres de los principales usos del direccionamiento por desplazamiento son: • • • Direccionamiento relativo Direccionamiento por registro base Indexando En la siguiente tabla se indica el cálculo de dirección realizado por algunos modos de direccionamiento. A = Contenido de un campo de dirección en la instrucción. R = Contenido de un campo de dirección en la instrucción que refiere a un registro. EA = Dirección actual (efectiva) de la localidad que contiene el operando referenciado. (X) = Contenido de la localidad de memoria X o registro X. Modo Inmediato Directo Indirecto Registro Registro indirecto Desplazamiento Pila Algoritmo Operando = A EA = A EA = (A) EA = R EA = (R) EA = A + (R) EA = Tope de pila Principal Ventaja No hay referencia a memoria Es simple Espacio de dirección largo No hay referencia a memoria Espacio de dirección largo Flexibilidad No hay referencia a memoria Principal Desventaja Magnitud de operando limitada Espacio de dirección limitado Múltiples referencias a memoria Espacio de dirección limitado Referencia a memoria extra Complejidad Aplicabilidad limitada FORMATOS DE INSTRUCCIÓN, VENTAJAS Y DESVENTAJAS EN LAS COMBINACIONES DE CAMPOS El formato de instrucción define la capa de los bits de una instrucción, en términos de sus componentes. Un formato de instrucción debe incluir un código de operación (opcode) y implícita o explícitamente cero o más operandos. Cada operando explicito es referenciado utilizando un modo de direccionamiento. El formato debe, implícita o explícitamente, indicar el modo de direccionamiento para cada operando. Para la mayoría de los repertorios de instrucciones se utiliza más de un modo de direccionamiento. Algunos conceptos relevantes son: Longitud de instrucción Es el aspecto más básico a encarar. Son varios los aspectos que afectan y se ven afectados al decidir esta variable, tales son: tamaño de memoria, organización de memoria, estructura de bus, complejidad del CPU y velocidad del CPU. La decisión tomada determina la riqueza y flexibilidad de la maquina vista por el programador de lenguaje ensamblador. El trueque más obvio es entre el deseo por un repertorio de instrucciones más poderoso y la necesidad para salvar espacio. Los programadores quieren más opcodes, más operandos, más modos de direccionamiento, y un mayor rango de dirección. Más opcodes y más operandos hacen la vida de un programador mucho más fácil, porque se pueden crear programas más cortos para completar las diversas tareas. Similarmente, más modos de direccionamiento dan al programador una mayor flexibilidad al implementar ciertas funciones, como manipulación de tablas y bifurcaciones multimodo. Y por supuesto, con el incremento del tamaño de memoria principal y del uso de memoria virtual, los programadores quieren ser más capaces de direccionar rangos de memoria mucho más grandes. Los opcodes, operandos, modos de direccionamiento, rango de dirección requieren bits y presionan en dirección de longitudes de instrucción más grandes. Pero longitudes de instrucción más grandes pueden ser derrochador. Una instrucción de 64 bits ocupa el doble de espacio que una de 32 pero es probablemente menos del doble de útil. Más allá de estos trueques, existen otras consideraciones, cualquiera que sea la longitud de instrucción, debe ser igual a la longitud de transferencia de memoria (en un sistema de buses, longitud del bus de datos) o una debe ser múltiplo de la otra. De otra manera no se podría obtener un número integral de instrucciones durante el ciclo de búsqueda. Una consideración relacionada es la tasa de transferencia de memoria. Esta tasa no se mantuvo al nivel de los incrementos de velocidad del procesador. Por consiguiente, la memoria puede volverse un cuello de botella si el procesador puede ejecutar instrucciones más rápido de lo que las busca. Una solución a este problema es utilizar memoria cache, otro es utilizar instrucciones más cortas, así instrucciones de 16 bits pueden ser buscadas con una tasa del doble que la de 32 bits pero probablemente puedan ejecutarse a menos del doble de rápido. Un punto importante es que la longitud de instrucción debe ser un múltiplo de la longitud de carácter, generalmente 8 bits, y de la longitud de números de punto fijo. A este concepto se le llama palabra (word). La longitud de palabra es, de algún modo, la unidad “natural” de organización; su tamaño indica el tamaño de los números de punto fijo. Su tamaño también es igual o relacionada al tamaño de transferencia de memoria. Porque una forma común de información es el dato de carácter, nos gustaría que una palabra almacenara un número integral de caracteres. De otro modo, se desperdician bits en cada palabra al almacenar múltiples caracteres, o un carácter tendrá que extenderse a los limites de palabra Asignación de bits Para cada longitud de instrucción, hay claramente intercambios entre el numero de opcodes y el poder de la capacidad de direccionamiento. Más opcodes obviamente significan más bits en el campo de opcode. Para un formato de instrucción de determinada longitud, esto reduce el número de bits disponibles para direccionamiento. Hay un interesante afinamiento a este intercambio, y es el uso de opcodes de longitud variable. En este enfoque, hay una longitud de opcode mínima pero, para algunos opcodes, pueden especificarse operaciones adicionales utilizando bits adicionales en la instrucción. Para una instrucción de longitud fija, esto deja menos bits para direccionamiento. Así, esta función se utiliza para aquellas instrucciones que requieren menos operandos y/o un direccionamiento menos poderoso. Los siguientes factores ayudan a determinar el uso de bits de direccionamiento. Número de modos de direccionamiento: Algunas veces un modo de direccionamiento puede ser indicado implícitamente. Por ejemplo, ciertos opcodes pueden pedir catalogar. En otros casos, los modos de direccionamiento deben ser explícitos, y uno o más bits de modo se necesitarán. Número de operandos: Las instrucciones típicas de las maquinas actuales proveen dos operandos. Cada dirección de operando en la instrucción requiere su propio indicador de modo, o el uso de un indicador de modo puede ser limitado a solo uno de los campos de dirección. Registro contra memoria: Una maquina debe tener registros para que la información pueda ser traída al CPU para procesamiento. Con un simple registro visible al usuario (usualmente llamado acumulador), una dirección de operando esta implícita y no consume bits de instrucción. Sin embargo, la programación con registros simples es difícil y requiere muchas instrucciones. Incluso con múltiples registros, solo se necesitan unos pocos bits para especificar el registro. Estudios indican que se recomiendan de 8 a 32 registros visibles al usuario; arquitecturas contemporáneas tienen por lo menos 32 registros. Número de conjuntos de registros: Las arquitecturas más actuales tienen un set de registros de uso general, con típicamente 32 o más registros en el. Estos registros pueden ser utilizados para almacenar información así como direcciones para direccionamiento por desplazamiento. Algunas arquitecturas, incluyendo la de Pentium tienen una colección o dos o más conjuntos especializados (como datos y desplazamiento). Una ventaja de este enfoque es que, para un número fijo de registros, una división requiere menos bits para utilizarse en la instrucción. Por ejemplo, con dos conjuntos de ocho registros, solo tres bits son requeridos para identificar un registro; el opcode implícitamente determinara cual conjunto de registros esta siendo referenciado. Rango de dirección: Para direcciones que referencian memoria, el rango de direcciones que pueden ser referenciadas esta relacionado con el número de bits de dirección. Porque esto impone una severa limitación, direccionamiento directo es raramente utilizado. Con direccionamiento por desplazamiento, el rango se abre hasta la longitud del registro de dirección. Incluso, es aun conveniente permitir elegir desplazamientos largos de la dirección de registro, lo que requiere de un número de bits en la instrucción relativamente grande. Granularidad de dirección: Para direcciones que referencian memoria en vez de registros, otro factor es la granularidad de direccionamiento. En un sistema con palabras de 16 o32 bits, una dirección puede referenciar una palabra o un byte a elección del diseñador. INSTRUCCIONES DE LONGITUD VARIABLE El tener una variedad de instrucciones y con diferentes longitudes, facilita el proveer un gran repertorio de opcodes, con diferentes longitudes para cada uno. El direccionamiento puede ser más flexible, con varias combinaciones de registros y referencias de memoria además de los modos de direccionamiento. Con instrucciones de longitud variable, todas estas variaciones pueden ser proveídas eficiente y compactamente. El principal precio a pagar por instrucciones de longitud variable es un incremento en la complejidad del CPU. Los precios de hardware a la baja, el uso de microprogramación, y un incremento general en entendimiento de los principios del diseño del CPU han contribuido a hacer de este un pequeño precio a pagar. Sin embargo, nos damos cuenta de que maquinas RISC y superescalares pueden explotar el uso de instrucciones de longitud fija para proveer un desempeño mejorado. El uso de instrucciones de longitud variable no remueve el atractivo de hacer todas las longitudes de instrucción integralmente relacionadas a la longitud de palabra. Porque el CPU no sabe la longitud de la siguiente instrucción a ser buscada, una estrategia típica es buscar un número de bytes o palabras iguales al menos la instrucción más larga posible. Esto significa que a veces múltiples instrucciones son buscadas; sin embargo esta es una buena estrategia a seguir en cualquier caso. Sus principales ventajas son: • • • Mas codops Direccionamiento más flexible Referencias a memoria y a registros Sus desventajas son: • El aumento en la complejidad del CPU FUENTES: • STALLINGS, William. Computer Organization & Architecture: designing for performance. Págs. 18-24, 382-403, 414-424. Editorial Prentice Hall. Pearson Education. 2003. 6ta. edición. • http://www.mailxmail.com/curso/informatica/arquitecturaordenadores/capitulo20.htm • http://www.ii.uam.es/~fjgomez/68000/tutorial/cap2.html • http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase08.htm • http://proton.ucting.udg.mx/dpto/maestros/mateos/z80/modos/modos.html • Diapositivas de apoyo del Curso