RL78/G13 のスタックポインタの値を取得したい

こんにちは。こじこじです。

RL78/G13を使用しています。スタックポインタに格納されている値を取得するにはどうすれば良いでしょうか?

開発環境は以下の通りです。

IDE:e2studio (Version:2021-07)

コンパイラ:GCC for Renesas RL78 (Version:4.9.2.202002

言語:C言語

スタック領域の使用量の自己診断機能を作成しようとしています。

次のどちらかで現在のスタックポインタ(SP)の値を取得しようとしているのですが、うまくいきません。

①アセンブラでspをどこかに格納する。

  →アセンブラを扱ったことがなく、うまくいっていません。

     Cソース内に、【asm("movw ax,sp")を定義すれば、spを汎用レジスタaxに格納することはできましたが、今度はaxを読み出す方法がわからず

      行き詰ってしまいました。axを自分で定義した変数に格納できればいいのですが。。。

②スタックポインタが格納されているメモリアドレスを直接参照して、値を取得する。

 →メモリアドレスが分からなかったです。

アドバイスお願いいたします。

  • こじこじ さん、こんにちは。NoMaYです。

    以下のように定義して使用するのが利便性が良いかと思います。

    #define SP (*(uint16_t *)0xffff8)

     

  • NoMaYさん。こじこじです。

    ありがとうございます。無事に現在スタック位置を参照することができました!

    なぜ0xFFFF8番地にSPが格納されているとご存じなのでしょうか?

    データシートやユーザーマニュアル等見ても、Web検索してもその情報を見つけるとができませんでした。

    よろしければご教示ください。

    私の調査能力が低いだけかもしれません。ご了承ください。

  • こじこじ さん、こんにちは。NoMaYです。

    RL78の前身の78K0Rや兄弟分の78K0や78K0Sその他といったマイコンの頃から同じ発想でCPUコアが作られているのです。そして、それらのマイコンで、それなりの頻度でアセンブラや逆アセンブラに接していると、いずれは少なくない人が自然と気付くのです。マシンコード(16進数の数値の列)が同じだな、ということからですね。(たぶん、気付いていると思う、のだけれども。命令の数が多いわけでも無かった/無い、こともありますし。)

    また、PSWやES/CSも同様ですね。ちなみに、ES/CSに関しては、こんな話題もありました。(最終的に、BUGでは無かった、ということになりましたが。(でも、命令セット表には記載されてない使用方法でしたけれども。))

    IAR RL78 C/C++ Compilerのinterrupt関数生成コードがおかしな気がします(BUGがあると思います)
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6940/iar-rl78-c-c-compiler-interrupt-bug
     

  • チョコです。

    これは、「RL78 ファミリ ユーザーズマニュアル ソフトウェア編」に以下のように記述されyています。

    以上

  • チョコさん、こんにちは。NoMaYです。

    どうも失礼しました。ソフトウェア編のユーザーズマニュアルに書かれていましたか。そういえば、命令動作のページは見ることも良くありましたが、それ以外のところは余り見ていた記憶が無かったです。そうでしたか、書かれていたのですね。

  • チョコです。

    これは、私も知らなかったのですが、かなり前に、fujita nozomuさんが教えてくれました。

    以上

  • こじこじ さん、こんにちは。NoMaYです。

    ところで、RL78の無料コンパイラには、GCC for Renesas RL78の他に、LLVM-RL78というのもあって、C言語拡張文法やビルトイン関数などがCC-RLの完全コピー(目標)となっているのですが、そちらは選択肢にならないのでしょうか?

    誘導尋問みたいな書き方になってしまうのですけれども、コード生成機能やRL78スマートコンフィグレータにてRL78/G13+LLVM-RL78がサポートされていないから、という理由だったりしますでしょうか?

    すみません、LLVM-RL78により本件が素朴に解決する、というわけでも無いのですけれども。

  • チョコさん、NoMaYさん。こじこじです。

    お返事遅くなり申し訳ございません。

    まずはSPの配置アドレスについての情報ありがとうございます。

    コンパイラについてですが、開発開始時に「LLVM-RL78」の存在を知らず、「GCC for Renesas RL78」を使用していました。

    そのまま不都合がなく、開発が終盤となってしまいました。諸事情により、今更開発環境を変えることができないので、

    「GCC for Renesas RL78」を使用しています。

    LLVM-RL78」は今後の参考にさせていただきます。

    ありがとうございます。