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.
| Domanda | Chiamata alla Macro | Chiamata alla Procedura |
|---|---|---|
| Quando è fatta la chiamata? | Durante l’assemblaggio | Durante l’esecuzione |
| Il corpo è inserito nel programma oggetto ogni volta che appare la chiamata? | Sì | No |
| L’istruzione per la chiamata di procedura è inserita nel programma oggetto e successivamente eseguita? | No | Sì |
| Occorre utilizzare una istruzione di ritorno dopo aver eseguito una chiamata? | No | Sì |
| Quante copie del corpo appaiono nel programma oggetto? | Tante quante sono le chiamate | 1 |
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,EBXora 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 