B_1.gif (1135 bytes)

INICIO WEB

B_2.gif (1184 bytes)

             

DIRECTIVAS DE TRATAMIENTO DE MACROS

                

Estas directivas permiten al usuario definir macros.

        

Estas directivas son las siguientes: ENDM, ENDR, EXITM, LOCAL, MACRO, REPT, REPTC y REPTI.

             

Sintaxis

        

ENDM

ENDR

EXITM

LOCAL symbol [,symbol] ...

name MACRO [argument] ...

REPT expr

REPTC formal, actual

REPTI formal, actual [, actual] ...
         

Parámetros

           
  • actual: Cadena que se va a cambiar.
  • argument: Nombre de argumento simbólico.
  • expr: Una expresión.
  • formal: Argumento en el cual cada carácter de "actual" (REPTC) o cada "actual" (REPTI) es sustituido.

  • name: Nombre de la macro.
  • symbol: Símbolo local a la macro.
            

Descripción

Una macro es un símbolo definido por el usuario que representa un bloque de una o más líneas fuente de ensamblador. Una vez tengas definida una macro tú puedes usarla en tu programa como una directiva de ensamblador o como un mnemónico de ensamblador.

Cuando el ensamblador encuentra una macro, busca su definición e inserta las líneas que la macro representa como si estuviesen incluidas en el archivo fuente en esa posición.

Para definir una macro se hace con la siguiente declaración:

macroname MACRO [arg] [arg] ...

donde macroname es el nombre que se va a usar para la macro y arg es un argumento para valores que tu quieres pasar a la macro cuando esta se extienda.

Para definir la macro "error" se puede hacer como se muestra a continuación:

       

errmac    MACRO     test

              CALL           abort

              DB                text, 0

              EVEN

              ENDM

        

Esta macro utiliza el parámetro "text"

          

Utilice la directiva EXITM para generar una salida prematura de la macro. No se permite utilizar la directiva EXITM dentro de los bloques REPT ... ENDR, REPTC ... ENDR o REPTI ... ENDR.

     

Utilice LOCAL para crear símbolos locales a la macro. La directiva LOCAL debe usarse antes de que el símbolo sea usado.

Cada vez que una macro se expande, se crean nuevas peticiones de símbolos locales por la directiva LOCAL. Está prohibido redefinir una macro.

        

Utilice la estructura REPT ... ENDR para ensamblar el mismo bloque de instrucciones un número de veces. Si "expr" equivale a 0 no se generará nada.

          

Utilice REPTC para ensamblar un bloque de instrucciones una vez para cada carácter de la cadena. Si la cadena contiene una coma debe ponerse entre comillas.

        

Utilice REPTI para ensamblar un bloque de instrucciones una vez para cada cadena en una serie de cadenas. Las cadenas contienen comas deben ponerse entre comillas.

          

Ejemplos

       

Esta sección nos da ejemplos de los diferentes modos en los que las macros pueden hacer que la programación en ensamblador sea más fácil.

             

Código para tener un mayor rendimiento

El siguiente ejemplo pasa bytes de un buffer a un puerto.

             

                     NAME            play

       

portb             VAR               0x18

                     RSEG             DATA

buffer            DS                  256

                     RSEG             CODE

play               LDI                R27, HIGH(buffer)

                     LDI                R26, LOW(buffer)

                     LDI                R25, 255

loop              LD                  R0, X+

                    OUT                portb, R0

                    DEC                R25

                    BRNE              loop

                    RET

                    END

         

El programa principal llama a esta rutina de la siguiente forma:

doplay CALL play

          

Para obtener un rendimiento mayor podemos reprogramarlo utilizando una macro.

         

                    NAME             play

        

portb            VAR                0x18

                     RSEG             DATA

buffer            DS                  256
        

play              MACRO

                    LOCAL            loop

                    LDI                  R27, HIGH(buffer)

                    LDI                  R26, LOW(buffer)

                    LDI                  R25, 255

loop             LD                    R0, X+

                   OUT                  portb, R0

                   DEC                  R25

                   BRNE                loop

                   ENDM

      
                   RSEG                CODE

                   play

                   END
        

Observe el uso de la directiva LOCAL para hacer que la etiqueta "loop" sea local a la macro; de otra forma ocurrirá un error si la macro se utiliza dos veces.

     

Utilización de REPTC y REPTI

El siguiente ejemplo ensambla una serie de llamadas a la subrutina "plot" para introducir cada carácter en una cadena.

        
                  NAME           reptc
        
                  EXTERN       plotc
       
Banner       REPTC          chr, "Welcome"
                  LDI               R16, ’chr’
                  CALL            plotc
                  ENDR
            
                  END
     

El siguiente ejemplo utiliza REPTI para borrar un número de posiciones de memoria:

       
                  NAME           repti
                  EXTERN       base, count, init
banner        REPTI           adds, base, count, init
                  LDI               R30, LOW(adds)
                  LDI               R31, HIGH(adds)
                  LDI               R16, 0
                  STD              Z+0, R16
                  ENDR
                  END
          
                                         

B_1.gif (1135 bytes)

B_3.gif (1151 bytes)

B_2.gif (1184 bytes)