Macros con ASM

ensamblador

Para finalizar el cursillo de Assembler vamos a aprender a programar macros, las macros son instrucciones complejas, formada por otras instrucciones más sencillas. Esto permite la automatización de tareas repetitivas. Se pueden programar macros en casi todos los lenguajes de programación y sus utilidades son muy variadas




Introducción Para cada instrucción simbólica que usted codifica, el ensamblador genera una instrucción de lenguaje de maquina. El ensamblador tiene facilidades que el programador puede utilizar para definir macros. Primero hay que definir un nombre especifico para la macro, junto con el conjunto de instrucciones en lenguaje ensamblador que la macro va a generar. Después, siempre que necesite codificar el conjunto de instrucciones, solo hay que codificar el nombre de la macro y el ensamblador genera de forma automática las instrucciones que han sido definidas en la macro.
Las macros son útiles para los siguientes propósitos:

• Simplificar y reducir la cantidad de codificación repetitiva.
• Reducir errores causados por la codificación repetitiva.
• Linealizar un programa en lenguaje ensamblador para hacerlo mas legible.


Definición de macro
Una definición de macro aparece antes de que cualquier definición de segmento. Examinemos una definición de una macro sencilla que inicializa los registros de segmento para un programa.EXE:

INICIAREGS MACRO ;Define macro
MOV AX, @data ; } Cuerpo de
MOV DS, AX ; } la definición
MOV ES, AX ; } de la macro
ENDM ; Fin de la macro

El nombre de esta macro es INICIAREGS, aunque es aceptable cualquier otro nombre valido que sea único. La directiva MACRO en la primer línea indica al ensamblador que las instrucciones que siguen, hasta ENDM ("fin de la macro"), son parte de la definición de la macro. La directiva ENDM termina la definición de la macro.
Los nombres a que se hace referencia en la definición de la macro, @data, AX, DS y ES, deben estar definidos en alguna parte del programa o deben ser dados a conocer de alguna otra forma al ensamblador.
En forma subsecuente se puede usar la macro-instruccion INICIAREGS en el segmento de código en donde quiera inicializar los registros. Cuando el ensamblador encuentra la macra-instruccion INICIAREGS, busca en una tabla de instrucciones simbólicas y, a falta de una entrada, busca macroinstrucciones. Ya que el programa contiene una definición de la macro INICIAREGS, el ensamblador sustituye el cuerpo de la definición generando instrucciones: la expansión de la macro.
Un programa usaría la macroinstruccion INICIAREGS solo una vez, aunque otras macros están diseñadas para ser utilizadas cualquier numero de veces y cada vez el ensamblador genera la misma expansión.

Manejo de parámetros Para hacer una macro flexible, puede definir nombres en ella como argumentos mudos (ficticios).La definición de la macro siguiente, llamada DESPLEGAR_MSG, proporciona el uso de la función 09H del DOS para desplegar cualquier mensaje. Cuando se usa la macroinstrucción el programador tiene que proporcionar el nombre del mensaje, el cual hace referencia a un área de datos terminada por un signo de dólar.

DESPLEGAR_MSG MACRO MENSAJE ; Argumento mudo
MOV AH, 09H
LEA DX, MENSAJE
INT 21H
ENDM ; Fin de la macro

Un argumento mudo en una definición de macro indica al ensamblador que haga coincidir su nombre con cualquier aparición del mismo nombre en el cuerpo de la macro. Por ejemplo, el argumento mudo MENSAJE también aparece en la instrucción LEA.
Cuando utiliza la macroinstrucción DESPLEGAR_MSG, usted proporciona un parámetro como el nombre real del mensaje que será desplegado, por ejemplo:

DESPLEGAR_MSG MENSAJE2

En este caso, MENSAJE2 tiene que estar apropiadamente definido en el segmento de dato. El parámetro en la microinstrucción corresponde al argumento mudo en la definición original de la macro:
Definición de macro: DESPLEGAR_MSG MACRO MENSAJE (Argumento)
Macroinstruccin: DESPLEGAR_MSG MENSAJE2 (Parametro)
El ensamblador ya ha hecho corresponder el argumento en la definición original de la macro con la instrucción LEA en el cuerpo de la macro. Ahora sustituye el (los) parámetro(s) de la macroinstrucción MENSAJE2 por la presencia de MENSAJE en la instrucción LEA y la sustituye por cualquier otra aparición de MENSAJE.
Un argumento mudo puede contener cualquier nombre valido, incluyendo un nombre de registro tal como CX. Puede definir una macro con cualquier numero de argumentos mudos, separados por coma, hasta la columna 120 de una línea. El ensamblador sustituye los parámetros de la macro instrucción por los argumentos mudos en la definición de la macro, entrada por entrada, de izquierda a derecha.

Manejo de etiquetas locales Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definición de la macro. Si utiliza la macro mas de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparición, los nombres duplicados harían que el ensamblador genere un mensaje de error. Para asegurar que cada nombre generado es único, hay que codificar la directiva LOCAL inmediatamente después de la instrucción MACRO. Su formato general es:
LOCAL Etiqueta1, Etiqueta2...Etiquetan.

Bibliotecas de Macros Definir una macro y usarla solo una vez en un programa no es muy productivo. El enfoque habitual es catalogar las macros en una biblioteca en disco bajo un nombre descriptivo, como MACRO.LIB. Usted solo tiene que reunir todas las definiciones de sus macros en un archivo y almacenar el archivo en disco:

Macro1 MACRO
....
ENDM
Macro2 MACRO
....
ENDM

Para usar cualquiera de las macros catalogadas, en lugar de codificar las definiciones MACRO al inicio del programa utilice la directiva INCLUDE así:

INCLUDE C: MACRO.LIB
Macro1
Macro2

El ensamblador accesa el archivo llamado MACRO en la unidad C e incluye ambas definiciones de macro, Macro1 y Macro2, en el programa. El listado ensamblado contendrá una copia de las definiciones de las macros.
La Directiva PURGE.
La ejecución de una instrucción INCLUDE hace que el ensamblador incluya todas las definiciones de macros que están especificadas en la biblioteca. Sin embargo, suponga que una biblioteca contiene las macros SUMA, RESTA, DIVIDE, pero que el programa solo necesita SUMA. La directiva PURGE permite que usted "elimine" la macros RESTA y DIVIDE que no necesita del ensamblado actual:

IF1
INCLUDE C:\MACRO.LIB ;Incluye la biblioteca completa
ENDIF
PURGE RESTA, DIVIDE ;Elimina la macros no necesarias
Una operación PURGE facilita solo el ensamblado de un programa y no tiene efecto sobre las macros almacenadas en la biblioteca.

Fuente de consulta

No hay comentarios :