Otro sencillo ejemplo pero muy esencial al momento de desarrollar programas en ASM un poco más complejos, es el uso de macros.
Las macros son instrucciones complejas formadas de instrucciones más sencillas, sirven cuando se quieren hacer procesos repetitivos.
Los macros sirven para:
Ahorrar código cuando se quiere hacer un proceso repetitivo.
Menos errores al momento de realizar código repetitivo.
Permite hacer uso de variables que son pasados como parámetros.
Mayor seguridad en el código, se pueden invocar desde un archivo externo al programas ASM.
Las macros se definen al inicio de un programa, antes de .model:
nombreMacro MACRO [parametros] ;Los parámetros son opcionales.
instrucciones...
ENDM ;Indica fin del macro.
Como primer programa haremos que un macro cargue un mensaje del segmento de datos a AX, así nos ahorramos 3 lineas de código al momento de imprimir una cadena.
inicio macro ;declaramos la macro, le damos el nombre de inicio
mov ax,@data ;Cargamos el segmento de datos.
mov ds,ax
mov dx,ax
endm
.model small
.stack 64
.data
msj db 'Este es mi primer macro', 10,13,'$'
.code
inicio ;Llamamos al macro, lo único que hace es cargar msj del segmento de datos.
mov ah,09h
lea dx,msj ;puede ser mov dx,offset msj
int 21h
mov ax,4c00h ;Sale del programa
int 21h
end
Ejecución del programa:
En un segundo programa con macro realizaremos un ciclo que valla imprimiendo el decremento del contador CX en un ciclo LOOP, pasando como parámetro el número a imprimir.
imprime macro numero ;Nuestra macro se llama imprimir, nuestro parámetro es numero
mov ah,02h
mov dl,numero ;Indica que mueva al registro DL lo que pasamos como parámetro.
add dl,30h ;suma 30h para imprimir el número real.
int 21h
endm
.model small
.stack 64
.data
num db 0 ;declaramos nuestra variable.
.code
mov cx,9
inicio:
mov num,cl
imprime num ;Llamamos al macro con el valor de nuestra variable.
loop inicio ;repite ciclo
mov ah,04ch ;Finaliza el programa.
int 21h
end
También se puede pasando el valor directo del registro, en la linea donde se manda a llamar el macro se puede pasar como parámetro a cl directamente y no declarar la variable num.
inicio:
imprime cl
loop inicio
Programa en ejecución:
No hay comentarios:
Publicar un comentario