| 
    
      
        | 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 erichiede 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 librerierendere 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 labelPuò contenere chiamate a subroutines o altre macroPuò 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_tomovlw  
  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_valuesublw  
  fileX,w
 btfsc  
  status, carry
 goto   
  switch_off
 
  
 |