在当前 PC 0xc7 处未找到源代码行。使用程序内存视图查看指令代码反汇编

问题描述 投票:0回答:1

我是汇编语言新手,我编写了一个简单的程序来学习。我遇到了带有“goto”指令的程序计数器问题(我相信)。我使用 PIC 10f202,并在模拟器模式下使用 MPLAB v.6.15 来调试代码。这是我的代码:

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

程序从程序存储器 1F6(第 503 行)开始,指令为“goto main”。它执行所有代码行,但当到达指令“gotoloop”时,程序存储器行1FF不显示指令“gotoloop”,然后程序转到程序存储器行0c7,那里没有指令。它不会返回到预期的指令“bcf GPIO,0”。

Program memory

起初,我使用“call”指令通过返回指令来调用子程序“循环”,但我收到错误消息,表明指令返回对于该 PIC 10F202 来说是非法指令。 我有一个旧的汇编代码,以前可以使用“goto”指令,但该代码是用 MPLAB 的旧编译器编译的:MPASM。在这段代码中(使用相同的 PIC 10f202),我使用了 goto 和 call 指令,并且编译得很好。 感谢您的帮助! 多米尼克

assembly pic 8-bit
1个回答
0
投票

您使用的控制器 (PIC10F202) 是一个资源非常有限的设备。

从调用中返回的操作码只有一个,

RETLW 0x00 to 0xFF

这总是在 W 寄存器中设置一个文字值。

该控制器还有其他几个“功能”,这使得为其创建代码成为一项挑战。如:

  • 调用堆栈有两层深
  • 无打扰
  • 被调用的函数必须从 0x000 到 0x0FF 之间的地址开始

还有很多其他人,我怀疑学习使用 pic-as 工具链编写汇编代码会非常令人沮丧。

对于我专为您创建的 MPLABX 项目,请参阅:

https://github.com/dsoze1138/MPLABXv5xx_pic-as_examples/blob/master/10F202_Example_v615.X/start.S

© www.soinside.com 2019 - 2024. All rights reserved.