Tutorials - PIC - Corso A&C

 

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:

  1. La label è obbligatoria e segue le regole generali delle label, come già visto.
  2. La coppia di direttive MACRO-ENDM inizia e chiude la macro. La chiusura è indispensabile.
  3. Sono associabili alla macro uno o più argomenti, dove sia necessario.
  4. Ogni macro va definita prima di poterla utilizzare.
  5. il richiamo della macro si effettua semplicemente inserendo la sua label in prima colonna nel sorgente al punto voluto.
  6. 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


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 29/07/14.