You are on page 1of 8

 MACROS

Definición

¿Qué es una macro?

  La mayoría de los programas ejecutan comandos de instrucciones repetitivas. Por


ejemplo, para desplegar un mensaje es necesario ejecutar cierto número de
instrucciones, por ejemplo:

MOV DX, offset Mensaje

MOV AH 09H

INT 21H

  Si un programa realiza muchas funciones de entrada/salida, puede resultarle


tedioso tener que codificar las instrucciones cada vez que se desea desplegar o leer algo.
Las macros ofrecen la facilidad de codificar una sola vez el conjunto de instrucciones y
reutilizar el código cuantas veces se desee dentro del programa.

  ¿Cómo definir una Macro?

  La definición de una macro, siempre requiere un formato específico. Dicho formato es:

Nombre_de_la_Macro MACRO [parámetro1, parámetro2, . . . , parámetros]


[LOCAL lista de etiquetas]
CUERPO DE LA MACRO
ENDM

Es decir, toda macro debe estar definida entre las palabras Macro y EndM. El
cuerpo es el conjunto de instrucciones que se ejecutarán cada vez que la macro sea
invocada.

Ejemplo 1:

CLRSCR MACRO
PUSH AX
PUSH BX
MOV AH, 15
INT 10H
POP BX
POP AX
ENDM

 PARÁMETROS Y ETIQUETAS

 
La lista de parámetros es opcional, y si existe, cada parámetro deberá ser separado
por una coma. Cuando se invoca la macro, los parámetros son reemplazados por los
nombres o valores que especifique la instrucción que la invoco. La expansión del código
se lleva a cabo durante la primera fase (recorrido) del ensamblador.

Es obvio que las etiquetas que aparecen en una macro pueden entrar en conflicto
con las que aparecen en el programa expandido, ocasionando esto, que se pueda repetir
alguna etiqueta. Para evitar este problema se utiliza el pseudooperador LOCAL seguido
por una lista de etiquetas que contiene todas las etiquetas que son propias de la macro.
Al momento del ensamblado, se asignan a todas ellas nombres únicos que no entren en
conflicto con el de otras etiquetas. Este proceso se repite sin importar el número de
veces que el macro se expanda ni de cuantos otros macros aparezcan. El uso de LOCAL
es optativo y depende si se tiene o no la necesidad de hacer que las etiquetas sean
locales.

La siguiente tabla muestra los pseudooperadores para el manejo de macros. La


proposición de macros puede estar contenida en el programa que las utiliza o
separadamente en una biblioteca de macros, la cual se carga como se describirá
posteriormente. Los macros permiten el uso múltiple de una secuencia de código, con
un cambio cada vez, como cuando utiliza una lista de parámetros. La pseudooperador
PURGE permite eliminar una macro que no se utilice en una biblioteca, una vez que
esta ha sido cargada. Un uso alternativo de la pseudooperador PURGE podría emplearse
para unir bibliotecas de macros, para una clase de aplicaciones determinadas como:
gráficos, I/O en disco, etcétera.

  La siguiente tabla, muestra los pseudo operadores de macros.

Pseudo-op Descripción
ENDM ENDM es el terminador para MACRO, REPT, IRP e IRPC

EXITM EXITM proporciona una salida a una expansión (REPT IRP, IRPC o MACRO) cuando
una prueba demuestra que la expansión restante no es necesaria

IRP Su forma es IRP muda, < lista de operandos >. El número de operandos (separados por
comas) en la lista de operandos determina el número de veces que se repite el código
que le sigue (terminado por ENDM). En cada repetición el item siguiente en la lista de
operandos substituye a todas las ocurrencias del parámetro mudo.
IRPC Su forma es IRPC modo, cadena. Es similar a IRP excepto que en cada repetición el
carácter siguiente en cadena sustituye a todas las ocurrencias del parámetro mudo

LOCAL

Su forma es LOCAL lista muda. LOCAL se utiliza dentro de una estructura MACRO.
El ensamblador crea un símbolo único para cada entrada en la lista muda durante cada
expansión del macro. Esto evita el problema de etiquetas definidas en forma múltiple,
por ejemplo, cuando expansiones múltiples del mismo macro toman su lugar en un
programa.

MACRO

Su forma es MACRO lista muda. Las proposiciones que siguen a la definición de


MACRO, antes de ENDM, son el macro. La lista fantasma contiene los parámetros a
ser reemplazados cuando se llame el macro durante el ensamblador. La forma de esta
llamada es nombre lista-parámetro. Lista-parámetro consiste de los parámetros
actuales (separados por comas) utilizados por la expansión.

PURGE

Su forma es PURGE nombre-macro...PURGE limpia la definición de un MACRO


especificado y permite que el espacio pueda ser utilizado. Esto es benéfico para cuando
se incluya a una biblioteca durante el ensamblado pero deseando eliminar los macros
no utilizados durante el proceso de ensamblado.

La siguiente tabla, muestra los macro operadores de propósito especial.

Operador Descripción
& Su forma es texto & texto. Este operador concatena textos o símbolos. Un ejemplo es:

TC1 MACRO X

LEA DX, CHAR & X

MOV AH, 9

INT 21H
ENDM

Aquí una llamada TC! A podría cargar DS con posición inicial de carácter CHARA.
;; Su forma es; texto. Un comentario precedido por dos "punto y coma" no se produce
como parte de la expansión cuando se define en un ensamblado un MACRO o REPT
! Su forma es !carácter Causa que el carácter sea interpretado como un valor literal, no
como un símbolo.
% Su forma es %expresión. Convierte la expresión en un número. Durante la expansión
el número sustituye a la expresión. Considere el siguiente ejemplo:

MAC1 MACRO X

= X * 1000

MAC2 %L1, X

ENDM

MAC2 MACRO Y, X

PROD & X DB 'No. de producción &X = &Y'

ENDM

Esto da como resultado PROD5 DB ' No. de producción 5 = 5000", "cuando se llama
con MAC1 5

Una biblioteca de macros, son grupos de pseudooperadores MACRO, cada uno


conteniendo instrucciones en ensamblador que serán insertadas en el archivo del
programa durante el ciclo 1 de ensamblado. Supóngase que se genera una biblioteca de
macros llamada MC1LIB.LIB que contenga los macros a ser incluidos en el programa.
La primera secuencia de instrucciones sería:

 IF1

INCLUDE MAC1LIB.LIB

ENDIF

  Esta secuencia hará que el ensamblador, durante el ciclo 1, sustituya los macros
utilizados en el programa en los puntos apropiados del código. De aquí que el uso de
macros aumente el tamaño del programa. La forma de la proposición IF (que es un
pseudo operador condicional) en la secuencia anterior proporciona solamente una
respuesta condicional durante el ciclo1.
 

 APLICACIONES DE LOS MACROS

  Para mostrar las aplicaciones de los macros, se realizarán ejemplos, mostrando de


una manera más práctica las aplicaciones de los mismos.

Ejemplo 2:

Realizar una macro que imprima un mensaje pasado como parámetro.

Para este ejemplo, supongamos que en un archivo contiene el macro siguiente y el


macro CLRSCR el archivo se llama MARCOS.LIB. Este archivo, puede tener la
extensión LIB, o también es común cuando tienen la extensión INC, porque es común
que los archivos que contiene solo macros, tengan esta extensión.

MACRO.INC

COMMENT *

ESTE MACRO IMPRIME UN MENSAJE EN LA PANTALLA, USANDO UNA


LIBRERIA

DE MACROS QUE CONTIENE LOS MACROS CLRSCR Y EL MACRO


IMPRIME.

IMPRIME MACRO MENSAJE


PUSH AX
PUSH DX
MOV AH, 9
LEA DX, MENSAJE
INT 21H
POP DX
POP AX

ENDM

CLRSCR MACRO
PUSH AX
PUSH BX
MOV AH, 15
INT 10H
MOV AH, 0
INT 10H
POP BX POP AX
ENDM
MACROS.ASM

INCLUDE MACRO.INC
.MODEL SMALL
.STACK 32
.DATA
CAD1 DB 'CADENA1',13,10,'$'
CAD2 DB 'CADENA2',13,10,'$'
CAD3 DB 'CADENA3',13,10,'$'

.CODE

MAIN PROC FAR


MOV AX, @DATA
MOV DS, AX
CLRSCR
IMPRIME CAD1
IMPRIME CAD2
IMPRIME CAD3
MOV AH, 4CH
MOV AL, 0
INT 21H
MAIN ENDP
END MAIN

2.- ALBERTO ROJAS PONCE


ENSAMBLADOR BASICO
EDITORIAL ALFAOMEGA GRUPO EDITOR S.A
SEGUNDA EDICION 1995, MEXICO DF.
NUM. DE PAGS.
MACROS Y PROCEDIMIENTOS.
La manera más fácil de modularizar un programa es dividirlo en dos o más partes. Para
esto, es necesario que datos, símbolos, y demás valores de un módulo sean reconocidos
por el otro u otrosmódulos. Para este tipo de declaraciones globales existen dos
directivas:
PUBLIC nombre,,, que hace la variable, etiqueta o símbolo absoluto disponible para
todos los programas.
EXTRN nombre:tipo,,, que especifica una variable, etiqueta o símbolo externos
identificados por nombre y tipo (que puede ser BYTE, WORD, DWORD, QWORD,
TBYTE, NEAR, FAR, o ABS, éste último para
números absolutos).
El siguiente ejemplo ilustra el uso de las directivas. El primer listado corresponde al
módulo principal,
mientras que el segundo al módulo que contiene una rutina. Ambos módulos son
archivos que se editan
por separado, se ensamblan por separado, pero se ligan juntos.
MODULO PRINCIPAL: MAIN.ASM
NAME main
PUBLIC exit
EXTRN print:near
stack SEGMENT word stack 'STACK'
DW 64 DUP(?)
stack ENDS
data SEGMENT word public 'DATA'
data ENDS
code SEGMENT byte public 'CODE'
ASSUME cs:code, ds:data
start:
mov ax,data ; carga localizacion del segmento
mov ds,ax ; en el registro DS
jmp print ; va a PRINT en el otro modulo
exit:
mov ah,4ch
int 21h
code ENDS
END start
SUBMODULO: TASK.ASM
NAME task
PUBLIC print
EXTRN exit:near
data SEGMENT word public 'DATA'
entrada DB "Entrando a un submodulo....",13,10,"$"
salida DB ".......saliendo del submodulo.",01,07,13,10,"$"
data ENDS
code SEGMENT byte public 'CODE'
ASSUME cs:code, ds:data
print:
mov ah,06h ; Funcion para borrar pantalla
mov al,0 ; todas las lineas
mov cx,0 ; de 0,0
mov dh,24d
mov dl,79d
mov bh,0 ; atributo en lineas vacias
int 10h ; Servicio de e/s video
mov dx, OFFSET entrada
mov ah,09h
int 21h
mov dx, OFFSET salida
int 21h
jmp exit ; Regresa al otro modulo
code ENDS
END
La declaración de macros se hace a través de las directivas MACRO y ENDM. Su
sintaxis es:
nombre MACRO [parámetros,,,]
declaraciones
ENDM
parámetros son los valores que se substituirán en la macro cada vez que se haga
referencia a ésta.
Para la definición de procedimientos se emplean las directivas PROC y ENDP. Su
sintaxis es:
nombre PROC [distancia]
sentencias
nombre ENDP
distancia, que puede ser NEAR (default) o FAR permiten indicar el tipo de acciones a
realizar en brincos
y llamados a subrutinas. nombre se puede usar como dirección en llamados o brincos. J.
TERRY GODFREY
LENGUAJE ENSAMBLADOR PARA MACROCOMPUTADORAS
EDITORIAL PRETINCE-HALL HISPANOAMERICA S.A
PRIMERA EDICION 1991
NUM. DE PAGS

You might also like