アセンブリ言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』
アセンブリ言語(アセンブリげんご、assembly language)とは、人間にわかりやすい形で機械語を記述する代表的な低級言語である。CPUが直接実行できる言語は機械語のみであるが、機械語は数字の羅列なので人間には理解しにくい。そこで、機械語を直接記述するのではなく、機械語の意味を表す略語で機械語を記述することで、人間にわかりやすくしたものがアセンブリ言語である。アセンブリ言語の文法はCPUのアーキテクチャに依存するため、高級言語のような移植性はない。
アセンブリ言語を機械語に変換する事をアセンブル (assemble) すると言い、それを行うプログラムの事をアセンブラ (assembler) と言う。アセンブリ言語のことをアセンブラと呼ぶ者もいるが、これは厳密には誤用である。
アセンブリ言語の命令は、アセンブラに対する命令(疑似命令)やマクロ命令を除き、機械語と1対1で対応する。そのため、高級言語のコンパイラの最適化能力では実現できない最適化を手作業で行いたい場合のほか、CPUの動作をプログラマが完全に制御する必要がある場面、例えばOSカーネルやデバイスドライバ、組み込みシステムの開発といった場面で頻繁に用いられる。
目次 |
[編集] 歴史
機械語は、実行したい計算の内容をCPUの内部構造に依存した非常に単純な操作に分割・変換したものであるため、人間には理解しづらい。機械語を並べながらプログラミングをするのは、人間のプログラマにとっては負担が大きかった。
そこで、機械語そのものを書く代わりに機械語の「意味」に相当する短い記号や単語を並べておき、それを見ながらプログラミングをすることが考えられた。
例えば80x86 CPUの機械語
は「ALレジスタに6116 (97) という数値を格納せよ」という意味であるが、この数列から意味を読み取るのは難しいので、
MOV AL, 61
と書いておく(MASMでの例)。ちなみに、"MOV" は 英単語 "move"(動かす)の略である。
このように、機械語そのものよりも親しみやすい記法でプログラムを書いておいて、プログラムが完成したときにまとめて機械語に変換するのである。
当初、この機械語への変換は人間が手で行っていた。これをハンド・アセンブルと呼ぶ。 しかし、この変換は単に定められた規則に従って記号や単語から機械語を生成するだけなので、この作業をコンピュータに行わせることが考えられた。 そしてアセンブリ言語を与えると、自動的に機械語を出力するプログラムが作られるようになった。このプログラムをアセンブラという。アセンブラの登場当初は、アセンブラで機械語のプログラムを生成することを自動プログラミングと呼んだ。
[編集] 文法
アセンブリ言語によるプログラミングにおいては、ニーモニックという命令の列を記述する。 ニーモニックは基本的に機械語の命令と対となる語であり、対象となるCPUのアーキテクチャによって異なる。一般にCPUの設計者あるいは製造者によって定義されたニーモニックが標準とされるが、アセンブラの実装によってはこれと異なるニーモニックを用いる場合もある。
プログラムには、機械語と対になる命令文の他に、直接機械語には変換されないアセンブラに対する指示文が含まれる。これを疑似命令といい、ラベルの宣言、セクションの定義、条件アセンブルや繰り返しブロック、マクロなどが含まれる。マクロは、複数のニーモニックを1つの命令文で記述する構文で、マクロを使えるアセンブラをマクロアセンブラという。
また、RISCアーキテクチャ向けのアセンブリ言語では、その命令セットに対応するもの以外のニーモニック(例えば定型的に用いられる複数の命令の組み合わせ)が標準で定義されていて、そのニーモニックを記述することで、動作が同じ命令に変換されたり、複数の命令を組み合わせた形にアセンブルされる。
さらに最近では、パイプライン処理などを最適化するために命令順序を入れ替えたり、ラベルの位置関係によってアドレッシングモードを最適化するアセンブラもあり、必ずしもソーステキストの記述とアセンブルの結果が直接対応するとは限らない。
機械語は、処理の内容であるオペコードと、処理の対象であるオペランドの組み合わせで記述できるよう設計されている。それに従い、ニーモニックもオペコードとオペランドに分けて記述する。たとえば先述のニーモニック
MOV AL, 61
は、オペコード「MOV」と、2つのオペランド「AL」と「61」からなり、
と変換される。オペランドの個数は命令によって異なる。典型的には、オペランドは0以上のソースと1つのデスティネーションからなり、ソースには定数・レジスタ・メモリのいずれか、ディスティネーションにはレジスタ・メモリのいずれかを指定する。プロセッサは、ソース部分に記述されたデータを用いて、ニーモニックに指定された命令を実行し、その結果をデスティネーションに格納する。上の例では、61がソースでALがデスティネーションに格納する。オペランドの記述順序は、上の例では「デスティネーション, ソース」だが、「ソース, デスティネーション」の順に書くアセンブリ言語もある。
[編集] アセンブラとコンパイラ
多くのコンパイラは、いったんコードをアセンブリ言語で出力してからアセンブラに通す。その意味ではアセンブリ言語は、最も利用頻度の高いプログラミング言語といえる。
一部のコンパイラでは、インライン・アセンブラを使うことで、ソース・コードの一部をアセンブラで書くことができる。最小限のアセンブリ言語の知識で書くことができ、プログラムのほんの数行をインライン・アセンブラ化するだけで、全体をアセンブリ言語で書いたプログラムに近い実行速度を実現できることもあるが、互換性や移植性は大きく損なわれる。
分割コンパイルで作成するプログラムの一部のモジュールをアセンブリ言語で書くこともある。この場合、コンパイラの呼出規約にしたがってアセンブリ言語のプロシージャを書き、コンパイラが生成したオブジェクトやライブラリと、アセンブラが生成したそれらを、対応したリンカで結合する。
[編集] 主なアセンブラ
- as - UNIX用のアセンブラ
- GNUアセンブラ (gas) - GNUが開発する、x86、680x0、SPARC、VAXなどの各種CPU用のアセンブラ
- Microsoft Macro Assembler (MASM) - インテルのx86 CPU用にマイクロソフトが開発したアセンブラ
- システムアセンブラ - IBMのメインフレーム用のアセンブラ
- CASL - 情報処理技術者試験用に作られた仮想機械COMETのためのアセンブリ言語
- CAP-X - CASL 以前に情報処理技術者試験で使われていたアセンブリ言語
- Netwide Assembler (nasm) - MASMと互換性の高いx86 CPU用アセンブラ
- Turbo Assembler (TASM) - ボーランドが開発していた、MASMと互換性の高いx86 CPU用アセンブラ
[編集] 亜種
表記をニモニックやオペランド等のトークンの並びにする形式の他に、等号や記号を使ってより直感的に扱える物もある。
- BASE, BASE-80 Z80用アセンブラ
- BASE-09 MC6809用アセンブラ
BASEの表記例は下記の通り(BASE-09)
S[A,B,X,U A=$80 A=A+$C0 S]A,B,X,U,PC
上記の記述は下記のアセンブラ表記に対応する。
PSHS A,B,X,U LDA #$80 ADDA #$C0 PULS A,B,X,U,PC