首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPLAB/XC8 8不能跳入ASM吗?

MPLAB/XC8 8不能跳入ASM吗?
EN

Stack Overflow用户
提问于 2014-12-25 00:31:52
回答 1查看 3.5K关注 0票数 3

我有一个用于混合C和程序集的PIC18F25K50项目;我想要做的大多数事情,我可以很容易地在程序集中管理(而且必须是高效的),但是有些部分我更关心开发使用的易用性。我实际上有几个这样的项目,而且我一直遇到同样的问题:我不能使用ASM跳到标签上。要跳转的每个函数-- CALLGOTOBNC等等--如果给出标签,就会失败,在没有指令的情况下,将PC设置为随机但一致的值,从而导致程序挂起。使用地址很好:BC $+4跳过了下一行。

一个不起作用的例子是:

代码语言:javascript
复制
#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);
}

现在,这在总体上可能不起作用,我请求将注意力集中在跳转问题上--这还在原型设计中,因为我甚至无法得到调用的函数。该程序没有问题地编译。

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

如果我严格地使用C来调用/跳转(就像我在上一个项目中必须使用的那样),它可以很好地工作,并确定它的去向。

几个星期以来,我一直在寻找这个问题的答案,尽管我所做的每一个项目(包括记事本中的明文,通过命令行进行编译)都有相同的问题,但我仍然没有看到任何其他有这个问题的人。这到底是怎么回事?

编辑:发现了程序内存视图,我能够更好地了解它在做什么。编译器确实知道函数在哪里,并试图跳转到正确的位置。很明显,打电话就是不知道它要去哪里。

例如: Address 0x7C92包含CALL 0x2044, 0。这正是它应该做的,也就是期望的功能开始的地方。但是,在运行此指令时,PC被更改为0x205E,丢失了函数的一半。

为了变得聪明,我决定在函数的标签之后插入几个NOPs,用0x205E将真正的代码排列起来。不幸的是,似乎任何变化都改变了它不可预测的跳跃会落在哪里,然后它落在了0x2086上。

顺便说一句,当它开始在任意的地方运行时,它通常会运行在一个GOTO上,并且它会按预期跳转到指定的位置。这只在相同的函数中工作,因为尝试使用GOTO而不是CALL最终会出现相同的错误位置,尽管编译的结果需要什么。

EN

回答 1

Stack Overflow用户

发布于 2014-12-25 01:30:15

http://ww1.microchip.com/downloads/en/DeviceDoc/33014K.pdf的PDF文档中有许多关于如何编写PIC18代码的示例。

以下是一个这样的例子:

代码语言:javascript
复制
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 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27643340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档