分かりやす〜い
コンピュータ技術情報

TOPに戻る
▼Processor
簡単なアセンブラ言語
┣ 高級、低級の意味と
┃ レジスタ、mov、add

┣ 計算を行う
┣ プログラムを作る
┣ loop命令
┣ Indexレジスタの
┃ 役割とレジスタの
┃ 大きさ
┣ リピートプリフィック
┃ ス・ストリング命令

┣ inc・dec命令
┣ MMX技術
┣ MMXレジスタ
┣ MMX・SIMD・SSE
┣ CMP・JMP命令
┣ 関数とパラメータ
┣ スタック領域
┣ ESPレジスタ
┣ セグメント・
┃   call・ret

┣ コードファイルを作る
┣ コードファイル説明1
┣ コードファイル説明2
┗ マイクロコード

Copyright(C) 2001-2002.ugpop. All rights reserved.




■デジタル用語辞典:
■ 関数とパラメータ ■

前回はコンペア命令とジャンプ命令について説明しました。
コンペア命令は「比較」を行なう為の命令で、比較した結果は
「EFLAGS」レジスタに格納されるのでした。

             EFLAGSレジスタ
      結果格納 ┌─────────┐
cmp ecx, 0─────→│         │
           └─────────┘

ジャンプ命令は指定したラベルに制御を移行させる為の命令で、
ジャンプする際に、「ある条件に合えば」ジャンプさせるとい
う事が出来るのでした。
そしてその際、ある条件に合っているかどうかはインテルプロ
セッサ内部で「EFLAGS」レジスタを自動的に参照してくれる、
という事も説明しました。

             EFLAGSレジスタ
       参照  ┌─────────┐
jne LOOP1 ←─────┤         │
           └─────────┘

今回は「簡単なアセンブラ言語」講座としてはいよいよ大詰め
の「関数って何?」という事について説明したいと思います。


皆さんご存知かと思いますがアプリケーションソフトウェアと
いう物は沢山の機能が寄せ集まって出来ている物です。

例えば、絵を表示する機能や音を鳴らす機能、計算をする機能、
それらの全てが協調して1つのアプリケーションソフトウェア
が成り立っているのです。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │
    │     ┌────────┐
    ├─────┤絵を表示する機能│
    │     │        │
    │     └────────┘
    │
    │
    │
    │     ┌────────┐
    ├─────┤音を鳴らす機能 │
    │     │        │
    │     └────────┘
    │
    │
    │
    │     ┌────────┐
    └─────┤計算をする機能 │
          │        │
          └────────┘


絵を表示する機能や音を鳴らす機能、計算をする機能等は、そ
れぞれが更に細かい機能に分かれています。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │
    │     ┌────────┐ ┌─┐─┐
    ├─────┤絵を表示する機能├┬┤ │ │
    │     │        ││└─┘ │
    │     └────────┘│┌─┐ │
    │               └┤ │ │更
    │                └─┘ │
    │                    │に
    │     ┌────────┐ ┌─┐ │
    ├─────┤音を鳴らす機能 ├┬┤ │ │細
    │     │        ││└─┘ │
    │     └────────┘│┌─┐ │か
    │               ├┤ │ │
    │               │└─┘ │い
    │               │┌─┐ │
    │               └┤ │ │機
    │     ┌────────┐ └─┘ │
    └─────┤計算をする機能 │ ┌─┐ │能
          │        ├┬┤ │ │
          └────────┘│└─┘ │
                    │┌─┐ │
                    └┤ │ │
                     └─┘─┘


この様に、ある機能を持っている物の事を「関数」と言います。
1番小さい機能だけが関数なのではなく、「絵を表示する機能」
というのも関数であり、「音を鳴らす機能」「計算をする機能」
も関数です。

1番大きな物では「アプリケーションソフトウェア」も関数で
す。

ここまではある程度プログラミングの知識を持っている方であ
れば説明するまでもない事ですよね?

ところで高級言語を使用していると、「クラス」という言葉を
聞く事があります。
「クラス」というのは、「データと処理を1つにまとめて名前
を付けた物」です。
もう少し具体的に言うと、C言語での構造体の定義の中に処理
の定義も行なえるようにした物です。

この「クラス」という概念ですが、これは人がソフトウェアを
設計し易いように、考えやすいように存在している物であり、
コンパイラ等が機械語に翻訳する時には、自動的に「関数」に
変換してくれます。

つまり「クラス」というのは全てソフト的な概念であって、プ
ロセッサがハード的に関わる事はありません。

しかし「関数」は違います。

関数はある程度プロセッサがハード的に関わる必要があるので
す。

この講座を読めば、どのようにして「関数」にプロセッサがハ
ード的に関わるのか分かって頂けると思います。


先ほど説明したように、「関数」というのはある「機能」を持
った物の事です。

説明を分かりやすくする為に、先ほどの説明の中から「アプリ
ケーションソフトウェア」と「絵を表示する機能」に的を絞っ
て説明します。

以下にアプリケーションソフトウェアが「絵を表示する機能」
を呼び出しているイメージを示します。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │
    │ 呼出し ┌────────┐
    ├────→│絵を表示する機能│
    │     │        │
    │     └────────┘


アプリケーションソフトウェアが「絵を表示する機能」を呼出
しています。
この時「絵を表示する機能」は、「どんな絵を表示すれば良い
のか」の情報をもらわなければなりません。

例えば、丸い絵を表示してね。とか、四角い絵を表示して中は
緑色に塗りつぶしてね。とかの情報です。

これらの情報の事を「パラメータ」といいます。

アセンブラ言語ではパラメータを渡す方法として、レジスタを
使用する方法があります。

例えば、アプリケーションソフトウェアが「絵を表示する機能」
を呼出す時に、レジスタ「EBX」にパラメータを格納するとし
ます。

以下にそのイメージを示します。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │                  レジスタEBX
    │ パラメータ格納         ┌──────┐
    ├────────────────→│丸い絵を表示│
    │                 └──────┘
    │ 呼出し ┌────────┐
    ├────→│絵を表示する機能│
    │     │        │
    │     └────────┘


レジスタ「EBX」にパラメータを格納した後に「絵を表示する
機能」を呼出しています。

その後、「絵を表示する機能」では、「どんな絵を表示しなけ
ればならないか」という情報を得る為に、レジスタ「EBX」を
参照します。

以下にそのイメージを示します。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │                  レジスタEBX
    │ パラメータ格納         ┌──────┐
    ├────────────────→│丸い絵を表示│
    │                 └──┬───┘
    │ 呼出し ┌────────┐     │
    ├────→│絵を表示する機能│     │
    │     │        │     │
    │     └───┬────┘     │
    │         │ パラメータ参照  │
    │         │←─────────┘
    │         │


これにより「絵を表示する機能」は「どんな絵を表示しなけれ
ばならないか」を知り、画面に「丸い絵」を表示する事が出来
るようになります。

以下に「絵を表示する機能」がレジスタに格納されているパラ
メータを参照し、画面に丸い絵を表示しているイメージを示し
ます。


┌──────────────────────────┐
│      アプリケーションソフトウェア      │
│                          │
└───┬──────────────────────┘
    │                  レジスタEBX
    │ パラメータ格納         ┌──────┐
    ├────────────────→│丸い絵を表示│
    │                 └──┬───┘
    │ 呼出し ┌────────┐     │
    ├────→│絵を表示する機能│     │
    │     │        │     │
    │     └───┬────┘     │
    │         │ パラメータ参照  │
    │         │←─────────┘
    │         │
              │          画面
              │       ┌──────┐
              │ 表示    │      │
              ├───────┼→○    │
              │       │ 丸い絵  │
              │       │      │
              │       └──────┘


このように、「アプリケーションソフトウェア」が「絵を表示
する機能」にパラメータを渡してあげる事により、「絵を表示
する機能」に希望の動作を行なわせる事が出来るのです。

ここでパラメータに注目して欲しいのですが、上の例では1つ
しかパラメータを渡していません。

しかし、パラメータが1つで足りる場合は、実はあまり無いの
です。

実際にプログラムを作る時には、「丸い絵の縁取りをしたい」
とか、「緑色で塗りつぶしたい」とか、「線は点線で書きたい」
とか、「丸の大きさを変えたい」とか、さまざまな情報をパラ
メータとして渡す必要があるのです。

しかしこれらのパラメータを全てレジスタを使用して渡そうと
しても、とてもじゃないですがレジスタの数が足りません。

インテルプロセッサには使えるレジスタは数個しかなく、しか
もその数少ないレジスタも、他の用途で使われている場合が多
い為、パラメータを渡す為に使えるレジスタはほんの少しにな
ってしまいます。

という事で、パラメータを渡す為にレジスタは使えない事はな
いのですが、数が圧倒的に足りない為、代わりに別の物が使用
されます。

それは何でしょうか?

続きは次回に、と言いたいところですが答えだけ教えておきま
す。

「メモリ」を使用します。

次回はメモリを使用してパラメータを渡す事について説明しま
す。



▲このページの上へ

▲このページの上へ

▲このページの上へ

←前に戻る    ▲このページの上へ    続きを読む→