Comment construire le fichier d'assemblage le plus simple dans MPLabX IDE 5.4

Aug 19 2020

Je viens de commencer à apprendre le codage en assembleur dans MPLabX IDE 5.4. Sans connecter de matériel, de simulateur ou de débogueur, je veux simplement créer un fichier de code objet et générer un fichier de liste à partir d'un fichier d'assemblage - juste pour vérifier si l'IDE fonctionne. Mais je continuais à recevoir des messages d'erreur obscurs même en construisant les chaînes de montage les plus simples possibles.

Comme le montre la figure [1 - 6] , je devrais avoir l'IDE MPLabX installé correctement avec l'intégration de XC8 (qui semble emballer avec lui le compilateur d'assemblage pic-as ou un autre nom pour l'assembleur MPASM - après avoir lutté pendant des heures pour demander et chercher pourquoi j'ai besoin d'un compilateur C pour le code MPASM jusqu'à ce que je réalise qu'ils étaient groupés). J'ai ensuite testé la construction d'un fichier d'assemblage avec une seule ligne de commentaire et une endinstruction. L'assembly a été construit avec succès, mais je ne trouve nulle part le fichier de liste (aucun fichier *.lst n'a été trouvé en cherchant dans tous les répertoires).

Dès que j'ajoute une instruction avant end, le processus de construction a échoué, comme illustré à la figure [7] .

  1. Pourquoi mon code assembleur ne se construit-il pas ?
  2. Pourquoi mon processus de construction (échec ou succès) n'a-t-il pas généré le fichier de liste comme tout le monde

[EDIT]
Voici le fichier de code d'assemblage. Le projet a été généré à partir de l'étape [1-6]. Je viens de créer un nouveau fichier d'assemblage ( FooFile.asm ) avec trois lignes d'instructions - org, clrw et end.

Réponses

7 Dan1138 Aug 21 2020 at 03:59

Microchip a rendu très difficile le développement d'applications en langage d'assemblage 8 bits à l'aide de la dernière version de MPLABX v5.40.

Pour vous aider, j'ai créé un exemple de projet PIC16F84A que vous pouvez trouver ici .

Voici le code source 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

Si vous pouvez obtenir une copie de l'intégralité du projet MPLABX à partir de mon référentiel git. Il y a certaines choses que vous devez apprendre sur la configuration d'un projet de langage d'assemblage dans MPLABX que Microchip n'a pas encore documentées suffisamment en détail.

Je ne suis pas un employé de Microchip et ils ne pourraient pas me payer suffisamment pour le faire à leur place.

Je m'attends à ce que les problèmes avec les outils MPLABX deviennent plus problématiques à mesure que les écoles commencent à enseigner le langage d'assemblage PIC lors des sessions d'automne. Mon objectif avec cette réponse est d'essayer d'aider avant plus d'étudiants à ne pas être frustrés et à ne pas échouer à cause de problèmes triviaux avec des outils boiteux.

2 KMC Aug 19 2020 at 23:33

Les documentations que Microchip a pour MPLab X et XC8 sont probablement parmi les pires que j'aie jamais lues. J'ai dû mailler ce que j'ai lu à partir de plusieurs sources, et avec quelques suppositions juste pour que l'assembleur fonctionne dans MPLab X IDE 5.4. Voici donc le code d'assemblage qui s'assemble sans message d'erreur ni d'avertissement.

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

Les tutoriels et les livres que j'ai lus utilisent tous l'assembleur MPASM au lieu de son remplacement actuel, pic-as dans XC8. Avec MPASM et l'ancien MPLab, le code d'assemblage pur serait simplement construit. Mais avec XC8 et pic-as actuels, vous devez commencer par inclure /Applications/microchip/xc8/v2.20/pic/include/xc.inc où il a une directive pointant vers /Applications/microchip/xc8/v2. 20/pic/include/pic.inc qui à son tour a une directive pointant vers /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc qui pointe finalement vers /Applications/microchip/xc8/v2.20/ pic/include/proc/pic16f84a.inc qui définit le 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

Pour une raison obscure, il doit y avoir un psectenroulement autour du code d'assemblage. L'explication est donnée comme ceci (je n'ai aucune idée de quoi il parle ou pourquoi j'ai besoin d'envelopper un code assembleur comme j'enveloppe entre crochets un appel de fonction C):

Les psects (abréviation de sections de programme) sont des conteneurs qui regroupent et contiennent des parties liées du programme, même si le code source de ces parties peut ne pas être physiquement adjacent dans le fichier source, ou peut même être réparti sur plusieurs modules. Ce sont les plus petites entités positionnées par l'éditeur de liens en mémoire.

En ce qui concerne le fichier de liste : l'instruction de lire ou de sortir le fichier de liste est quelque peu mentionnée dans le Guide de l'utilisateur de MPLAB® X IDE (Section 5.16 à la page 127) : Window>Debugging>Output>DisassemblyListingFile . Alternativement, le fichier de liste peut être sorti vers /MyProject/disassembly/listing.disasm (pas au format * .lst comme le suggère le forum Microchip ou leur guide !) en insérant -code=0h -Wa,-adans ProjectProperties/pic-asLinker/CustomLinkerOptions (il n'y a aucune mention ou instructions dans l'un de leurs guides de l'utilisateur et il se trouve que je devine juste où insérer quoi en lisant le Guide de l'utilisateur de l'assembleur MPLAB® XC8 PIC pour les ingénieurs embarqués) où il fournit des exemples de compilation sous la ligne de commande XC8. Aucun des fichiers de liste générés sous l'IDE ne fournit tous les détails - il ne montre même pas les adresses vectorielles des instructions !

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
 

Je n'accepterai pas ma propre réponse. Si quelqu'un peut m'aider à répondre à ma découverte ou expliquer pourquoi psect est là et comment obtenir le fichier de liste pour afficher les adresses vectorielles, j'accepterai sa réponse.

[EDIT] Pour sortir le fichier de liste sur MPLabX 5.4 ou avec la CLI X8 (pis-as) en utilisant l'option -Wa,-a.

// Le fichier source doit se terminer par l'extension *.S pour que le compilateur prétraite le préprocesseur C $sudo pic-as -mcpu=16F84A -Wa,-a SourceFileName.S -o OutputFolderName/OutputFileName