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. (Manonellas, 2019)

 

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. (Manonellas, 2019)

 

 

 

 

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. (Manonellas, 2019)

 

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. (Manonellas, 2019)

 

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í. (Manonellas, 2019)

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. (Manonellas, 2019)

 

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. (Manonellas, 2019)

 

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. (Manonellas, 2019)

 

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. (Manonellas, 2019)

 

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 (S/A, 2018)

 

 

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. (Manonellas, 2019)


Ejercicio de direccionamiento de memoria: 



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

Entradas más populares de este blog

Competencia 4: Proyecto de Arduino, clasificador de color 1/4

Competencia 4: Proyecto de Arduino, clasificador de color 2/4