# Modo de direccionamiento

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y/o constantes, contenida dentro de una instrucción de la máquina o en otra parte.
No existe una forma generalmente aceptada de nombrar a los distintos modos de direccionamiento. En particular, los distintos autores y fabricantes de equipos pueden dar nombres diferentes para el modo de hacer frente al mismo, o los mismos nombres, a los diferentes modos de direccionamiento.
Además, un modo de direccionamiento que en una determinada arquitectura se trata como un modo de direccionamiento, puede representar la funcionalidad que en otra arquitectura está cubierto por dos o más modos de direccionamiento.

## Modos de direccionamiento existentes

Las arquitecturas de computadores varían mucho en cuanto al número de modos de direccionamiento que ofrecen desde el hardware. Eliminar los modos de direccionamiento más complejos podría presentar una serie de beneficios, aunque podría requerir de instrucciones adicionales, e incluso de otro registro. Se ha comprobado que el diseño de las CPU segmentadas es mucho más fácil si los únicos modos de direccionamiento que proporcionan son simples.
La mayoría de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que otras máquinas CISC tales como el DEC VAX tienen más de una docena de modos de direccionamiento, algunos de ellos demasiado complejos. El mainframe IBM System/360 disponía únicamente de tres modos de direccionamiento; algunos más fueron añadidos posteriormente para el System/390.
Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de la propia instrucción (un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele reservarse un campo específico en la propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía múltiples operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para indicar el modo de direccionamiento de ese operando en particular.

## Tipos de direccionamiento
### Implícito

En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio código de operación se conoce la dirección de el/los operando/s al (a los) que se desea acceder o con el/los que se quiere operar.
Supongamos una arquitectura de pila, las operaciones aritméticas no requieren direccionamiento explícito por lo que se ponen como:
- add - sub ...
Porque cuando se opera con dos datos en esta arquitectura se sabe que son los dos elementos del tope de la pila. Ejemplo de una pila
1 2 3 4 5 6 <- pila top es 1 ntop es
Aun así, cabe aclarar que a menudo se considera como modo de direccionamiento la especificación misma del operando de la instrucción. Bajo esta consideración, podríamos decir que el modo implícito no es un modo de direccionamiento per se, ya que precisamente se caracteriza por no especificar operando.

### Inmediato

En la instrucción está incluido directamente el operando.
En este modo el operando es especificado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especificada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante.
Cuando el campo de dirección especifica un registro del procesador, la instrucción se dice que está en el modo de registro.
Su valor es fijo, por lo que se suele utilizar en operaciones aritméticas o para definir constantes y variables. Como ventaja, no se requiere acceso adicional a memoria para obtener el dato, pero el tamaño del operando está limitado por el tamaño del campo de direccionamiento.
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.
Ejemplo: MOV AX,12

### Directo o absoluto

El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando.
En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El operando reside en la memoria y su dirección es dada directamente por el campo de dirección de la instrucción. En una instrucción de tipo ramificación el campo de dirección especifica la dirección de la rama actual.
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; en el direccionamiento directo a memoria, dependerá del tamaño de la memoria.
Ejemplo: MOV A,17H

### Indirecto

El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.
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.
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.
Ejemplo: MOV A,@17H

#### Indirecto recursivo

Unos pocos sistemas como el PDP-6 o el PDP-10 tenían la posibilidad de direccionamiento indirecto recursivo. Tal dirección de memoria indirecta tenía un campo de registro para indexación y posiblemente un otro bit indirecto, de modo que el proceso de direccionamiento indirecto con indexación podría teóricamente repetirse cualquier número de veces hasta que se encontrara una dirección sin un bit indirecto en la cadena.

### Absoluto

El campo de operando contiene una dirección en memoria, en la que se encuentra la instrucción. Y no se cancela.

### De registro

Sirve para especificar operandos que están en registros.
En este modo, los operandos están en registros que residen dentro de la CPU.

### Indirecto mediante registros

El campo de operando de la instrucción contiene un identificador de registro en el que se encuentra la dirección efectiva del operando.
En este modo el campo de la dirección de la instrucción da la dirección en donde la dirección efectiva se almacena en la memoria. El control localiza la instrucción de la memoria y utiliza su parte de dirección para acceder a la memoria de nuevo para leer una dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de dirección de la instrucción sea sumado al control de un registro especificado en el procesador. La dirección efectiva en este modo se obtiene del siguiente cálculo:
Dir. efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador...

### De desplazamiento

Combina el modo directo e indirecto mediante registros. Requiere dos campos de direccionamiento. Uno referente a un registro y el otro a un desplazamiento a agregar al contenido del registro.
* Relativo: Le suma el valor del campo de dirección a la dirección de la instrucción que se está ejecutando. Utiliza pocos bits en el direccionamiento.
* Por registro base: Direcciona a un registro y le agrega un desplazamiento al contenido del mismo. Permite la carga de varios programas referenciando cada uno con un registro distinto.
* Indexado: El campo de dirección contiene una dirección a memoria y una dirección a un registro, el cual contiene el desplazamiento que se le aplicara a la dirección de memoria. Preindexado: Primero se suman los valores del registro y el campo de dirección. Esa suma es la dirección efectiva. Postindexado: Primero se busca la dirección que marca el campo de dirección, cuyo valor contenido más el valor en el registro es la dirección efectiva

### De pila

Se utiliza cuando el operando está en memoria y en la cabecera de la pila.
Este direccionamiento se basa en las estructuras denominadas Pila (tipo LIFO), las cuales están marcados por el fondo de la pila y el puntero de pila (*SP). El puntero de pila apunta a la última posición ocupada. Así, como puntero de direccionamiento usaremos el SP.
El desplazamiento más el valor del SP nos dará la dirección del objeto al que queramos hacer referencia. En ocasiones, si no existe C. de desplazamiento solo se trabajara con 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 tipo de direccionamiento nos aporta flexibilidad pero por el contrario, es mucho más complejo que otros tipos estudiados más arriba.

### Relativo a un registro base

Consiste, al igual que el indirecto a través de registro, en calcular la dirección efectiva (EA, effective address) como la suma del contenido del registro base y un cierto desplazamiento (offset) que siempre será positivo. Esta técnica permite códigos reentrantes y acceder de forma fácil y rápida a posiciones cercanas de memoria. Este modo de direccionamiento es muy usado por los ensambladores cuando se llaman a las funciones (para acceder a los parámetros almacenados en la pila). ...

### Relativo a un registro índice

Es similar al direccionamiento relativo a un registro base, excepto que es el contenido del registro índice el que indica el desplazamiento que se produce a partir de una dirección de memoria que se pasa también como argumento a la orden que utiliza este modo de direccionamiento. Aunque en esencia son dos modos equivalentes. La EA se calcula como la suma del contenido del registro índice y una dirección de memoria.

### Indexado respecto a una base

Se trata de una combinación de los dos anteriores y consiste en calcular la dirección efectiva como:

### Relativo al contador de programa

Consiste en direccionar una posición de memoria usando como registro base al contador de programa (PC), el funcionamiento es análogo al direccionamiento respecto a registro base con la salvedad de que, en este caso, el offset puede ser también negativo.

### Indexado con autoincremento/autodecremento

Es un modo de direccionamiento análogo al indexado, explicado anteriormente.
La única diferencia es que permite un incremento o decremento de la dirección final o el registro índice según los siguientes casos:
* Indexado con autopreincremento: Incrementa el registro índice primero (se incrementa un valor, según el tamaño del objeto direccionado) y luego calcula la EA al igual que el direccionamiento indexado.
* Indexado con autoposincremento: Calcula la dirección efectiva y después incrementa esta.
* Indexado con autopredecremento: Decrementa el registro índice y después calcula la dirección efectiva.
* Indexado con autoposdecremento: Calcula la dirección efectiva y después decrementa esta.

### Instrucción de salto con direccionamiento absoluto

Consiste en cargar en el PC el valor que se especifica, por ejemplo:
jmp 0xAB ----> Carga 0xAB en PC

### Instrucción de salto con direccionamiento relativo

Es parecida a la especificada anteriormente la diferencia es que el salto es relativo al PC, pongamos un ejemplo: supongamos que PC vale = 0x0A, si nosotros interpretamos la instrucción jr +03, saltaremos tres posiciones posteriores a PC (también podría ser -03 y serían posiciones anteriores). Pero, ¡cuidado! si esa instrucción estaba en la posición 0x0A la dirección de PC a incrementar será la inmediatamente posterior (ya que PC se incrementa automáticamente después de leer la instrucción), por lo que quedaría:
PC = 0x0B ---> nuevo PC = 0x0B+0x03 = 0x0E, con lo que el PC quedaría como 0x0E.

### Direccionamiento paginado

En el paginado la memoria se encuentra actualmente dividida en páginas (bloques de igual longitud).
Para obtener las direcciones se necesita:
* Indicador de página (IP): en un registro específico o de propósito general de la máquina.
* Dirección de la palabra (DP): en el campo CD de la instrucción.
Así, concatenando ambas partes se obtiene la dirección completa.
El problema viene cuando queremos referenciar un dato al que no podemos acceder de forma relativa (p. ej. porque los registros base no puedan alcanzar dicha posición aun con el direccionamiento absoluto. Sin embargo, solo una pequeña parte de la memoria se puede acceder (64 kilobytes, si el desplazamiento es de 16 bits).
El desplazamiento de 16 bits puede parecer muy pequeño en relación con el tamaño de la memoria de los equipos actuales (esta es la razón por la 80386 se expandió a 32 bits). Podría ser peor ya que: los sevidores IBM System/360 sólo tienen un signo de 12 bits de desplazamiento. Sin embargo, el principio de localización se aplica en un corto espacio de tiempo, la mayoría de los elementos de datos que un programa quiere acceder están bastante cerca uno del otro.
Este modo de direccionamiento está estrechamente relacionado con el modo de direccionamiento absoluto.
Ejemplo 1: Dentro de una subrutina, un programador estará principalmente interesados en los parámetros y las variables en los atributos del objeto actual.
* Datos: Q367183