Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


Il $ 

Un avviso riguarda l' uso del $ al posto di una label. 

Questa pratica, comune a chi programma con gli Assembly da lungo tempo, non è per nulla inelegante, ma spesso è ben poco sensata. 

In passato era necessaria per ridurre il volume dei sorgenti, evitando di usare label utili in un solo punto, dato che si lavorava con macchine dotate di risorse di memoria minime e, inizialmente, senza neppure unità di storage diverse da nastri o floppy.

Oggi, la potenza dei sistemi di sviluppo (leggi personal computer), anche nel caso dei più anzianotti, è tale che l' assemblaggio di un sorgente ben impegnativo non porta via più di qualche secondo o frazione di secondo, mentre non c'è sicuramente problema di spazio per i testi ASCII dei sorgenti. Quindi un aumento di volume di questi dovuto ad un numero maggiore di label è del tutto irrilevante.

Anche perchè va  considerato che le istruzioni dei mid range sono a 1 byte mentre quelle degli enhanced sono a 2 se non a 4 bytes; quindi un $-1 , per funzionare, deve diventare un $-2 , se non un $-4, a seconda di cosa si deve saltare. Dato che l' aggiunta di una label non porta alcun problema al compilatore, non ha sempre senso perdere tempo a calcolare se si tratta di istruzioni a 2 o 4 byte con il rischio di sbagliare quando questo lavoro lo fa per noi l' Assembler .

Comunque è possibilissimo che se ne senta la necessità in contesti di successivi test per i quali creare label locali monouso può essere considerato pesante.

Ad esempio una sequenza per PIC 16 del genere:

   movf    TEMP1, w
   skpnc    
    incfsz TEMP1, w
   addwf   ACC1, f
   movf    TEMP2, w
   skpnc   
    incfsz TEMP2, w
   addwf   ACC2, f

   

può essere traslata convenientemente per PIC 18, senza creare nuove lablel,  con:

   movf    TEMP1, w
   bnc     $+4
    incfsz TEMP1, w
   addwf   ACC1, f
   movf    TEMP2, w
   bnc     $+4
    incfsz TEMP2, w
   addwf   ACC2, f

dove si eliminano gli pseudo-opcodes skpc con l' opcodes  bnc e non si creano label "monouso" con l' impiego del simbolo $ .  Oppure più semplicemente con:

   movf    TEMP1, w
   btfsc   STATUS,C
    incfsz TEMP1, w
   addwf   ACC1, f
   movf    TEMP2, w
   btfsc   STATUS,C
    incfsz TEMP2, w
   addwf   ACC2, f

  

Nel caso si voglia comunque usare il $, occorre prestare attenzione che, nel caso di:

   skpnc   
    goto   next1
   addwf   ACC1, f

   

il salto deve diventare:

   bnc     $+6        ; e non $+4
    goto   next1
   addwf   ACC1, f   

   

dato che goto è a 4 bytes !

Va comunque ricordato che l' uso di $ , dove non è funzionale, rende estremamente più complicata (e antipatica) la rilettura dei listati, cosa che non succede con l' introduzione di una label.

 


Azione

La soluzione ideale è quella di eliminare l' uso del $ e sostituirlo con label.

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.