GNUアセンブラ(グヌーアセンブラ、; GAS) はGNUプロジェクトによって開発されているアセンブラである。GNUコンパイラコレクションのデフォルトのバックエンドとして使用されており、GNUオペレーティングシステムやLinuxカーネルのコンパイルにも使われる。Ver.2.5以降はGNU Binutilsパッケージの一部分である"The GNU Binutils are a collection of binary tools. The main ones are: ... as - the GNU assembler." GNU Binutils. gnu.org. 2022-03-11閲覧.。
Gasの実行ファイル名は であり、Unix系システムでの標準的なアセンブラの実行ファイル名である。GASはクロスプラットフォームであり、様々なコンピュータ・アーキテクチャ上で動き、またそれらを対象にアセンブルすることができる。GNU General Public Licenseでライセンスされた自由ソフトウェアである。
歴史 GASの最初のバージョンは1986年から1987年にリリースされた。これはディーン・エルスナー(Dean Elsner)によって書かれ、VAXアーキテクチャをサポートしていた。
一般的な構文 GASはサポートするアーキテクチャすべてで使用可能な一般構文を持つ。一般構文にはアセンブラ指示文やコメントも含まれる。デフォルトの構文はAT&T記法である。
ディレクティブ GASはピリオドで始まるキーワードである、C言語のプリプロセッサに似たアセンブラ指示文(疑似命令)を使用する。ほとんどのアセンブラ指示文はすべてのアーキテクチャを対象に使用できるが、一部機種依存のものもある 。
バージョン2.10以降では、.intel_syntaxディレクティブを使用することでIntel記法を使用できる。
コメント GASは2つのコメント形式をサポートしている。
複数行
Gasは、C言語と同様の「/*」「*/」で囲まれる複行コメントを実装している。
<nowiki> movl %eax,%edx /* ここはコメント 改行の入った 説明文 */ </nowiki>
単一行
単一行コメントには、アセンブル対象のアーキテクチャに応じていくつかの異なる形式がある。 ハッシュ記号 (#) — i386, x86-64, i960, 68HC11, 68HC12, VAX, V850, M32R, PowerPC, MIPS, M680x0, RISC-V セミコロン (;) — AMD Am29000 系統, ARC, H8/300 系統, HPPA, PDP-11, , Motorola, M32C アットマーク (@) — 32-bit ARM 二つのスラッシュ (//) — AArch64 バーティカルバー (|) — M680x0 感嘆符 (!) — Renesas SH
記法 批判の一つに、x86やx86-64といったアーキテクチャ上で一般的なインテル記法ではなく、AT&T記法を使用することが挙げられる。mov などの命令の引数の順番が逆になっている。
しかし、バージョン2.10から追加された.intel_syntaxディレクティブにより、インテル記法もサポートされた。
利用 GNUアセンブラは、人気のコンパイラスイートであるGCCのバックエンドとして、オープンソースソフトウェアや自由ソフトウェアのコンパイルに広く使用されている。GASは、他のGNUソフトウェアと組み合わせてLinuxオペレーティングシステム上のアセンブラとしてよく使用される。GASの修正されたバージョンは、macOS開発ツールパッケージにも含まれている。
プログラム例 IA-32上のLinux用の標準的な「Hello, world!」プログラムは以下のように実装される。 .global _start
.text _start: movl $4, %eax # 4("write"システムコールのコード)-> EAXレジスタ movl $1, %ebx # 1(標準出力のファイルディスクリプタ)-> EBX(システムコールの第1引数) movl $msg, %ecx # msg文字列の32ビットアドレス -> ECX(第2引数) movl $len, %edx # msg文字列の長さ -> EDX(第3引数) int $0x80 # 0x80(128)で割り込みを発生させ、カーネルのシステムコール処理を呼び出す
movl $1, %eax # 1("exit")-> EAX movl $0, %ebx # 0(成功終了)-> EBX int $0x80 # 前述の通り
.data msg: .ascii "Hello, world!\n" # インラインのASCII文字列 len = . - msg # (現在のアドレス - msgの開始アドレス)をシンボル"len"に代入
出典
関連項目
GNUツールチェーン
外部リンク
Binutils homepage Gas manual