Cómo construir el archivo de ensamblaje más simple en MPLabX IDE 5.4
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 end
instrucció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 end
de , el proceso de construcción falla como se muestra en la Figura [7] .
- ¿Por qué mi código ensamblador no se está construyendo?
- ¿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
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.
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 psect
ajuste 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,-a
ProjectProperties /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
