Esercitazioni
PIC - Assembly
|
Le macro
MPASM è un Macro-Assembler, ovvero un assemblatore in
grado di trattare macro istruzioni.
Una macro istruzione (o semplicemente macro) è un insieme di istruzioni
che vengono raccolto sotto una unica label: ogni volta che il compilatore
incontra questa label, la sostituisce con le istruzioni sottintese.
Una macro è un modo per automatizzare una azione che si esegue ripetutamente o in maniera regolare.Una
volta creata la macro, sarà possibile eseguire il codice sottinteso
illimitatamente senza la necessità di riscriverlo ogni volta.
Concettualmente è molto simile ad una funzione, può essere richiamata da eventi ed essere
parametrizzata.
Si differenza dalla subroutine in quanto quest' ultima si situa in una
determinata area della memoria programma e
richiede un accesso con una chiamata (istruzione call o rcall). Una volta
scritta, sta al programmatore il richiamarla quando occorre.
La macro, invece, viene trasformata in opcodes dal compilatore ogni volta che
esso incontra la label relativa, quindi non richiede chiamata, ma, in
compenso, può, se usata ripetutamente, impegnare una quantità maggiore di
memoria programma.
La necessità di una chiamata alla subroutine comporta la presenza di uno
stack che possa salvare gli indirizzi di ritorno; questo può essere un
problema nei piccoli microcontroller (Baseline) dove lo stack ha una ampiezza
minimale (2 livelli) e le subroutine hanno stretti limiti di posizionamento
nella memoria, dovuti alle istruzioni codificate su soli 12 bit. Un altro
problema è il passaggio di parametri alla subroutine, che deve essere
effettuato esternamente ad essa, caricando quanto richiesto in registri
dedicati.
Per queste ragioni macro e subroutine convivono normalmente in un buon
sorgente, avendo ciascuna particolarità di vantaggio e svantaggio che ne
fanno preferire l' uso in dipendenza delle circostanze.
Lo scopo delle macro, come per le subroutines, è quello di:
- facilitare il lavoro del programmatore, utilizzando elementi
predisposti, ad esempio tratti da librerie
- rendere il file sorgente più compatto, sostituendo ripetitive serie di
istruzioni con un singolo elemento
- Una macro va definita PRIMA di essere utilizzata.
- E' indicata con una label
- Può contenere chiamate a subroutines o altre macro
- Può avere una serie di parametri di ingresso
|
Viene impiegata una direttiva specifica MACRO
ENDM.
La sintassi è semplice:
label |
MACRO |
spazio/tab |
[arg0, arg1...argn] |
.... qui il contenuto della macro
.... |
spazio/tab |
ENDM |
|
Le regole essenziali sono poche:
- La label è obbligatoria e segue le regole generali delle label, come
già visto.
- La coppia di direttive MACRO-ENDM
inizia e chiude la macro. La chiusura è indispensabile.
- Sono associabili alla macro uno o più argomenti, dove sia necessario.
- Ogni macro va definita prima di poterla utilizzare.
- il richiamo della macro si effettua semplicemente inserendo la sua label
in prima colonna nel sorgente al punto voluto.
- Una macro può essere richiamata un numero illimitato di volte nel
sorgente: per ogni chiamata il compilatore scriverà la sequenza di
istruzioni sottintese.
Le macro possono essere raccolte in librerie e inserite nel sorgente con un
include.
Le macro consentono operazioni molto più complesse di quelle viste finora.
Durante le esercitazioni verranno proposti vari esempi.
Per una descrizione dettagliata delle possibilità delle macro, si rimanda al
documento DS33014F
di Microchip.
Un vantaggio tipico della macro è quello di poter accettare parametri
(argomenti).
Ad esempio
;compara un file con una costante
;salta ad una destinazione se file >= costante
cfl_jge MACRO
file, const, jump_to
movlw
const
sublw
file,w
btfsc
status, carry
goto
jump_to
ENDM
Richiamando la macro con la sua label e la serie di parametri richiesta, ad
esempio:
cfl_jge fileX, max_value, switch_off
il compilatore genererà la sequenza di istruzioni:
movlw max_value
sublw
fileX,w
btfsc
status, carry
goto
switch_off
|