Re: 初歩的な質問



[ このメッセージへの返事 ] [ 返事を書く ] [ 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では全ての環境において特定のレジスタがフレームポインタとして
> 使用されているんでしょうか?

全ての環境といっているのは、全てのプロセッサ、全ての処理系(コンパイラ)ということですか?
この辺はよく分かりません。ただ、フレームポインタを使用する場合、レジスタを固定としたほうがコンパイラが楽でしょう。