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

PIC10F202汇编goto跳转异常及指令合法性问题求助

问题描述
  • 作为汇编新手,使用PIC 10F202芯片,在MPLAB v6.15模拟器调试简单程序时,执行goto loop指令未跳转到loop起始的bcf GPIO,0,反而跳转到无指令的0xc7地址。
  • 最初尝试用call调用loop子程序并搭配return指令,编译器提示return对PIC10F202属于非法指令。
  • 此前用旧版MPASM编译同芯片代码,goto和call指令可正常使用。
代码展示
PROCESSOR 10f202

#include <xc.inc>

; CONFIG
  CONFIG  WDTE = OFF            ; Watchdog Timer (WDT disabled)
  CONFIG  CP = OFF              ; Code Protect (Code protection off)
  CONFIG  MCLRE = OFF           ; Master Clear Enable (GP3/MCLR pin fuction is digital I/O, MCLR internally tied to VDD)

PSECT resetVect, class=CODE, delta=2
resetVect:
    PAGESEL main
    goto main
    
PSECT code, delta=2
main:
    clrf GPIO           ; clrf GPIO, F
    movlw   0b0001000       ; configure GP1 (only) as an output
    tris    GPIO
    
loop:
    bcf GPIO,0
    bsf GPIO,0
    movlw 256
    movwf 0x10
    nop
    goto loop
    
END resetVect
问题分析与解决方案

1. return指令非法的原因

PIC10F202属于小型PIC MCU,无硬件堆栈结构,本身不支持子程序调用指令call和return。旧版MPASM的"正常使用"大概率是编译错误或记忆偏差,该芯片硬件层面无法执行这类指令,只能通过goto实现跳转逻辑。

2. goto loop跳错地址的原因与修复

核心问题:程序段地址增量设置错误

代码中PSECT code, delta=2的delta=2是针对16位指令宽度的MCU设置的,但PIC10F202的指令是12位,每个指令仅占用1个程序存储器单元,delta=2会导致编译器计算标签地址时错位,最终让goto跳转到错误的0xc7地址。

修复步骤:

  • 将PSECT code, delta=2修改为PSECT code, delta=1,匹配12位指令的地址增量。
  • 修正movlw 256:PIC10F202是8位MCU,movlw仅支持0-255的立即数,256会被截断为0,可改为movlw 0xff或其他合法8位数值以实现预期延时。

修改后重新编译,模拟器中goto loop即可正确跳转到loop标签的起始位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:46:16