「アセンブリ言語」の版間の差分

提供: miniwiki
移動先:案内検索
(1版 をインポートしました)
(内容を「 '''アセンブリ言語'''(アセンブリげんご、英: assembly language) *コンピューターで、機械語の命令を分かりやすいように記号化…」で置換)
(タグ: Replaced)
 
1行目: 1行目:
{{参照方法|date=2015年8月}}
 
{{プログラミング言語}}
 
[[ファイル:Motorola 6800 Assembly Language.png|thumb|[[モトローラ]] [[MC6800]] のアセンブリ言語のソースコード]]
 
'''アセンブリ言語'''(アセンブリげんご、英: assembly language)とは、[[コンピュータ]]、[[マイクロコントローラ]]、その他のプログラム可能な機器を動作させるための[[機械語]]を人間にわかりやすい形で記述する、代表的な[[低水準言語]]である。なお、英語の ''assembly'' とは「組立」という意味である。<!--日本語の意味では'''組立言語'''となる。--><!--ビルド手順を記述する言語などもあり、このようなことを書いても(しかも、アセンブリ言語のことを「組立言語」と言っている例はまずないだろう)混乱の原因でしかない-->
 
  
== 概要 ==
+
'''アセンブリ言語'''(アセンブリげんご、英: assembly language)
[[プロセッサ]]が直接実行できる言語は、機械語である。しかし、機械語は、バイナリ(数値)の羅列なので人間には理解しにくい。そこで、機械語を直接記述するのではなく、ニーモニックと呼ぶ命令語で[[プログラム (コンピュータ)|プログラム]]を記述することで、人間により分かりやすくしたものがアセンブリ言語である。ただし、アセンブリ言語の[[プログラム意味論|意味]]は、個々のプロセッサに依存する。したがって、基本的に[[高水準言語]]と異なり、それぞれのコンピュータの機種に依存する(machine dependent)。
 
  
アセンブリ言語で書いたプログラムを機械語プログラムに変換することを'''アセンブル'''(assemble)すると言う。また、それを行うプログラムのことを'''アセンブラ'''(assembler)と言う。なお、アセンブリ言語の意味で、'''「アセンブラ」'''または'''「アセンブラ言語」(Assembler Language)'''と呼ぶ場合がある<ref group="注">IBMは[[System/360]]から2011年現在まで一貫してアセンブラ言語(Assembler Language)と呼んでいる。例:[http://www-01.ibm.com/software/awdtools/hlasm/ IBM High Level Assembler]</ref><ref>Stroustrup, Bjarne, ''The C++ Programming Language'', Addison-Wesley, 1986, ISBN 0-201-12078-X: ''"C++ was primarily designed so that the author and his friends would not have to program in assembler, C, or various modern high-level languages."'' - ''assembler'' を ''assembly language'' の意味で使っている例</ref>。また、初期のコンピュータでは、「アセンブラ」を「アセンブリプログラム」と呼ぶ例もあった<ref>Saxon, James, and Plette, William, ''Programming the IBM 1401'', Prentice-Hall, 1962, LoC 62-20615. - ''assembly program'' という用語を使っている例</ref>。
+
*コンピューターで、機械語の命令を分かりやすいように記号化した言語。機械語と一対一の対応をしており、高級言語に比べ、機械語の命令などをより細かく記述できる。記号言語。
  
アセンブリ言語の命令には、機械語に対応したものと、アセンブラに対する命令(疑似命令)や[[マクロ (コンピュータ用語)|マクロ]]がある。<ref group="注">MIPSのアセンブラの一部など、命令の遅延分岐スロットへの移動を勝手に行うものもある。OPTASM(SLR社)という最適化アセンブラもあった。</ref>これらが機械語と1対1で対応するため、[[プログラマ]]がCPUの動作を把握しながらプログラムを記述することができる。
+
*コンピュータの機械語を, 足し算なら ADD, 引き算なら SUB (subtract の略)のように記号で表わすもの. assembler ともいう.
  
アセンブリ言語では、機械語に相当する低水準な操作または'''[[オペコード]]'''を'''ニーモニック'''で表す。オペコードによっては、機械語命令の一部として1つまたは複数の'''オペランド'''が必要である。また、多くのアセンブリ言語は、オペランドとしてラベルやシンボルを使ってアドレスや定数を表すことができ、それらの値をプログラム内にそのまま書く(ハードコーディング)のを防ぐことができる。'''マクロアセンブラ'''は[[マクロ (コンピュータ用語)|マクロ命令]]機能を備えており、アセンブリ言語のテキストに名前を事前に割り当て、その名前を使うことで他のコードにそのテキストを挿入できる。多くのアセンブラは、プログラム開発を支援したり、アセンブリ過程を制御したり、[[デバッグ]]を支援したりといった付加機構を備えている。
+
{{テンプレート:20180815sk}}
 
 
== 歴史 ==
 
機械語は、実行したい計算の内容をCPUの内部構造に依存した非常に単純な操作に分割・変換したものであるため、人間には理解しづらい。したがって、機械語を並べながらプログラミングするのは、人間のプログラマにとっては負担が大きかった。
 
 
 
そこで、機械語そのものを書く代わりに、機械語の「意味」に相当する短い記号や単語を対応させ、それを記述してプログラミングをすることが考えられた。
 
 
 
世界で最初に実用的に稼働した[[ノイマン型]]電子計算機とされる[[EDSAC]]のローダ(外部記憶装置からプログラムやデータを読み出して主記憶装置に書き込むプログラム)でも、原始的なアセンブラの機能がすでに実装されている。EDSACは、ワード指向アーキテクチャで命令長が1ワードの固定長命令のマシンであり、[[入力機器]]は紙テープでありキャラクタ指向である。紙テープ上のA100Fという文字列から十進法を数値に変換するなどの処理をおこない、「100番地の値を[[アキュムレータ (コンピュータ)|アキュムレータ]]に加算する」という1ワードの命令を生成するといった機能が、EDSACのローダには実装されていた。
 
 
 
機械語への変換は、人間が手で行うこともある。これを'''ハンド・アセンブル'''と呼ぶ。単に定められた規則に従って記号や単語から機械語を生成するだけなので、自動的に機械語を出力するプログラムが作られるようになった。このプログラムを'''アセンブラ'''という。
 
 
 
コンピュータの歴史の初期には、このような、プログラムによって機械語プログラムを生成することを[[自動プログラミング]]と呼んだ。
 
 
 
[[ドナルド・ギリース]]は、まだ発明されていなかったアセンブラを開発中に、[[フォン・ノイマン]]から開発を即座に止めるように言われた、という1950年代初期ならではの逸話がある。当時は、人間が手作業でもできるような瑣末な仕事をコンピュータにさせるような時代が来るとは考えられておらず、単に時間の無駄だとノイマンは考えたのである。
 
 
 
== 主要概念 ==
 
=== アセンブラ ===
 
'''アセンブラ'''は、アセンブリ命令ニーモニックを[[オペコード]]に変換し、[[識別子|シンボル名]]をメモリ位置や他の実体に変換することで[[オブジェクトコード]]を生成する<ref name="Salomon">David Salomon (1993). ''[http://www.davidsalomon.name/assem.advertis/asl.pdf Assemblers and Loaders]''</ref>。シンボル名による参照の利用はアセンブラの重要な機能であり、面倒な計算やプログラム修正に伴うアドレスの更新の手間を省くことができる。多くのアセンブラは[[マクロ (コンピュータ用語)|マクロ]]機能を備えており、よく使用する命令列を[[サブルーチン]]呼び出しではなく[[インライン展開]]することができる。
 
 
 
==== パス回数 ====
 
実行ファイルを生成するのにソースファイルを何回パス(走査)するかでアセンブラを分類できる。
 
; ワンパスアセンブラ
 
: ソースコードを1回だけパスするアセンブラ。定義される前にシンボルが使われているとオブジェクトコードの最後に "errata" を置く必要があり、[[リンケージエディタ|リンカ]]または[[ローダ]]が未定義シンボルが使われていた位置にあるプレースホルダーを書き換える。あるいは、未定義なシンボルを使用するとエラーになる。
 
; マルチパスアセンブラ
 
: 最初のパスで全シンボルとその値の表を作成し、その表を使ってその後のパスでコードを生成する。
 
どちらの場合も、アセンブラは最初のパスで各命令のサイズを確定させる必要があり、それによって後に出現するシンボルのアドレスを計算する。命令のサイズは後から定義されるオペランドの型や距離に依存することがあるため、アセンブラは最初のパスでは悲観的な見積もりをし、必要に応じてその後のパスまたは errata にて1つ以上の[[NOP]]命令(何もしない命令)を挿入してすき間を埋める必要がある。最適化を行うアセンブラでは、最初の悲観的コードをその後のパスで稠密なコードに書き換えてアドレスの再計算を行うことがある。
 
 
 
もともとワンパスアセンブラは高速であるためよく使われていた。マルチパス動作をするには、[[磁気テープ]]を巻き戻したり[[パンチカード]]のデッキをセットし直して読み込む必要があったためである。現代のコンピュータではマルチパスであってもそのような遅延は生じない。マルチパスアセンブラは errata がないため、[[リンケージエディタ|リンク処理]](アセンブラが直接実行コードを生成する場合は[[ローダ]]の処理)が高速化される<ref>{{Cite book|last=Beck|first=Leland L.|title=System Software: An Introduction to Systems Programming|publisher=Addison Wesley|year=1996|chapter=2}}</ref>。
 
 
 
==== 高水準アセンブラ ====
 
より洗練された{{仮リンク|高水準アセンブラ|en|high-level assembler}}は言語として次のような抽象化を提供する。
 
* 高度な[[制御構造]]
 
* 高水準なプロシージャ/関数の宣言と呼び出し
 
* 構造体/レコード、共用体、クラス、集合といった高水準な抽象[[データ型]]
 
* 洗練されたマクロ処理(なお、マクロ機能は1950年代末の [[IBM 700/7000 series|IBM 700 シリーズ]]や1960年代の[[System/360]]などで普通に使われていた)
 
* [[クラス (コンピュータ)|クラス]]、[[オブジェクト (プログラミング)|オブジェクト]]、[[抽象化 (計算機科学)|抽象化]]、[[ポリモーフィズム]]、[[継承 (プログラミング)|継]]<ref name="intel-1999-MOV" />[[継承 (プログラミング)|承]]といった[[オブジェクト指向]]の特徴を備えたアセンブラ<ref>Hyde, Randall. "Chapter 12 – Classes and Objects". The Art of Assembly Language, 2nd Edition. No Starch Press. © 2010.</ref>
 
 
 
==== クロスアセンブラとメタアセンブラ ====
 
'''クロスアセンブラ'''は[[クロスコンパイラ]]と似ており、あるプラットフォームで動作するが、そのプラットフォームではなく別のプラットフォーム向けのオブジェクトコードを生成するアセンブラを指す。小型の組み込みシステムなど、対象システムでアセンブラを動作させられない場合に使用することが多い。その場合、生成した[[機械語]]コードを対象システムに転送する何らかの手段が必要である。単に機械語コードをバイト単位に転送することもできるが、[[ASCII]]表現の転送用フォーマットがメーカーから提供されている(モトローラの[[:en:SREC (file format)|SREC]]、インテルの[[:en:Intel HEX|HEX]]など)。
 
 
 
'''メタアセンブラ'''は、アセンブリ言語の文法や意味論を記述したものを入力とし、その言語のためのアセンブラを出力するプログラムである<ref>[http://www.encyclopedia.com/doc/1O11-metaassembler.html (John Daintith, ed.) A Dictionary of Computing: "meta-assembler"]</ref>。
 
 
 
=== アセンブリ言語 ===
 
アセンブリ言語で書かれたプログラムは、プロセッサの命令に対応したニーモニックの列、ディレクティブや擬似命令と呼ばれるメタな文、コメント、データで構成されている。ニーモニックとは、機械語の命令がプロセッサでおこなう動作を表現する英単語ないしその省略(LoadをLDなど)で表現したものである。通常の文はオペコードのニーモニックで始まり、パラメータ(データ、引数)のリストがそれに続く<ref name="intel-1999">{{Cite book |title=Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference |year=1999 |publisher=INTEL CORPORATION |url= http://download.intel.com/design/PentiumII/manuals/24319102.PDF |accessdate=2010-11-18}}</ref>。
 
 
 
なかには、[[パイプライン処理]]などを最適化するために命令順序を入れ替えたり、ラベルの位置関係によってアドレッシングモードを最適化するアセンブラもあり、必ずしもソーステキストの記述とアセンブルの結果が直接対応するとは限らない。
 
 
 
オペランドにはソースとデスティネーションの二種類があり、データとして読み取られるのがソースで、オペコードで示された命令の実行結果が格納されるのがデスティネーションである。ソースには定数・レジスタ・メモリのいずれか、デスティネーションにはレジスタ・メモリのいずれかを指定する。
 
 
 
なお、オペランドの記述順序は、上の例では「デスティネーション, ソース」だが、「ソース, デスティネーション」の順に書くアセンブリ言語もある。また、オペランドの個数は命令によって異なり、典型的なオペランドは0以上の'''ソース'''と1つの'''デスティネーション'''からなるが、プロセッサにより、暗黙のソースやデスティネーションを持つためにそれらを記述しない命令や、オペランドを持たない命令を持つ場合もある。
 
 
 
例えば、次の命令は[[x86]]/[[IA-32]]プロセッサのもので、[[定数 (プログラミング)|8ビット即値]]を[[レジスタ (コンピュータ)|レジスタ]]に入れる命令である。この命令のバイナリコードは 10110 で、その後に3ビットのレジスタを指定する識別子が続く。''AL'' レジスタの識別子は 000 なので、次に示す[[機械語]]は ''AL'' レジスタに 01100001 というデータをロードする<ref name="intel-1999-MOV">{{Cite book |title=Intel Architecture Software Developer’s Manual, Volume 2: Instruction Set Reference |year=1999 |publisher=INTEL CORPORATION |pages=442 and 35 |url= http://download.intel.com/design/PentiumII/manuals/24319102.PDF |accessdate= 2010-11-18}}</ref>。
 
10110000 01100001
 
このバイナリコードを人間が読みやすいように[[十六進法]]で表現すると次のようになる。
 
B0 61
 
ここで、<code>B0</code>は「''AL''に後続の値をコピーする」ことを意味し、<code>61</code>は01100001を十六進法で表したもの([[十進法]]では97)である。インテルのアセンブリ言語では、この種の命令に MOV というニーモニックを割り当てており、セミコロン以下に説明的コメントを添えたアセンブリ言語での表現は次のようになる。
 
<source lang="asm">MOV AL, 61h      ; Load AL with 97 decimal (61 hex)</source>
 
この場合、定数61Hがソース、レジスタALがデスティネーションに該当し、命令が実行されると、定数61Hが、レジスタALに単純に格納される。これが人間にとってはさらに読みやすく覚えやすい。
 
 
 
ニーモニックとオペコードの対応は、命令セットアーキテクチャにより、あるいは個々のアセンブラの実装によりまちまちである(こともある)。設計者の美意識であったり、メーカーの商戦略(売れている既存製品に「似ているように見える」と思わせれば、実際には大違いでも売ってしまえばとりあえずは勝ちである)のせいによることもある。違うオペコードの命令でも同一のニーモニックの場合もあれば、同じオペコードの命令でもオペランド違いなどで違うニーモニックを当てている場合もある。
 
 
 
前述のインテルの MOV のようにデータの転送の多くを同一の命令あるいはニーモニックとする場合もあれば、データのコピー/移動の方向などによって別々の命令あるいはニーモニックとする場合もある(「メモリからレジスタへの移動」を L、「レジスタからメモリへの移動」を ST、「レジスタからレジスタへの移動」を LR、「即値をメモリへ移動」を MVI など)。(この段落では命令セットの設計の話とアセンブリ言語の話を一緒にしている)
 
 
 
インテルのオペコード 10110000(<code>B0</code>)は8ビットの値を ''AL'' レジスタにコピーするが、10110001(<code>B1</code>)は''CL''レジスタにコピーし、10110010(<code>B2</code>)は ''DL'' レジスタにコピーする。これらをアセンブリ言語で表現すると次のようになる<ref name="intel-1999-MOV"/>。
 
<source lang="asm">
 
MOV AL, 1h        ; Load AL with immediate value 1
 
MOV CL, 2h        ; Load CL with immediate value 2
 
MOV DL, 3h        ; Load DL with immediate value 3
 
</source>
 
MOVの構文には次の例のようにさらに複雑なものもある<ref>{{Cite web |last=Evans |first=David |title=x86 Assembly Guide |url= http://www.cs.virginia.edu/~evans/cs216/guides/x86.html |publisher=University of Virginia |accessdate= 2010-11-18|year=2006}}</ref>。
 
<source lang="asm">
 
MOV EAX, [EBX]   ; Move the 4 bytes in memory at the address contained in EBX into EAX
 
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX
 
</source>
 
MOVというニーモニックを使った文は、その内容によってアセンブラが88-8E、A0-A3、B0-B8、C6、C7のいずれかのオペコードに変換するので、プログラマはオペコードを知る必要がないし、オペコードを覚える必要もない<ref name="intel-1999-MOV"/>。
 
 
 
アセンブリ言語から機械語への変換はアセンブラが行うが、逆方向の変換の一部は[[逆アセンブラ]]が行う。[[高水準言語]]とは異なり、単純なアセンブリ構文と機械語命令には[[全単射|1対1の関係]]がある。しかしアセンブラは擬似命令(マクロの一種)を提供していることがあり、1つの擬似命令をよく使われる機械語命令列に展開する。例えば、大小比較による条件分岐命令を持たないマシンの場合、アセンブラで大小比較命令とゼロなら分岐する条件分岐命令(比較命令の結果を使用)に展開される擬似命令を用意したりする。多くの高機能アセンブラは豊富な[[マクロ (コンピュータ用語)|マクロ]]言語機能を備えており、複雑なコード列やデータシーケンスを生成できる。
 
 
 
[[コンピュータ・アーキテクチャ]]はそれぞれ独自の機械語を持つ。アーキテクチャが異なれば、サポートする命令の数や種類が異なり、レジスタの大きさや個数が異なり、データの格納形式が異なる。汎用コンピュータの多くは機能的にほぼ同等だが、実装は異なるので、アセンブリ言語にはその差異が反映されている。
 
 
 
機械語の[[命令セット]]は、プロセッサによって異なる。[[命令セット]]が同じでも様々なニーモニックやアセンブリ言語の文法が存在しうる。一般にプロセッサの設計者あるいは製造者によって定義されたニーモニックが標準とされるが、アセンブラによってはこれと異なるニーモニックを用いる場合もある([[GNU]]アセンブラのgasの[[インテル]]プロセッサ用など)。
 
 
 
== 言語設計 ==
 
=== 基本要素 ===
 
アセンブラの開発者によって用語の使い方に大きな差異があり、文の分類などが異なる。例えば、マシンのニーモニックや拡張ニーモニック以外は全て擬似命令と呼ぶ場合もある。典型的なアセンブリ言語は、プログラムの操作の定義に使われる命令文を以下の3種類に分類する。
 
* オペコードのニーモニック
 
* データセクション
 
* アセンブリディレクティブ
 
 
 
==== オペコードのニーモニックと拡張ニーモニック ====
 
アセンブリ言語の命令文は一般に非常に単純で、[[高水準言語]]のそれとは異なる。一般にニーモニックは1つの機械語命令(オペコード)のシンボル名であり、個々の機械語命令には少なくとも1つのオペコード・ニーモニックが対応している。命令は一般に「オペコード」と0以上の「オペランド」で構成される。多くの命令は1つまたは2つの値を参照する。オペランドには即値(命令内に置かれる値)、レジスタ(暗黙のうちに使用される場合もある)、記憶装置内のデータの位置を示すアドレスなどがある。「拡張ニーモニック」はオペコードと特定オペランドの組合せを表すのに使われることが多い。例えば、System/360では、BC命令にマスク15を組み合わせたものが'''B'''、BC命令にマスク0を組み合わせたものが'''NOP'''という拡張ニーモニックで表される。
 
 
 
「拡張ニーモニック」は命令の特殊な用途をサポートするのに使われることが多く、本来の命令の名称からはその用途が連想できないときに使うことが多い。例えば、多くのCPUは明示的に[[NOP]]命令を用意していないが、その用途に使える命令は存在する。8086では''xchg ax,ax''という命令が''nop''として使えるので、アセンブリ言語で''nop''を記述すると ''xchg ax,ax'' という命令に変換される。逆アセンブラにもこのあたりを認識し、''xchg ax,ax''を''nop''に変換するものがある。同様にIBMの[[System/360]]と[[System/370]]のアセンブラでは、拡張ニーモニック''NOP''と''NOPR''を使用し、それぞれ''BC''と''BCR''のマスク0の命令に変換する。[[SPARC]]アーキテクチャでは、拡張ニーモニックを''synthetic instructions''と呼んでいる<ref>{{Cite web |url=http://www.sparc.com/standards/V8.pdf |publisher=SPARC, International |title=The SPARC Architecture Manual, Version 8 |year=1992 |accessdate=2012-10-27 |archiveurl=https://web.archive.org/web/20111210201410/http://www.sparc.com/standards/V8.pdf |archivedate=2011年12月10日 |deadlinkdate=2018年3月 }}</ref>。
 
 
 
アセンブラによっては単純な組み込みマクロ命令を備えており、数個の機械語命令に展開される。例えば、一部の[[Z80]]用アセンブラでは、''ld hl,bc'' というマクロ命令を ''ld l,c'' と ''ld h,b'' という2命令に展開する<ref>http://www.z80.de/z80/z80code.htm</ref>。
 
 
 
==== データセクション ====
 
データと変数を保持するデータ要素を定義するのに使われる命令文がある。データの型、長さ、境界(アライメント)を定義する。また、そのデータがプログラム外部(別ファイルでアセンブルされたプログラム)からも利用可能なのか、それともデータセクションを定義したプログラム内でのみ使用可能なのかも定義できる。一部のアセンブラはこれを擬似命令に分類している。
 
 
 
==== アセンブリディレクティブ ====
 
アセンブリディレクティブは、擬似命令とも呼ばれ、アセンブラがアセンブリ実施中に実行すべき命令となっている<ref name="Salomon"/>。プログラマが入力するパラメータによって、異なった形でアセンブルが行われるよう指示することができる。また、プログラムの見た目を操作して、[[可読性]]と保守性を向上させるのにも使われる。例えば、記憶装置の領域を予約し、その初期内容を指定するディレクティブなどがある。ディレクティブの名称はドットで始まることが多く、それによって通常のニーモニックと区別している。
 
 
 
擬似オペコード(pseudo-opcode)と言った場合、オブジェクトコードを実際に生成するディレクティブのみを指すこともある<ref>{{Cite web |last=Microsoft Corporation|title=MASM: Directives & Pseudo-Opcodes |url= http://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/CH08.PDF |accessdate=2011-03-19}}</ref>。
 
 
 
==== ラベル/シンボル ====
 
シンボリックアセンブラでは、任意の名前([[ラベル (プログラミング)|ラベル]]またはシンボル)とメモリ位置を対応付けることができる。通常、定数や変数に名前をつけることができ、命令文ではそれらの位置を名前で参照できる。実行コードではサブルーチンのエントリポイントと名前を関連付け、サブルーチンを名前で呼び出すことができる。サブルーチン内では、分岐命令の分岐先をラベルで示すことができる。一部のアセンブラは「ローカルシンボル」をサポートしており、通常のシンボルとは語彙的に区別する(例えば、"10$"を分岐先に使用する、など)。
 
 
 
一部のアセンブラは柔軟なシンボル管理を提供しており、複数の[[名前空間]]を管理したり、[[データ構造]]内のオフセットを自動的に計算したり、リテラル値やアセンブラが実施した単純な計算結果を参照するラベルを割り当てたりすることができる。ラベルは定数や変数を[[リロケータブル]]なアドレスで初期化するのにも使える。
 
 
 
==== コメント ====
 
他の言語と同様アセンブリ言語でも[[ソースコード]]にコメントを付与でき、アセンブラはそれらを無視できる。高水準言語に比べて可読性が低いため、コメントの重要性は高い。
 
 
 
これらの機能を多用することで低水準のコードのコーディングや保守の問題を大幅に単純化することができる。コンパイラや逆アセンブラが生成するアセンブリソースはコメントがなく、自動生成されるシンボルが意味不明で、データ定義もないため、非常に可読性が低い。
 
 
 
=== マクロ ===
 
マクロの使用はアセンブリ言語に限らず(さらには、プログラミングに限らず)一般的な技法だが、アセンブリ言語でのプログラミングでは特に有用である。[[m4 (プログラミング言語)|m4]]のような汎用のマクロプロセッサが使われることもあれば、アセンブラに組み込まれたマクロもある。以下ではアセンブラに組み込まれたマクロについて述べる。
 
 
 
多くのアセンブラは事前定義されたマクロをサポートしており、中にはユーザーが定義可能なマクロをサポートしているものもある。マクロは命令列と変数や定数の定義を埋め込むことができ、その中にオペコードやディレクティブの列が含まれる。マクロが定義されると、その名前をニーモニックとして使用できる。アセンブラはソース内にマクロを発見すると、対応するコード列に置き換え、元からソースにそのコード列が存在したかのように処理をする(アセンブラによっては、マクロを展開した中にマクロがあれば、それも展開することができる)。
 
<!--
 
なお、このような「マクロ」の定義は、例えば、[[C言語]]でのマクロとは若干異なる。C言語のマクロは一般に #define というディレクティブで定義され、1行または多くても数行で済ませることが多い。アセンブラのマクロはそれ自体が長い「プログラム」であり、アセンブラがアセンブル時に解釈して実行する。
 
--><!--
 
C言語でも長大なマクロを使うこともあり、アセンブリ言語でも命令に別名を付けるだけのマクロもある。ここにあるのは、ごく狭い経験しかないと思われる決め付けである。
 
-->
 
 
 
マクロは短い名前だが、数行からかなり長い行数のコードに展開されるので、アセンブリ言語のプログラムの見た目を短くすることができる。また、マクロによってアセンブリ言語プログラムに高水準の構造を追加でき、パラメータ付きのデバッグ用コードを埋め込むなどの利用法がある。
 
 
 
[[引数]]が使えるマクロを持つものもある。中には洗練されたマクロ言語を備えたアセンブラもあり、オプションパラメータ、記号変数、条件文、文字列操作、算術演算などの高水準言語要素を持ち、マクロ実行中にそれらを使用でき、またマクロがコンテキストをセーブしたり情報を交換したりすることも可能である。そういったアセンブラでは、マクロの引数に基づいて大量のアセンブリ言語命令またはデータ定義を生成できる。例えば、レコード風のデータ構造や展開されたループを生成するのに使え、複雑なパラメータに基づいてアルゴリズム全体を生成することもできる。そのようなマクロで大いに拡張されたアセンブリ言語を使用すると、あたかも一種の高水準言語であるかのようにプログラムを書くことができることもある。
 
 
 
メインフレームの時代には、マクロは特定顧客の大規模ソフトウェアシステムのカスタマイズや、メーカーのオペレーティングシステムを顧客の要望に合わせた特注版にするのに使われていた。例えば、[[IBM]]の [[:en:VM (operating system)|VM/CMS]]、リアルタイムトランザクション処理用アドオン、[[CICS]]、{{仮リンク|IBM Airline Control Program|en|IBM Airline Control Program|label=ACP}}/[[Transaction Processing Facility|TPF]]([[CRS (航空)|コンピュータ予約システム]] (CRS) やクレジットカード会社で使われているトランザクションOS)などで使われてきた。
 
<!--
 
アセンブラのマクロ機能だけを全く異なる言語のコード生成に使うこともできる。例えば、[[COBOL]]のプログラムをマクロアセンブラのアセンブル時に実行されるオペレータで生成することができる。
 
 
 
というのも、1960年代に実用化された「マクロ処理」は「アセンブリ」とは独立した概念であり、マクロ処理は単なるオブジェクトコード生成というよりも現代的にはワードプロセッシングやテキストプロセッシングに近い。C言語にもマクロ処理の概念が導入されており、[[プリプロセッサ]]と呼ばれる。ただし、アセンブラのマクロプロセッサは[[チューリング完全]]だったが、C言語のプリプロセッサはそうではない(Cのプリプロセッサにはループ機能や "goto" 機能がない)。
 
 
 
マクロ処理の能力は大きいが、アセンブラ以外の高水準言語ではあまり使われなくなった(例外としてC/C++と[[PL/I]]がある)。
 
--><!--
 
アセンブラごとにそのマクロ機能は全くまちまちであって、ここにある記述のように、その全てについて一概に決めつけるような記述はいずれにしても誤りである。
 
-->
 
 
 
一方で、(やはりアセンブリ言語に限られないが)マクロには「落とし穴」も多い。最も単純なものとしては、式としての意味に従って変換されるのではなく、文字列から対応する文字列に変換されるためによるバグがある。例えば、次のようなマクロがあるとする。
 
 
 
foo: macro a
 
load a*b
 
 
 
このマクロは foo という名前で仮引数 a をとる。呼出・展開時にaに渡された実引数と、(グローバル変数または定数である)bとを掛け、loadする。しかし実引数が、<tt>a-c</tt>というような式であった場合、マクロとしては、<tt>load a-c*b</tt>と展開され、(おそらく)意図されていない結果を招く。これを防ぐにはマクロ定義内で仮引数は常に括弧で囲むようにするか、呼び出し時に実引数が問題を起こしそうな式の場合は括弧で囲むようにする<ref>{{Cite web |url= http://msdn.microsoft.com/en-us/library/503x3e3s%28v=VS.90%29.aspx |title=Macros (C/C++), MSDN Library for Visual Studio 2008 |publisher=Microsoft Corp. |accessdate=2010-06-22}}</ref>。
 
 
 
このような問題は括弧で解決するが、マクロにおいて発生する問題として、一般に容易に解決できないことが知られている「名前の捕捉」という問題がある。たとえば直前の例のマクロの場合、実引数がbという名前であったとすると<tt>load b*b</tt>となって、実引数の自乗を計算する、という、(おそらく)前述の例よりももっと意図されていない結果を招く。このようなマクロの性質を一般にこの分野の専門用語で「不健全」と言う。詳細は「[[健全なマクロ]]」の記事を参照のこと。
 
 
 
=== 構造化プログラミングサポート ===
 
[[構造化プログラミング]]の要素を取り入れたアセンブラもある。最初期の例として"Concept-14 macro set"がある。Dr. H.D. Mills(March, 1970)が提案し、IBMの連邦政府システム部門のMarvin Kesslerが実装したもので、System/360のマクロアセンブラにIF/ELSE/ENDIFなどの制御構造を導入した<ref>{{Cite web |url= http://skycoast.us/pscott/software/mvs/concept14.html |title=Concept 14 Macros |publisher=MVS Software |accessdate=2009-05-25}}</ref>。これは[[Ratfor]]などと同様の発想で、コードの表面上からGOTOを消し、制御構造風な読みやすいマクロでコードを書けるというものだった。1980年代にはこの手法が広まった。
 
 
 
独特の設計として、[[:en:Whitesmiths|Whitesmiths Ltd.]]([[Unix系]]OS [[:en:Idris (operating system)|Idris]] や[[C言語|C]][[コンパイラ]]で有名)が開発した8080/[[Z80]]プロセッサ用「ストリーム指向」アセンブラ A-natural がある。この言語はオペコードや[[レジスタ (コンピュータ)|レジスタ]]、メモリ参照といった要素をそのまま扱えるためアセンブラと呼ばれているが、実行順序を示す構文を取り入れていた。括弧やその他の記号でプログラムのブロック構造を指定したり、生成した命令列の実行順序を制御できる。A-naturalは同社のCコンパイラが中間コードとしており、人間が直接使うものではなかったが、その構文にはファンも存在した。
 
 
 
また構造化プログラミングとは若干異なるが、[[キャリーラボ]]は[[BASIC]]風の文法のアセンブリ言語 BASE を開発した。[[Z80]]用のBASE-80と[[MC6809]]用のBASE-09がある。BASEの表記例は下記の通り(BASE-09)
 
 
 
<pre>
 
S[A,B,X,U
 
A=$80
 
A=A+$C0
 
S]A,B,X,U,PC
 
</pre>
 
 
 
上記の記述は下記のアセンブラ表記に対応する。
 
 
 
<source lang="asm">
 
PSHS A,B,X,U
 
LDA #$80
 
ADDA #$C0
 
PULS A,B,X,U,PC
 
</source>
 
 
 
その後、アセンブリ言語で大規模システムを開発することが少なくなり、アセンブリ言語の高機能化の需要が減っていった<ref name="assembly-language?cat=technology">{{Cite web |url= http://www.answers.com/topic/assembly-language?cat=technology |title=assembly language: Definition and Much More from Answers.com |accessdate=2008-06-19 |author=Answers.com}}</ref>。それでも、資源の制約が強い場合やターゲットシステムのアーキテクチャが高水準言語の効率的使用を妨げている場合、アセンブラは有用であり、高機能なアセンブラの開発も行われている<ref>[http://neshla.sourceforge.net/ NESHLA: The High Level, Open Source, 6502 Assembler for the Nintendo Entertainment System]</ref>。
 
 
 
== 利用 ==
 
=== 歴史的観点 ===
 
アセンブリ言語は、ごく単純なものまで含めれば、[[プログラム内蔵方式]]のコンピュータの最初期の1940年代から存在している。[[EDSAC]] (1949) の ''initial orders''(現代の用語では[[ブート]]ローダーに相当するもの)は、テープにパンチされた十進によるアドレスを、内部表現の二進に変換するなどの機能を持っていた(命令については、「1文字のニーモニック」に見えるかもしれないが、それは実際には同機の機械語そのものである)<ref>{{Cite book| last1 = Salomon | title = Assemblers and Loaders | url = http://www.davidsalomon.name/assem.advertis/asl.pdf | accessdate = 2012-01-17 | page = 7 }}</ref>。[[ナサニエル・ロチェスター]]は1954年に [[IBM 701]] 用アセンブラを書いている。1955年、Stan Poley が [[IBM 650]] 用言語アセンブリSOAP (Symbolic Optimal Assembly Program) を開発した<ref>{{Cite web| url = http://www.columbia.edu/cu/computinghistory/650.html | title = The IBM 650 Magnetic Drum Calculator | accessdate = 2012-01-17}}</ref>。
 
 
 
アセンブリ言語は、初期のコンピュータでのプログラミングでの入力ミス削減や時間短縮に貢献し、機械語コード参照やアドレス計算といった退屈な作業からプログラマを解放した。その後[[高水準言語]]へと移行していったが、ハードウェアの直接操作、特殊命令の使用、性能向上といった目的で今もアセンブリ言語が使われている。特に[[デバイスドライバ]]、[[組み込みシステム]]、[[リアルタイムシステム]]でよく使われている。
 
 
 
歴史的には多数のプログラムがアセンブリ言語だけで書かれてきた。[[ALGOL]]の方言である[[:en:Executive Systems Problem Oriented Language|ESPOL]]で書かれた [[:en:Burroughs MCP|Burroughs MCP]] (1961) が登場するまで、オペレーティングシステムはアセンブリ言語で書くのが普通だった。商用アプリケーションもアセンブリ言語で書かれている。例えば、[[IBM]]の[[メインフレーム]]用ソフトウェアの多くはアセンブリ言語で書かれていた。[[COBOL]]、[[FORTRAN]]、[[PL/I]] などが取って代わっていったが、1990年代になってもアセンブリ言語のコードベースを保守し続けていた大企業も少なくない。
 
 
 
初期の[[マイクロコンピュータ]]では、アセンブリ言語がよく使われており、OSやアプリケーションもアセンブリ言語で書かれた。これは、リソースの制約が厳しく、メモリやディスプレイのアーキテクチャが特殊だったからである。また、マイクロコンピュータ向けの高水準言語のコンパイラがなかったという面も重要である。また、初期のマイクロコンピュータのユーザはホビーストが主であり、何でも自前で作るという精神もそれに影響していたと見られる。
 
 
 
1980年代から1990年代にかけて、[[ホームコンピュータ]]([[ZX Spectrum]]、[[コモドール64]]、[[Amiga]]、[[Atari ST]] など)でもアセンブリ言語がよく使われていた。というのもそれらのBASICは性能が低く、ハードウェアの全機能を利用できないことが多かったためである。例えば、Amigaには[[フリーウェア]]のアセンブリ言語[[統合開発環境]] [http://www.theflamearrows.info/homepage.html ASM-One assembler] があり、[[Microsoft Visual Studio]] に匹敵する機能を備えていた。
 
 
 
Don French が開発した [[VIC-1001|VIC-20]] 用アセンブラは 1,639 バイトという小ささで、世界一小さいアセンブラと言われている。アドレスをシンボルで表現でき、各種アドレス計算(四則演算、AND、OR、冪乗など)が可能だった<ref>{{Cite web |url=http://www.radiks.net/~jimbo/art/int7.htm |title=Speaking with Don French : The Man Behind the French Silk Assembler Tools |date=2004-05-21 |accessdate=2008-07-25 |author=Jim Lawless |publisher= |archiveurl=https://web.archive.org/web/20080821105848/http://www.radiks.net/~jimbo/art/int7.htm |archivedate=2008年8月21日 |deadurl=no |deadlinkdate=2018年3月 }}</ref>。
 
 
 
商用製品でアセンブリ言語を使う最大の理由は、使用メモリ量を最小にし、オーバーヘッドを最小にし、性能と信頼性を向上させるためである。1980年代のビジネスソフトでは、例えば<!--、[[IBM PC]] の[[DOS (OS)|DOS]]や--><!-- ←ビジネスソフトではない -->[[表計算ソフト]] [[Lotus 1-2-3]] などはアセンブリ言語で書かれていた。日本では[[松 (ワープロ)|松]]が有名である。
 
 
 
1990年代に入っても、[[コンシューマーゲーム]]の多くはアセンブリ言語で書かれていた。ある業界関係者は、[[セガサターン]]の最高性能を引き出して[[PlayStation (ゲーム機)|プレイステーション]]に対抗するには、アセンブリ言語を使うしかなかったとしている(プレイステーションにはソニーが提供するCライブラリが存在した)<ref>[http://www.eidolons-inn.net/tiki-index.php?page=SegaBase+Saturn Eidolon's Inn : SegaBase Saturn]</ref>。また、アーケードゲームの[[NBAジャム (ゲーム)|NBAジャム]] (1993) もアセンブリ言語で開発されている。ただし一方で、ファミコン時代すでに[[メタルスレイダーグローリー]]やスーパーファミコンの[[MOTHERシリーズ|MOTHER 2]]・[[シムシティ#スーパーファミコン版|シムシティ]]<ref>[http://jp.franz.com/base/seminar/2005-11-18/SeminarNov2005-Abe.pdf Lispによるリターゲッタブルコードジェネレータの実装 (PDF)] {{webarchive|url=https://web.archive.org/web/20080820015317/http://jp.franz.com/base/seminar/2005-11-18/SeminarNov2005-Abe.pdf |date=2008年8月20日 }}</ref>、プレステの[[クラッシュ・バンディクー (ゲーム)|クラッシュ・バンディクー]]で<ref>http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview21.html</ref>、開発の一部に[[LISP]]が使われていたという話もあり、アセンブリ言語が全てという世界だった、と認識するのは誤りである。
 
 
 
=== 現代における使用 ===
 
アセンブリ言語と高水準言語を比較した有用性と性能についての議論は、これまでよく行われてきた。アセンブリ言語は、後述するように特定の用途で重要な役割を演じている。しかし、一般的には、[[コンパイラ最適化|最適化コンパイラ]]は人手で書かれたアセンブリ言語のコードと同等の性能を発揮すると言われている<ref>{{Cite web |last=Rusling |first=David A. |title=The Linux Kernel |url= http://tldp.org/LDP/tlk/basics/sw.html |accessdate=2012-03-11}}</ref>(例外もある<ref name="goto">{{Cite web |url= http://www.nytimes.com/2005/11/28/technology/28super.html?_r=1 |title=Writing the Fastest Code, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips |publisher=New York Times, John Markoff |date=2005-11-28 |accessdate=2010-03-04}}</ref><ref name="bit-fild">{{Cite web |url=http://hardwarebug.org/2010/01/30/bit-field-badness/ |title=Bit-field-badness |publisher=hardwarebug.org |date=2010-01-30 |accessdate=2010-03-04 |archiveurl=https://web.archive.org/web/20100205120952/http://hardwarebug.org/2010/01/30/bit-field-badness/ |archivedate=2010年2月5日 |deadurl=no |deadlinkdate=2018年3月 }}</ref><ref name="gcc-mess">{{Cite web |url=http://hardwarebug.org/2009/05/13/gcc-makes-a-mess/ |title=GCC makes a mess |publisher=hardwarebug.org |date=2009-05-13 |accessdate=2010-03-04 |archiveurl=https://web.archive.org/web/20100316212040/http://hardwarebug.org/2009/05/13/gcc-makes-a-mess/ |archivedate=2010年3月16日 |deadurl=no |deadlinkdate=2018年3月 }}</ref>)。最近のプロセッサやメモリサブシステムは複雑化してきたため、コンパイラでもアセンブリ言語でも効果的な最適化がますます困難になってきている<ref name="GreatDebate1">{{Cite web|url=http://webster.cs.ucr.edu/Page_TechDocs/GreatDebate/debate1.html|title=The Great Debate|date=|accessdate=2008-07-03|author=Randall Hyde|archiveurl=https://web.archive.org/web/20080616110102/http://webster.cs.ucr.edu/Page_TechDocs/GreatDebate/debate1.html|archivedate=2008年6月16日|deadurl=no|deadlinkdate=2018年3月}}</ref><ref name="compiler-fails1">{{Cite web|url=http://hardwarebug.org/2008/11/28/codesourcery-fails-again/|title=Code sourcery fails again|publisher=hardwarebug.org|date=2010-01-30|accessdate=2010-03-04|archiveurl=https://web.archive.org/web/20100402221204/http://hardwarebug.org/2008/11/28/codesourcery-fails-again/|archivedate=2010年4月2日|deadurl=no|deadlinkdate=2018年3月}}</ref>。さらに言えば、プロセッサが高性能化するにしたがって[[入出力]]や[[ページング方式|ページング]]による遅延が無視できないレベルとなったため、コーディングによる性能追求は多くのプログラマにとって大きな問題ではなくなってきている。
 
 
 
開発者がアセンブリ言語を選択する状況として、次のようなものがある。
 
* 限られた資源で単独で動作する小さな実行ファイルが必要とされ、高水準言語のランタイム環境や[[ライブラリ]]が使えない場合。アセンブリ言語を使う状況としては最も一般的である。例えば、電話機のファームウェア、自動車の燃料・点火システム、空調システム、セキュリティシステム、センサーなどがある。
 
* [[デバイスドライバ]]や[[割り込みハンドラ]]、[[ブート#ブートローダ|ブートコード]]、[[Basic Input/Output System|BIOS]]、[[Power On Self Test|POST]]など、ハードウェアと直接やりとりするコード。
 
* コンパイラでは実装されていないプロセッサ固有の命令を使わなければならないプログラム。例えば、[[暗号]]のencryptionとdecryptionに使われる[[ビット演算#(キャリーなし)ローテート|ビット単位ローテート]]命令などといった演算を使うためにアセンブリ言語を使用する。
 
* [[コンパイラ最適化|コンパイラの最適化]]では不可能な、[[SIMD]]命令を駆使した[[最適化 (情報工学)|最適化]]などを手作業で行いたい場合。
 
* 極端な最適化を必要とするプログラム(例えば、プロセッサ集約型アルゴリズム内の内側の[[ループ (プログラミング)|ループ]]など)。例えば、[[コンピュータゲーム]]開発においては、システムのハードウェア機能を最大限に発揮するようアセンブリ言語を使うことがある。また大規模な科学シミュレーションでも高度に最適化されたアルゴリズムを必要とする。例えば、[[線型代数学]]の[[Basic Linear Algebra Subprograms|BLAS]]<ref name="goto"/><ref name="bench">{{Cite web |url= http://eigen.tuxfamily.org/index.php?title=Benchmark-August2008 |title=BLAS Benchmark-August2008 |publisher=eigen.tuxfamily.org |date=2008-08-01 |accessdate=2010-03-04}}</ref>や[[離散コサイン変換]](例えば[[x264]]のSIMDアセンブリ版<ref>{{Cite web |url=http://git.videolan.org/?p=x264.git;a=tree;f=common/x86;hb=HEAD |title=x264.git/common/x86/dct-32.asm |publisher=git.videolan.org |date=2010-09-29 |accessdate=2010-09-29 |archiveurl=https://web.archive.org/web/20120304083653/http://git.videolan.org/?p=x264.git%3Ba%3Dtree%3Bf%3Dcommon%2Fx86%3Bhb%3DHEAD |archivedate=2012年3月4日 |deadlinkdate=2018年3月 }}</ref>)がアセンブリ言語で書かれている。
 
* 新たなプロセッサや特殊なプロセッサなど、高水準言語が存在しない場合。
 
* 次のような正確なタイミングを必要とするプログラム。
 
** シミュレーション、航空航法システム、医療装置などの[[リアルタイムシステム|リアルタイム]]プログラム。例えば[[フライ・バイ・ワイヤ]]システムでは、[[遠隔測定法|テレメトリ]]を厳密な制限時間内に解釈して対応する必要がある。そのようなシステムでは予測不能な遅延の原因を排除する必要があり、自動[[ガベージコレクション]]を伴う[[インタプリタ]]や[[ページフォルト]]を伴う[[仮想記憶]]や[[プリエンプション|プリエンプティブ・マルチタスク]]を避けなければならない。高水準言語の中には、ランタイム環境やOSインタフェースによってそのような遅延を生じるものがある。アセンブリ言語や低水準言語を選択することで、処理の詳細な部分まで目が行き届く。
 
** 暗号アルゴリズムは常に厳密に同じ時間で実行することで、{{仮リンク|タイミング攻撃|en|timing attack}}を防ぐ。
 
* 高度なセキュリティが要求され、環境を完全に制御する必要がある場合。
 
* [[コンピュータウイルス]]、[[ブート#ブートローダ|ブートローダ]]、一部の[[デバイスドライバ]]など、ハードウェアと密接に連携するソフトウェア。
 
* 監視・トレース・[[デバッグ]]のための[[命令セットシミュレータ]]で、追加のオーバーヘッドを最小に保ちたい場合。
 
* 次のような[[リバースエンジニアリング]]またはプログラムファイルの改造。この場合[[逆アセンブラ]]が併用される。
 
** [[ソースコード]]が失われた(または入手できない)[[バイナリ]]ファイルがあるとき、それを改造する場合。あるいはソフトウェアの[[コピープロテクト]]を(不正に)解除する場合。
 
** [[テレビゲーム]]の改造。アセンブリ言語レベルでの改造がよく行われている。
 
* [[自己書き換えコード]]
 
* [[グラフ電卓]]向けのソフトウェア開発<ref>{{Cite web |url=http://tifreakware.net/tutorials/89/a/calc/fargoii.htm |title=68K Programming in Fargo II |accessdate=2008-07-03 |archiveurl=https://web.archive.org/web/20080702181616/http://tifreakware.net/tutorials/89/a/calc/fargoii.htm |archivedate=2008年7月2日 |deadurl=no |deadlinkdate=2018年3月 }}</ref>
 
 
 
[[コンピュータ科学]]のカリキュラムでは、アセンブリ言語(ないし[[機械語]])の基礎は必修である。なぜなら、コンピュータ科学ではコンピュータのハードウェア、具体的には[[プロセッサ]]や[[コンピュータ・アーキテクチャ|アーキテクチャ]]について学ぶが、(普通の)プロセッサが直接実行するのは高水準言語ではなく機械語だからであり、アーキテクチャは機械語の命令セットとして定義されるものだからである(Instruction Set Architecture、ISA)。また[[システムソフトウェア]]、具体的には[[コンパイラ]]や[[オペレーティングシステム]]の「最も下側」の部分の理解のためにも必須である。<!--実際にアセンブリ言語を使用するプログラマは全体から見れば少ないが、その概念は非常に重要である。[[二進法]]、[[メモリ管理]]、[[スタック]]処理、[[文字コード]]、[[割り込み (コンピュータ)|割り込み]]処理、[[コンパイラ]]設計といった基本的トピックは、ハードウェアレベルでのコンピュータの動作を学ばなければ深く理解するのが困難である。コンピュータの動作は基本的には[[命令セット]]で定義されるので、アセンブリ言語を学ぶことでそのような概念を習得できる。--><!--↑こういったことをゴチャゴチャ書く必要は無いと思います-->
 
 
 
なお一方で、最近のコンピュータの命令セットはその多くはどれも似ている。したがって、どれか1つのアセンブリ言語を学ぶだけで、基本概念、どんなときにアセンブリ言語を使用するのが適しているか、高水準言語から効率的な実行コードを生成する方法をある程度は学習できる<ref>{{Cite web |url=http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/fwd.html |title=Foreword ("Why would anyone learn this stuff?"), ''op. cit.'' |date=1996-09-30 |accessdate=2010-03-05 |author=Hyde, Randall |archiveurl=https://web.archive.org/web/20100325155048/http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/fwd.html |archivedate=2010年3月25日 |deadurl=no |deadlinkdate=2018年3月 }}</ref>。
 
 
 
より実践的には、コンパイラが生成したコードを確認したい場合といったようなものがある。普段は意識しないような場所であっても、何か理由があっていざという時には腑分けできるということは重要である。これは、子どもが算数([[筆算]]など)を学ぶ必要があるが、日常の計算には[[電卓]]を使っているのに似ている。また、「最適化の最後の手段」でもある。
 
 
 
=== 高水準言語との連携 ===
 
* 高水準言語の処理系の[[呼出規約]](言語処理系ではなくOSやハードウェアベンダ側で共通化している場合もある)に従うことで、高水準言語と相互にコードを呼び出すことができる。後述の[[インラインアセンブラ]]などにより同一のモジュールに埋め込むこともできれば、別モジュールとして[[リンケージエディタ]]でリンクすることもある。
 
* 多くのコンパイラは、機械語を直接生成するのではなく、アセンブリ言語のコードを生成し、それをアセンブラに通している。人間による[[デバッグ]]や最適化などに便利である(機械による最適化には、内部表現を使ったほうが便利なので、あまり意味がない)。その意味ではアセンブリ言語は、目に見えない形ではあるが最も利用頻度の高いプログラミング言語といえるという主張もあるが、その意味では機械語が絶対的に最も利用頻度の高いプログラミング言語である。
 
* [[インラインアセンブラ]]のある言語ないし処理系では、ソース中にアセンブリ言語による記述を含めることができる。例えば[[Linuxカーネル]]ではその利用が多い。アセンブリ言語と同様の利点が得られるかわりに、やはりアセンブリ言語と同様にプログラミング言語を使う利点(移植性など)が失われる。
 
 
 
=== 主な利用用途 ===
 
 
 
==== 道路施設 ====
 
* [[電光掲示板]]
 
* [[信号機]]
 
 
 
==== 家電機器 ====
 
* [[炊飯器]]
 
* [[掃除機]]
 
* [[洗濯機]]
 
* [[電子レンジ]]
 
* [[リモコン]]
 
* [[冷蔵庫]]
 
* [[冷凍庫]]
 
 
 
==== 玩具 ====
 
* [[ファービー]]
 
 
 
==== OS ====
 
* [[BareMetal]][https://en.wikipedia.org/wiki/BareMetal]
 
* [[KolibriOS]][https://en.wikipedia.org/wiki/KolibriOS]
 
* [[MenuetOS]][https://en.wikipedia.org/wiki/MenuetOS]
 
* [[SymbOS]][https://en.wikipedia.org/wiki/SymbOS]
 
* [[UNIX]](1969年〜1973年まで)
 
 
 
==== コンピューター・パソコン ====
 
* [[Apple II]] - [[65816 (コンピュータ)]]を使用。
 
* [[X1 (コンピュータ)]]
 
* [[PC-8800]]
 
* [[MSX]]
 
* [[X68000]]
 
 
 
==== ゲーム機 ====
 
* [[PCエンジン]] - - [[MOS 6502]]を使用。
 
* [[ファミリーコンピュータ]] - MOS 6502を使用。
 
* [[ゲームギア]] - [[Z80]]を使用。
 
* [[ゲームボーイ]] - Z80を使用。
 
* [[スーパーファミコン]] - 65816(Ricoh 5A22)
 
* [[メガドライブ]]
 
 
 
==== ゲームソフト ====
 
* [[セガサターン]] - [[ナイツ (ゲーム)]]に使用された。
 
 
 
== 主なアセンブラ ==
 
* [[IBM High Level Assembler|IBM High Level Assembler (HLASM)]] - [[IBM]]系[[メインフレーム]]用のアセンブラ。
 
* [[PDP-8#プログラム例|PDP-8のアセンブリ言語]] - PAL-III (Program Assembly Language III)
 
* [[CAP-X]] - CASL 以前に情報処理技術者試験で使われていたアセンブリ言語
 
* [[CASL]] - [[情報処理技術者試験]]用に作られたアセンブリ言語。同時に定義されているペーパーマシンCOMET用
 
* [[:en:As (Unix)|as]] - [[UNIX]]用のアセンブラ
 
* [[GNUアセンブラ|GNUアセンブラ (gas)]] - [[GNUプロジェクト]]が開発する、[[x86]]、[[MC68000|680x0]]、[[SPARC]]、[[VAX]]などの各種CPU用のアセンブラ
 
* [[Microsoft Macro Assembler|Microsoft Macro Assembler (MASM)]] - [[インテル]]のx86 CPU用に[[マイクロソフト]]が開発したアセンブラ
 
* [[Netwide Assembler|Netwide Assembler (nasm)]] - MASMと互換性の高いx86 CPU用アセンブラ
 
* [[Turbo Assembler|Turbo Assembler (TASM)]] - [[ボーランド]]が開発していた、MASMと互換性の高いx86 CPU用アセンブラ
 
* [[MIX (プログラミング)|MIXAL]] - [[ドナルド・クヌース]]が考案したペーパーマシンMIX用。また後継ペーパーマシンMMIX用の[[MMIX|MMIXAL]]も存在する
 
 
 
[[Unix系]]システムでは、アセンブラを as と呼ぶのが一般的だが、実体はそれぞれのOSで異なる。[[GNUアセンブラ]]を使っているものが多い。
 
 
 
同じ系統のプロセッサであっても、複数のアセンブリ言語の方言が存在する。アセンブラによっては他の方言のアセンブリ言語も使用可能な場合がある。例えば、[[Turbo Assembler|TASM]]は[[Microsoft Macro Assembler|MASM]]用コードを入力として受け付け可能だが、逆は不可能である。{{仮リンク|FASM|en|FASM}}と[[Netwide Assembler|NASM]]は文法がほぼ同じだが、サポートしているマクロが異なるため、相互の翻訳は困難である。いずれも基本機能は同じだが、追加機能に差異がある<ref name="Hyde">{{Cite web |url = http://webster.cs.ucr.edu/AsmTools/WhichAsm.html |title = Which Assembler is the Best? |accessdate = 2007-10-19 |author = Randall Hyde |archiveurl = https://web.archive.org/web/20071018014019/http://webster.cs.ucr.edu/AsmTools/WhichAsm.html |archivedate = 2007年10月18日 |deadurl = no |deadlinkdate = 2018年3月 }}</ref>。
 
 
 
== 脚注 ==
 
{{Reflist|group="注"}}
 
 
 
== 出典 ==
 
{{Reflist|colwidth=30em}}
 
 
 
== 参考文献 ==
 
* Jonathan Bartlett: ''[http://programminggroundup.blogspot.com/ Programming from the Ground Up]''. Bartlett Publishing, 2004. ISBN 0-9752838-4-7<br />Also available online [http://download.savannah.gnu.org/releases-noredirect/pgubook/ProgrammingGroundUp-1-0-booksize.pdf as PDF]{{リンク切れ|date=2018年3月 |bot=InternetArchiveBot }}
 
* Robert Britton: ''MIPS Assembly Language Programming''. Prentice Hall, 2003. ISBN 0-13-142044-5
 
* Paul Carter: ''PC Assembly Language''. Free ebook, 2001.<br />[http://drpaulcarter.com/pcasm/ Website]
 
* Jeff Duntemann: ''Assembly Language Step-by-Step''. Wiley, 2000. ISBN 0-471-37523-3
 
* Randall Hyde: ''The Art of Assembly Language''. No Starch Press, 2003. ISBN 1-886411-97-2
 
* Peter Norton, John Socha, ''Peter Norton's Assembly Language Book for the IBM PC'', Brady Books, NY: 1986.
 
* Michael Singer, ''PDP-11. Assembler Language Programming and Machine Organization'', John Wiley & Sons, NY: 1980.
 
* Dominic Sweetman: ''See MIPS Run''. Morgan Kaufmann Publishers, 1999. ISBN 1-55860-410-3
 
* John Waldron: ''Introduction to RISC Assembly Language Programming''. Addison Wesley, 1998. ISBN 0-201-39828-1
 
 
 
== 関連項目 ==
 
* [[逆アセンブラ]]
 
* [[コンパイラ|コンパイル]]
 
* [[マクロ (コンピュータ用語)|マクロ(コンピュータ用語)]]
 
* [[命令セット]]
 
 
 
== 外部リンク ==
 
* [http://www.atariarchives.org/mlb/introduction.php Machine language for beginners]
 
* [http://www.int80h.org/ Unix Assembly Language Programming]
 
* [http://www-03.ibm.com/systems/z/os/zos/bkserv/r8pdf/index.html#hlasm IBM High Level Assembler] IBMのメインフレーム用アセンブリ言語のマニュアル
 
* [http://c2.com/cgi/wiki?LearningAssemblyLanguage PPR: Learning Assembly Language]
 
* [http://www.azillionmonkeys.com/qed/asmexample.html Assembly Language Programming Examples]
 
* [http://www.grc.com/smgassembly.htm Authoring Windows Applications In Assembly Language]
 
* [http://mark.masmcode.com/ Assembly Optimization Tips] by Mark Larson
 
* [http://nasm.sourceforge.net/doc/nasmdoc0.html NASM Manual]
 
* [http://www.softools.com/sasmzilog.htm Z80/Z180/8085 Assembler]
 
  
 
{{プログラミング言語一覧}}
 
{{プログラミング言語一覧}}
334行目: 14行目:
 
[[Category:アセンブリ言語|*]]
 
[[Category:アセンブリ言語|*]]
 
[[Category:アセンブラ|*]]
 
[[Category:アセンブラ|*]]
 
 
[[pl:Asembler#Język asemblera]]
 

2018/9/24/ (月) 18:51時点における最新版

アセンブリ言語(アセンブリげんご、英: assembly language)

  • コンピューターで、機械語の命令を分かりやすいように記号化した言語。機械語と一対一の対応をしており、高級言語に比べ、機械語の命令などをより細かく記述できる。記号言語。
  • コンピュータの機械語を, 足し算なら ADD, 引き算なら SUB (subtract の略)のように記号で表わすもの. assembler ともいう.


楽天市場検索: