Esercitazioni
PIC - Assembly
|
La scrittura del sorgente
La scrittura del sorgente Assembly (e questo vale per qualsiasi linguaggio) è anche un fatto formale e il mantenere
una certa struttura consente notevoli vantaggi rispetto ad una scrittura
disordinata.
Li definiamo "linguaggi" proprio perchè, come la lingua parlata e
scritta, hanno una sintassi ed una ortografia, che, per quanto possano essere
semplici, sono da rispettare con assoluta precisione: come se a scuola,
sbagliando ortografia e sintassi, l' insegnante ci avrebbe dato un cattivo
voto, anche qui un sorgente il cui testo non risponde alle regole del
linguaggio sarà respinto dal compilatore, con una lista degli errori commessi
e la mancata produzione del file oggetto.
Dunque è opportuno, già dall' inizio, adeguarsi ad una scrittura ordinata
e sensata, evitando quegli errori che rendono poi pesante la correzione del
sorgente. Sfortunatamente si trovano in rete molti cattivi esempi di
programmazione Assembly (e non solo...); in generale, si tratta di scheletriche liste di istruzioni in cui
i commenti sono praticamente assenti,
rendendo penosa la lettura e difficile la comprensione, mentre si utilizzano solo molto parzialmente le possibilità offerte dall'
Assembler.
Tra i problemi principali vogliamo citare:
- la mancanza di una
qualsiasi forma: un sorgente privo di una forma logica nella sua scrittura impedisce di
realizzare un lavoro ordinato ed efficace e rende difficile, se on
impossibile, la rilettura del testo durante la correzione degli errori (debug)
- la mancanza di commenti utili a capire cosa e
come si sta facendo: il problema maggiore nella programmazione Assembly è l'
inadeguatezza dei commenti, elemento chiave di un sorgente che sia auto
documentante, ma sopratutto comprensibile. Non solo per altri che lo
debbano leggere, ma anche per se stessi: qualunque programmatore sa che
quanto ha scritto, se non adeguatamente commentato, gli risulterà
difficilmente comprensibile a distanza di tempo, nonostante l' abbia
scritto lui stesso.Non parliamo poi di quando sia necessario apportare
modifiche al programma, riutilizzarne parti o ricercare le cause di mal
funzionamenti.
- l' uso smodato di valori assoluti: l' Assembly nasce proprio per evitare per quanto possibile l' uso di
valori assoluti. Se è ben vero che in Assembly trattiamo a livello di
registri, di bit e bytes, è anche vero che il linguaggio nasce proprio
per evitare di citare valori esadecimali o binari, sostituendoli con
simboli (label) mnemonici, che consentono una ben più immediata
comprensione e gestione.
- la configurazione
lasciata al programma di gestione del dispositivo di programmazione o
espressa in esadecimale : in questo ricade anche la configurazione iniziale dell' hardware
del microcontroller: non si tratta di un elemento secondario, ma di
una base da cui dipende poi il corretto svolgimento del programma. E' ben
vero che nella memoria del microcontroller i Configuration
Bits si trovano sotto forma binaria, ma nel momento di determinarli l'
uso di valori binari è assurdo, in quanto nasconde quali siano le
impostazioni programmate.
La scrittura sotto forma di testo, che poi sarà interpretata dal
compilatore, è invece di immediata comprensione
- l' inserimento di comandi dell' Assembler non giustificati, come
Errorlevel -302 e simili: l'Assembler fornisce numerose funzioni (direttive), dalla formattazione
del file lista (file .lst) ottenuto dalla compilazione, alla gestione di
memoria, all' aggiunta di pseudo istruzioni o ad automatismi di aiuto al
programmatore. E', purtroppo, normale trovare in rete esempi in cui questi
comandi da una una parte sono abusati e dall' altra restano in gran parte
inutilizzati. Questa mancanza di conoscenza delle funzioni messe a
disposizione dall' Assembler non è certo un aiuto per il principiante.
- l' uso del simbolo $ e l' uso limitato di simboli,
macro, subroutine: Assembly è un linguaggio simbolico, ma i simboli hanno valori e
funzioni ben precise ed il loro uso non può essere nè casuale, nè
eccessivo e neppure inadeguato. Un testo sorgente ben strutturato consente
spesso di poter essere riutilizzato anche in altre situazioni ed è la
base per realizzare librerie. L' idea di scrivere in modo modulare,
sfruttando subroutine, macro, librerie è la chiave per poter realizzare
senza eccesso di fatica programmi via via più complessi.
- l' assenza di modularità: la mancanza di forma è causa di
mancanza di modularità. macro, subroutine, librerie, sono elementi
chiave della programmazione e consentono, oltre ad una maggiore
efficacia della scrittura, la possibilità di riutilizzare quanto scritto,
riportandolo in altre occasioni senza la necessità di scrivere
nuovamente. Una struttura modulare è l' unica via per affrontare sorgenti
di una certa complessità.
Se avete già iniziato con una forma poco corretta di Assembly,
consigliamo di adottare da subito una forma rigorosa che non è
pedanteria, ma necessità.
Spendiamo, dunque, un bel po' di parole per cercare di fornire una base di
partenza abbastanza solida.
Anche se per vari esercizi proposti la loro semplicità è tale da non
richiedere molti "fronzoli", ugualmente riteniamo sia necessario
anche in questi casi attenersi strettamente alle regole di una buona
programmazione. In caso contrario, la
mancanza di un metodo ci farà trovare in enormi difficoltà una volta si
voglia affrontare programmi più complessi.
|