Modos de direccionamiento.
Los modos de direccionamiento al igual que el set de instrucciones serán empleados solo por el lenguaje ensamblador base principal para nuestro pequeño tutorial.
Los modos de direccionamiento son usados para que la CPU conozca la manera en que le serán accedidos los operandos de la instrucción a ejecutar. Las instrucciones se dividen en dos grandes grupos:
Operando Simple del tipo: [instrucción] destino
Doble Operando del tipo: [instrucción] fuente, destino
Los MSP430™ soportan 7 modos de direccionamiento, de los cuales solo 4 de ellos son implementados físicamente en la CPU (Registro, Indexado, Indirecto e Indirecto con autoincremento) es decir grabados en cilicio, 2 de ellos resultan de usar el PC como un registro (Simbólico e Inmediato) y el ultimo se obtiene indexando un registro cuyo valor es cero (Absoluto), es decir SR cuando se usa como Generador De Constantes.
Las instrucciones de Operando Simple pueden ser usadas con los 7 modos de direccionamiento, en el caso de las instrucciones de Doble Operando, para el caso de su operando fuente se pueden usar los 7 modos de direccionamiento, pero para el caso de el operando destino solo se pueden usar 4.
A continuación se describen los 7 modos de direccionamiento con ejemplos, una breve descripción, ya que no es el objetivo aburrir con teoría complicada acerca de los modos de direccionamiento y por ultimo una tabla con la cantidad de ciclos de reloj que se tarda en ejecutar alguna instrucción dependiendo sus modos de direccionamiento.
Modo registro
Ejemplo de Operando simple:
Registro Antes. R8=0000h
Instrucción INC R8
Registro Después. R8=0001h
Descripción: Dado que utilizamos la instrucción INC, lo que hace este ejemplo es incrementar en 1 el valor del registro 8 (R8).
Ejemplo de Operando doble:
Registros Antes. R4=0010h, R5=07F0h
Instrucción MOV R4,R5
Registro Después. R4=0010h, R5=0010h
Descripción: Ya que se usa la instrucción MOV lo que hace el ejemplo es que mueve el contenido de R4 a R5.Como podemos ver independientemente de la instrucción a usar se nota que solo se usaron registros de la CPU, de hecho este modo de direccionamiento solo se puede usar con los 16 registros de la CPU lo cual hace que este modo sea de los mas veloces y que menos espacio ocupa.
Modo indexado
Sintaxis:
[instrucción] n(destino)
[instrucción] n(fuente), *otro modo
Donde: [instrucción] es cualquiera en el set de instrucciones, fuente y destino son cualquier registro de la CPU, n es un numero cualquiera y *otro modo significa cualquier otro modo de direccionamiento disponible para el destino incluyendo indexado.
Ejemplo de Operando simple:
Registro Antes. R8=0300h
Locación de memoria antes. 0303h=FF0Eh
Instruccion DEC 3(R8)
Registro Después. R8=0300h
Locación de memoria despues. 0303h=FF0Dh
Descripción: La instrucción no altera a R8 si no que altera a la locación de memoria R8 + 3, es decir 300+3=303 que es donde se realiza el decremento ya que se utilizo la instrucción DEC.
Ejemplo de Operando doble:
Registro Antes. R4=0240h, R5=A0F1h
Locación de memoria antes 0245h=FFFFh y A0F7=O777h
Instrucción MOV 5(R4), 6(R5)
Registro Después. R4=0240h, R5=A0F1h
Locación de memoria despues 0245h=FFFFh y A0F7=FFFFh
Descripción: Como en el caso anterior no se modifican los registros R4 ni R5 si no que se modifica el contenido de la dirección R4 +5 y R5+6 es decir (240h+5h=245h) y (A0F1h+6h=A0F7h). Así como con el modo registro, los operandos solo pueden ser registros de la CPU.
Modo simbolico
Sintaxis:
[instrucción] etiqueta1
[instrucción] etiqueta1, *otro modo
Donde: [instrucción] es cualquiera en el set de instrucciones, etiqueta1 es como su nombre lo dice una etiquete la cual contiene una dirección y *otro modo significa cualquier otro modo de direccionamiento disponible para el destino incluyendo el simbólico.
Ejemplo de Operando simple:
Locación de memoria antes ETQ1=FF0Eh
Instrucción CLR ETQ1
Locación de memoria después ETQ1=0000h
Descripción: ETQ1 es una etiqueta que hace referencia a una localidad de memoria, en este caso borra la localidad de memoria ya que eso hace CLR.
Ejemplo de Operando doble:
Locación de memoria antes ETQ1=FEAFh y ETQ2=7421h
Instrucción MOV ETQ1, ETQ2
Locación de memoria después ETQ1=FEAFh y EQT2=FEAFh
Descripción: Como podemos ver el contenido de ETQ1 se mueve a ETQ2.
Modo absoluto
Sintaxis:
[instrucción] &etiqueta1
[instrucción] &etiqueta1, *otro modo
Donde: [instrucción] es cualquiera en el set de instrucciones, etiqueta1 es una etiqueta la cual contiene una dirección , *otro modo significa cualquier otro modo de direccionamiento disponible para el destino incluido Absoluto y "&" es el que caracteriza a este modo.
Ejemplo de Operando simple:
Locación de memoria antes ETQ1=FF0Eh
Instrucción CLR &ETQ1
Locación de memoria después ETQ1=0000h
Descripción: Como podemos ver ocurre exactamente lo mismo que con el modo simbólico esto porque la función que cumplen es la misma, lo único que cambia es como la hacen, aunque como usuarios nunca nos enteramos de la diferencia.
Ejemplo de Operando doble:
Locación de memoria antes ETQ1=FEAFh y ETQ2=7421h
Instrucción MOV &ETQ1, &ETQ2
Locación de memoria después ETQ1=FEAFh y EQT2=FEAFh
Descripción: Ocurre lo mismo que en el modo anterior, edemas de que estos modos cumplen la misma función además generan la misma cantidad de código.
Modo indirecto
Sintaxis:
[instrucción] @fuente
[instrucción] @fuente, *otro modo
Donde: [instrucción] es cualquiera en el set de instrucciones, fuente es cualquier registro de la CPU, *otro modo significa cualquier otro modo de direccionamiento disponible para el destino y "@" caracteriza a este modo.
Ejemplo de Operando simple:
Registro Antes. R5=0240h
Locación de memoria antes 0240h=0021h
Instrucción CLR @R8
Registro Después. R5=0240h
Locación de memoriaantes 0240h=0000h
Descripción: Podemos notar que R5 no se ve afectado si no el contenido de R5
Ejemplo de Operando doble:
Registro Antes. R4=0060h, R9=1000h
Locación de memoria antes 0060h=AAA0
Instrucción MOV @R4, R9
Registro Después. R4=0060h, R9=AAA0h
Locación de memoria despues 0060h=AAA0
Descripción: R4 esta actuando como apuntador, lo que hace la instrucción es mover el contenido de la dirección apuntada por R4 al registro 9 (R9) esto se hace sin alterar R4. Hay que mencionar que este modo de direccionamiento es exclusivo de la fuente.
Modo indirecto autoincrementado
Sintaxis:
[instrucción] @fuente+
[instrucción] @fuente+, *otro modo
Donde: [instrucción] es cualquiera en el set de instrucciones, fuente es cualquier registro de la CPU, *otro modo significa cualquier otro modo de direccionamiento disponible para el destino y "@" junto con "+" caracterizan a este modo.
Ejemplo de Operando simple:
Registro Antes. R7=0F28h
Locación de memoriaantes 0F28h=0062h
Instrucción DINC @R7+
Registro Después. R7=0F29h
Locación de memoria despues 0F28h=0064h
Descripción: En este caso se usa la instrucción de doble incremento, lo cual se hace sobre el contenido de la dirección a la que apunta R7, pero aquí si se modifica el registro que usamos como apuntador, es decir R7=R7+1.
Ejemplo de Operando doble:
Registro Antes. R5=FF00h R9=00A0h
Locación de memoria antes FF00h=0034h
Instrucción MOV @R5+, R9
Registro Después. R5=FF01h R9=0034h
Locación de memoria despues FF00h=0034h
Descripción: Dado que R5 actua como apuntador, lo que se modifica es R9 ya que se copia el valor apuntado por R5 a R9 y también R5 ya que se incrementa en 1. También hay que mencionar que este modo solo es para la fuente al igual que el anterior.
Modo inmediato
Sintaxis:
[instrucción] #cte, *otro modo
Donde:: es cualquiera en el set de instrucciones, cte es un valor numérico constante, *otro modo significa cualquier otro modo de direccionamiento disponible para el destino y "#" caracteriza a este modo.
Ejemplo de Operando doble:
Registro Antes. R15=0FF0h
Instrucción MOV #000F, R15
Registro Después. R15=00Fh
Descripción: Mueve la constante 000Fh al registro 15 (R15), este modo es solo para el operando fuente.