Cómo construir el archivo de ensamblaje más simple en MPLabX IDE 5.4

Aug 19 2020

Acabo de empezar a aprender a programar en ensamblador en MPLabX IDE 5.4. Sin conectar ningún hardware, simulador o depurador, simplemente quiero crear un archivo de código de objeto y generar un archivo de listado a partir de un archivo de ensamblaje, solo para verificar si el IDE funciona. Pero seguí recibiendo oscuros mensajes de error incluso al construir las líneas de ensamblaje más simples posibles.

Como se muestra en la figura [1 - 6] , debería tener MPLabX IDE instalado correctamente junto con la integración de XC8 (que parece empaquetar con él el compilador pic-as ensamblador u otro nombre para el ensamblador MPASM, después de luchar durante horas preguntando y buscando por qué necesito un compilador C para el código MPASM hasta que me di cuenta de que estaban incluidos). Luego probé la construcción de un archivo de ensamblaje con una sola línea de comentario y una endinstrucción. El ensamblaje se creó con éxito, pero no puedo encontrar el archivo de listado en ninguna parte (no se encontró ningún archivo *.lst buscando en todos los directorios).

Tan pronto como agrego alguna instrucción antes endde , el proceso de construcción falla como se muestra en la Figura [7] .

  1. ¿Por qué mi código ensamblador no se está construyendo?
  2. ¿Por qué mi proceso de construcción (fallido o exitoso) no generó el archivo de lista como todos los demás?

[EDITAR]
Aquí está el archivo de código ensamblador. El proyecto se generó a partir del paso [1-6]. Acabo de crear un nuevo archivo de ensamblaje ( FooFile.asm ) con tres líneas de instrucciones: org, clrw y end.

Respuestas

7 Dan1138 Aug 21 2020 at 03:59

Microchip ha hecho que sea muy difícil desarrollar aplicaciones de lenguaje ensamblador de 8 bits utilizando la última versión de MPLABX v5.40.

Para ayudar, he creado un proyecto de ejemplo PIC16F84A que puede encontrar aquí .

Este es el código fuente 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 puede, obtenga una copia de todo el proyecto MPLABX de mi repositorio git. Hay algunas cosas que debe aprender sobre la configuración de un proyecto de lenguaje ensamblador en MPLABX que Microchip aún no ha documentado con suficiente detalle.

No soy un empleado de Microchip y no podrían pagarme lo suficiente para hacer esto por ellos.

Espero que los problemas con las herramientas MPLABX se vuelvan más problemáticos a medida que las escuelas comiencen a enseñar el lenguaje ensamblador PIC en las sesiones de otoño. Mi objetivo con esta respuesta es tratar de ayudar antes de que más estudiantes no se frustren y fallen debido a problemas triviales con herramientas poco convincentes.

2 KMC Aug 19 2020 at 23:33

Las documentaciones que Microchip tiene para MPLab X y XC8 son probablemente algunas de las peores que he leído. Tuve que combinar lo que había leído de varias fuentes y, con algunas suposiciones, solo para que el ensamblador funcionara en MPLab X IDE 5.4. Así que aquí está el código ensamblador que se ensambla sin errores ni mensajes de advertencia.

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

Los tutoriales y los libros que he leído utilizan el ensamblador MPASM en lugar de su reemplazo actual, como en XC8. Con MPASM y MPLab anterior, el código ensamblador puro simplemente se compilaría. Pero con el XC8 actual y pic-as, debe comenzar incluyendo /Applications/microchip/xc8/v2.20/pic/include/xc.inc donde tiene una directiva que apunta a /Applications/microchip/xc8/v2. 20/pic/include/pic.inc que a su vez tiene una directiva que apunta a /Applications/microchip/xc8/v2.20/pic/include/ic_as_chip_select.inc que finalmente apunta a /Applications/microchip/xc8/v2.20/ pic/include/proc/pic16f84a.inc que define el 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

Por alguna razón oscura, tiene que haber un psectajuste alrededor del código ensamblador. La explicación se da así (no tengo idea de qué está hablando o por qué necesito envolver un código ensamblador como envuelvo entre paréntesis una llamada de función C):

Psects, abreviatura de secciones de programa, son contenedores que agrupan y contienen partes relacionadas del programa, aunque el código fuente de estas partes no esté físicamente adyacente en el archivo fuente, o incluso puede estar repartido en varios módulos. Son las entidades más pequeñas posicionadas por el enlazador en la memoria.

En cuanto al archivo de lista: las instrucciones para leer o generar el archivo de lista se mencionan de alguna manera en la Guía del usuario de MPLAB® X IDE (Sección 5.16 en la página 127): Window>Debugging>Output>DisassemblyListingFile . Alternativamente, el archivo de listado se puede enviar a /MyProject/disassembly/listing.disasm (¡no en el formato * .lst como sugiere el foro de Microchip o su guía!) al insertar -code=0h -Wa,-aProjectProperties /pic-asLinker/CustomLinkerOptions (no hay mención o instrucciones en cualquiera de sus guías de usuario y simplemente adivino dónde insertar qué al leer MPLAB® XC8 PIC Assembler User's Guide for Embedded Engineers) donde proporciona ejemplos de compilación bajo la línea de comando XC8. Ninguno de los archivos generados bajo el IDE proporciona todos los detalles, ¡ni siquiera muestra las direcciones vectoriales de las instrucciones!

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
 

No aceptaré mi propia respuesta. Si alguien puede ayudar a abordar mi hallazgo o explicar por qué psect está allí y cómo obtener el archivo de lista para mostrar direcciones vectoriales, aceptaré su respuesta.

[EDITAR] Para generar un archivo de lista en MPLabX 5.4 o con X8 (pis-as) CLI usando la opción -Wa,-a.

// El archivo fuente debe terminar con la extensión *.S para que el compilador procese previamente el preprocesador C $sudo pic-as -mcpu=16F84A -Wa,-a SourceFileName.S -o OutputFolderName/OutputFileName