×[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。
■ 高級、低級の意味とレジスタ、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
次回はアセンブラ言語での計算についてもう少し説明します。