Come costruire il file assembly più semplice in MPLabX IDE 5.4

Aug 19 2020

Ho appena iniziato a imparare la codifica in assembly in MPLabX IDE 5.4. Senza collegare alcun hardware, simulatore o debugger, voglio semplicemente creare un file di codice oggetto e generare un file di elenco da un file di assemblaggio, solo per verificare se l'IDE funziona. Ma continuavo a ricevere oscuri messaggi di errore anche dalla costruzione delle linee di assemblaggio più semplici possibili.

Come mostrato nella figura [1 - 6] , dovrei avere l'IDE MPLabX installato correttamente insieme all'integrazione di XC8 (che sembra impacchettare con esso il compilatore pic-as assembly o un altro nome per l'assemblatore MPASM - dopo aver lottato per ore chiedendo e cercando perché ho bisogno di un compilatore C per il codice MPASM finché non mi sono reso conto che erano in bundle). Ho quindi testato la creazione di un file assembly con una singola riga di commento e endun'istruzione. L'assembly è stato compilato correttamente, ma non riesco a trovare da nessuna parte il file di elenco (non è stato trovato un file *.lst cercando in tutte le directory).

Non appena aggiungo qualsiasi istruzione prima end, il processo di costruzione fallisce come mostrato nella Figura [7] .

  1. Perché il mio codice assembly non viene compilato?
  2. Perché il mio processo di costruzione (fallito o riuscito) non ha generato il file di elenco come tutti gli altri

[EDIT]
Ecco il file del codice assembly. Il progetto è stato generato dalla fase [1-6]. Ho appena creato un nuovo file assembly ( FooFile.asm ) con tre righe di istruzioni: org, clrw e end.

Risposte

7 Dan1138 Aug 21 2020 at 03:59

Microchip ha reso molto difficile lo sviluppo di applicazioni in linguaggio assembly a 8 bit utilizzando l'ultima versione di MPLABX v5.40.

Per aiutare ho realizzato un progetto di esempio PIC16F84A che puoi trovare qui .

Questo è il codice sorgente di pic-as(v2.20):

    ;
    ; File:     main.S
    ; Target:   PIC16f84A
    ; Author:   dan1138
    ; Date:     2020-08-20
    ; Compiler: pic-as(v2.20)
    ; IDE:      MPLABX v5.40
    ;
    ; Description:
    ;
    ;   Example project for the PIC16F84A controller using the pic-as(v2.20) tool chain.
    ;
    ; Add this line in the project properties box, pic-as Global Options -> Additional options: 
    ;   -Wa,-a -Wl,-pPor_Vec=0h,-pIsr_Vec=4h
    ;
    ;                           PIC16F84A
    ;                   +----------:_:----------+
    ;             <>  1 : RA2               RA1 : 18 <> 
    ;             <>  2 : RA3               RA0 : 17 <> 
    ;             <>  3 : RA4/T0CKI        OSC1 : 16 <- 4MHz crystal
    ;    ICSP_VPP ->  4 : MCLR             OSC2 : 15 -> 4MHz crystal     
    ;         GND ->  5 : GND               VDD : 14 <- 5v0
    ;             <>  6 : RB0/INT       PGD/RB7 : 13 <> ICSP_PGD
    ;             <>  7 : RB1           PGC/RB6 : 12 <> ICSP_PGC
    ;             <>  8 : RB2               RB5 : 11 <> 
    ;             <>  9 : RB3               RB4 : 10 <> 
    ;                   +-----------------------:
    ;                            DIP-18

        PROCESSOR   16F84A
        PAGEWIDTH   132
        RADIX       DEC

    #include <xc.inc>

    ; PIC16F84A Configuration Bit Settings

     config FOSC = HS        ; Oscillator Selection bits (HS oscillator)
     config WDTE = OFF       ; Watchdog Timer (WDT disabled)
     config PWRTE = OFF      ; Power-up Timer Enable bit (Power-up Timer is disabled)
     config CP = OFF         ; Code Protection bit (Code protection disabled)

      skipnc  MACRO
        btfsc   STATUS,STATUS_C_POSITION
      ENDM

      skipnz  MACRO
        btfsc   STATUS,STATUS_Z_POSITION
      ENDM
    ;
    ; Power-On-Reset entry point
    ;
        PSECT   Por_Vec,global,class=CODE,delta=2
        global  resetVec
    resetVec:
        PAGESEL main                ;jump to the main routine
        goto    main

    ;
    ;   Data space use by interrupt handler to save context
        PSECT   Isr_Data,global,class=RAM,space=1,delta=1,noexec
    ;
        GLOBAL  WREG_save,STATUS_save
    ;
    WREG_save:      DS  1
    STATUS_save:    DS  1
    PCLATH_save:    DS  1
    ;
    ;   Interrupt vector and handler
        PSECT   Isr_Vec,global,class=CODE,delta=2
        GLOBAL  IsrVec
    ;
    IsrVec:
        movwf   WREG_save
        swapf   STATUS,W
        movwf   STATUS_save
        movf    PCLATH,W
        movwf   PCLATH_save
    ;
    IsrHandler:
    ;
    IsrExit:
        movf    PCLATH_save,W
        movwf   PCLATH
        swapf   STATUS_save,W
        movwf   STATUS
        swapf   WREG_save,F
        swapf   WREG_save,W
        retfie                      ; Return from interrupt
        

    ;objects in bank 0 memory
        PSECT   MainData,global,class=RAM,space=1,delta=1,noexec
    max:    DS      1               ;reserve 1 byte for max
    tmp:    DS      1               ;reserve 1 byte for tmp

    /* find the highest PORTB value read, storing this into the object max */
        PSECT   MainCode,global,class=CODE,delta=2
    main:
        BANKSEL TRISB               ;starting point
        movlw   0xFF
        movwf   BANKMASK(TRISB)     ;
        BANKSEL max
        clrf    BANKMASK(max)
    loop:
        BANKSEL PORTB               ;read and store port value
        movf    BANKMASK(PORTB),w
        BANKSEL tmp
        movwf   BANKMASK(tmp)
        subwf   max,w               ;is this value larger than max?
        skipnc
        goto    loop                ;no - read again
        movf    BANKMASK(tmp),w     ;yes - record this new high value
        movwf   BANKMASK(max)
        goto    loop                ;read again
        END     resetVec

Se puoi, per favore, prendi una copia dell'intero progetto MPLABX dal mio repository git. Ci sono alcune cose che devi imparare sull'impostazione di un progetto in linguaggio assembly in MPLABX che Microchip non ha ancora documentato in modo sufficientemente dettagliato.

Non sono un dipendente se Microchip e loro non potrebbero pagarmi abbastanza per farlo per loro.

Mi aspetto che i problemi con gli strumenti MPLABX diventino più un problema quando le scuole inizieranno a insegnare il linguaggio assembly PIC nelle sessioni autunnali. Il mio obiettivo con questa risposta è cercare di aiutare prima che più studenti non si sentano frustrati e falliscano a causa di problemi banali con strumenti scadenti.

2 KMC Aug 19 2020 at 23:33

Le documentazioni che Microchip ha per MPLab X e XC8 sono probabilmente tra le peggiori che abbia mai letto. Ho dovuto combinare ciò che ho letto da più fonti e con qualche ipotesi solo per far funzionare l'assembler in MPLab X IDE 5.4. Quindi ecco il codice assembly che viene assemblato senza errori o messaggi di avviso.

PROCESSOR 16F84A
#include <xc.inc>
PSECT   code
        org     00
loop:   clrw
        end     loop

Tutorial e libri che ho letto tutti usano l'assemblatore MPASM invece della sua attuale sostituzione, pic-as in XC8. Con MPASM e il vecchio MPLab, il codice assembly puro verrebbe semplicemente creato. Ma con l'attuale XC8 e pic-as, devi iniziare includendo /Applications/microchip/xc8/v2.20/pic/include/xc.inc dove ha una direttiva che punta a /Applications/microchip/xc8/v2. 20/pic/include/pic.inc che a sua volta ha una direttiva che punta a /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc che alla fine punta a /Applications/microchip/xc8/v2.20/ pic/include/proc/pic16f84a.inc che definisce il PSECT :

psect udata,class=RAM,space=SPACE_DATA,noexec
psect udata_bank0,class=BANK0,space=SPACE_DATA,noexec
psect code,class=CODE,space=SPACE_CODE,delta=2
psect data,class=STRCODE,space=SPACE_CODE,delta=2,noexec
psect edata,class=EEDATA,space=SPACE_EEPROM,delta=2,noexec

Per qualsiasi oscura ragione, ci deve essere un psectwrapping attorno al codice assembly. La spiegazione è data come questa (non ho idea di cosa stia parlando o perché ho bisogno di avvolgere un codice assembly come se facessi il wrapping di una chiamata di funzione C):

I psect, abbreviazione di sezioni di programma, sono contenitori che raggruppano e contengono parti correlate del programma, anche se il codice sorgente di queste parti potrebbe non essere fisicamente adiacente nel file sorgente o potrebbe persino essere distribuito su più moduli. Sono le entità più piccole posizionate dal linker in memoria.

Per quanto riguarda il file di elenco: l'istruzione per leggere o emettere il file di elenco è in qualche modo menzionata nella Guida per l'utente di MPLAB® X IDE (Sezione 5.16 a pagina 127): Window>Debugging>Output>DisassemblyListingFile . In alternativa, il file dell'elenco può essere emesso in /MyProject/disassembly/listing.disasm (non nel formato * .lst come suggerisce il forum di Microchip o la loro guida!) inserendo -code=0h -Wa,-ain ProjectProperties/pic-asLinker/CustomLinkerOptions (non c'è menzione o istruzioni in una qualsiasi delle loro guide per l'utente e mi capita di indovinare dove inserire cosa leggendo MPLAB® XC8 PIC Assembler User's Guide for Embedded Engineers) dove fornisce esempi di compilazione sotto la riga di comando XC8. Nessuno dei file di elenco generati nell'IDE fornisce tutti i dettagli: non mostra nemmeno gli indirizzi vettoriali delle istruzioni!

Disassembly Listing for FooProject
Generated From:
/Users/*******/Desktop/Foo/dist/default/production/Foo.production.elf


---  /Users/*******/Desktop/Foo/FooFile.asm  ------------------------------------------------------------
                                                  1:     PROCESSOR 16F84A
                                                  2:     #include <xc.inc>
                                                  3:     PSECT code
                                                  4:         ; a commend
                                                  5:        org     00
01FF  0103     CLRW                               6:     loop:  clrw
                                                  7:        end     loop
 

Non accetterò la mia risposta. Se qualcuno può aiutare a indirizzare la mia scoperta o spiegare perché psect è lì e come ottenere il file di elenco per mostrare gli indirizzi vettoriali, accetterò la sua risposta.

[MODIFICA] Per generare il file di elenco su MPLabX 5.4 o con CLI X8 (pis-as) utilizzando l'opzione -Wa,-a.

// Il file di origine deve terminare con l'estensione *.S affinché il compilatore possa preelaborare il preprocessore C $sudo pic-as -mcpu=16F84A -Wa,-a SourceFileName.S -o OutputFolderName/OutputFileName