DIRECCIONAMIENTO Y REGISTROS

Anuncio
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
Descargar