
■ 関数とパラメータ ■
前回はコンペア命令とジャンプ命令について説明しました。
コンペア命令は「比較」を行なう為の命令で、比較した結果は
「EFLAGS」レジスタに格納されるのでした。
EFLAGSレジスタ
結果格納 ┌─────────┐
cmp ecx, 0─────→│ │
└─────────┘
ジャンプ命令は指定したラベルに制御を移行させる為の命令で、
ジャンプする際に、「ある条件に合えば」ジャンプさせるとい
う事が出来るのでした。
そしてその際、ある条件に合っているかどうかはインテルプロ
セッサ内部で「EFLAGS」レジスタを自動的に参照してくれる、
という事も説明しました。
EFLAGSレジスタ
参照 ┌─────────┐
jne LOOP1 ←─────┤ │
└─────────┘
今回は「簡単なアセンブラ言語」講座としてはいよいよ大詰め
の「関数って何?」という事について説明したいと思います。
皆さんご存知かと思いますがアプリケーションソフトウェアと
いう物は沢山の機能が寄せ集まって出来ている物です。
例えば、絵を表示する機能や音を鳴らす機能、計算をする機能、
それらの全てが協調して1つのアプリケーションソフトウェア
が成り立っているのです。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│
│ ┌────────┐
├─────┤絵を表示する機能│
│ │ │
│ └────────┘
│
│
│
│ ┌────────┐
├─────┤音を鳴らす機能 │
│ │ │
│ └────────┘
│
│
│
│ ┌────────┐
└─────┤計算をする機能 │
│ │
└────────┘
絵を表示する機能や音を鳴らす機能、計算をする機能等は、そ
れぞれが更に細かい機能に分かれています。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│
│ ┌────────┐ ┌─┐─┐
├─────┤絵を表示する機能├┬┤ │ │
│ │ ││└─┘ │
│ └────────┘│┌─┐ │
│ └┤ │ │更
│ └─┘ │
│ │に
│ ┌────────┐ ┌─┐ │
├─────┤音を鳴らす機能 ├┬┤ │ │細
│ │ ││└─┘ │
│ └────────┘│┌─┐ │か
│ ├┤ │ │
│ │└─┘ │い
│ │┌─┐ │
│ └┤ │ │機
│ ┌────────┐ └─┘ │
└─────┤計算をする機能 │ ┌─┐ │能
│ ├┬┤ │ │
└────────┘│└─┘ │
│┌─┐ │
└┤ │ │
└─┘─┘
この様に、ある機能を持っている物の事を「関数」と言います。
1番小さい機能だけが関数なのではなく、「絵を表示する機能」
というのも関数であり、「音を鳴らす機能」「計算をする機能」
も関数です。
1番大きな物では「アプリケーションソフトウェア」も関数で
す。
ここまではある程度プログラミングの知識を持っている方であ
れば説明するまでもない事ですよね?
ところで高級言語を使用していると、「クラス」という言葉を
聞く事があります。
「クラス」というのは、「データと処理を1つにまとめて名前
を付けた物」です。
もう少し具体的に言うと、C言語での構造体の定義の中に処理
の定義も行なえるようにした物です。
この「クラス」という概念ですが、これは人がソフトウェアを
設計し易いように、考えやすいように存在している物であり、
コンパイラ等が機械語に翻訳する時には、自動的に「関数」に
変換してくれます。
つまり「クラス」というのは全てソフト的な概念であって、プ
ロセッサがハード的に関わる事はありません。
しかし「関数」は違います。
関数はある程度プロセッサがハード的に関わる必要があるので
す。
この講座を読めば、どのようにして「関数」にプロセッサがハ
ード的に関わるのか分かって頂けると思います。
先ほど説明したように、「関数」というのはある「機能」を持
った物の事です。
説明を分かりやすくする為に、先ほどの説明の中から「アプリ
ケーションソフトウェア」と「絵を表示する機能」に的を絞っ
て説明します。
以下にアプリケーションソフトウェアが「絵を表示する機能」
を呼び出しているイメージを示します。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│
│ 呼出し ┌────────┐
├────→│絵を表示する機能│
│ │ │
│ └────────┘
アプリケーションソフトウェアが「絵を表示する機能」を呼出
しています。
この時「絵を表示する機能」は、「どんな絵を表示すれば良い
のか」の情報をもらわなければなりません。
例えば、丸い絵を表示してね。とか、四角い絵を表示して中は
緑色に塗りつぶしてね。とかの情報です。
これらの情報の事を「パラメータ」といいます。
アセンブラ言語ではパラメータを渡す方法として、レジスタを
使用する方法があります。
例えば、アプリケーションソフトウェアが「絵を表示する機能」
を呼出す時に、レジスタ「EBX」にパラメータを格納するとし
ます。
以下にそのイメージを示します。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│ レジスタEBX
│ パラメータ格納 ┌──────┐
├────────────────→│丸い絵を表示│
│ └──────┘
│ 呼出し ┌────────┐
├────→│絵を表示する機能│
│ │ │
│ └────────┘
レジスタ「EBX」にパラメータを格納した後に「絵を表示する
機能」を呼出しています。
その後、「絵を表示する機能」では、「どんな絵を表示しなけ
ればならないか」という情報を得る為に、レジスタ「EBX」を
参照します。
以下にそのイメージを示します。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│ レジスタEBX
│ パラメータ格納 ┌──────┐
├────────────────→│丸い絵を表示│
│ └──┬───┘
│ 呼出し ┌────────┐ │
├────→│絵を表示する機能│ │
│ │ │ │
│ └───┬────┘ │
│ │ パラメータ参照 │
│ │←─────────┘
│ │
これにより「絵を表示する機能」は「どんな絵を表示しなけれ
ばならないか」を知り、画面に「丸い絵」を表示する事が出来
るようになります。
以下に「絵を表示する機能」がレジスタに格納されているパラ
メータを参照し、画面に丸い絵を表示しているイメージを示し
ます。
┌──────────────────────────┐
│ アプリケーションソフトウェア │
│ │
└───┬──────────────────────┘
│ レジスタEBX
│ パラメータ格納 ┌──────┐
├────────────────→│丸い絵を表示│
│ └──┬───┘
│ 呼出し ┌────────┐ │
├────→│絵を表示する機能│ │
│ │ │ │
│ └───┬────┘ │
│ │ パラメータ参照 │
│ │←─────────┘
│ │
│ 画面
│ ┌──────┐
│ 表示 │ │
├───────┼→○ │
│ │ 丸い絵 │
│ │ │
│ └──────┘
このように、「アプリケーションソフトウェア」が「絵を表示
する機能」にパラメータを渡してあげる事により、「絵を表示
する機能」に希望の動作を行なわせる事が出来るのです。
ここでパラメータに注目して欲しいのですが、上の例では1つ
しかパラメータを渡していません。
しかし、パラメータが1つで足りる場合は、実はあまり無いの
です。
実際にプログラムを作る時には、「丸い絵の縁取りをしたい」
とか、「緑色で塗りつぶしたい」とか、「線は点線で書きたい」
とか、「丸の大きさを変えたい」とか、さまざまな情報をパラ
メータとして渡す必要があるのです。
しかしこれらのパラメータを全てレジスタを使用して渡そうと
しても、とてもじゃないですがレジスタの数が足りません。
インテルプロセッサには使えるレジスタは数個しかなく、しか
もその数少ないレジスタも、他の用途で使われている場合が多
い為、パラメータを渡す為に使えるレジスタはほんの少しにな
ってしまいます。
という事で、パラメータを渡す為にレジスタは使えない事はな
いのですが、数が圧倒的に足りない為、代わりに別の物が使用
されます。
それは何でしょうか?
続きは次回に、と言いたいところですが答えだけ教えておきま
す。
「メモリ」を使用します。
次回はメモリを使用してパラメータを渡す事について説明しま
す。