Modos de
direccionamiento.
Por otra parte, dependiendo de la complejidad de las
estructuras de datos manejadas se puede hacer necesaria la utilización de modos
de direccionamiento más o menos complejos. Algunas veces el modo del
direccionamiento viene indicado implícitamente por el código de operación, que
fuerza el modo de direccionamiento, en otros casos el modo debe indicarse
explícitamente en cada operando. Vamos a dedicarnos ahora a tratar algunos
modos de direccionamiento más comunes que suelen encontrarse en los procesadores
de propósito general. Aunque hay múltiples variaciones, todas ellas suelen
estar basadas en los modos que vamos a tratar a continuación.
1) Direccionamiento Inmediato
La forma más simple
de indicar un operando es incluyéndolo en la propia instrucción. Ya que las
instrucciones no son modificables, este es el modo que se utiliza en
operaciones con constantes. Si la constante es un valor numérico, se almacena
en complemento a dos.
La ventaja del direccionamiento inmediato es que no se
requieren referencias adicionales a memoria para obtener el operando, ahorrando
por lo tanto espacio y tiempo. El inconveniente es que el espacio reservado
para este operando suele estar restringido y suele ser menor que el tamaño de
la palabra, por lo que en algunos procesadores solamente se utiliza para
constantes de valores pequeños.
2) Direccionamiento
Directo (o absoluto)
Otra forma muy simple de hacer referencia a un operando es
indicando su dirección en memoria principal, y solamente requiere una
referencia adicional a memoria para obtener el operando. Es el modo de
direccionamiento común para las variables globales de los programas.
La pega que tiene es que cuando se dispone de grandes
espacios de direccionamiento, requiere muchos bits para indicar la dirección,
como es el caso de Motorola. En el Pentium de Intel, se utiliza hasta un máximo
de 32 bits para indicar la dirección del operando en memoria.
3) Direccionamiento a
Registro
Este modo es similar al direccionamiento directo, pero en
este caso, el campo de dirección se refiere a uno de los registros generales
del procesador.
Las ventajas que tiene es que solo necesita 3 o 4 bits para
indicar uno de los registros generales, y que no requiere referencias
adicionales a memoria. El inconveniente es que no se suele disponer de muchos
registros, aunque con el advenimiento de las máquinas RISC, la tendencia es a
ir incrementando su número.
Se utiliza para
guardar valores temporales en la evaluación de expresiones, o para mantener en
registros algunas variables que se referencian muy a menudo.
4) Direccionamiento
Indirecto
Si en el direccionamiento directo, el campo de operando
indicaba la dirección del dato, en el direccionamiento indirecto, se hace
referencia a una palabra de memoria principal en la que se encuentra la dirección
del operando. La otra posibilidad de este direccionamiento es que el campo de
operando hace referencia a un registro general en el que se encuentra la
dirección del dato.
Como se puede apreciar, según este esquema, con una
“indirección” se requieren dos accesos adicionales a memoria para obtener el
operando (si es vía registro, solo uno).
Este direccionamiento
se utiliza cuando la dirección de las variables no se conoce en tiempo de
compilación, sino que es durante la ejecución del programa cuando se calcula la
dirección del operando y se guarda ésta en memoria o en un registro.
5) Direccionamiento
por Desplazamiento
Hay unos cuantos métodos de direccionamiento que para formar
la dirección del operando utilizan el contenido de un registro más un desplazamiento
que viene explícitamente en el campo de operando.
A este mecanismo para formar la dirección del operando se le
conoce también como base + desplazamiento. La base está contenida en un
registro, y el desplazamiento viene indicado por los bits del campo de
operando.
En algunos casos, el registro base utilizado puede estar
implícitamente impuesto por el código de operación. Dependiendo del registro
base utilizado, se distinguen los siguientes modos de direccionamiento por
desplazamiento:
- Relativos. En este modo se utiliza el Contador de
Programa, de tal modo que la dirección efectiva se calcula añadiendo el
desplazamiento que figura en el campo de operando más el contenido del Contador
de Programa.
Este direccionamiento lo utilizan los compiladores para
indicar las direcciones de salto en las instrucciones de control de bucles.
- Por registro base.
Este modo de direccionamiento se utiliza comúnmente en los programas
reubicables. El registro base contiene la dirección de una gran área de datos o
de instrucciones. Y los bits del campo de operando indican el desplazamiento
del dato a partir del comienzo del área de datos indicado por el registro base.
Además de permitir programas reubicables, constituye una
buena alternativa al direccionamiento directo, pues requiere pocos bits en el
campo de operando.
- Indexado. El
propósito de este modo de direccionamiento es facilitar el acceso iterativo a
las matrices o tablas de datos. Lo que se hace es indicar en los bits del campo
de operando la dirección inicial de la tabla, y a esta dirección se le añade el
contenido de un registro llamado “registro de índice”. Para ir referenciando
los sucesivos elementos de la tabla simplemente hay que ir incrementando el
contenido del registro de índice.
6) Direccionamiento a
Pila
La Pila es una estructura de datos que se mantiene en
memoria principal. Básicamente es un vector de celdas de datos de direcciones
secuenciales, en los que se meten y sacan datos con política LIFO (Last In,
First Out), es decir, el último en entrar es el primero en salir.
Esta estructura es
muy útil como ayuda en la ejecución de los programas, pues se utiliza para
guardar en ella variables temporales, parámetros, direcciones de retorno en la
llamada a procedimientos, etc.
El primer elemento que se mete en la pila se dice que está
en el fondo de la pila, y el último que se ha metido está en la cima de la
pila. El interés de la cima de la pila es que siempre está en ella el primer
dato disponible de la pila. Las operaciones con la pila son meter y sacar datos
de ella, y operan utilizando un registro denominado puntero de pila que siempre
contiene la dirección de la cima de la pila.
Subrutina.
Sabemos que un procedimiento o subrutina es un grupo de
instrucciones que realizan alguna tarea y que puede ser llamado desde diversos
puntos de un programa. A diferencia de los saltos, estas llamadas tienen la
particularidad de que una vez terminado el trabajo del procedimiento, se
devuelve el control a la siguiente instrucción del punto de llamada. Por esto,
una de las primeras cosas que hay que hacer en una llamada a procedimiento es
guardar la dirección de retorno en alguna parte.
Pila de empuje hacia
abajo.
Una memoria LIFO se denomina pila push-down. El principio de
estas memorias, se cargan en paralelo un byte de datos en el tope de la pila.
Cada sucesivo byte empuja el anterior al registro siguiente. Cada nuevo dato
siempre se carga en el registro superior y los datos previamente almacenados
son empujados hacia abajo dentro de la pila. El nombre de pila de empuje hacia
abajo viene dado estas características.
Los datos se recuperan en orden inverso. El último dato
introducido siempre está en el registro superior de la pila, por lo que, cuando
sale de la pila, los demás satos saltan a la siguente posición superior.
