miércoles, 10 de julio de 2013

Mi primer macro

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