gpt4 book ai didi

c - MPLAB/XC8 不能在ASM 中跳转?

转载 作者:行者123 更新时间:2023-12-04 12:51:05 25 4
gpt4 key购买 nike

我有一个混合 C 和汇编的 PIC18F25K50 项目;我想做的大部分事情我都可以在 Assembly 中轻松管理(并且必须提高效率),但是我更关心开发的易用性的某些部分使用 C。我实际上有几个,我一直遇到同样的问题:我无法使用 ASM 跳转到标签。每个要跳转的函数——CALLGOTOBNC 等等——如果给定标签,将 PC 设置为某个随机值,都会失败- but-consistent 值,其中没有指令,导致程序挂起。使用地址可以正常工作:BC $+4 跳过下一行。

一个不起作用的例子是:

#asm
_waitUS:
GLOBAL _waitUS
waitLoop:
//12 cycles = 1 microsecond:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ WREG, F, ACCESS
GOTO waitLoop
RETURN
#endasm

void main() {
//DEBUG:
waitUS(6);
}

现在,这可能无法正常工作,我恳求您关注跳跃问题 - 这仍在原型(prototype)设计中,因为我什至无法调用函数。该程序编译没有问题。

一旦调用 waitUS(6),PC 就会从 - 在我的例子中 - 0x7C96 跳转到 0x52。将 C 调用换成 MOVLW 6; CALL _waitUS 以完全相同的方式中断。

如果我严格使用 C 来调用/跳转(就像我在之前的项目中必须做的那样),它会工作正常,并弄清楚它的去向。

几周来我一直在寻找这个问题的答案,但仍然没有看到其他人有这个问题,即使我做的每个项目(包括记事本中的纯文本,通过命令行编译)都有完全相同的问题。这到底是怎么回事?

编辑:发现程序内存 View 后,我能够更好地了解它在做什么。编译器确实知道函数在哪里,并且它试图跳转到正确的位置。显然,CALL 只是不知道它要去哪里。

例子:地址 0x7C92 包含 CALL 0x2044, 0。这正是它应该做的,这就是所需功能的起点。然而,在运行该指令时,PC 被更改为 0x205E,缺少一半的功能。

自作聪明,我决定在函数的标签后添加几个 NOP,将真正的代码与 0x205E 对齐。不幸的是,似乎任何变化都会改变其不可预测的跳跃着陆点,然后它着陆在 0x2086 而不是。

顺便说一句,当它开始在随机位置运行时,它通常会遇到 GOTO - 并且它按预期跳转到指定位置。这仅适用于同一函数,因为尝试使用 GOTO 而不是 CALL 最终会出现在相同的错误位置,尽管编译结果要求如此。

最佳答案

位于 http://ww1.microchip.com/downloads/en/DeviceDoc/33014K.pdf 的 PDF 文档有很多关于如何对 PIC18 进行编码的示例。

这是一个这样的例子:

RST CODE 0x0 ;The code section named RST
;is placed at program memory
;location 0x0. The next two
;instructions are placed in
;code section RST.
pagesel start ;Jumps to the location labelled
goto start ;’start’.

PGM CODE ;This is the beginning of the
;code section named PGM. It is
;a relocatable code section
;since no absolute address is
;given along with directive CODE.
start
movlw D'10'
movwf delay_value
xorlw 0x80
call delay
goto start
end

关于c - MPLAB/XC8 不能在ASM 中跳转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com