sábado, 18 de septiembre de 2010

MACROS

Macros: Las macros asignan un nombre simbólico a un bloque de sentencias fuente. Luego se puede usar dicho nombre para representar esas sentencias. Opcionalmente se pueden definir parámetros para representar argumentos para la macro.


Las macros de definen así:


.MACRO      nombre_de_la_macro
..... instrucciones a ejecutar
.ENMACRO


Un ejemplo de su uso puede ser las instrucciones del inicio de pila.


 Cuando se quiera iniciar la pila solamente hay que colocar INICIA_PILA.


Ya que no se cuenta con una instrucción para Adherir un Inmediato a un Registro (Rn +k), pero sí la instrucción que resta (Rn-k), podemos crear una macro que realice esta operación.


Esta macro de nombre "ADDI"  resta al registro que es identificado por "@0"  el negativo del inmediato "@1", esto es @0 - (-(@1)) = @0 + @1 .  Si queremos sumarle al Registro R19=127 el inmediato 46.
Luego de esto R19=127+46 = 173

Ahora para hacer más manejable el código podemos crear un archivo que incluya todas nuestras macros. Nuestras subrutinas también las pondremos en otro archivo.




Nuestro proyecto final queda.



7 comentarios:

  1. No logro entender como se usa o que se refiere @0,1... podrias ampliar la explicacion gracias.

    ResponderEliminar
  2. La macro es como una "función" a la cual le pasas algunos parámetros, en éste caso esos parámetros están representados por @0,@1,@2...hasta @n (dependiendo de la cantidad de parámetros que le pases), esos parámetros son los que debes usar dentro de la macro.
    Por ejemplo:
    ;**************************************
    ;**SINTAXIS: MULT_16X8 REG1,REG2,REG3
    ;** (REG1:REG2)x(REG3)=(R4:R3:R2)
    ;**************************************
    .MACRO MULT_16X8
    MUL @1,@2
    MOVW R3:R2,R1:R0
    MUL @0,@2
    MOV R4,R1
    ADD R3,R0
    BRCC PC+2
    INC R4
    .ENDMACRO
    ;********************************************

    Esta macro multiplica (8bits)x(16bits)
    Llamas a la macro así: MULT_16X8 REG1,REG2,REG3
    y el compilador toma @0=REG1, @1=REG2, @2=REG3 y en base a eso se realizan las operaciones que se encuentran dentro de la macro.

    Espero esta explicación te ayude...

    ResponderEliminar
  3. Excelente explicacion! aprecio mucho tu ayuda y tus post son extraordinarios ya que toda esta info solo la encuentras en C. Sigue con el buen trabajo ;)

    PD: Como cambias el color de tus macros? podrias hacer un post de esto si no es mucho pedir?
    atte. Jahir

    ResponderEliminar
  4. Para darle color tienes que ir a: "C:\Archivos de programa\Atmel\AVR Tools\AvrStudio4\edit" allí encontraras un archivo llamado "AvrStudio_asm.ini" (realiza una copia antes de modificarlo) ábrelo con algún editor de texto. Dentro de ese archivo hay una parte que dice "[ColorGroups]", debajo de esto esta la cantidad de grupos y luego cada uno de ellos; para agregar un grupo (en este caso las macro) sumale 1 a "NumGroups" y despues del ultimo grupo coloca el tuyo. Esto queda algo asi...
    [ColorGroups]
    NumGroups =9
    Group1 =Text
    Group2 =Text Selection
    Group3 =Number
    Group4 =Operator
    Group5 =Comment
    Group6 =Keyword
    Group7 =String
    Group8 =Disasm
    Group9 =Macros_m

    Luego mas abajo y antes de "[Keywords]" debes agregar esto:

    [Macros_m]
    Foreground =128,0,128
    Background =255,255,255
    BackColorAutomatic =1
    ForeColorAutomatic =0
    DisplayName=Macros_m
    Configurable=1

    y para terminar después de todas las "[Keywords]" agrega 1 a 1 tus macros, por ejemplo:

    INICIA_PILA =Macros_m
    ADDI =Macros_m
    delay_ms =Macros_m
    delay_us =Macros_m
    delay_s =Macros_m
    .
    .
    .
    .

    eso es todo...!!!

    ResponderEliminar
  5. Muchas gracías Ojala no dejes de subir prograamas en ensamblador para los que apenas estamos empezando, una pregunta me llama la atencion el poder hacer las luces del auto fantastico

    ResponderEliminar
  6. Si tiene razón como se podrian hacer las luces del auto fantastico en ensamblador usando operaciones AND, OR, NOT con desplazamientos

    ResponderEliminar
    Respuestas
    1. Yo creo que podría ser algo así.

      .include "m128def.inc"

      .CSEG
      .ORG 0x0000 RJMP INICIO
      //**************************************
      INICIO:
      ldi r16,byte1(RAMEND)
      out spl,R16
      ldi r16,byte2(RAMEND)
      out sph,R16

      ldi R16,0b_1111_1111
      out DDRD,R16

      LOOP:
      ldi r18,0b_11_00_00_00
      out PORTD,r18
      nop
      LOOP_1:
      delay_ms
      in r16,PIND
      lsr r16
      out PORTD,r16
      brcc LOOP_1

      ldi r18,0b_00_00_00_11
      out PORTD,r18
      nop
      LOOP_2:
      delay_ms
      in r16,PIND
      lsl r16
      out PORTD,r16
      brcc LOOP_2

      rjmp LOOP

      Eliminar