assembly 在当前PC 0xc7上找不到源代码行,使用程序内存视图查看指令代码反汇编

xa9qqrwz  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(69)

我是新的汇编语言,我写了一个简单的程序来学习。我遇到了一个程序计数器的问题(我相信)与“后藤”指令。我使用PIC 10 F202和我使用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

字符串
程序在程序存储器1F 6(行503)处以指令“后藤main”开始。它执行所有代码行,但当它到达指令“后藤循环”时,程序存储器行1FF不显示指令“后藤循环”,然后程序转到没有指令的程序存储器行0 c7。它不返回到预期的指令“bcf GPIO,0”。
Program memory
起初我使用“call”指令调用子例程“loop”并返回指令,但我收到错误消息,该指令返回是此PIC 10 F202的非法指令。我有一个旧的汇编代码,以前使用“后藤”指令,但此代码是使用MPLAB的旧编译器编译的:MPASM。在这段代码中(使用相同的PIC 10 f202)我使用了后藤和调用指令,它编译得很好。感谢帮助!Dominique

xiozqbni

xiozqbni1#

您正在使用的控制器(PIC 10 F202)是一个资源非常有限的设备。
只有一个操作码从调用中返回,RETLW 0x00 to 0xFF
这总是在W寄存器中设置一个文字值。
在这个控制器中还有其他几个“特性”,这使得为它创建代码成为一个挑战。例如:

  • 调用堆栈有两层深
  • 无中断
  • 被调用的函数必须开始于0x 000和0x 0 FF之间的地址

还有很多其他的,我怀疑学习使用pic-as工具链编写汇编代码将非常令人沮丧。
对于我为您创建的MPLABX项目,请参阅:
https://github.com/dsoze1138/MPLABXv5xx_pic-as_examples/blob/master/10F202_Example_v615.X/start.S
在你的问题中,你说:
我有一个旧的汇编代码,以前的工作与“后藤”指令,但这段代码是编译与旧的编译器从MPLAB:MPASM。在这段代码(使用相同的PIC 10 F202),我使用后藤和调用指令,它编译罚款。
使用pic-as工具构建代码时失败的原因有点复杂,我会尽量简短。它涉及到这个特定的控制器系列如何跟踪内部振荡器的工厂校准值。
Microchip将校准值作为MOVLW n操作码写入程序存储器空间的最后一个指令字。当应用程序在此位置找到指令时,它将被设备编程工具用出厂校准值覆盖。
这对你来说意味着你的应用程序不应该使用这个位置。正如你所看到的,你的应用程序的最后一条指令是GOTO,它被覆盖了,因为它位于PIC 10 F202控制器的地址0x 1FF。

相关问题