Ho realizzato questa libreria di macro che ci permetterà di gestire con estrema facilità loop e salti condizionati in MPASM.
La trovate come singolo file include (padnest-mpasm-structs-vX.x.inc) nel progetto ad essa dedicato qui: https://sourceforge.net/p/padnest/svn/HEAD/tree/mpasm/Padnest_MPASM_structs.X
La trovate come singolo file include (padnest-mpasm-structs-vX.x.inc) nel progetto ad essa dedicato qui: https://sourceforge.net/p/padnest/svn/HEAD/tree/mpasm/Padnest_MPASM_structs.X
Nel file test.asm trovate i vari casi di test che fungono anche come validi esempi di utilizzo.
Nel file della libreria trovate tutte le possibili istruzioni ben commentate.
Grazie ai blocchi strutturati la scrittura del codice ASM risulterà più semplice, elegante, leggibile e manutenibile rispetto al solito.
La libreria mette a disposizione
- i cicli do-until, do-forever, while e for-next
- i blocchi condizionati if-else-otherwise e switch-case
Do-Until (Do-Forever)
Permette di definire un blocco di istruzioni da eseguire sicuramente almeno un volta e da ripetere finchè non si verifica una determinata condizione valutata alla fine del blocco stesso.
Esempio:
L'esecuzione proseguirà poi alla linea 5.
movlf 0x01, REGX do incf REGX untilfl REGX, EQ, 0x03 nopIl loop verrà ripetuto fino a quando il valore del registro REGX non sarà uguale a 3.
L'esecuzione proseguirà poi alla linea 5.
Esempio di loop infinito:
do ... foreverIl blocco do verrà ripetuto all'infinito.
Si può comunque forzare l'uscita dal blocco do corrente utilizzando le istruzioni break e exitdo:
movlf 0x01, REGX do do ifl REGX, EQ, 0x03 exitdo endi incf REGX forever incf REGX untilfl REGX, EQ, 0x04 nop
While
Simile al do-until solo che la valutazione della condizione avviene all'inizio del blocco.
Il blocco viene pertanto eseguito solo se la condizione è vera e ripetuto fintanto che essa rimane vera:
Il blocco viene pertanto eseguito solo se la condizione è vera e ripetuto fintanto che essa rimane vera:
movlf 0x01, REGX whilefl REGX, LT, 0x04 incf REGX endwhileQuando il valore del registro REGX sarà uguale a 4 l'esecuzione del loop terminerà.
For-Next
Il classico ciclo dove si utilizza un registro come contatore:
for REGX, 1, 3 for REGY, 1, 3 incf REGZ next REGY next REGXIl registro REGZ verrà incrementato 9 volte. Anche da un ciclo for si può forzare l'uscita tramite l'istruzione break o l'istuzione exitfor.
Switch-Case
Molto utile per eseguire blocchi di istruzioni al verificarsi di una condizione potendo anche definire un comportamento di default se nessuna condizione si verifica:
switchf REGX casel 0x01 nop break casel 0x02 casel 0x03 nop break casel 0x04 casel 0x05 nop break default nop endswitchSi valuta il contenuto del registro REGX: se vale 1 si esegue il nop alla linea 3; se vale 2 o 3 si esegue il nop alla linea 7; se vale 4 o 5 si esegue il nop alla linea 11; altrimenti si esegue il nop alla linea 14.
Per altri esempi fare riferimento al file test.asm nel progetto MPLAB-X della libreria.
La libreria sarà utilizzata nei prossimi post della serie "Studio PIC 18F".Stay tuned!
ap
NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.
Nessun commento :
Posta un commento