B.6 手続き呼出し規約
分割コンパイルする場合は、各コンパイル単位で関数の引数・戻り値をどうやって(=どのレジスタに)セットするかのルールが必要でそのルール手続き呼び出し規約(calling convention)と呼ぶ。例えばIntel CPUの場合だけでも、以下のようなものがある。
cdecl fastcall stdcall safecall thiscall Pascal Intel ABI x86-64 |
呼び出し規約が異なるobjやlibファイルを、リンカは通常リンクする事ができない。
例えばBorlandのコンパイラにはcoff2omf.exeというツールが添付されており、このツールを使う事で、オプションを指定する事でlibファイルをstdcallやcdecl方式に変換する事が出来る。
規約では主にレジスタの使い方や、スタック領域(スタックフレーム)の使い方が規定される。Intel CPUの場合、fastcallでは出来る限りレジスタを使用して引数を渡そうとするのに対して、cdeclでは全てスタックに積まれるといった違いがある。
B.7 例外と割込み
省略B.8 入力と出力
MIPSのシミュレータであるSPIMでは、キーボード入力、ディスプレイ出力に対応している。入出力を行うためには、メモリマップされたIOポートである、レシーバ(0xffff0004)と、トランスミッタ(0xffff000c)の下位8bitに値を読み書きする事で実現できる。それぞれのデータを制御するためのレジスタ(制御bit)が有り、それぞれ0xffff0000と0xffff0008の下位2ビットにマッピングされている。
B.9 SPIM
SPIMはLinuxやWindowsでMIPSのCPUをシミュレートする事が出来る。シミュレータなので、かなり遅い(100倍ぐらい)けど、MIPS環境を手軽に手に入れることが出来るし、レジスタの振る舞いなどを見る事も出来るので学習目的には役立つ環境となっている。
ただ、所詮シミュレータなので、タイミングは実機と同じでは無い。例えば遅延分岐やパイプラインハザードに伴う遅延、メモリアクセスのレイテンシ等までは実機と同じ振る舞いにはなっていない。
システムコールは、最低限の入出力(キーボード、コンソール、ファイルI/O)と、メモリの動的確保(sbrk)関するものが実装されており、呼び出したいシステムコールの番号を$v0レジスタにセットしてsyscall命令を発行することで実行できる。
B.10 MIPS R2000のアセンブリ言語
省略B.11 おわりに
省略B.12 演習問題
省略
関連記事
コメントを残す