アセンブリ言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』
プログラミング言語(一覧) |
オブジェクト指向言語 |
C++ - C# - D - Delphi - Eiffel Groovy - Java - Oberon Objective-C - Python - Ruby S - Self - Simula - Smalltalk Visual Basic .NET - WinDev |
命令型言語 |
ALGOL - APL - ASP AWK - アセンブリ言語 - BASIC C - COBOL - ECMAScript Forth - FORTRAN - Limbo Logo - Modula-2 - Pascal Perl - PHP - PL/I PostScript - RPG - Tcl/Tk |
関数型言語 |
Dylan - Haskell - ML/OCaml LISP/Common Lisp Mathematica - Scheme XSLT ー XQuery |
宣言型言語 |
CLIPS - Prolog - SQL |
並行プログラミング言語 |
Ada 95 - Erlang |
マークアップ言語 |
HTML - SGML - XML S式 |
関連項目 |
ソフトウェア設計 - プログラミング ソフトウェアテスト - 最適化 |
アセンブリ言語(アセンブリげんご、assembly language)とは、人間にわかりやすい形で機械語を記述するプログラミング言語である。代表的な低級言語である。CPUが直接実行できる言語は機械語のみであるが、機械語は数字の羅列なので人間には理解しにくい。そこで、機械語を直接記述するのではなく、機械語の意味を表す略語で機械語を記述することで、人間にわかりやすくしたものがアセンブリ言語である。アセンブリ言語の文法はCPUのアーキテクチャに依存するため、高級言語のような移植性はない。
アセンブリ言語を機械語に変換する事をアセンブル (assemble) すると言い、それを行うプログラムの事をアセンブラ (assembler) と言う。アセンブリ言語のことをアセンブラと呼ぶ者もいるが、これは厳密には誤用である。
アセンブリ言語の命令は、アセンブラに対する命令(疑似命令)やマクロ命令を除き、機械語と1対1で対応する。そのため、高級言語のコンパイラの最適化能力では実現できない最適化を手作業で行いたい場合のほか、CPUの動作をプログラマが完全に制御する必要がある場面、例えばOSカーネルやデバイスドライバ、組み込みシステムの開発といった場面で頻繁に用いられる。
目次 |
[編集] 歴史
機械語は、実行したい計算の内容をCPUの内部構造に依存した非常に単純な操作に分割・変換したものであるため、人間には理解しづらい。機械語を並べながらプログラミングをするのは、人間のプログラマにとっては負担が大きかった。
そこで、機械語そのものを書く代わりに機械語の「意味」に相当する短い記号や単語を並べておき、それを見ながらプログラミングをすることが考えられた。
例えば80x86 CPUの機械語
- 10110000 011000012 (B0 6116)
は「ALレジスタに6116 (97) という数値を格納せよ」という意味であるが、この数列から意味を読み取るのは難しいので、
- MOV AL, 61
と書いておく(MASMでの例)。ちなみに、"MOV" は 英単語 "move"(動かす)の略である。
このように、機械語そのものよりも親しみやすい記法でプログラムを書いておいて、プログラムが完成したときにまとめて機械語に変換するのである。
当初、この機械語への変換は人間が手で行っていた。これをハンド・アセンブルと呼ぶ。 しかし、この変換は単に定められた規則に従って記号や単語から機械語を生成するだけなので、この作業をコンピュータに行わせることが考えられた。 そしてアセンブリ言語を与えると、自動的に機械語を出力するプログラムが作られるようになった。このプログラムをアセンブラという。アセンブラの登場当初は、アセンブラで機械語のプログラムを生成することを自動プログラミングと呼んだ。
[編集] 文法
アセンブリ言語のプログラムでは、ニーモニックという命令の列を記述する。 ニーモニックは基本的に機械語の命令と一対一対応する命令文であり、対象となるCPUのアーキテクチャによって異なる。
ただし、擬似命令という、直接機械語には変換されない、アセンブラに対する指示文もプログラムには含まれる。疑似命令には、ラベルの宣言、セクションの定義、条件アセンブルや繰り返しブロック、マクロなどが含まれる。マクロは、複数のニーモニックを1つの命令文で記述する構文で、マクロを使えるアセンブラをマクロアセンブラという。
さらに最近では、パイプライン処理などを最適化するために命令順序を入れ替えたり、ラベルの位置関係によってアドレッシングモードを最適化するアセンブラもあり、必ずしも機械語の命令と一対一になるとはかぎらない。
機械語は、処理の内容であるオペコードと、処理の対象であるオペランドの組み合わせで記述できるよう設計されている。それに従い、ニーモニックもオペコードとオペランドに分けて記述する。たとえば先述のニーモニック
- MOV AL, 61
は、オペコード「MOV」と、2つのオペランド「AL」と「61」からなる。オペランドの個数はCPUとオペコードによって異なる。典型的には、オペランドは1つ以上のソースと1つのデスティネーションからなり、ソースにあるデータは、オペコードの処理を実行した後、デスティネーションに格納される。上の例では、61がソースでALがデスティネーションである(オペランドの順序はアセンブラに依存する)。
多くのCPUでは、オペコードとオペランドが頻繁に使われる組み合わせなら、機械語の1ワードの中にまとめて収めることができる。先述の例
- MOV AL, 61
- 10110000 011000012 (B0 6116)
では、オペコードMOVとオペランドALが、B016という1ワード(この例では8ビット)に収められている。こうすることで、メモリを節約し、また時間のかかるメモリアクセス時間を短縮している。アーキテクチャとして先発であるCISCアーキテクチャの命令セットはこの傾向が強いが、RISCアーキテクチャも後に、組み込み用途において短い命令を求められたため、短い命令を備えているものがある。
なお、RISCアーキテクチャでは、実際の命令セットには存在しない命令をニーモニックで記述することができる。これらのニーモニックは、実在する複数の命令に分割してアセンブルされる。
[編集] アセンブラとコンパイラ
多くのコンパイラは、いったんコードをアセンブリ言語で出力してからアセンブラに通す。その意味ではアセンブリ言語は、最も利用頻度の高いプログラミング言語といえる。
一部のコンパイラでは、インライン・アセンブラを使うことで、ソース・コードの一部をアセンブラで書くことができる。最小限のアセンブリ言語の知識で書くことができ、プログラムのほんの数行をインライン・アセンブラ化するだけで、全体をアセンブリ言語で書いたプログラムに近い実行速度を実現できることもあるが、互換性や移植性は大きく損なわれる。
分割コンパイルで作成するプログラムの一部のモジュールをアセンブリ言語で書くこともある。この場合、コンパイラの関数呼び出し規約にしたがってアセンブリ言語のプロシージャを書き、コンパイラが生成したオブジェクトやライブラリと、アセンブラが生成したそれらを、対応したリンカで結合する。
[編集] 主なアセンブラ
- as - UNIX用のアセンブラ
- GNU Assembler (gas) - GNUが開発する、x86、680x0、SPARC、VAXなどの各種CPU用のアセンブラ
- Microsoft Macro Assembler (MASM) - インテルのx86 CPU用にマイクロソフトが開発したアセンブラ
- システムアセンブラ - IBMのメインフレーム用のアセンブラ
- CASL - 情報処理技術者試験用に作られた仮想機械COMETのためのアセンブリ言語
- Netwide Assembler (nasm) - GNUが開発する、MASMと互換性の高いx86 CPU用アセンブラ
- Turbo Assembler (TASM) - ボーランドが開発していた、MASMと互換性の高いx86 CPU用アセンブラ
[編集] 亜種
表記をニモニックやオペランド等のトークンの並びにする形式の他に、等号や記号を使ってより直感的に扱える物もある。
- BASE,BASE-80 Z-80用のアセンブラ
- BASE-09 MC6809用のアセンブラ
BASEの表記例は下記の通り(BASE-09)
S[A,B,X,U A=$80 A=A+$C0 S]A,B,X,U,PC
上記の記述は下記のアセンブラ表記に対応する。
PUSHS U PUSHS X PUSHS B PUSHS A LDA #$80 ADDA #$C0 POPS A POPS B POPS X POPS U POPS PC