Macros en NASM


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!

Posted in

One response to “Macros en NASM”

  1. Miguel
    Posted December 7, 2011 at 8:13 pm | Permalink

    Genial, como siempre.

    Un saludo

Leave a Reply