Spesso i programmatori di linguaggi assemblativi hanno bisogno si ripetere più volte alcune sequenze di istruzioni. Un approccio per risolvere questo problema è trasformare le sequenze di istruzioni in una procedura e nel richiamarla quando è necessaria.

Infatti le macro - macroistruzioni, forniscono una tale soluzione.

Definizione, chiamata ed espansione delle macro

La definizione di una macro è un modo per assegnare un nome ad una porzione di testo. Una volta definita, possiamo scrivere il nome della macro invece della porzione di programma corrispondente.

Per esempio consideriamo la seguente porzione di assembly ( per x86 ) che scambia il contenuto delle variabili P e Q :

MOV EAX,P
MOV EBX,Q
MOV Q,EAX 
MOV P,EBX 

Se volessimo eseguire lo scambio due volte potremmo fare in questo modo :

MOV EAX,P
MOV EBX,Q
MOV Q,EAX 
MOV P,EBX 
 
MOV EAX,P
MOV EBX,Q
MOV Q,EAX 
MOV P,EBX 

Però non conviene e quindi usiamo le macro, creandone una con il nome di SWAP :

SWAP MACRO
	MOV EAX,P
	MOV EBX,Q
	MOV Q,EAX 
	MOV P,EBX
ENDM // fine macro 
// ora richiamiamo la macro 
SWAP 
SWAP 

Quando l’assemblatore incontra una definizione di macro, la salva in una tabella per poterla utilizzare successivamente. Infatti quando viene utilizzato il nome di una macro come codice operativo si dice chiamata della macro, mentre la sua sostituzione con il corpo della macro è chiamata espansione della macro ( viene fatto durante il processo assemblativo e non durante l’esecuzione ).

Non bisogna confondere le chiamate delle macro con le chiamate di procedure. La chiamata della macro è un'istruzione diretta all'assemblatore, mentre la chiamata di procedura è un'istruzione macchina inserita nel programma oggetto.

DomandaChiamata alla MacroChiamata alla Procedura
Quando è fatta la chiamata?Durante l’assemblaggioDurante l’esecuzione
Il corpo è inserito nel programma oggetto ogni volta che appare la chiamata?No
L’istruzione per la chiamata di procedura è inserita nel programma oggetto e successivamente eseguita?No
Occorre utilizzare una istruzione di ritorno dopo aver eseguito una chiamata?No
Quante copie del corpo appaiono nel programma oggetto?Tante quante sono le chiamate1

Macro con parametri

Possiamo avere anche la necessità di utilizzare dei parametri, quindi la definizione di una macro può includere dei parametri formali che poi quando la macro verrà chiamata, verranno sostituiti dai parametri attuali. Consideriamo l’esempio di swap di prima, ma modifichiamolo in modo da poter fare lo swap tra variabili diverse e non sempre fisse P e Q :

// swap tra P e Q
MOV EAX,P
MOV EBX,Q
MOV Q,EAX 
MOV P,EBX
 
// swap tra R e S
MOV EAX,R
MOV EBX,S
MOV S,EAX 
MOV R,EBX

ora definiamo una macro di nome CHANGE con 2 parametri :

CHANGE MACRO P1,P2 
	MOV EAX,P1
	MOV EBX,P2
	MOV P2,EAX 
	MOV P1,EBX 
 EDM 
 
 CHANGE P,Q // passiamo P e Q come parametri 
 CHANGE R,S // passiamo R e S come parametri 

Processo di assemblaggio