You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPLAB X反汇编PIC固件编译报错:程序空间不足求助

问题描述

我正在开展首个逆向工程项目,已从Delonghi Dedica EC685咖啡机的PIC16F1938处理器中提取HEX格式的原厂固件。通过MPLabX将固件写入模拟器内存,导出反汇编输出并修正寄存器名称后得到汇编文件。但使用MPLab X IDE中的pic-as编译该文件时,出现程序空间不足的错误提示,这和固件本来就适配该设备的事实矛盾。我是资深软件工程师,但刚接触PIC汇编,恳请协助解决。

编译报错详情
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'E:/Development/Pic/Pic16f1938_test.X'
make  -f nbproject/Makefile-default.mk dist/default/production/Pic16f1938_test.X.production.hex
make[2]: Entering directory 'E:/Development/Pic/Pic16f1938_test.X'
"C:\Program Files\Microchip\xc8\v2.36\pic-as\bin\pic-as.exe" -mcpu=PIC16F1938 -c \
-o build/default/production/newpic_8b_asm_func.o \
newpic_8b_asm_func.S \
  -mdfp="C:/Program Files/Microchip/MPLABX/v6.10/packs/Microchip/PIC12-16F1xxx_DFP/1.4.213/xc8"  -msummary=+mem,+psect,+class,+hex,-file,-sha1,-sha256,-xml,-xmlfull -fmax-errors=20 -mwarn=0 -xassembler-with-cpp
"C:\Program Files\Microchip\xc8\v2.36\pic-as\bin\pic-as.exe" -mcpu=PIC16F1938 build/default/production/newpic_8b_asm_func.o \
-o dist/default/production/Pic16f1938_test.X.production.hex \
  -mdfp="C:/Program Files/Microchip/MPLABX/v6.10/packs/Microchip/PIC12-16F1xxx_DFP/1.4.213/xc8"  -msummary=+mem,+psect,+class,+hex,-file,-sha1,-sha256,-xml,-xmlfull -mcallgraph=std -Wl,-Map=dist/default/production/Pic16f1938_test.X.production.map -mdownload-hex
:0:: error: (1347) can't find 0x2943 words (0x2943 withtotal) for psect "code" in class "CODE" (largest unused contiguous range 0x800)
Non line specific message::: advisory: (1493) updated 32-bit floating-point routines might trigger "can't find space" messages appearing after updating to this release; consider using the smaller 24-bit floating-point types
:0:: warning: (528) no start record; entry point defaults to zero
(908) exit status = 1
nbproject/Makefile-default.mk:121: recipe for target 'dist/default/production/Pic16f1938_test.X.production.hex' failed
make[2]: Leaving directory 'E:/Development/Pic/Pic16f1938_test.X'
nbproject/Makefile-default.mk:85: recipe for target '.build-conf' failed
make[1]: Leaving directory 'E:/Development/Pic/Pic16f1938_test.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [dist/default/production/Pic16f1938_test.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
解决思路
  • 修正psect与内存配置:反汇编生成的代码可能未正确指定PIC16F1938的程序内存分区。PIC16F1938有16KB(8192字)程序空间,但pic-as默认链接配置可能未启用全部内存,或psect定义错误。手动在汇编开头添加正确的psect声明:
    psect code,class=CODE,delta=2
    
    同时在MPLabX项目设置的Linker->Memory Model中,确认配置适配PIC16F1938,或手动指定完整内存范围。
  • 恢复原始地址映射:模拟器导出的反汇编可能丢失了原始固件的地址信息,导致编译器将所有代码挤入低地址段引发冲突。确保汇编文件代码段地址与原厂HEX一致,比如在代码开头用org指令指定起始地址(如org 0x0000),其他段也对应原始地址。
  • 禁用冗余自动代码:pic-as可能自动添加初始化代码、浮点库(即使未用到),参考报错里的浮点库提示,在编译参数中添加-mno-fp禁用浮点支持,或在项目设置中关闭自动添加的启动代码。
  • 检查寄存器修正与配置位:修正寄存器名称时可能误改了内存相关伪指令,或__CONFIG指令配置了错误的内存保护位,导致部分程序空间被锁定。核对汇编中的设备配置指令,确保未限制内存使用。
  • 对比原厂HEX验证地址:用hex编辑器查看原厂HEX的最大地址,确认其在PIC16F1938的内存范围(0x0000到0x1FFF)内,同时对比编译生成的HEX地址分配,定位是否存在地址重叠或分配错误。

内容的提问来源于stack exchange,提问作者Crog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:25:05