我是新的汇编语言,我写了一个简单的程序来学习。我遇到了一个程序计数器的问题(我相信)与“后藤”指令。我使用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
1条答案
按热度按时间xiozqbni1#
您正在使用的控制器(PIC 10 F202)是一个资源非常有限的设备。
只有一个操作码从调用中返回,
RETLW 0x00 to 0xFF
这总是在W寄存器中设置一个文字值。
在这个控制器中还有其他几个“特性”,这使得为它创建代码成为一个挑战。例如:
还有很多其他的,我怀疑学习使用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。