0

レジスタのコンテキストを保存し、アセンブリから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:未実装のフラッシュメモリアクセスによるトラップ、0xXXXXXXの命令から発生しました」エラー

スタックポインター(W15)にアクセスする方法と関係があるのではないかと思います。

誰かアドバイスはありますか?ありがとう

4

2 に答える 2

0

RETURNは、スタックの最上位にあるものをリターンアドレスとして使用するため、PSVPAGと等しいものにRETURNしようとしているため、クラッシュしています。最初にスタックのバランスをとらなければ、サブルーチンから戻ることはできません。とはいえ、コンテキストをスタックに保存するという考えは間違っているようですが、通常のRAMを使用してみませんか?

于 2012-01-16T03:53:18.567 に答える
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 に答える