0

我正在尝试保存寄存器的上下文并将堆栈指针存储到 Assembly 中的 C 变量,它可以工作,但是当它到达 return 语句时会引发许多错误和崩溃。

这是代码:

_saveContext:

    PUSH    SR                      
    PUSH    W0                      
    MOV     #32, W0
    MOV     W0, SR
    PUSH    W1                      
    PUSH.D  W2
    PUSH.D  W4
    PUSH.D  W6
    PUSH.D  W8
    PUSH.D  W10
    PUSH.D  W12
    PUSH    W14
    PUSH    RCOUNT
    PUSH    TBLPAG
    PUSH    ACCAL
    PUSH    ACCAH
    PUSH    ACCAU
    PUSH    ACCBL
    PUSH    ACCBH
    PUSH    ACCBU
    PUSH    DCOUNT
    PUSH    DOSTARTL
    PUSH    DOSTARTH
    PUSH    DOENDL
    PUSH    DOENDH                                                                                      
    PUSH    CORCON
    PUSH    PSVPAG
    MOV     W15, W0
    MOV     W0, _stackPointer  //Save to C Var
    RETURN

在 MPLAB 中模拟代码时,它可以工作,C 变量被分配堆栈指针的值,但是当它到达 RETURN 时会导致多个错误:

“CORE-E0004:由于未实现的 FLASH 存储器访问而导致的陷阱,从 0xXXXXXX 处的指令发生”错误

我认为这可能与我访问堆栈指针(W15)的方式有关。

有人有什么建议吗?谢谢

4

2 回答 2

0

好吧,我找到了解决方法,我会在这里发布它,也许它会帮助其他人。

解决方案是直接将代码添加到我的 C 文件中并完全摆脱程序集文件。我没有调用汇编子例程,而是在 C 中添加了一个汇编块:

asm volatile("PUSH      SR          \n"
            "PUSH.D     W0          \n"                                 
            "PUSH.D     W2          \n"
            "PUSH.D     W4          \n"
            "PUSH.D     W6          \n"
            "PUSH.D     W8          \n"
            "PUSH.D     W10         \n"
            "PUSH.D     W12         \n"
            "PUSH       W14         \n"
            "PUSH       RCOUNT      \n"
            "PUSH       TBLPAG      \n"
            "PUSH       ACCAL       \n"
            "PUSH       ACCAH       \n"
            "PUSH       ACCAU       \n"
            "PUSH       ACCBL       \n"
            "PUSH       ACCBH       \n"
            "PUSH       ACCBU       \n"
            "PUSH       DCOUNT      \n"
            "PUSH       DOSTARTL    \n"
            "PUSH       DOSTARTH    \n"
            "PUSH       DOENDL      \n"
            "PUSH       DOENDH      \n"                                                                                 
            "PUSH       CORCON      \n"
            "PUSH       PSVPAG      \n"
            "MOV        W15, _stackPointer  \n");   

这解决了我遇到的所有问题

于 2012-01-17T00:47:40.183 回答
0

它正在崩溃,因为您试图返回到任何 PSVPAG 等于,因为 RETURN 使用堆栈顶部的任何内容作为返回地址。如果不首先平衡堆栈,就不能从子程序返回。就是说,在堆栈上保存上下文的想法似乎不可行,为什么不使用普通 RAM?

于 2012-01-16T03:53:18.567 回答