Modos de Direccionamiento Material Elaborado por el Profesor Ricardo González A partir de Materiales de las Profesoras Angela Di Serio y María Blanca Ibañez Modos de Direccionamiento Cada instrucción debe contener la información que necesita el CPU para su ejecución: Código de operación. Especifica la operación a realizar (suma, resta, E/S, etc.) La operación se indica mediante un código binario. Referencia a operandos fuente (dirección). La operación puede involucrar uno o más operandos fuentes, es decir, operandos que son entradas para la instrucción. Referencia al operando resultado (dirección). La operación puede producir un resultado. Referencia a la siguiente instrucción. Le indica al CPU de donde va a captar la siguiente instrucción tras completarse la ejecución de la instrucción actual. La siguiente instrucción a captar está en memoria principal. En la mayoría de los casos, la siguiente instrucción sigue inmediatamente a la instrucción en ejecución. En tales casos no hay referencia explícita a la siguiente instrucción. Cuando sea necesaria una referencia explícita, debe suministrarse la dirección de memoria Operandos de una instrucción Los operandos fuente y resultado pueden estar en alguna de las siguientes areas: Memoria principal. En este caso debe indicarse la dirección de la celda que contiene el operando Registro del CPU. Dependiendo de la arquitectura, el CPU contiene uno o más registros que pueden ser referenciados por las instrucciónes de máquina. Si sólo existe un registro, la referencia al mismo puede ser implícita. Si existe más de uno, cada registro tendrá asignado un número único, y la instrucción debe contener el número del registro deseado. Dispositivode E/S. La instrucción debe especificar el módulo y dispositivo de E/S para la operación. En el caso de E/S asignadas en memoria, se dará una dirección de memoria. Dentro de la Instrucción misma: Como es el caso de un operando inmediato. Direccionamiento de Operandos Hay dos aspectos importantes que debemos tomar en cuenta. El primero es como se especifica la dirección de un operando o referencia; y el segundo como se organizan los bits de una instrucción para definir las direcciones de los operandos y la operación que realiza dicha instrucción. En esta sección analizaremos las técnicas de direccionamiento más comunes: Inmediato Directo Indirecto. Registro. Indirecto con registro Con desplazamiento. Pila Direccionamiento de Operandos Hay que resaltar que la mayoría de las arquitecturas de computadores ofrecen más de uno de estos modos de direccionamiento. La pregunta que surge entonces es como determina la unidad de control que modo de direccionamiento se está empleando en cada instrucción. Se pueden adoptar varias alternativas. A menudo se utilizan códigos de operación para indicar el tipo de direccionamiento que se usa. En otras ocasiones se utilizan uno o más bits del formato de instrucción para indicar el modo de direccionamiento (campo de modo). El valor del campo de modo determina que modo de direccionamiento va a utilizarse. Cod Op Operando(s) Operando addinm adddir addreg adddes bits para identificar el tipo de direccionamiento bits para el operando Direccionamiento de Operandos Para explicar estos modos de direccionamiento usaremos la siguiente notación: A contenido del campo de dirección de la instrucción EA dirección real o efectiva de la posicion que contiene el operando que se referencia (X) contenido de la posicion X A - Address EA - Effective Address (X) - Content of X Modo Inmediato Cual es el rango de valores que pueden ser representados en el campo de direccionamiento inmediato? Si se trata de números enteros representados usando Complemento a dos el rango de posibles valores representables esta dado por: Memoria [-215 .. 215-1] Si se trata de números naturales, entonces el rango es: X-2 1 e 16 X-1 [0.. 2 -1] y X X+1 X+2 Si queremos sumar el valor 5 hacemos: addi X 5 5 y + 0 Características del Modo Inmediato El operando está en la instrucción. El operando es una constante a tiempo de ejecución. No hay referencias adicionales a memoria despues de la búsqueda de la instrucción. El tamaño del operando está limitado al tamaño del campo de dirección. Modo Directo Una forma sencilla de direccionamiento es el directo en el que el campo de dirección contiene la dirección efectiva del operando Memoria add 1498 1499 1500 1501 1502 1500 Direccion en memoria Registros 1 0 5 0 Modo Directo Este modo fue común en las primeras generaciones de computadores y aún se encuentra en un número pequeño de sistemas. Ventaja: Sólo requiere una referencia a memoria para obtener el operando y no necesita ningún cálculo especial. Desventaja: La limitación directa es que proporciona un espacio limitado de direcciones. Modo Directo El espacio de direcciones referenciable viene dado por el rango [0 .. 221-1] ¿Qué hace el lenguaje ensamblador MIPS para manejar el direccionamiento directo? El lenguaje ensamblador MIPS permite el uso de instrucciones de la forma lw $10, A donde A es una dirección de memoria de 32 bits. Una instrucción de este estilo pudiera requerir el uso de más de una palabra para su representacion. MIPS posee formatos de instrucción de tamano fijo restringido a 32 bits, por lo tanto es imposible colocar una dirección de 32 bits en el formato de instrucción. El lenguaje ensamblador MIPS se encarga de traducir dicha instrucción en varias instrucciónes: Iw $10, A lui $1,4097 Iw $10, MenosSignificativo($1) donde Características del Modo Directo La instrucción contiene la dirección efectiva del operando Un acceso adicional es requerido para obtener el operando. El rango de direcciones está limitado por el ancho del campo que contiene la dirección del operando La dirección es una constante a tiempo de ejecución pero el operando en si puede variar a tiempo de ejecución add 1498 1499 1500 1501 1502 1500 Direccion en memoria Registros 5 1 0 4 0 Modo Indirecto El problema con el modo directo es que la longitud del campo de direcciones es normalmente menor que la longitud de la palabra, limitando de esta manera el rango de direcciones. Una solución es hacer que el campo de direcciones referencie la dirección de una palabra de memoria que contiene la dirección completa del operando. A esto se le conoce como modo indirecto. add_indir 199 200 201 200 Direccion en memoria Registros 1497 1498 1499 1500 1501 -32 1500 0 1 0 5 0 Modo Indirecto Ventaja: Permite acceder a todo el espacio de direcciones. No hay limitación como en el caso anterior de modo directo. Desventaja: La ejecución de la instrucción requiere de dos referencias a memoria para capturar el operando: una para captar su dirección y otra para obtener su valor. Una variante al modo, raramente utilizada, es el modo indirecto de varios niveles. Esta aproximación no presenta realmente una ventaja significativa, y su desventaja principal es que pueden requerirse dos o mas referencias para captar un operando. add_indir 200 Direccion en memoria Registros 199 200 201 -32 1500 0 1497 1498 1499 1500 1501 1 0 5 0 Características del Modo Indirecto La instrucción contiene la dirección de memoria que contiene la dirección del operando. Se requieren dos accesos a memoria para obtener el operando. El rango de direcciones efectivas es de 2n donde n es el ancho de la palabra. El número de direcciones de memoria que puede ser usado para almacenar direcciones efectivas es de 2k donde k es el ancho del campo dirección en la instrucción. Modo Registro Este modo es similar al directo. La unica diferencia es que el campo de dirección referencia un registro en lugar de una dirección de memoria principal. Memoria add_reg R3 R1 R2 R3 R4 1 0 5 0 Identificacion de un Registro Registros 1498 1499 1500 1501 1502 1 0 7 0 Modo Registro Ventaja: Solo es necesario un campo pequeño de direcciones en la instrucción y no se requieren referencias a memoria. El tiempo de acceso a un registro interno al CPU es mucho menor que el tiempo necesario para acceder memoria principal. Desventaja: El espacio de direcciones está muy limitado dado al pequeño número de registros que poseen las arquitecturas. Ejemplo: Si tenemos 32 registros, ¿cuantos bits requerirá el campo de dirección para indicar el número del registro al que se hace referencia? Memoria add_reg R3 R1 R2 R3 R4 1 0 5 0 Identificacion de un Registro Registros 1498 1499 1500 1501 1502 1 0 7 0 Caracteríticas del Modo Registro El campo de dirección dentro de la instrucción contiene el nombre o referencia de un registro. La dirección efectiva del operando está en la instrucción. No se requiere acceso a memoria para obtener el operando. Memoria add_reg R3 R1 R2 R3 R4 1 0 5 0 Identificacion de un Registro Registros 1498 1499 1500 1501 1502 1 0 7 0 Modo Indirecto con Registro Este modo es similar al indirecto. La diferencia está en que en el indirecto el campo de dirección hace referencia a una posicion de memoria que contiene la dirección del operando y en el indirecto registro, el campo de dirección hace referencia a un registro que contiene la dirección efectiva del operando. Memoria add_ind_reg R3 R1 R2 R3 R4 1 0 1500 0 Identificacion de un Registro Registros 1498 1499 1500 1501 1502 1 0 5 0 Modo Indirecto con Registro Ventaja: emplea una referencia menos a memoria que el modo indirecto. Desventaja: la ejecución de la instrucción requiere una referencia a memoria para capturar el operando. Memoria add_ind_reg R3 R1 R2 R3 R4 1 0 1500 0 Identificacion de un Registro Registros 1498 1499 1500 1501 1502 1 0 5 0 Modo con Desplazamiento Este modo combina las posibilidades de los modos directo e indirecto con registro. Requiere que las instrucciónes tengan dos campos de dirección donde al menos uno de ellos es explícito. El valor contenido en uno de los campos de dirección se utiliza directamente. El otro campo de dirección o referencia implícita definida por el código de operación se refiere a un registro cuyo contenido se suma al primer campo de dirección para generar la dirección efectiva del operando. Memoria 1498 1499 1500 1501 1502 1 0 9 0 5 Modo con Desplazamiento Hay tres formas distintas de modos con desplazamiento: • Desplazamiento Relativo • Desplazamiento con Registro Base . • Indexado (o Relativo a un registro Indice) Memoria 1498 1499 1500 1501 1502 1 0 9 0 5 Desplazamiento Relativo o Relativo al PC El registro referenciado implícitamente es el contador de programa (PC). La dirección de la instrucción actual se suma al campo de dirección para producir la dirección efectiva. Normalmente el campo de dirección se trata como un número en complemento a dos para esta operación. La dirección efectiva es un desplazamiento relativo a la dirección de la instrucción. EA= A + (PC) Ejemplo: beq $10, $11, Lazo PC add_relativo 1498 2 Desplazamiento R1 R2 R3 R4 1 0 -123 0 Registros 1498 1499 1500 1501 1502 Memoria add_relativo 2 Otra instruccion 0 5 0 Desplazamiento 2 Desplazamiento Relativo Esta instrucción de MIPS es ensamblada en un formato conocido como tipo I de MIPS Colocando en el campo desplazamiento la cantidad de palabras que debe desplazarse desde la instrucción actual para poder lIegar a la dirección Lazo. PC Instruc k Instruc k+1 Instruc k+2 Instruc k+3 Instruc k+4 Instruc k+5 PC Instruc k Instruc k+1 Instruc k+2 Instruc k+3 Instruc k+4 Instruc k+5 Desplazamiento Positivo +3 PC Instruc k Instruc k+1 Instruc k+2 Instruc k+3 Instruc k+4 Instruc k+5 Desplazamiento Negativo -2 Desplazamiento con Registro Base El registro referenciado contiene una dirección de memoria y el campo de dirección contiene un desplazamiento desde dicha dirección. La referencia al registro puede ser explícita o implícita. EA = A + (Rn) La dirección del operando viene dada por la suma del contenido del registro base más el desplazamiento. Ejemplo: Iw $10, 100($5) La dirección efectiva del segundo operando viene dado por 100+($5) Desplazamiento con Registro Base Memoria si Registro Base 1498 1499 1500 1501 1502 1503 1504 1 0 9 0 4 5 EA = A + (Rn) Desplazamiento Memoria Registro Base add_relativoRb R3 Desplazamiento 500 Dirección R1 R2 R3 R4 1 0 1000 999 Rb 1000 1001 0 Registros 1499 1500 1501 1502 1 5 4 0 Modo Indexado o relativo a un Registro Indice El campo de dirección referencia una dirección de memoria y el registro contiene un desplazamiento desde dicha dirección. Dirección Base 1498 1499 1500 1501 1502 1503 1504 EA = A + (Rn) 1 0 9 0 4 5 Desplazamiento según el contenido del Registro Indice Memoria Registro Indice add_indexado R3 Dirección Base 1500 Dirección del Operando R1 R2 R3 R4 1 0 2 0 Registros 1498 1499 Dir Base 1500 1501 1502 1 0 5 0 Desplazamiento por el contenido de R3 Modo Indexado o relativo a un Registro Indice Este modo de direccionamiento es empleado especialmente para el recorrido de estructuras. Por ejemplo para recorrer un arreglo podemos colocar una direccion Array al comienzo del mismo he ir accediendo a sus diferentes posiciones al ir modificando un registro índice. Registro Indice Dirección Base Memoria load_indexado R3 R2 Vector Dirección del Operando R1 R2 R3 R4 1 0 1 23 4 5 2 4 6 8 10 12 0 Registros Vector 1498 1499 1500 1501 1502 1503 1504 1505 1506 19 2 4 6 8 10 12 Desplazamiento por el contenido de R3 Modo Indexado o relativo a un Registro Indice Modo Indexado en SPIM Iw $10, A($5) ¿Qué hace el lenguaje ensamblador MIPS para permitir este modo? Traduce la instrucción en las siguientes instrucciónes lui addu Iw $1, 4097 $1, $1, $5 $10, MenosSignificativoA($1) 4097 (R5) + MenosSignificativoA Modo Pila En este modo los operandos a trabajar están en la pila, el resultado de la operación queda en el tope de la pila. A add A+B B C C Pila o Stack Pila o Stack Ejemplo 1 de Modos de direccionamiento load_inm $Rl, Inmediato Directo Indirecto. Registro. Indirecto con registro Con desplazamiento. 0 add_dir $R5 , 1504 sub_ind $R5 , – – – 1504 add_reg $R4 $R5, Relativo Registro Base Indexado Relativo al PC Pila Memoria store_reg_indi $R6 $R1, load_desp 1499 ($R1) $R2, Sub_inm 1 $R2, add_desp Cod Operac. 1500($R2) R1 R2 R3 R4 R5 R6 1 1 2 1 0 1498 Registros OP1 $R1, OP2 Vector 1500 1497 1498 1499 1500 1501 1502 1503 1504 1505 0 100 4 0 1 2 3 1498 Ejemplo 2 de Modos de direccionamiento Suponga que estamos trabajando con una arquitectura que posee 4 registros ( $RO,$Rl, $R2 y $R3) y la memoria es direccionada por palabras. El conjunto de instrucciones para esta arquitectura está conformado por las siguientes operaciones: add opl, op2 opl = opl + op2 sub opl, op2 opl = opl - op2 move opl, op2 opl = op2 Y los modos de direccionamiento son los siguientes: Inmediato # Registro $Ri Directo etiqueta o número Indirecto @ Desplazamiento n ($Ri) Desplazamiento n($Ri)+ (despues de calcular la autoincremento dirección del operando incrementa en 1 $Ri ) Ejemplo 2 de Modos de direccionamiento En un instante de tiempo los registros y la memoria presentan el siguiente estado: Dado el siguiente trozo de código y la tabla de símbolos, muestre como se modifican los registros y la memoria move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 $Rl referencia a1 registro 1 y #2 corresponde a un modo inmediato. La instrucción transfiere e1 va1or 2 a1 registro Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 $R0 referencia a1registro 0 y el operabdo 2 corresponde a un modo directo. La instruccion transfiere e1 contenido de la direccion 2 de memoria a1 registro R0. Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 $R2 referencia al registro 2 y B corresponde a un modo directo. Al revisar la tabla de símbolos obtenemos que la etiqueta B corresponde a la dirección 8 de memoria. La instrucción transfiere el contenido de la dirección de memoria 8 al registro. Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 $R2 referencia al registro 2 y 2 ($R1) corresponde a un modo desplazamiento. Para calcular la dirección del operando se toma el contenido del registro y se le suma el desplazamiento 2. En este caso la dirección efectiva del segundo operando es 4. Para la operación add se toma el contenido del registro 2 y el contenido de la dirección de memoria 4. Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 C referencia a la direccion 3 de memoria y @$R0 corresponde a un modo indirecto registro. Para calcular la dirección del segundo operando se toma el contenido del registro 0 (10), y este valor es la dirección efectiva del operando. El contenido de la direccion de memoria 10 es transferido a la direccion 3 Ejemplo 2 de Modos de direccionamiento move move move add move move $Rl, $R0 , $R2 , $R2, C , $R0 , #2 2 B 2 ($Rl) @$R0 @4(R1)+ R0 R1 R2 R3 $R0 referencia al registro 0 y @4($Rl) corresponde a un modo desplazamiento indirecto. Para calcular la dirección del segundo operando se toma el contenido del registro 1 (2), y a este valor se le suma el desplazamiento 4 para obtener una dirección de memoria (6). A esta dirección se le aplica el modo indirecto, es decir la dirección no contiene el operando sino la dirección que realmente contiene el operando. Por lo tanto el contenido de la direccion 1 de memoria es transferido al registro 0. Despues de esta transferencia se incrementa el contenido del registro 1