X86アセンブラ/x86アセンブラ
x86 アーキテクチャには様々なアセンブラーが存在します。このページではそのうちのいくつかを紹介し、どこでアセンブラーを入手できるか、何に使えるか、どこで最も使われているかなどを説明します。
GNUアセンブラー( GNU assembler )は、GCCコンパイラのアセンブリーバックエンドとして最も一般的です。GAS(頻繁に略称される)のプログラミングを学ぶ最も説得力のある理由の一つは、インラインのアセンブリ命令(Cソースコードに埋め込まれたアセンブリコード)を書くことであり、これらの命令は(gccによってコンパイルされる際に)GASの構文である必要があるからです。GASはアセンブリ言語を記述するためにAT&T構文を使用しており、これはより複雑であると主張する人もいるが、より情報量が多いと言う人もいる。
注意:最近のGCCには「-masm」オプションがあり、「-mas=intel」に設定すると、インテルの構文を使ってインラインアセンブリを定義できるようになります。GASでは、「-msyntax=intel」または「.intel_syntax」指令を使用することで対応できます。
いにしえの、pcc( Portable C compiler )は、Cのソースコードからターゲットプロセッサーのアセンブリー言語のソースコードを出力し、出力されたアセンブリ言語ソースをアセンブラーが処理し機械語表現を得ていました。
この構造は、クロスコンパイル・クロスアセンブル・クロスビルドを行う上で好適でC言語のホームグランドである Unix の移植に貢献しました。
ただし、移植が完了しセルフビルドが主になるとCコンパイラーのコード生成先にアセンブリ言語を選択せず、アセンブラーが行っているように直接機械語表現を得るほうが効率的であることが自明となり、(様々な内部的な中間表現を経て)アセンブラーが出力するような直接機械語表現をCコンパイラー自身が出力することが主流となりました。
この様な状況の下でも、Cコンパイラーにアセンブリー言語を出力するオプション -S
は多くのCコンパイラーでサポートされ続けており
- Cのソースがどんなアセンブリー言語に翻訳されるかの確認
- それが最適化でどの様に変化するかの確認
- Cコンパイラーがなし得ない最適化(ex. 専用命令の使用)を手動で行う場合の雛形の生成
などのニーズがあります。
マイクロソフトのマクロアセンブラー「MASM」は、何年も前から使われ続けています。『MASMはもうサポートされていない』『改良されていない』と言う人が多いが、マイクロソフトはこれを否定している。MASMはメンテナンスされていますが、現在はバグフィックスモードになっています。現在、新しい機能は追加されていません。しかし、マイクロソフトは64ビット版のMASMを新しい64ビットコンパイラー・スイートとともに出荷しています。MASMはマイクロソフトからVisual Studio+の一部、MSDNからのダウンロード、またはMicrosoft DDKの一部として提供されています。MASMの最新バージョンはバージョン11.xです(参考: www.masm32.com)。
MASMの命令はインテルの構文を採用しており、GASアセンブラーが採用しているAT&Tの構文とは対照的です。最も重要なのは、MASMの命令はGASとは逆の順序でオペランドを受け取ります。この事実が、2つのアセンブラーの間で移行しようとする人々にとって最大の障害となっているのです。
また、MASMには非常に強力なマクロエンジンが搭載されており、多くのプログラマーがMASMのプログラムに高級言語風の見た目を持たせるために使用しています。
外部リンク
編集JWASMは、オープン・ワトコムのWASMをベースにした80x86プラットフォーム用の16、32、64ビットのアセンブラーで、Japheth氏によって作成されました。
構文的にはMASMと互換性がありますが、より高速で、ソースコードはSybase Open Watcom Public Licenseに基づいて自由に入手できるため、商用・非商用を問わず無料で使用できます。さらに、JWASMはELFをサポートしており、一般的なMASMの構文をサポートする唯一のクロスプラットフォームのアセンブラーです。JWASMは積極的に開発されており、一般的にはMASMの非公式な後継製品とみなされています。
外部リンク
編集Netwide Assembler(NASM)は、80x86プラットフォーム用のフリーでリターゲティング可能なアセンブラーを作るために、オープンソースで開始されました。NASMプロジェクトが開始された当時、MASMはまだマイクロソフトから販売されており(現在はMASMは無料)、GASにはエラーチェック機能がほとんど含まれていませんでした。GASは結局のところGCCのバックエンドであり、GCCは常にGASに文法的に正しいコードを供給していた。このため、GASはユーザーとのインターフェースをあまり必要とせず、GAS用のコードを書くのは非常に大変でした。
NASMは、「インテルに似ているが、複雑ではない」構文を使用しています。
NASMのユーザーマニュアルは http://www.nasm.us/doc/ にあります。
特徴
- クロスプラットフォーム: GASと同様に NASM は,ほぼすべてのプラットフォームで動作し、PowerPC Macでも動作すると言われています(ただし、生成されるコードはx86プラットフォームでのみ動作します)。
- オープンソース
- マクロ言語(コードを書くコード)
アセンブリで書かれていますが、DOS、DexOS、Linux、Windows、BSDなど、いくつかのOSで動作します。構文はTASMの "ideal mode "やNASMのものと似ていますが、このアセンブラーのマクロは別の方法で行われています。
特徴
- このアセンブラー自体が書かれているので、ソースコードはこのアセンブラーの書き方の例になっています。
- オープンソース
- NASMのようなきれいな構文
- 非常に高速
- マクロ言語(コードを書くコード)がある。
- DOSおよびWindows用の内蔵IDE
- バイナリー、MZ、PE、ELF、COFFを作成 - リンカーは不要
外部リンク
編集Yasmアセンブラー
編集YASMは、2条項BSDライセンスのもと、NASMを全面的に書き直したものです。YASMは、複数の構文をネイティブに理解できるように設計されています(現在はNASMとGAS)。YASMの主な目的は、低レベルでコードを扱うことができ、他のソフトウェアプロジェクトに容易に統合することができる再利用可能なライブラリ、"libyasm"を作ることです。
外部リンク
編集HLA
編集HLAは、Randall Hyde氏が開発したアセンブラーのフロントエンドで、同氏の著書「The Art of Assembly」で初めて紹介されました。
HLAは、高レベルフォーマットで書かれたアセンブリを受け取り、そのコードを別のフォーマット(通常、MASMまたはGAS)に変換します。その後、別のアセンブラー(MASMまたはGAS)が命令をマシンコードにアセンブルします。
BBC BASIC for WINDOWS (proprietary)
編集プロプライエタリーなBBC BASIC for Windowsは、INTELシンタックスを使ったWindows用のユーザーモードをターゲットとした32ビットx86アセンブラーの開発をサポートしていますが、現在のところ(プロプライエタリーなランタイムと環境を含まない限り)スタンドアロンのEXEの生成はできません。 マクロアセンブルは、BBC BASIC環境を使用して可能であり、関連するコードに巻き付けられたBASIC関数を用いてマクロを定義します。
詳細については、マニュアルの「http://www.bbcbasic.co.uk/bbcwin/manual/bbcwina.html Assembler」の項をご覧ください。