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

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.




■デジタル用語辞典:
■ 高級、低級の意味とレジスタ、mov、add ■

今回から「簡単なアセンブラ言語」講座をはじめます。
と言っても、講座名に書かれてある様に内容は「簡単な」物に
する予定ですので、アセンブラ言語と聞いただけで引いてしま
う方にも読みやすいと思います。

みなさんはアセンブラ言語って知ってますか?
アセンブラ言語を知ってるという方は、結構プロセッサについ
て詳しい方なのではないでしょうか?

アセンブラ言語とプロセッサが直切理解する機械語は1対1で
対応するものなので、アセンブラ言語を知る事は=プロセッサ
を知る事になります。

また、アセンブラ言語を知っている人の数はC言語やC++言
語などを知っている人の数に比べると圧倒的に少ないです。
その為、知っていると職にありつけやすいかもしれません。
(余談ですが。。)

尚、この講座で取り上げるアセンブリ・アセンブラという言葉
は、主にインテルプロセッサのIA-32(Intel Architecture 32bit)
について解説するものです。

最近マイクロソフトが「.NET」と呼ばれる物の中で中間言語の
事をアセンブリコードと呼んでいますが、これとは全く別物で
ある事をあらかじめお断りしておきます。

アセンブラ言語は低級言語と呼ばれます。
それに対し、C/C++/JAVA言語等は高級言語と呼ばれ
ます。

アセンブラ言語は何故低級言語と呼ばれるかと言うと、C言語
などに比べるとよりハードウェアに近い言語だからです。

例えば、インテルのペンティアムプロセッサというハードウェ
アがあるとします。

┌──────────┐
│プロセッサ(ハード)│
└──────────┘


このハードウェアを動作させる為に、「機械語」という物を上
からかぶせてあげます。

┌──────────┐
│   機械語    │
├──────────┤
│プロセッサ(ハード)│
└──────────┘


「機械語」というのは、プロセッサが直接理解する言語で、数
値のみで表されたものです。
実行形式ファイル(EXEファイルやELFファイル等)をバイナリ
エディタで開くと見る事が出来ます。

さらに、機械語は人が見て理解しにくいものなので、人が見て
理解しやすいように「アセンブラ言語」という物を上からかぶ
せてあげます。

┌──────────┐
│ アセンブラ言語  │
├──────────┤
│   機械語    │
├──────────┤
│プロセッサ(ハード)│
└──────────┘


このアセンブラ言語というものは、機械語と1対1で対応して
いるものです。
例えばアセンブラ言語で表されている「MOV EAX, 5」という命
令は機械語で表すと「B8 05 00 00 00」になります。

機械語よりはアセンブラ言語の方が分かりやすいのです。

さらに、アセンブラ言語もまだ人が見て分かりにくい部分があ
る為、その上に「C」や「C++」、「JAVA」という言語
をかぶせてあげます。

┌──┬───┬───┐
│C  │C++  │JAVA │
├──┴───┴───┤
│ アセンブラ言語  │
├──────────┤
│   機械語    │
├──────────┤
│プロセッサ(ハード)│
└──────────┘



「C」「C++」「JAVA」という言語は、人が見て分かり
やすい様に作られています。
例えばC言語で

printf("HELLO!");

等と書かれてあると、それほどプログラミングについて詳しく
ない方でも、なんとなく「"HELLO!"という文字をprint(表示)
するのかな?」と分かりますよね?

そして最後は以下の様になるでしょうか。

┌──────────┐
│    人     │
├──┬───┬───┤
│C  │C++  │JAVA │
├──┴───┴───┤
│ アセンブラ言語  │
├──────────┤
│   機械語    │
├──────────┤
│プロセッサ(ハード)│
└──────────┘



これが低級、高級という表現が行なわれる理由です。
1番低い位置にプロセッサ(ハード)を置いておき、その上に
機械語、アセンブラ、その上にC言語等の言語をかぶせていき、
最後に「人」が来ます。

人に近ければ近いほど、人にとって理解しやすい(高級な)言
語となります。
ただし、その分人の考え方(設計手法など)を覚える必要性が
出てきます。

なお、上で示した図は高級、低級の説明を分かりやすくする為
にあくまで私の主観で配置したものである事をお断りしておき
ます。
人によっては「C++よりJAVAの方が高級だ!」と思う方もいら
っしゃるでしょうし、C++言語のある部分に関してはJAVAより
高級だと思う方ももしかしたらいらっしゃるかもしれません。
Basic/C#言語はどこに行ったのだ、と思う方もいらっしゃるで
しょう。その点はご了承ください。

とにかく各種言語が「低級言語」「高級言語」と呼ばれる理由
が分かっていただければ良いです。


また、ハードウェアに近い言語というと、覚える事が多いので
はないかと敬遠してしまう人がいるかもしれませんが、そんな
ことはありません。むしろC/C++/JAVA言語の関数や
クラス、文法や設計手法等を覚えることに比べると少ないと言
えます。

アセンブラ言語は簡単なのです。

それでは、少しづつアセンブラ言語の説明に入っていきます。

まずはインテルプロセッサの「レジスタ」の説明をします。

プロセッサはさまざまな動作を行なうにあたって、「レジスタ」
と呼ばれる物を必ず使います。

例えば、5+3のような簡単な足し算を行なう場合、人間では
頭の中で5という数字と3という数字を思い浮かべ、それらを
「加える」という事を行なって答えを導き出します。
そんな事ない。そんなの直感ですぐ分かる。という人もいるか
と思いますが、小学校低学年の頃を思い出して下さい。
リンゴが5つ、ミカンが3つ、とか思いながらゆっくり順番に
足し算を行なっていたはずです。

プロセッサについても同じような事が言えます。
頭に5という数字を思い浮かべる代わりに、レジスタに5とい
う数字を入れてあげます。
頭に3という数字を思い浮かべる代わりに、レジスタに3とい
う数字を入れてあげます。
そして5という数字と3という数字を加える処理を行ない、答
えを導き出すのです。

この、一時的に思い浮かべる場所の事を「レジスタ」と思って
ください。

例として、プロセッサがレジスタを2つ使用して5+3の処理
を行っている図を示します。


1.「5」という数字を思い浮かべる。
  (レジスタAに5という数字を入れてあげる。)

  レジスタA    レジスタB
  ┌───┐    ┌───┐
  │   │←5  │   │
  └───┘    └───┘


2.「3」という数字を思い浮かべる。
  (レジスタBに3という数字を入れてあげる。)

  レジスタA    レジスタB
  ┌───┐    ┌───┐
  │ 5 │    │   │←3
  └───┘    └───┘


3.5という数字と3という数字を加える処理を行ない、答え
  を導き出す。
  (レジスタAにレジスタBを加える。)

  レジスタA    レジスタB
  ┌───┐    ┌───┐
  │ 5 │    │ 3 │
  └─┬─┘    └─┬─┘
    ↓        │
  レジスタA      │
  ┌───┐      │
  │ 8 │←─足し算─┘
  └───┘

ここで注意してもらいたいのですが、レジスタというものは一
見バッファのようにふるまっていますが、レジスタとバッファ
は全く異なるものという事です。

何が異なるのかというと、まずバッファは物理的にメモリ上に
存在しており、「データを保存する為だけ」に使用されます。

それに対し、レジスタは物理的にプロセッサ内部に存在してお
り、データを一時的に保存する為に使用される事もあるのです
が、その他の用途にも使用され、プロセッサの制御そのものに
密接に関わってきます。


今度はもっと具体的に書きます。
上の例をインテルプロセッサのアセンブリコードで書いた物を
見てみましょう。

1.頭に5という数字を思い浮かべる代わりに、レジスタ
  「EAX」に5という数字を入れてあげる。

  レジスタEAX
  ┌───┐  
  │   │←5
  └───┘  

  MOV EAX, 5
  ↑
  move(移動)という命令。一番右側にある5という数字をレ
  ジスタ「EAX」に移動しなさい、という命令。


2.頭に3という数字を思い浮かべる代わりに、レジスタ
  「EBX」に3という数字を入れてあげる。

  レジスタEBX
  ┌───┐  
  │   │←3
  └───┘  

  MOV EBX, 3
  ↑
  move(移動)という命令。一番右側にある3という数字をレ
  ジスタ「EBX」に移動しなさい、という命令。


3.5という数字と3という数字を加える処理を行なう。

  レジスタEAX  レジスタEBX
  ┌───┐    ┌───┐
  │ 5 │    │ 3 │
  └─┬─┘    └─┬─┘
    ↓        │
  レジスタEAX    │
  ┌───┐      │
  │ 8 │←─足し算─┘
  └───┘

  ADD EAX, EBX
  ↑
  addition(加える)という命令。一番右側にある「EBX」の
  内容を「EAX」に加えなさい、という命令。

この例の場合、足し算した結果は「EAX」に格納されます。
どうでしょうか。結構簡単ではないでしょうか?

なお、詳しい方にお断りしておきますが、この講座で例として
示すアセンブリコードは分かりやすくする為にあえて非効率な
コードを示しています。
こうした方がもっと効率が良くなるはずだ、とか、ここでレジ
スタを使う必要は無いはず、とか、いろいろとご意見があるか
と思いますが、ここではその点、ご了承くださるよう、お願い
申し上げます。

でも間違い指摘やご感想等のご意見は受け付けておりますので、
少しでも間違いだと思われた場合はどんどんご意見ください。
(私もあまり自信が無かったりしますので。。)
よろしくお願い致します。m(_ _)m

次回はアセンブラ言語での計算についてもう少し説明します。



▲このページの上へ

▲このページの上へ

▲このページの上へ

              ▲このページの上へ    続きを読む→