- 2.7 コンピュータ・ハードウエア内での手続きのサポート
- 「手続きを実行する際には、プログラムは下記の6つの手順を踏まなければならない。
- 手続きからアクセスできる場所にパラメータを置く。
- 手続きに制御を移す。
- 手続きに必要なメモリ資源を入手する。
- 必要なタスクを実行する。
- 呼び出し元のプログラムからアクセスできる場所に結果を置く。
- 制御を元の位置に戻す。手続きはプログラム内のいろいろな場所から呼出される可能性があるからである。」
- 手続きからアクセスできる場所にパラメータを置く。
- 手続き関係のレジスタ
- $a0-$a3: 引数レジスタ。1に利用。
- $v0-$v1: 値レジスタ。5に利用。
- $ra: 戻りレジスタ。6に利用。
- $a0-$a3: 引数レジスタ。1に利用。
- PC: プログラム・カウンタ(program counter)。現在実行中の命令のアドレスを保持。
- jal: jump-and-link。2の際に、$raにPC+4をセットしておく。
- 引数や戻りの値がレジスタ数より多い場合はどうする?
- スタックにスピル・アウトする。
- スタックは歴史的ないきさつによって、アドレスの高い方から低い方にのびる。
- スタックの入口というか、push先は、$sp(スタック・ポインタ)というレジスタに保持する。
- 復元(または維持)責任:
- $t0-$t9: caller
- $s0-$s9: callee
- $t0-$t9: caller
- leaf手続き:他の手続きを呼出さない手続き。
- leafでない手続きを使用するときは、必要なレジスタ退避を復元責任にしたがって実施する。
- $gp: グローバル・ポインタ。Cのstatic変数のアドレスを保持するレジスタ。
- 手続フレーム(アクティベーション・レコード):手続き内の変数で、レジスタに割り当てられないものを格納したスタック領域。
- $fp: フレーム・ポインタ。フレームの先頭アドレスを格納。
- プログラムおよびデータのメモリへの割当ては、規約である。
- テキスト・セグメント: 機械語コードを配置。(pcが管理に関係)
- 静的データ・セグメント: 定数や静的変数を配置。($gpが管理に関係)
- 動的データ・セグメント:
- ヒープ: リンクト・リストのような動的なデータを配置。(Cではmalloc()とfree()が関係)
- スタック: ($fpと$spとが管理に関係)
- ヒープ: リンクト・リストのような動的なデータを配置。(Cではmalloc()とfree()が関係)
- テキスト・セグメント: 機械語コードを配置。(pcが管理に関係)
- 「手続きを実行する際には、プログラムは下記の6つの手順を踏まなければならない。
そこそこ複雑な内容だと思うのだが、本書の構成と記述がよいのですんなり理解できる。
とりあえず、ここまで。
0 件のコメント:
コメントを投稿