Indirizzi assoluti e simboli
Sempre in questo ambito, va stigmatizzato l' uso dissennato che alcuni fanno
degli indirizzi assoluti.
I PIC ricevono da MPASM un particolare aiuto
sotto forma
di numerosi automatismi che semplificano il lavoro del programmatore, a patto,
però , che si scriva con la buona norma di utilizzare mnemonici e simboli
piuttosto che valori assoluti.
La pessima e stupidissima abitudine di usare
indirizzi assoluti e non simbolici fa si che , a parte l' illeggibilità del
sorgente, esso sia portabile solo con grandissima fatica quando le risorse
del chip sono differenti.
Ad esempio, è comune trovare nei sorgenti dei PIC righe tipo:
Una cosa del genere, sarà anche carina, ma non spiega per niente quello che
sta accadendo !
Questo è un palese, e purtroppo comune, esempio di "mala programmazione"
, che rende il sorgente per
niente
trasferibile da PIC16 a 18 (oltre che praticamente illeggibile) !!
Le ragioni di una simile mala scrittura derivano dalla disponibilità,
all'inizio delle programmazione Assembly, di strumenti di sviluppo primitivi e
dalle prestazioni limitate. Sfortunatamente, nel campo hobbistico, la presenza
di esempio basati su questi sistemi primitivi e obsoleti ha fatto proliferare
esempi come quello presentato.
Alla luce dello stato dell'arte dell'Assembly, le due righe contengono tre gravissime scorrettezze :
- non viene usato lo mnemonico per il registro di STATUS, sostituito dal suo indirizzo
assoluto (03 ) , il che rende impossibile
trasferire l' istruzione ad un processore il cui STATUS non si trovi all'
indirizzo 03, oltre che richiede al lettore di sapere che all' indirizzo 03h si
trova il registro di STATUS. Scrivendo la label STATUS tutto sarebbe stato
immediatamente chiaro.
- similmente non viene usato lo mnemonico per il flag carry, sostituito con la sua
posizione come bit nel registro di status, il che rende estremamente
difficoltoso capire di cosa si tratti , oltre a ritrovarsi nella condizione di
cui sopra. Sarebbe bastato scrivere la lettera C per avere tutto immediatamente
chiaro.
- viene usato $ al posto di una label, il che rende impossibile trasferire
la riga ad un processore il cui "passo" delle istruzioni sia
differente
La non-portabilità di una simile scrittura è immediata. Infatti :
- nei PIC18F lo STATUS non
si trova a 0x03.
- come visto prima, la scorretta abitudine di utilizzare il simbolo $
porta al completo fallimento del
goto in ambiente PIC18.
Scrivendola in modo decente come:
test btfsc STATUS, C
goto test |
le cose cambiano parecchio : non si è sicuramente fatto alcuna fatica in
più rispetto a prima, nè il listato sorgente resta appesantito, ma, a parte che ora si capisce al primo colpo cosa
si sta chiedendo di fare al processore, la prima barbara e analfabeta scrittura deve essere per forza
modificata per la portabilità,
mentre la seconda non richiede alcuna modifica per essere eseguita identicamente su un
PIC16 o un PIC18.
Azione
La soluzione ideale è quella di utilizzare le
label del file .INC relativo al processore usato e, in generale,
abolire ogni riferimento assoluto e sostituirlo con label. |
|