1.6 Modos de direccionamiento
Los modos de
direccionamiento son las diferentes maneras de especificar un operando dentro
de una instrucción en lenguaje ensamblador. 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.
Diferentes
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 CPUs 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 pila1 2 3 4 5
6 <- pila top() es 1 ntop() es 2
Donde top() representa el tope de la pila y ntop() el siguiente
al tope de la pila y son estos argumentos con los que se opera al llamar a una
orden en concreto.
◘ 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.
◘ Directo:
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.
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.
◘ 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.
◘ 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 dirección 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.
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.e. porque los registros base no puedan
alcanzar dicha posición aun con el direccionamiento absoluto. Sin embargo, sólo
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.
No hay comentarios:
Publicar un comentario