miércoles, 2 de noviembre de 2016

Modos de direccionamiento lenguaje de maquinas

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.