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

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.




■デジタル用語辞典:
■ MMX技術 ■

前回はデータを加工するプログラムを作成してみました。
そして、そのプログラムを少しだけ効率良くする為に「inc」
命令を使用したのでした。

前回のプログラムをもう1度見てみましょう。


─↓inc.c───────────────────────

#include <stdio.h>
int main(void);
int sub(char*, char*);

int main()
{
int i;
char a[8]={ 0, 1, 2, 3, 4, 5, 6, 7};
char b[8]={10,11,12,13,14,15,16,17};

for(i=0;i<8;i++)
{
printf("a[%d]:%d b[%d]:%d\n", i, a[i], i, b[i]);
}

sub(&a[0], &b[0]);

for(i=0;i<8;i++)
{
printf("a[%d]:%d b[%d]:%d\n", i, a[i], i, b[i]);
}
return 0;
}

int sub(char* a, char* b)
{
printf("sub routine called\n");
_asm{
mov edi, a
mov esi, b
mov ecx, 8
LOOP1:
mov al, [edi] ;←データaをレジスタalに移動
mov bl, [esi] ;←データbをレジスタblに移動
add al, bl ;←データa+データbをalレジスタに格納
mov [edi], al ;←alレジスタをデータaに移動
inc edi ;←データbのアドレスを1加算
inc esi ;←データaのアドレスを1加算
loop LOOP1
}
}

─↑ここまで──────────────────────


上のプログラムはデータbをデータaに加算するプログラムです。

サブ関数内にある「inc edi」という部分は「ediレジスタに1
を加算する」という命令で「add edi, 1」と同じ意味である事
は前回説明しました。そして、「add」命令を使用するよりも
「inc」命令を使用した方が処理が速く行なわれる事も説明し
ました。

今回は、このプログラムをもっと速く処理が行なわれるように
変更を加えていきます。



突然ですが皆さんは「MMX」という言葉を聞いた事があるでし
ょうか?

実は前回作成したプログラムにも、この「MMX」を適用して、
速く処理が行なわれるようにする事が出来ます。

「MMX」というのは、Multi Media eXtensionの略で、画像や音
声等のマルチメディア処理を高速に行なえるように、インテル
が開発した技術の事です。

もう少し具体的に書きます。

今、皆さんが見ている「画面」ありますよね?

ご存知の方も多いと思いますが、この「画面」は、沢山の「点」
が集まって出来ています。

コントロールパネルを開いて「画面」を選択し、「設定」タブ
をクリックすれば画面の解像度を設定する事が出来ます。
「1024×768」とか「1152×864」で設定してい
る方も多いのではないでしょうか。

ここで、仮に「1152×864」の解像度に設定してみたと
しましょう。

これは1つの画面上に、横に1152個の点があり、縦に86
4個の点があるという事になります。

そしてこの「点」1つ1つに対して、プロセッサが「あなたは
何色ね。その横のあなたは何色ね。」と指定してあげる事によ
って、1つの画面が表示される事になります。


1つの画面を表示するのに、1152×864=99万532
8回、プロセッサは点に対して色の指定をしてあげているので
す。

大変な作業ですよね?

また、画面をスクロールさせたりしてみると、その度にプロセ
ッサは、「ここの点の色を消して、こっちの点の色を書いてあ
げて・・・。」等とものすごく忙しく働いているのです。


さて、今まで「点」に「色を指定する」と書いてきましたが、
これは具体的にどうやっているのでしょうか?


ディスプレイをパソコンに接続する時に、ディスプレイから出
ているケーブルをパソコンに接続してみた方は多いと思います。

このケーブルの接続先には、「ビデオカード」という機械が入
っており、ディスプレイに対して画面を表示する為の信号を送
っています。

そしてこのカードにはV-RAM(Video Random Access Memory)と
いうメモリが搭載されています。

V-RAMとは、普通にコンピュータ上に搭載されている「メモリ」
(RAM)と基本的に同じ物です。
同じ物なのですが、ビデオカード上に搭載されている為、これ
を区別して「Video Random Access Memory」と呼んでいます。

そして、このV-RAM上にデータを書き込んであげる事が「点」
に「色を指定する」という事と同じ事になります。

つまり、「画面表示を行なう」という事は、ただ単に「メモリ
にデータを書き込んでいる」だけなのです。

と言うことは、今まで作成してきた、データをコピーするプロ
グラムや、データを加工するプログラムの技術は画面表示にお
いてもそのまま使う事が出来ます。

今まで、データをコピーする処理や加工する処理等を作成して
きました。

単純な処理のようですが、使いようによっては、画面に絵を表
示したり、表示されている絵をさまざまに変化させる事も出来
る、立派なマルチメディア処理にもなりえるのです。

ここまで分かって頂けたところでMMX(Multi Media eXtension)
技術の説明です。


先ほども書いたように、MMXというのは、画像や音声等のマル
チメディア処理を高速に行なうように、インテルが開発した技
術の事です。

前回はデータを加工する処理を作成したのですが、説明を分か
りやすくする為に以下に前回作成したサブ関数のループ処理部
分のイメージを示します。


1.データaからレジスタへデータを読み出す。

  mov al, [edi] ;←データaをレジスタalに移動

                 メモリ
      ┌──┐      ┌───┐
レジスタal│ 0│←─────┤  0│データa
      └──┘      │  1│
                │  2│
                │  3│


2.データbからレジスタへデータを読み出す。

  mov bl, [esi] ;←データbをレジスタblに移動

                 メモリ
      ┌──┐      ┌───┐
レジスタbl│10│←─────┤ 10│データb
      └──┘      │ 11│
                │ 12│
                │ 13│


3.レジスタの値を加算する。

  add al, bl ;←データa+データbをalレジスタに格納

      ┌──┐
レジスタal│10│
      └──┘
        ↑ 
        + 
        │ 
      ┌─┴┐
レジスタbl│10│
      └──┘


4.レジスタからデータaへデータを書き込む。

  mov [edi], al ;←alレジスタをデータaに移動

                 メモリ
      ┌──┐      ┌───┐
レジスタal│10├─────→│ 10│データa
      └──┘      │  1│
                │  2│
                │  3│


後はデータaとデータbのアドレスを1ずつ加算しながら1〜
4までの処理を8回繰り返します。


以上が前回作成した「データを加工する」処理になります。


さて、これまで使用してきた「al」レジスタや「bl」レジスタ
ですが、「al」というのは前にも説明した様にレジスタの1番
小さい大きさの呼び方です。

「al」レジスタというのは「eax」レジスタの8ビットの大き
さの呼び方なのです。

32ビットの大きさの時は「eax」レジスタと呼び、16ビッ
トの大きさの時は「ax」レジスタと呼び、8ビットの大きさの
時は「ah」「al」レジスタという呼び方をします。

以下に「eax」レジスタを32ビット、16ビット、8ビット
それぞれの大きさで扱う時のイメージを示します。


     EAX(32BIT)  
┌───────────┐
│      AX(16BIT) │
      ┌─────┐
      │     │
┌─────┬──┬──┐
│     │ AH │ AL │
└─────┴──┴──┘


レジスタというのは、実際には上の様なイメージとなっていま
す。
ここまでは以前にもこの講座で説明しました。

しかし、データを加工するプログラムを見てもらえると分かる
ように、「al」レジスタや「bl」レジスタ等、1番小さい部分
しか使っていません。

     レジスタ     
┌────────────┐
│           0│
└────────────┘
          │  │
          └──┘
            ↑
        ここしか使ってない。


という事は、本来使えるはずの左側の部分、残り4分の3は無
駄となってしまっています。

     レジスタ     
┌────────────┐
│           0│
└────────────┘
│         │
└─────────┘
     ↑
  使ってない部分


これはもったいない事です。

何故左側の部分が使われないのかというと、「メモリ上にある」
元々のデータが8ビットの大きさしかないからです。

メモリ上のデータが8ビットの大きさしかないので、これをレ
ジスタ上で計算する場合も、やはりレジスタは8ビットの部分
しか使いようがないのです。

勿論、メモリ上のデータが32ビットの大きさであれば、レジ
スタも32ビットフルに使う事が出来ます。

しかし意外な事に、画像や音声等のマルチメディア処理では8
ビットのデータを扱う機会が非常に多いです。
(という事はそれだけレジスタの1部分が無駄になってしまう
機会も多いという事です。)

この使われていない、もったいない部分を有効に使う事はでき
ないでしょうか?

そこでインテルの人達は考えました。

もしも、このもったいない部分を有効に使ったらどんな事にな
るだろうか?

そして考えた結果が以下の様なイメージになります。


1.データaからレジスタへデータを読み出す。

     レジスタ            メモリ
┌────────────┐      ┌───┐
│  3  2  1  0│←─────┤  0│データa
└────────────┘ ┌────┤  1│
   ↑  ↑  ↑     │┌───┤  2│
   │  │  └─────┘│┌──┤  3│
   │  └─────────┘│
   └─────────────┘

2.データbからレジスタへデータを読み出す。

     レジスタ            メモリ
┌────────────┐      ┌───┐
│ 13 12 11 10│←─────┤ 10│データb
└────────────┘ ┌────┤ 11│
   ↑  ↑  ↑     │┌───┤ 12│
   │  │  └─────┘│┌──┤ 13│
   │  └─────────┘│
   └─────────────┘


3.データaにデータbの値を加算する。

     レジスタ     
┌────────────┐
│ 16 14 12 10│
└────────────┘
   ↑  ↑  ↑  ↑ 
   +  +  +  + 
   │  │  │  │ 
┌──┴──┴──┴──┴┐
│ 13 12 11 10│
└────────────┘


4.レジスタからデータaへデータを書き込む。

     レジスタ            メモリ
┌────────────┐      ┌───┐
│ 16 14 12 10├─────→│ 10│データa
└──┬──┬──┬───┘ ┌───→│ 12│
   │  │  │     │┌──→│ 14│
   │  │  └─────┘│┌─→│ 16│
   │  └─────────┘│
   └─────────────┘


なんとなく凄いなぁ、と思いませんでした?

このイメージの様な事を行なうと沢山のデータをいっぺんに処
理する事が出来ます。

これでレジスタが無駄になる事はなくなり、全て丸くおさまり
ます。

後は「EAX」レジスタ等にこれらの処理が行なえるように機能
を追加するだけです。

しかし、インテルの人達は「EAX」レジスタ等にはこの処理が
行なえるようにはしませんでした。

何故なのでしょうか?

次回に説明します。



▲このページの上へ

▲このページの上へ

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