ELEMANIA
PIC16F690 - Codice assembly nel C
Codice assembly nel C

Ci sono alcuni casi in cui è utile o necessario scrivere porzioni di codice in assembly all'interno del proprio programma C. Ciò accade in generale quando si vuole avere un completo controllo sul codice prodotto, spesso per ragioni di ottimizzazione della velocità di esecuzione o dello spazio occupato in memoria.

Una possibile soluzione a questo problema è scrivere una routine in linguaggio assembly, salvarla in un file .asm incluso nel progetto e quindi chiamare il codice di questa routine in C come se si trattasse di una funzione C. Questa soluzione, sebbene molto potente e versatile, non viene qui trattata in quanto è necessario imparare a gestire lato assembly i parametri della funzione e l'eventuale valore di ritorno.

Ci occupiamo qui invece del caso più semplice in cui si voglia semplicemente inserire una porzione di assembly all'interno di un programma in C. Un metodo è usare l'istruzione asm() (che per ovvie ragioni non fa parte del C standard) che consente di inserire una singola istruzione assembly come mostra l'esempio seguente:

void main(void)
    {
    unsigned int var = 1;
    ... // altro codice in linguaggio C

    asm("BCF 03,1" );    // una singola istruzione in assembly

    ... // altro codice in linguaggio C
    }

Una soluzione più pratica, nel caso in cui si vogliano inserire più linee di codice assembly, è quella di utilizzare le direttive #asm e #endasm come mostrato nell'esempio seguente:

void main(void)
    {
    unsigned int var = 1;
    ... // altro codice in linguaggio C

    #asm        // inizio del codice assembly

    BSF 03,5 ; setta a 1 il bit 5 di SR
    BCF 03,6 ; resetta a 0 il bit 6 di SR
    CLRF 0C ;  pulisce (azzera) il contenuto del registro (usando l'indirizzo relativo)

    #endasm    // fine del codice assembly

    ... // altro codice in linguaggio C
    }

Alcune osservazioni importanti:

E' importante anche sapere che le variabili e le funzioni dichiarate in C sono accessibili in assembly con lo stesso nome e il prefisso _ (underscore). Per esempio si consideri l'esempio seguente che fa riferimento alla variabile var definita nel sorgente C:

void main(void)
    {
    unsigned int var = 1;
    ... // altro codice in linguaggio C

    #asm        // inizio del codice assembly

    BANKSEL _var    ; seleziona il banco di appartenenza di var
    CLRF _var         ; azzera var

    #endasm    // fine del codice assembly

    ... // altro codice in linguaggio C
    }

 

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it