En Assembly podemos definir macros que faciliten la escritura de nuestros programas.
Las macros son como métodos ya que reciben parámetros y realizan una serie de instrucciones. Se definen de la siguiente manera:
%macro Nombre Cantidad-Parametros Instrucciones %endmacro
Definiendo cuatro macros tenemos las siguientes para trabajar directamente en la consola:
%macro INT80 4 mov eax, %1 mov ebx, %2 mov ecx, %3 mov edx, %4 int 80h %endmacro %macro LeerConsola 2 INT80 __NR_read, 0, %1, %2 %endmacro %macro EscribirConsola 2 INT80 __NR_write, 1, %1, %2 %endmacro %macro Salir 0 INT80 __NR_exit, 0, 0, 0 %endmacro
Una buena práctica de programación es definir las macros y las constantes en un archivo independiente con la estención .inc. Esto es parecido a los archivos de cabecera de C.
Para incluir las macros en nuestro programa utilizamos %include "Archivo.inc".
Archivo Macros.inc
Este es el archivo que define las Constantes y Macros.
; ; Constantes ; %define __NR_exit 1 %define __NR_read 3 %define __NR_write 4 ; ; Esta es una macro generica para invocar la interrupción 80. ; Recibe 4 parametros ; %macro INT80 4 mov eax, %1 mov ebx, %2 mov ecx, %3 mov edx, %4 int 80h %endmacro ; ; Macros para Leer y Escribir en la Consola ; %macro LeerConsola 2 INT80 __NR_read, 0, %1, %2 %endmacro %macro EscribirConsola 2 INT80 __NR_write, 1, %1, %2 %endmacro ; ; Macro para dar el control al sistema ; %macro Salir 0 INT80 __NR_exit, 0, 0, 0 %endmacro
Archivo HolaMacros.S
En nuestro programa vamos a incluir el archivo Macros.inc.
; Incluimos las macros %include "Macros.inc" ; Main global main ; Datos con valor inicial section .data mensaje db 'Hola Macros!', 0xa length equ $ - mensaje ; Código section .text main: ; Escribimos 'Hola Macros!' en la consola EscribirConsola mensaje, length ; Regresamos el control al sistema Salir
$ nasm -f elf HolaMacros.S $ gcc HolaMacros.o -o HolaMacros $ ./HolaMacros Hola Macros!
One response to “Macros en NASM”
Genial, como siempre.
Un saludo