Montagem - Macros
Escrever uma macro é outra maneira de garantir a programação modular em linguagem assembly.
Uma macro é uma sequência de instruções, atribuída por um nome e pode ser usada em qualquer lugar do programa.
No NASM, as macros são definidas com %macro e %endmacro diretivas.
A macro começa com a diretiva% macro e termina com a diretiva% endmacro.
A sintaxe para definição de macro -
%macro macro_name  number_of_params
<macro body>
%endmacro 
    Onde, number_of_params especifica os parâmetros numéricos, macro_name especifica o nome da macro.
A macro é chamada usando o nome da macro junto com os parâmetros necessários. Quando você precisa usar alguma sequência de instruções muitas vezes em um programa, pode colocar essas instruções em uma macro e usá-la em vez de escrever as instruções o tempo todo.
Por exemplo, uma necessidade muito comum de programas é escrever uma sequência de caracteres na tela. Para exibir uma sequência de caracteres, você precisa da seguinte sequência de instruções -
mov	edx,len	    ;message length
mov	ecx,msg	    ;message to write
mov	ebx,1       ;file descriptor (stdout)
mov	eax,4       ;system call number (sys_write)
int	0x80        ;call kernel 
    No exemplo acima de exibição de uma string de caracteres, os registros EAX, EBX, ECX e EDX foram usados pela chamada de função INT 80H. Portanto, cada vez que você precisa exibir na tela, você precisa salvar esses registros na pilha, invocar INT 80H e, em seguida, restaurar o valor original dos registros da pilha. Portanto, pode ser útil escrever duas macros para salvar e restaurar dados.
Observamos que, algumas instruções como IMUL, IDIV, INT, etc., precisam que algumas das informações sejam armazenadas em alguns registros particulares e até mesmo retornem valores em algum (s) registro (s) específico (s). Se o programa já estava usando esses registros para manter dados importantes, os dados existentes desses registros devem ser salvos na pilha e restaurados após a execução da instrução.
Exemplo
O exemplo a seguir mostra como definir e usar macros -
; A macro with two parameters
; Implements the write system call
   %macro write_string 2 
      mov   eax, 4
      mov   ebx, 1
      mov   ecx, %1
      mov   edx, %2
      int   80h
   %endmacro
 
section	.text
   global _start            ;must be declared for using gcc
	
_start:                     ;tell linker entry point
   write_string msg1, len1               
   write_string msg2, len2    
   write_string msg3, len3  
	
   mov eax,1                ;system call number (sys_exit)
   int 0x80                 ;call kernel
section	.data
msg1 db	'Hello, programmers!',0xA,0xD 	
len1 equ $ - msg1			
msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $- msg2 
msg3 db 'Linux assembly programming! '
len3 equ $- msg3 
    Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Hello, programmers!
Welcome to the world of,
Linux assembly programming!