忍者ブログ
忍者ブログakadan123です。
<< | 2024 年04 月 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | >>
[30]  [29]  [28]  [27]  [26]  [25
Updated   
2024.04.16 (Tue)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Updated   
2011.10.03 (Mon)
アセンブリ言語(アセンブリげんご、assembly language)とは、コンピュータを動作させるための機械語を人間にわかりやすい形で記述する、代表的な低級言語である。概要 [編集]CPUが直接実行できる言語は機械語のみであるが、機械語は数字(内部的には二進数)の羅列なので人間には理解しにくい。そこで、機械語を直接記述するのではなく、ニーモニックと呼ばれる命令語でプログラムを記述することで、人間により分かりやすくしたものがアセンブリ言語である。アセンブリ言語の文法はCPUのアーキテクチャに依存するため、高級言語のような移植性はない。アセンブリ言語を機械語に変換する事をアセンブル (assemble) すると言い、それを行うプログラムの事をアセンブラ (assembler) と言う。なお、アセンブリ言語の意味で「アセンブラ」または「アセンブラ言語」(Assembler Language)と呼ぶ場合も多い[1]。アセンブリ言語の命令は、アセンブラに対する命令(疑似命令)やマクロ命令を除き、機械語と1対1で対応し、プログラマがCPUの動作を把握しながらプログラムを記述する事ができる。そのため、 実行速度やプログラムサイズに制限があるアプリケーションで、高級言語であるコンパイラの最適化能力では達成できない最適化を手作業で行いたい場合CPUの動作をプログラマが完全に制御する必要がある場合 メモリ容量や演算実行速度などのリソースに厳しい制約がある用途などにはアセンブリ言語によるプログラムが行われる。現在でも、例えばOSカーネルやデバイスドライバ、組み込みシステムの開発といった場面で頻繁に用いられる。歴史 [編集]機械語は、実行したい計算の内容をCPUの内部構造に依存した非常に単純な操作に分割・変換したものであるため、人間には理解しづらい。機械語を並べながらプログラミングするのは、人間のプログラマにとっては負担が大きかった。そこで、機械語そのものを書く代わりに機械語の「意味」に相当する短い記号や単語を対応させ、それを記述してプログラミングをすることが考えられた。例えばx86 CPUの機械語10110000 011000012 (B0 6116)は「ALレジスタに6116 (97) という数値を格納せよ」という意味であるが、この数列から意味を読み取るのは難しいので、と書いておく(MASMでの例)。ちなみに、"MOV" は 英単語 "move"(動かす)の略である。このように、機械語そのものよりも親しみやすい記法でプログラムを書いておいて、プログラムが完成したときにまとめて機械語に変換するのである。当初、この機械語への変換は人間が手で行っていた。これをハンド・アセンブルと呼ぶ。 しかし、この変換は単に定められた規則に従って記号や単語から機械語を生成するだけなので、この作業をコンピュータに行わせることが考えられた。 そしてアセンブリ言語を与えると、自動的に機械語を出力するプログラムが作られるようになった。このプログラムをアセンブラという。アセンブラの登場当初は、アセンブラで機械語のプログラムを生成することを自動プログラミングと呼んだ。文法 [編集]アセンブリ言語によるプログラミングは、基本的に機械語の命令列を記述することでおこなう。機械語の命令(インストラクション)は、アセンブリ言語においては普通、ニーモニックと呼ばれる、機械語の命令がプロセッサでおこなう動作を表現する英単語ないしその省略表現(LoadをLDなど)で表現する。機械語の命令セットは、プロセッサによって異なる。一般にプロセッサの設計者あるいは製造者によって定義されたニーモニックが標準とされるが、アセンブラによってはこれと異なるニーモニックを用いる場合もある(GNUアセンブラのgasのインテルプロセッサ用など)。アセンブリ言語プログラムのソースコードには、機械語に対応したニーモニックの他に、機械語には変換されない、アセンブラに対する指示文が含まれる。これを疑似命令またはアセンブラ命令といい、ラベルの宣言、セクションの定義、条件アセンブルや繰り返しブロック、マクロなどが含まれる。マクロは、複数のニーモニックを1つの命令文で記述する構文で、マクロを使えるアセンブラをマクロアセンブラという。また、RISCアーキテクチャ向けのアセンブリ言語では、その命令セットに対応するもの以外のニーモニック(例えば定型的に用いられる複数の命令の組み合わせ)が標準で定義されていて、そのニーモニックを記述することで、動作が同じ命令に変換されたり、複数の命令を組み合わせた形にアセンブルされる。なかには、パイプライン処理などを最適化するために命令順序を入れ替えたり、ラベルの位置関係によってアドレッシングオマニモードを最適化するアセンブラもあり、必ずしもソーステキストの記述とアセンブルの結果が直接対応するとは限らない。機械語のコードは、処理の内容を指示するオペコードと、処理の対象を指示するオペランドから成る。それに従い、アセンブリ言語のソースコードでは、オペコードに対応するニーモニックと、オペランドを組み合わせて記述する。オペランドにはソースとデスティネーションの二種類があり、データとして読み取られるのがソースで、オペコードで示された命令の実行結果が格納されるのがデスティネーションである。ソースには定数・レジスタ・メモリのいずれか、デスティネーションにはレジスタ・メモリのいずれかを指定する。たとえば先述の、は、ニーモニック「MOV」と、2つのオペランド「AL」と「61H」からなり、10110000 011000012 (B0 6116)と変換される。この場合、定数61Hがソース、レジスタALがデスティネーションに該当し、命令が実行されると、定数61Hが、レジスタALに単純に格納される。なお、オペランドの記述順序は、上の例では「デスティネーション, ソース」だが、「ソース, デスティネーション」の順に書くアセンブリ言語もある。また、オペランドの個数は命令によって異なり、典型的なオペランドは0以上のソースと1つのデスティネーションからなるが、プロセッサにより、暗黙のソースやデスティネーションを持つためにそれらを記述しない命令や、オペランドを持たない命令を持つ場合もある。アセンブラとコンパイラ [編集]多くのコンパイラは、いったんコードをアセンブリ言語で出力してからアセンブラに通す。その意味ではアセンブリ言語は、目に見えない形ではあるが最も利用頻度の高いプログラミング言語といえる。一部の高級言語のコンパイラでは、インラインアセンブラを使うことで、高級言語のソースの中にアセンブリ言語による記述を含めることができる。最小限のアセンブリ言語の知識で書くことができ、プログラムで実行時間の多くを占める部分をインラインアセンブラによる記述に置き換えることで、全体をアセンブリ言語で書いたプログラムに近い実行速度を実現できることもあるが、特定のCPUのアーキテクチャに依存する記述となるので互換性や移植性は大きく損なわれる。分割コンパイルで作成するプログラムの一部のモジュールをアセンブリ言語で書くこともある。この場合、コンパイラの呼出規約にしたがってアセンブリ言語のプロシージャを書き、コンパイラが生成したオブジェクトやライブラリと、アセンブラが生成したそれらを、対応したリンカで結合する。
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする: