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 |
|
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 |