Renesas Synergy™

FAQ 1007663 : スタックの設定について

Q: 質問

スタックの設定はリンク・ディレクティブで行うのと、 スタートアップ・ルーチンで行うものと、メイン処理の中で行うものと、 どれが優先的に行われるのですか? それともすべてで行わなければならないのですか?

たとえば以下のように異なるところにスタックの設定をした場合はどうなりますか?

--- cstart.asm (スタートアップ・ルーチン)---
MOVW    AX, #0FE20H		;0FE20hに設定
MOVW    SP, AX

--- lk78k0s.dr(リンク・ディレクティブ) ---
memory STACK : (0FE00H, 30H)	;0FE30hに設定

また、スタックがどこに割り当たっているかを確認できますか?

 


A: 回答

リンク・ディレクティブでは、スタックを設定していません。
単に、STACKという名前の領域を確保しているだけです。
領域の確保を行わないとその領域は使用できないので、確保は必要です。

なお、スタック・ポインタは、0FE20hに設定されています。

上記の記述では、STACKとして領域が確保されていることが、 スタック・エリアが確保されていることの確認になります。

なお、スタックを設定する別の方法として、リンクする際に、-S オプションを指定すると、 スタック・エリアの両端を定義するシンボルが生成されます。

   -SSTACK
     ~~~~~ <-ディレクティブで定義した、スタック用の領域

この場合のスタック・ポインタの設定は

   MOVW    AX, _@STBEG	;リンカが生成したシンボル
   MOVW    SP, AX

とします。

また、リンカでパブリックシンボルを.mapに出力すると(-kp)、スタック・エリアが確認できます。

_@STBEG ~ _@STEND の空間がスタック・エリアとなります。

 

適用製品

78K0用コンパイラ [CC78K0]
78K0用アセンブラパッケージ [RA78K0]
78K0S用アセンブラパッケージ [RA78K0S]
他にご質問がございましたら、リクエストを送信してください