[ このメッセージへの返事 ]
[ 返事を書く ]
[ home.html ]
投稿者:
movem.l d0-d7/a0-a5,-(sp) @ h101.p064.iij4u.or.jp on 97/10/27 17:01:50
In Reply to: Re: 初歩的な質問
posted by 68user @ oryo.inforyoma.or.jp on 97/10/27 02:53:51
> a6は関数コール時の引数・コールされた関数内のローカル変数の内容を
> 保存しているフレームを指している、ということでしょうか?
まあ、そんな感じです。図で書くと下のようになります。
|
|movemで待避されたレジス←前の関数で使用している領域
|タの値
|−−−−−−−−−−−
|関数を呼ぶときの引数
|−−−−−−−−−−−
|リターンアドレス
|−−−−−−−−−−−
|古いa6の値 ←a6の指す位置(古いa7の値)
|−−−−−−−−−−−
|
|ローカル変数用の領域
|(スタックフレーム)
|
|−−−−−−−−−−−
|movemで待避されたレジス
|タの値 ←a7の指す位置
|−−−−−−−−−−−
| ←次にスタックが使われるときは
| ここから使用される
|
※ a7 = sp(スタックポインタ)
で、引数とスタックフレームをアクセスする場合はa6のオフセットで指定することになります。
(この図、わかりにくいですか?)
movemによるレジスタの待避を、スタックフレームを生成する前に行うコンパイラもありまが(最適化に都合が良い)、こっちの方がフレームポインタの関係が分かりやすいでしょう。
> Cでは全ての環境において特定のレジスタがフレームポインタとして
> 使用されているんでしょうか?
全ての環境といっているのは、全てのプロセッサ、全ての処理系(コンパイラ)ということですか?
この辺はよく分かりません。ただ、フレームポインタを使用する場合、レジスタを固定としたほうがコンパイラが楽でしょう。
|