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. |
|