2.4. Modos de direccionamiento Distintas formas que tiene la arquitectura para especificar la ubicación de los operandos. Objetivos: - Reducir el número de bits para especificar un operando en memoria. - Dar soporte a las estructuras de datos de alto nivel. Pueden ser: - Para datos, sobre los que opera la instrucción. - Para instrucciones, especifica la dirección de la siguiente instrucción a ejecutar (en instrucciones de control). Veremos: - Aspectos del almacenamiento de datos en memoria: alineación y orden de los bytes: - Los distintos modos de direccionamiento. 1 2.4.1. Necesidades de direccionamiento Dónde puede estar un operando: - En la propia instrucción - En un registro - En memoria 2 A simple vista, lo lógico parecería que en la propia instrucción se especificase el operando, su dirección en memoria o el registro que lo contiene. No siempre lo más indicado por las siguientes razones: - Ahorro de espacio: en los direccionamientos indirectos como base+desplazamiento (dirección=registro+valor) e indexado (registro+registro), menos bits para especificar una dirección. - Código reubicable: con los direccionamientos relativos a una dirección base (almacenada en un registro). - Estructuras de datos: direccionamientos relativos a la dirección base (en un registro) de la tabla, con un desplazamiento (en un registro o una constante), direccionamientos auto-incremento/decremento y escalado o índice. 3 2.4.2. Interpretación de las direcciones de memoria ¿Qué objeto es accedido dada una dirección y una longitud? Dos convenios para ordenar en memoria los bytes de un objeto multibyte: - Little endian: el byte en la dirección menos significativa es el del extremo menos significativo. - Big endian: el byte en la dirección menos significativa es el del extremo más significativo. 4 Alineación de los datos en memoria Algunas arquitecturas exigen que los objetos mayores de un byte estén alineados en memoria. Definición: un acceso a un objeto de tamaño t bytes en el byte de dirección D se alinea si D mod t = 0 (mod: resto de la división D/t). Es decir, la dirección del objeto debe ser múltiplo de su tamaño en bytes. 5 Ejemplo: doble palabra alineada y no alineada 6 2.4.3. Descripción de los distintos modos de direccionamiento 7 Para especificar algunos modos de direccionamiento usaremos la siguiente notación: A = Especificación en la instrucción de una dirección de memoria (Address). R = Especificación en la instrucción de un registro (Register). EA = Dirección real del operando en memoria (Effective address). rR = Contenido del registro R. M[D] = Contenido de la posición de memoria D. OPERANDO = Valor del operando direccionado. 8 (1) Direccionamiento por registro El campo de dirección especifica un registro donde está el operando. OPERANDO = rR n bits del campo de dirección necesarios para referenciar 2n registros. Ventajas : campo de direcciones pequeño y no hay accesos a memoria. Desventaja: espacio de posiciones limitado. Ejemplo: add r4, r3 equivale a r4 = r4 + r3 9 (2) Direccionamiento inmediato El operando está en la propia instrucción OPERANDO = Operand Para definir constantes cortas Ejemplo: add r4, #5 equivale a r4 = r4 + 5 10 Número en complemento a 2, se hace extensión del signo al cargarlo en un registro. Ventaja: una vez captada la instrucción, no se necesitan más referencias a memoria Desventaja: pocos bits para codificar el dato VAX permite distintos tamaños para operandos inmediatos: 6, 8, 16, 32 y 64 bits. MIPS solo permite 16 bits. 11 (3) Direccionamiento directo El campo de dirección contiene la dirección efectiva del operando. OPERANDO = M [ A ] Muy sencillo, usado en las primeras computadoras. Desventaja: limitación del rango de direcciones por el tamaño del campo. Ejemplo: add r1, (100) equivale a r1 = r1 + M [ 100 ] 12 Direccionamiento indirecto (por memoria o por registro) Solución a la limitación del direccionamiento directo. (4) Direccionamiento indirecto por registro Se especifica un registro donde está la dirección del operando. OPERANDO = M [ rR ] Supera la limitación del nº de bits para especificar la dirección y un solo acceso a memoria para obtener el operando. Ejemplo: add r2, (r5) equivale a r2 = r2 + M [ r5 ] 13 (5) Direccionamiento indirecto por memoria El campo de direcciones contiene la dirección de una palabra donde está la dirección del operando. OPERANDO = M [ M [A] ] Desventaja: dos accesos a memoria, para obtener el operando. Ejemplo: add r1, @(100) equivale a r1 = r1 + M [ M [100] ] 14 (6) Direccionamiento base + desplazamiento Combina posibilidades del directo (facilidad de uso) y del indirecto por registro (menos bits para especificar dirección). Habrá que especificar un registro y un valor. La suma del contenido del registro y el valor es la dirección del operando. OPERANDO = M [ rR + A ] Ejemplo: add r4,28(r1) equivale a r4 = r4 + M [ 28 + r1 ] Para tratar vectores: el registro puede apuntar al principio del vector y el desplazamiento selecciona el elemento correspondiente. 15 (7) Direccionamiento relativo al contador de programa Caso particular de direccionamiento base+desplazamiento en el que el registro base es implícitamente el contador de programa. OPERANDO = PC + Address Se utiliza para realizar saltos condicionales (concepto de localidad). 16 (8) Direccionamiento indexado La dirección del operando es la suma de dos registros. OPERANDO = M [ rs+rt ] Para acceder a vectores de forma más versátil que base + desplazamiento. Un registro contiene la base del vector y el otro el índice del elemento correspondiente. Ejemplo: add r3, (r1+r2) equivale a r3= r3+M[r1+r2] 17 (9) Direccionamiento autoincremento Indirecto por registro con autoincremento del mismo. Ejemplo: add r1,(r3)+ equivale a r1= r1 + M[r3] r3=r3+d (d, tamaño del elemento) (10) Direccionamiento autodecremento Igual pero se autodecrementa el registro. (11) Direccionamiento escalado o índice Para soportar tratamientos de arrays. Ejemplo: add r1, 50(r2)[r3] equivale a r1=r1+M[50+r2+r3*d] donde d:tamaño del elemento del array 18 Los cinco modos de direccionamiento del MIPS son: (1) Direccionamiento inmediato El operando se encuentra codificado en la propia instrucción, representado como dato inmediato. 19 (2) Direccionamiento a registro El operando está en un registro cuyo identificador se encuentra codificado en la instrucción. 20 (3) Direccionamiento base (+desplazamiento) La dirección efectiva del operando se obtiene sumando un desplazamiento que se encuentra en la instrucción con una dirección base que se encuentra en un registro especificado también por la instrucción. 21 (4) Direccionamiento relativo al contador de programa Es un caso particular del direccionamiento base (+desplazamiento) donde el registro que contiene la dirección base es de forma implícita el PC y el desplazamiento es de instrucciones (4 posiciones de memoria). 22 Este modo de direccionamiento se utiliza en instrucciones de bifurcación. Ya que el desplazamiento es de 16 bits, este modo de direccionamiento permite saltar dentro del rango de palabras ±215 respecto a la instrucción. Esto es suficiente para implementar bucles y sentencias ‘if’. Este modo de direccionamiento, especifica un salto relativo (número de instrucciones) a la instrucción siguiente a la de bifurcación. 23 (5) Direccionamiento pseudodirecto La dirección se calcula concatenando los 4 bits más significativos del PC con la dirección de 26 bits especificada en la instrucción y dos ceros. Este modo de direccionamiento permite saltar más allá que el anterior. 24