MPLAB X IDE v6.15无法正确汇编PIC16F877汇编程序求助
PIC16F877A汇编在MPLAB X v6.15中的编译异常解决
问题现象
- 内存摘要显示
Extra sections占用20字,但程序空间占用为0 - 反汇编代码与原程序严重不匹配,仅
GOTO语句正确 - 添加
#include <xc.inc>后,错误代码被放入EEPROM空间,程序空间仍无有效代码
原程序代码
PORTD EQU 0x08 TRISD EQU 0x88 STATUS EQU 0x03 PCLATH EQU 0x0A ORG 0 ; start at address 0 BCF PCLATH, 4 BCF PCLATH, 3 GOTO main ORG 6 main: CLRF STATUS BSF STATUS, 0x5 BCF STATUS, 0x6 CLRF TRISD loop: BCF STATUS, 0x5 BCF STATUS, 0x6 MOVLW 0xFF MOVWF PORTD MOVLW 0x00 MOVWF PORTD bcf PCLATH, 4 bcf PCLATH, 3 GOTO loop end
原构建输出
"C:\Program Files\Microchip\xc8\v2.45\pic-as\bin\pic-as.exe" -mcpu=PIC16F877A -c \ -o build/default/debug/BlinkS.o \ BlinkS.S \ -D__DEBUG=1 -mdfp="C:/Program Files/Microchip/MPLABX/v6.15/packs/Microchip/PIC16Fxxx_DFP/1.4.149/xc8" -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull -fmax-errors=20 -mwarn=0 -xassembler-with-cpp ::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage "C:\Program Files\Microchip\xc8\v2.45\pic-as\bin\pic-as.exe" -mcpu=PIC16F877A build/default/debug/BlinkS.o \ -o dist/default/debug/BlinkS.X.debug.hex \ -D__DEBUG=1 -mdfp="C:/Program Files/Microchip/MPLABX/v6.15/packs/Microchip/PIC16Fxxx_DFP/1.4.149/xc8" -msummary=+mem,-psect,-class,-hex,-file,-sha1,-sha256,-xml,-xmlfull -mcallgraph=std -Wl,-Map=dist/default/debug/BlinkS.X.debug.map -mno-download-hex ::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage ::: warning: (528) no start record; entry point defaults to zero Memory Summary: Program space used 0h ( 0) of 2000h words ( 0.0%) Data space used 0h ( 0) of 170h bytes ( 0.0%) EEPROM space used 0h ( 0) of 100h bytes ( 0.0%) Configuration bits used 0h ( 0) of 1h word ( 0.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%) Extra sections used 14h ( 20)
原反汇编内容
Disassembly Listing for BlinkS 1: ; Program 2: 3: ; processor PIC16F877A 4: 5: 6: PORTD EQU 0x08 7: TRISD EQU 0x88 8: STATUS EQU 0x03 9: PCLATH EQU 0x0A 10: 11: 12: ORG 0 13: ; start at address 0 0000 0A0A INCF PCLATH, W 14: BCF PCLATH, 4 0001 2806 GOTO 0x6 15: BCF PCLATH, 3 0002 3FFF ADDLW 0xFF 16: GOTO main 17: 18: ORG 6 19: main: 0006 08FF MOVF 0x7F, F 20: CLRF STATUS 0007 0800 MOVF INDF, W 21: BSF STATUS, 0x5 0008 0A0A INCF PCLATH, W 22: BCF STATUS, 0x6 0009 280A GOTO 0xA 23: CLRF TRISD 24: loop: 000A 3FFF ADDLW 0xFF 25: BCF STATUS, 0x5 000B 3FFF ADDLW 0xFF 26: BCF STATUS, 0x6 000C 3FFF ADDLW 0xFF 27: MOVLW 0xFF 000D 3FFF ADDLW 0xFF 28: MOVWF PORTD 000E 3FFF ADDLW 0xFF 29: MOVLW 0x00 000F 3FFF ADDLW 0xFF 30: MOVWF PORTD 0010 3FFF ADDLW 0xFF 31: bcf PCLATH, 4 0011 3FFF ADDLW 0xFF 32: bcf PCLATH, 3 0012 3FFF ADDLW 0xFF 33: GOTO loop 34: 35: end
添加#include <xc.inc>后的内存摘要
Memory Summary: Program space used 0h ( 0) of 2000h words ( 0.0%) Data space used 0h ( 0) of 170h bytes ( 0.0%) EEPROM space used 13h ( 19) of 100h bytes ( 7.4%) Configuration bits used 0h ( 0) of 1h word ( 0.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
问题根源
你使用的是PIC-AS汇编器(XC8 v2.45配套的新汇编器),但代码采用旧版MPASM语法,两者在段处理、指令解析上存在差异:
- PIC-AS默认会把未指定段的代码放入临时段(即
Extra sections),不会映射到程序空间 - 部分指令的语法解析逻辑不同,导致反汇编错乱
- 未显式声明处理器,汇编器无法正确识别寄存器映射和指令集
修正后的代码
#include <xc.inc> ; 显式声明目标处理器 PROCESSOR PIC16F877A ; 声明复位向量段,指定放入程序空间 PSECT resetvec, class=CODE, delta=2 ORG 0x00 ; 复位入口 BCF PCLATH, 4 BCF PCLATH, 3 GOTO main ; 声明主程序段,指定放入程序空间 PSECT code, class=CODE, delta=2 ORG 0x06 main: CLRF STATUS BSF STATUS, RP0 ; 用标准位名替代硬编码0x5,避免解析错误 BCF STATUS, RP1 ; 用标准位名替代硬编码0x6 CLRF TRISD loop: BCF STATUS, RP0 BCF STATUS, RP1 MOVLW 0xFF MOVWF PORTD MOVLW 0x00 MOVWF PORTD BCF PCLATH, 4 BCF PCLATH, 3 GOTO loop END
关键修正点
- 添加处理器声明:
PROCESSOR PIC16F877A告诉汇编器目标芯片,确保指令集和寄存器映射正确 - 使用
PSECT声明段:通过class=CODE标记代码段,强制汇编器将代码放入程序空间,而非临时段或EEPROM - 用寄存器位名替代硬编码:
RP0、RP1是STATUS寄存器的标准位名,比0x5、0x6更可靠,避免汇编器解析错误 - 保留
#include <xc.inc>:该头文件包含芯片的寄存器、位定义,无需手动用EQU声明,减少人为错误
项目设置验证
- 打开项目属性,确认汇编器工具链选择
xc8-pic-as而非旧版MPASM - 在
xc8-pic-as设置中,确保Processor选项正确设置为PIC16F877A - 移除不必要的编译宏(如
__DEBUG=1),避免引入额外库代码
修正后的预期结果
- 内存摘要中程序空间会显示正确的代码占用量
- 反汇编代码与原程序完全匹配
Extra sections占用消失,代码正常放入程序空间
内容的提问来源于stack exchange,提问作者John K
相关产品推荐
相关产品推荐

