|
Complementos de sistemas electrónicos digitales |
Tema
3
|
3. MODOS DE DIRECCIONAMIENTO
Cuando se analiza el software de un sistema microprocesador uno de los aspectos más importantes es el modo de direccionamiento. Hace referencia a la forma en que la CPU accede a los datos que necesita. Los DSPs de la familia TMS320C3x disponen de seis modos de direccionamiento:
- Direccionamiento a registro. Hace referencia a una posible forma de acceso a datos en la que el dato se encuentra almacenado en uno de los 28 registros internos de que dispone la CPU. Ejemplo:
ABSF R1 ;; Si R1, antes de ejecutarse la instrucción era –6.3, luego vale 6.3.
Obsérvese que el operando, en este caso, es R1, uno de los registros internos de la CPU.
- Direccionamiento directo. Hace referencia a una posible forma de acceso a datos en la que el dato se encuentra almacenado en una posición del mapa de memoria del DSP determinada por los 8 LSBs del registro interno de la CPU denominado DP, puntero a una de las 256 posibles páginas de datos que existen en el mapa de memoria del DSP y que forman los 8 MSBs de la dirección donde se encuentra el dato. Los 16 LSBs que faltan de la dirección del dato se indican en la instrucción. Ejemplo:
ADDI @0BCDEh,R7 ;; dato se obtiene en función del valor de DP. ; Si DP=0x8A se encuentra en la dirección 0x8ABCDE.
Obsérvese que aparecen dos operandos, @0BCDEh, que es el accedido empleando direccionamiento directo y R7, al que accede la CPU empleando direccionamiento a registro y que almacena el resultado de la operación.
- Direccionamiento indirecto. Hace referencia a una posible forma de acceso a un dato en la que la dirección del mismo se genera a partir de uno de los registros auxiliares, AR0...AR7, y de un desplazamiento (entero de 8 bits sin signo, de 0 a 255, especificado directamente en la instrucción o uno de los dos registros índice IR0 ó IR1 que existen en la CPU). La dirección efectiva del dato la constituyen los 24 LSBs que resultan de operar aritméticamente (suma), mediante las ARAUs, el registro ARi empleado y el desplazamiento definido en la instrucción. Ejemplos:
ADDI *+AR3(14),R7 ;; dato se obtiene en función del valor de AR3. ; En este caso se encuentra en la dirección 0x8ABCDE.
Obsérvese que aparecen dos operandos, *+AR3(14), que es accedido empleando direccionamiento indirecto, y R7, al que se accede empleando direccionamiento a registro.
ADDI *++AR3(IR0),R7 ;; dato se obtiene en función del valor de AR3 y de IR0. ; En este caso se encuentra en la dirección 0x8ABCDE.
ADDI *AR3++(IR1),R7 ;; dato se obtiene en función del valor de AR3. ; En este caso se encuentra en la dirección 0x8ABCD0.
A continuación se muestran los diferentes modos de direccionamiento indirecto según se emplee el desplazamiento fijo de 8 bits definido por el usuario, disp, que deberá valer entre 0 y 255, o uno de los dos registros de desplazamiento de la CPU: IR0 o IR1. Se dispone, además, de dos formas especiales de realizar el acceso al dato empleando direccionamiento indirecto: Indirecto circular e indirecto bit-reversed. Estos direccionamientos son muy interesantes cuando se desea programar algoritmos matemáticos recursivos (convoluciones, correlaciones, FFTs). Veamos en qué consiste cada uno de estos modos especiales de direccionamiento indirecto.
- Direccionamiento indirecto circular. Particularmente interesante en la implementación de convoluciones y correlaciones. El cálculo de la dirección donde se ubica el dato requiere del registro interno de la CPU denominado BK. Dicho registro se emplea en la definición del tamaño de una tabla de datos de forma que el dato direccionado siempre se encuentre dentro de la tabla definida. Ejemplo de manejo de direccionamiento indirecto circular en el que el operando viene dado por el registro AR0 con BK=0110b (tabla de datos de tamaño 6):
*AR0++(5)% ; Inicialmente AR0 = Puntero al Elemento 0. ; Al final de la instrucción, AR0 = Puntero al Elemento 5. *AR0++(2)% ; Al final de la instrucción, AR0 = Puntero al Elemento 1. *AR0—(3)% ; Al final de la instrucción, AR0 = Puntero al Elemento 4. *AR0++(6)% ; Al final de la instrucción, AR0 = Puntero al Elemento 4. *AR0--% ; Al final de la instrucción, AR0 = Puntero al Elemento 3.![]()
En la figura 3.3 se muestra cómo se calcula la dirección del dato direccionado en una tabla de datos definida. La dirección base de la tabla de datos, EB, tiene los N+1 LSBs a cero y los MSBs coinciden con los MSBs de ARn. El bit N se determina con el registro BK (el bit más significativo de este registro a uno determina el valor de N). Obsérvese que, este tipo de direccionamiento indirecto impide que el puntero al dato exceda los límites inferior o superior de la tabla: Siempre se direcciona un dato dentro de la tabla de datos. La tabla de datos equivale, por tanto, a una memoria de datos circular (detrás del último dato aparece nuevamente el primero).
![]()
Figura 3.3. Direccionamiento Indirecto Circular
- Direccionamiento indirecto bit-reversed. Particularmente interesante en la implementación de algoritmos FFTs (Fast Fourier Transforms) donde, si los datos iniciales que desean ser transformados están ordenados en el orden correcto, el resultado final del algoritmo óptimo implementado en este DSP los reordena en orden bit-reversed. El cálculo de la dirección donde se ubica el dato requiere de uno de los registros índice de la CPU, IR0, que se emplea, en este caso, en la definición de la mitad del tamaño de la tabla de datos. Al igual que en el direccionamiento indirecto de tipo circular, el puntero al dato no puede abandonar la tabla. Ejemplo de manejo y de acceso a los datos de una tabla de 16 valores, empleando direccionamiento indirecto de tipo bit-reversed, en el que el operando lo determina AR2, con IR0=1000b (tabla de datos de tamaño 16):
*AR2++(IR0)B ; Inicialmente AR2 = 01100000b. Elemento 0. ; Al final de la instrucción, AR2 = 01101000b: Elemento 8. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100100b: Elemento 4. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101100b: Elemento 12. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100010b: Elemento 2. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101010b: Elemento 10. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100110b: Elemento 6. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101110b: Elemento 14. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100001b: Elemento 1. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101001b: Elemento 9. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100101b: Elemento 5. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101101b: Elemento 13. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100011b: Elemento 3. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101011b: Elemento 11. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100111b: Elemento 7. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01101111b: Elemento 15. *AR2++(IR0)B ; Al final de la instrucción, AR2 = 01100000b: De nuevo elemento 0.En los apuntes de la asignatura se puede encontrar una tabla donde se muestran todas las posibles formas de acceso al dato que emplean el modo de direccionamiento indirecto.
- Direccionamiento inmediato corto. Hace referencia a una posible forma de acceso a datos en la que el operando es un valor de 16 bits que se incluye en la propia instrucción. El dato puede ser un entero o un flotante dependiendo del tipo de instrucción que lo requiera como operando (instrucción de manejo de enteros o de flotantes). En ambos casos se trata de un operando de precisión simple (16 bits). Ejemplo:
SUBI 1,R7 ;; Antes de la instrucción, R7=6d. Luego, R7=5d.
- Direccionamiento inmediato largo. Hace referencia a una posible forma de acceso a datos en la que el operando es un valor de 24 bits que se incluye en la propia instrucción. Este tipo de direccionamiento se emplea en instrucciones que provocan un cambio en el valor del registro PC (contador de programa del DSP). Ejemplo:
BR 8000h ; Antes de la instrucción, PC=100h. Luego, PC=8000h.- Direccionamiento relativo al contador de programa. Hace referencia a una posible forma de acceso a datos en la que el operando es un desplazamiento relativo al valor, justo antes de la ejecución de la instrucción que emplea este modo de direccionamiento, del registro contador de programa. Este tipo de direccionamiento se emplea en instrucciones que provocan un cambio en el valor del registro PC (contador de programa del DSP) pero, al contrario que en el caso anterior, el valor a almacenar en el registro PC lo determina el propio ensamblador de forma transparente al programador. Ejemplos:
BU NEWPC ; Antes de la instrucción, PC=1000h y NEWPC es una etiqueta que ; apunta a la dirección 1005h. ; Después de la instrucción, PC=1005h. El desplazamiento producido ; en el PC (el dato u operando) es 5h (NEWPC-PC). BUD NEWPC ; Antes de la instrucción, PC=1000h y NEWPC es una etiqueta que ; apunta a la dirección 1005h. ; Después de la instrucción, PC=1005h. El desplazamiento producido ; en el PC (el dato u operando) es 2h (NEWPC-(PC+3)), no 5h, debido ; a que, en las instrucciones de salto con retardo, el salto efectivo no se ; produce hasta 3 instrucciones después de la instrucción de salto.