Competencia 1, 3er PA: Descripción de los modos de direccionamiento a memoria y un ejercicio demostrativo.
Modos
de direccionamiento a memoria
Entendemos
por modo de direccionamiento las diferentes maneras de expresar un
operando en una instrucción y el procedimiento asociado que permite obtener la
dirección donde está almacenado el dato y, como consecuencia, el dato.
Los
juegos de instrucciones ofrecen maneras diferentes de expresar los operandos
por medio de sus modos de direccionamiento, que serán un compromiso entre
diferentes factores:
·
El
rango de las direcciones que hemos de alcanzar para poder acceder a todo el
espacio de memoria dirigible con respecto a programación.
·
Con
respecto al espacio para expresar el operando, se intentará reducir el número
de bits que hay que utilizar para codificar el operando y, en general, las
diferentes partes de la instrucción para poder construir programas que ocupen
menos memoria.
·
Las
estructuras de datos en las que se pretenda facilitar el acceso o la manera de
operar, como listas, vectores, tablas, matrices o colas.
·
La
complejidad de cálculo de la dirección efectiva que expresa el operando para
agilizar la ejecución de las instrucciones.
1.-Direccionamiento inmediato
Este
modo de direccionamiento se suele utilizar en operaciones aritméticas o
lógicas, transferencias en las que se quiere inicializar registros y, de manera
general, para definir y utilizar constantes.
El
valor del dato se representa, normalmente, en complemento a 2 y cuando se
transfiere a un registro o a una posición de memoria se hace la extensión de
signo replicando el bit de signo a la izquierda hasta llenar el operando
destino.
La
ventaja principal de este modo de direccionamiento es que no es necesario
ningún acceso adicional a memoria para obtener el dato, lo que agiliza la
ejecución de la instrucción.
Las
desventajas principales son que el valor del dato es constante y el rango de
valores que se pueden representar está limitado por el tamaño de este operando,
que no suele ser demasiado grande [–2(n – 1), 2(n – 1) – 1] si
se representa en complemento a 2, donde n es el número de bits del
operando.
2.-Direccionamiento directo
En
el direccionamiento directo el operando indica dónde se encuentra el dato que
se quiere utilizar. Si hace referencia a un registro de la máquina, el dato
estará almacenado en este registro y hablaremos de direccionamiento
directo a registro; si hace referencia a una posición de memoria, el dato
estará almacenado en esta dirección de memoria (dirección efectiva) y
hablaremos de direccionamiento directo a memoria.
Estos
modos de direccionamiento tienen una forma muy simple y no hay que hacer
cálculos para obtener la dirección efectiva donde está el dato.
El
tamaño del operando, en el caso del direccionamiento directo a registro,
dependerá del número de registros que tenga la máquina, que suele ser
relativamente reducido y, por lo tanto, se necesitan pocos bits; en el caso del
direccionamiento directo a memoria, dependerá del tamaño de la memoria. En las
máquinas actuales, el operando deberá ser muy grande para poder dirigir toda la
memoria, lo que representa uno de los inconvenientes principales de este modo
de direccionamiento.
Las
ventajas principales del direccionamiento directo a registro es que el tamaño
del operando es muy pequeño y el acceso a los registros es muy rápido, por lo
que es uno de los modos de direccionamiento más utilizado.
3.-Direccionamiento indirecto
En
el direccionamiento indirecto, el operando indica dónde está almacenada la
dirección de memoria (dirección efectiva) que contiene el dato que queremos
utilizar. Si hace referencia a un registro de la máquina, la dirección de
memoria (dirección efectiva) que contiene el dato estará en este registro y
hablaremos de direccionamiento indirecto a registro; si hace referencia a
una posición de memoria, la dirección de memoria (dirección efectiva) que
contiene el dato estará almacenada en esta posición de memoria y hablaremos
de direccionamiento indirecto a memoria.
hemos
comentado que uno de los problemas del direccionamiento directo a memoria es
que se necesitan direcciones muy grandes para poder acceder a toda la memoria;
con el modo de direccionamiento indirecto esto no sucede: se puede guardar toda
la dirección en un registro o en la memoria utilizando las posiciones que sean
necesarias.
Si
se guardan en registros, puede suceder que no todos los registros del
procesador se puedan utilizar para almacenar estas direcciones, pero en este
caso siempre habrá algunos especializados para poder hacerlo, ya que son
imprescindibles para que el procesador funcione.
Generalmente,
las direcciones que se expresan en el modo de direccionamiento indirecto a
memoria son de tamaño inferior a las direcciones reales de memoria; por este
motivo, solo se podrá acceder a un bloque de la memoria, que habitualmente se
reserva como tabla de punteros en las estructuras de datos que utiliza el
programa.
Este
convenio será el mismo para cada máquina y siempre con el mismo valor o la
misma operación; por este motivo solo se puede acceder a un bloque de la
memoria direccionable del programa.
La
desventaja principal de este modo de direccionamiento es que necesita un acceso
más a memoria que el directo. Es decir, un acceso a memoria para el
direccionamiento indirecto a registro y dos accesos a memoria para el
direccionamiento indirecto a memoria; por este motivo este segundo modo de
direccionamiento no se implementa en la mayoría de las máquinas.
4.-Direccionamiento relativo
En
el direccionamiento relativo, el operando expresará dos valores, una dirección
de memoria y un desplazamiento respecto a esta dirección (salvo los casos en
los que uno de los dos sea implícito). La dirección de memoria (dirección
efectiva) donde tendremos el dato la obtendremos sumando el desplazamiento a la
dirección de memoria. Las variantes más utilizadas de este modo de
direccionamiento son direccionamiento relativo a registro base,
direccionamiento relativo a registro índice y direccionamiento
relativo a PC.
Estos
modos de direccionamiento son muy potentes, no requieren accesos extras a la
memoria, como sucede con el indirecto, pero hay que hacer una suma, que no
retrasa casi la ejecución de la instrucción, especialmente en las máquinas que
tienen una unidad específica para el cálculo de estas direcciones.
Desde
el punto de vista del programador, estos modos de direccionamiento son muy
útiles para acceder a estructuras de datos como vectores, matrices o listas, ya
que se aprovecha la localidad de los datos, dado que la mayoría de las
referencias en la memoria son muy próximas entre sí.
Estos
modos de direccionamiento también son la base para hacer que los códigos sean
reentrantes y reubicables, ya que permiten cambiar las referencias a las
direcciones de memoria cambiando simplemente el valor de un registro, para
acceder tanto a los datos como al código mediante las direcciones de las
instrucciones de salto o llamadas a subrutinas; también son útiles en algunas
técnicas para proteger espacios de memoria y para implementar la segmentación.
Estos
usos se aprovechan en la compilación y en la gestión que hace el sistema
operativo de los programas en ejecución y, por lo tanto, son transparentes al programador.
4.1.-Direccionamiento relativo a registro
base
En
el direccionamiento relativo a registro base, la dirección de memoria se
almacena en el registro que denominaremos registro base (RB) y el desplazamiento
se encuentra explícitamente en la instrucción. Es más compacto que el modo de
direccionamiento absoluto a memoria, ya que el número de bits utilizados para
el desplazamiento es inferior al número de bits de una dirección de memoria.
En
algunas instrucciones el registro base se utiliza de manera implícita y, por lo
tanto, solo habrá que especificar explícitamente el desplazamiento.
Este
modo de direccionamiento se utiliza a menudo para implementar la segmentación.
Algunas máquinas tienen registros específicos para eso y se utilizan de
manera implícita, mientras que en otras máquinas se pueden elegir los registros
que se quieren utilizar como base del segmento, pero, entonces, hay que
especificarlo explícitamente en la instrucción.
4.2.-Direccionamiento relativo a registro
índice
En
el direccionamiento relativo a registro índice, la dirección de memoria se
encuentra explícitamente en la instrucción y el desplazamiento se almacena en
el registro que denominaremos registro índice (RI). Justo al
contrario que en el direccionamiento relativo a registro base.
Este
modo de direccionamiento se utiliza a menudo para acceder a estructuras de
datos como vectores, matrices o listas, por lo que es muy habitual que después
de cada acceso se incremente o decremente el registro índice un valor constante
(que depende del tamaño y el número de posiciones de memoria de los datos a los
que se accede). Por este motivo, algunas máquinas hacen esta operación de
manera automática y proporcionan diferentes alternativas que
denominaremos direccionamientos relativos autoindexados.
Si
la autoindexación se lleva a cabo sobre registros de carácter general, puede
requerir un bit extra para indicarlo en la codificación de la instrucción.
Es
muy habitual permitir tanto el autoincremento como el autodecremento, operación
que se puede realizar antes de obtener la dirección efectiva o después. Por lo
tanto, habrá cuatro alternativas de implementación, aunque un mismo juego de
instrucciones no las tendrá simultáneamente:
1)
Preautoincremento: RI se incrementa antes de obtener la
dirección.
2)
Preautodecremento: RI se decrementa antes de obtener
la dirección.
3)
Postautoincremento: RI se incrementa después de obtener
la dirección.
4)
Postautodecremento: RI se decrementa después de obtener
la dirección.
Muchas
máquinas habitualmente implementan variantes de estos modos de
direccionamiento, combinando el direccionamiento relativo a registro base y el
direccionamiento relativo a registro índice. Utilizan dos registros o más y el
desplazamiento, lo que evita poner la dirección de memoria. Tienen tanta o más
potencia de acceso y se puede reducir bastante el tamaño de la instrucción, ya
que solo hay que identificar registros o registros y un desplazamiento.
4.3.-Direccionamiento relativo a PC
El
direccionamiento relativo a PC es equivalente al relativo a registro base, con
la diferencia de que utiliza el registro contador de programa (PC) de manera
implícita en la instrucción y solo hay que expresar, mediante una etiqueta, el
desplazamiento para calcular la dirección de memoria (dirección efectiva) a la
que se quiere acceder.
Otra
característica que diferencia el modo de direccionamiento relativo a PC es la
manera de expresar el desplazamiento: como puede ser un valor tanto positivo
como negativo, se suele representar en complemento a 2.
El
direccionamiento relativo a PC se utiliza a menudo en las instrucciones de
ruptura de secuencia, generalmente en los saltos condicionales, que suelen ser
cortos y, en consecuencia, el tamaño del campo no tendrá que ser muy grande.
El
compilador lleva a cabo la conversión de las etiquetas utilizadas en un
programa a un desplazamiento de manera transparente al programador porque el
modo de direccionamiento está implícito en las instrucciones de salto.
Es
muy importante para el programador saber qué modo de direccionamiento utiliza
cada instrucción de ruptura de secuencia porque el desplazamiento que se puede
especificar en el direccionamiento relativo a PC no es muy grande y puede
suceder que no permita llegar a la dirección deseada; entonces habrá que
modificar el programa para poder utilizar otra instrucción de ruptura de
secuencia con un direccionamiento que permita llegar a todo el espacio
dirigible.
5.-Direccionamiento implícito
En
el direccionamiento implícito, la instrucción no contiene información sobre la
localización del operando porque este se encuentra en un lugar predeterminado,
y queda especificado de manera implícita en el código de operación.
·
Depende
solamente de la instrucción, es decir, la instrucción no lleva parámetros.
·
Particularmente
en instrucciones que no accesan memoria, o bien que tienen una forma específica
de accesarla.
Ejemplos: PUSHF, POPF, NOP
6.-Direccionamiento a pila
El
direccionamiento a la pila es un modo de direccionamiento implícito; es decir,
no hay que hacer una referencia explícita a la pila, sino que trabaja
implícitamente con la cima de la pila por medio de registros de la máquina;
habitualmente uno de estos registros se conoce como stack
pointer (SP) y se utiliza para apuntar a la cima de la pila.
Como
es un modo de direccionamiento implícito, solo se utiliza en instrucciones
determinadas, las más habituales de las cuales son PUSH (poner un elemento en
la pila) y POP (sacar un elemento de la pila).
Este
modo de direccionamiento se podría entender como un direccionamiento indirecto
a registro añadiendo la funcionalidad de auto indexado que ya hemos comentado.
Es decir, se accede a una posición de memoria identificada por un registro, el
registro SP, que se actualiza, antes o después del acceso a memoria, para que
apunte a la nueva cima de la pila.
Bibliografía
Manonellas, G. E. (2019). universidad abierta de
Catalunya. Obtenido de universidad abierta de Catalunya:
http://cv.uoc.edu/annotation/8255a8c320f60c2bfd6c9f2ce11b2e7f/619469/PID_00218277/PID_00218277.html#w31aab7c11
S/A. (2018). sites
google. Obtenido de sites google:
https://sites.google.com/site/lgiao2018/unidad-1/1-6-modos-de-direccionamiento
Vinculo de descarga para el reporte
Comentarios
Publicar un comentario