sabato 1 febbraio 2014

padnest-mpasm-structs: libreria di macro per semplificare i loop e i salti condizionati

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

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:
    movlf 0x01, REGX
    do
        incf REGX
    untilfl REGX, EQ, 0x03
    nop
Il 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
        ...
    forever
Il 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:
    movlf 0x01, REGX
    whilefl REGX, LT, 0x04
        incf REGX
    endwhile
Quando 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 REGX
Il 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
    endswitch
Si 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