Las instrucciones actúan, en último término, sobre datos que se encuentra en memoria; los resultados de las operaciones va, en último término, a memoria. De modo que en las instruciones necesitamos incluir direcciones de memoria: direcciones de los datos a manipular y direcciones donde guardaremos los resultados. Dependiendo del tipo de operación podrá requerirse: un operando, para las operaciones monádicas, como negación, cambiar de signo, o tomar el inverso); o dos operandos (como sumar y todas las operaciones aritméticas y lógicas); otras operaciones podrían requerir aíun más argumentos. Por otra parte se requerirá también la dirección de dónde dejar el resultado.
Como siempre, se presenta un tradeoff. Por un lado es cómodo tener una o más direcciones de memoria en una instrucción, por otra parte queremos direccionar gran cantidad de memoria. Ello significa que los campos de dirección requerirán de suficientes bits para direccionar la gran memoria, ocuparán pues bastante espacio en la palabra de instrucción. Pero a su vez una instrucción muy larga no es nada deseable: más tiempo para su captación, más tiempo para su decodificación, los programas serán más largos. Estos requisitos encontrados ha motivado multitud de ingeniosos modos de direccionar una gran memoria sin realmente ocupar mucho del precioso espacio en la palabra de instrucción.
El modo de direccionamiento más obvio es el que llamamos DIRECTO; la dirección del operando aparece en la palabra de instrucción. Así LOAD 550 significa cargar el acumulador con el valor que se encuentra en la celda de memoria número 550.
Como ya hemos mencionado en el campo donde colo.camos la direccoión (la dirección 550 en el ejemplo) no hay suficientes bits para direccionar toda la memoria que podríamos tener disponible (simplemente porque patrte de los bits de la palabra de instruccoión se ocupan en el código de operacioón y eventualmente en otros campos). Surge el modo INDIRECTO, el cual, por un lado ofrece mayor alcance (poder direccionar mayor cantidad de memofria) y por otro lado nos ofrecerá un mecanismo para cambiar de manera cómoda y segura la dirección del operando, asunto que nos interesa en un lazo iterativo por ejemplo, donde a cada vuelta del lazo queremos accesar una dirección diferente. En este modo de direccionamiento el valor que aparece en el campo DIR de la palabra de instruccoión es la dirección de la direccoión del arg mento (de allí su nombre de indirecto). Así LOAD (indirecto) 550 significa ir a la dirección de memoria 550 y tomar ese valor, no como argumengto sino como dirección del argumento. Así si en la celda 550 había un 8420, vamos a leer la celda 8420, el valor obtenido será el argumento final al que se refiere la instrucción.
Otras veces interesa operar con constantes. Si estamos evaluando por ejemplo la fórmula Y = 5X + 20, el 5 y el 20 son constantes; mientras «X» y «Y» son variables. Para accesar las varfiablkes usaremos su direcciones de memoria donde hayamos decidido mantenerlas; para accesar las constantes podríamos también tenerlas en celdas de memoria y accesarlas por sus direcciones. Surge sin embargo la alternativa de incluirlas en la propia palabra de instrucción -y ahorrar así accesos a memoria. Para tal propósito algunas arquitecturas ofrecen el direccionamiento INMEDIATO: el operando está en el campo DIR de la palabra de instrcción. Así MULTIPLY (inmediato) 5 significa multiplicar por 5; y ADD (inmediato) 20 significa sumar 20.
Vimos que un beneficio del direccionamiento INDIRECTO, aparte de aumentar el alcance de direcciones, era la flexibilidad que ofrece a la hora de accesar los varios elementos de una estructura de datos. Observemos sin embargo que su desventaja es que implica mayores accesos a memoria. Una alternativa al indirecto es el INDEXADO, el cual ofrece las mismas dos ventajas del INDIRECTO pero sin el pagar el precio de incrementar accesos a memoria. En el modo indexado hacemos uso del registro índice (al igumal que pasa con el acumulador, una arquitectura podría ofrecer más de un registro índice, pero pensemos de momento en un sólo registro índice). En este modo de direccionamiento el campo DIR se interpreta como un desplazamiento que debemos sumar al valor del registro índice para obtener así la dirección en memoria del operamdo. As´+i si el registro índice tiene cargado el valor 300, la instrucción LOAD (indexado) 550, significa cargar el acumulador con elvalor que se encuentre en ka dirección de memoria 300 + 550. Obviamente las arfquitecturas que ofrecen este modo de direccionamiento, ofreceran instrucciones para cargar el registro índice y seguramente otras instrucciones para incrementar, decrementar y comparar el valor de ese registro. Una varfiante del modo indexdo es el INDEXADO CON AUTOINCREMENTO, el cyual funcional tal cual como explicamos, pero una vez accesado el operando, el valor del índice es incrementado automáticamente. La idea tras este mecanismo es obviamente el acceso a vectores o arreglos de datos (almacenados en posiciones consecutoivas de memoria). Existe trambién INDEXADO CON AUTODECREMENTO.
Si la máquina ofrece varfios registros índices, se va a necesitar un campo en la palabra de instrucción para especificar cuál de ellos se va a utilizar en la particular instrucción.
El direccionamiento indexado ha dado la idea para el uso de un segundo índice que se aplicacría sumándolo a todas las direcciones para obtener la dirección efectiva que se va a accesar, es el llmado registro de segmento o registro base, el cual facilita una técnica avanzada de uso de memoria que es la segmentación y relocalización dinámica de programas y datos, tema que se tratará en futuras lecciones.
Si bien la motivación utilizada para introducir el modo de direccionamiento fue la de resolver el limitado alcance de un campo de dirección en la palabra de instrucción, resulta .como hemos visto- que algunos modos son particularmente útiles para el acceso eficiente a estructuras de datos, particularmente a los arreglos y otros son útiules para lograr una localización flexible de los prograas en memoria, es decir que los programas no estén obligados a usar ciertas direcciones físicas, sino que usan desplazamientos relativos a una base modificable.–body
Agregar rbegister addressing y register indirect addressing. Si sólo unas pocas instr necesitan el inmediato, este suele ser parte del código OP y no un modo en campo aparte.
Direccionamiento en instrucciones de salto: reflexivo, que es como indexing vía PC.
-
01 – Introducción
-
02 – Partes del Computador
-
03 – Memoria
-
04 – Registros
-
05 – Funcionamiento del Computador
-
06 – Formato de Instrucción
-
07 – Modos de Direccionamiento
-
08 – Repertorio de Instrucciones
-
09 – Trayectorias de Datos
-
10 – Entrada y Salida
-
11 – Velocidad de Procesamiento y Capacidad de Memoria
-
12 – Interrupciones
-
13 – Organización Tubular
-
14 – Memoria Cache
-
15 – Memoria Virtual
-
16 – Multiprocesadores
-
Post Template
SUR ofrece dos modos de direccionamiento: DIRECTO e INDEXADO. De nuevo aquí, con algún sortilegio, ofreceremos -manteniendo el campo de modo en 1 bit- un tercer modo: INMEDIATO (aunque tendrá limitaciones, propias de un sortilegio). El campo de dirección, permite accesar en modo DIRECTO 226, esto es 64 MW (o 128 MB). En modo INDEXADO el alcance es 232, esto es 4GW (o 8 GB).
Es muy común hacer operaciones con constantes, como sumar, o restar, 1 a una variable. Multiplicar por 10, dividir entre 2, etc. Por esa razón es conveniente tener el direccionamiento inmediato. Si suplimos el operando en la misma instrucción, en el campo que normalmente es de dirección, no hay que ir a memoria a buscarlo. Tener este tercer modo requeriría en principio aumentar el campo de MODO de direccionamiento de 1 a 2 bits (de paso, diponiendo de 2 bits, posríamos agregar un cuarto modo, pero estaríamos reduciendo el campo DIR en un bit y por tanto reduciendo. a la mitad el tamaño de memoria direcionable). Hemos observado sin embargo que las constantes más comunmente requeridas son pequeñas (1, 2, 10). Si necesitamos una constante grande, pues habrá que tenerla en memoria y referirse a ella por su dirección para accesarla, pero si es pequeña la colocamos en el campo DIR de la palabra de instrucción. ¿Cómo saber entonces si lo que está en el campo DIR es una dirección baja o una constante pequeña. En SUR se resuelve con una técnica que denominamos mapeo de constantes. Si el bit de MODO está en «0» (DIRECTO) y el campo DIR contiene una valor pequeño, ese campo se interpreta como operando, si es un valor mayor de 18 se interpreta como dirección y se hará el acceso a esa dirección de memoria para extraer el operando. El mapeo lo resuelve el hardware de decodificación en la unidad de memoria. Quizá llame la atención que se haya escogido como límite para constantes pequeñas el 18. Realmente ese límite es 16. El valor 17 está mapeado al registro acumulador y el 18 al registro índice (es decir ue también utilizamos mapeo de registros). ¿Qué significa mapear un registro? significa que con esa dirección reservada para referirse al registro, todas las instrucciones de acceso a memoria puede utilizar también el registro mapeado como operando. Veremos abundantes ejemplos del mapeo tanto de constantes pequeñas como de registros una vez que presentemos el reepertorio de instrucvciones y podamos entonces comenzar a programar SUR en lenguaje de bajo nivel.
Otro punto que llamará la atención es notar que al hacer mapeo de memoria, las direcciones mapeadas se vuelven inaccesibles (son celdas perdidas en la memoria). No es una perdida mayor: apenas 18 palabras en una memoria de varios megas. Sin embargo, en nuestro caso no se pierden realmente: son accesibles vía direccionamiento INDEXADO (recordar que el mapeo ocuirre si el bit de modo está en «0», DIRECTO, no si está en «1», INDEXADO (en la lección 18 estudiaremos el concepto de MODO PRIVILEGIADO que se refiere a ciertas instrucciones del repertorio que están vedadas al programador de aplicaciones, sólo están disponibles para el programador de sistemas, esto es para el SO. En el caso de SUR, el acceso a las direccines bajas -vía indexado- es una operación privilegiada. Cómo entrar a modo privilegiado es normalmente un secreto bien guardado. Entrar a modo usuario es como lanzarse en paracaídas: una vez que te lanzas, no puedes volver al avión).
Direccionamiento DIRECTO en SUR
Cuando el campo de MODO de la palabra de instrucción contiene un «0» se trata del direccionamiento DIRECTO. El campo DIR de la palabra de instrucción contiene la dirección de memoria donde se encuentra el dato u operando. El alcace del campo DIR es de 226, es decir 64 MW.

Direccionamiento INDEXADO en SUR
Cuando el campo de MODO de la palabra de instrucción contiene un «1» se trata del direccionamiento INDEXADO. La dirección indicada en el campo DIR se suma al contenido del registro índice (registroi X) para obtener la dirección efectiva o dirección de memoria donde se encuentra el dato u operando. El alcance efectivo es de 4 GW (teoricamente, con el registro X apuntando a la última dirección del bloque de 4GW, se puede todavia alcanzar otros 64 MW de memoria).

Direccionamiento INMEDIATO de Pequeñas Constantes
Con el modo de direccionamiento directo (campo MODO = 0), los valores en el campo DIR comprendidos entre 0 y 15 se interpretan como operandos inmediatos (como datos) y no como direcciones de memoria.

Donde el valor «dato» es un número positivo entre 0 y 16. Esos valores pequeños en el campo DIR están «mapeados» a valores constantes.