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!