GNUアセンブラ(グヌーアセンブラ、: GNU assembler; GAS) はGNUプロジェクトによって開発されているアセンブラである。GNUコンパイラコレクションのデフォルトのバックエンドとして使用されており、GNUオペレーティングシステムLinuxカーネルのコンパイルにも使われる。Ver.2.5以降はGNU Binutilsパッケージの一部分である[2]

GNUアセンブラ
開発元 GNUプロジェクト
最新版
GNU Binutils 2.44[1] ウィキデータを編集 / 2025年2月2日 (21日前)
プログラミング
言語
C言語
プラットフォーム クロスプラットフォーム
種別 アセンブラ
ライセンス GNU General Public License v3
公式サイト www.gnu.org/software/binutils/
テンプレートを表示

Gasの実行ファイル名は as であり、Unix系システムでの標準的なアセンブラの実行ファイル名である。GASはクロスプラットフォームであり、様々なコンピュータ・アーキテクチャ上で動き、またそれらを対象にアセンブルすることができる。GNU General Public Licenseでライセンスされた自由ソフトウェアである。

歴史

編集

GASの最初のバージョンは1986年から1987年にリリースされた[3]。これはディーン・エルスナー(Dean Elsner)によって書かれ、VAXアーキテクチャをサポートしていた[3]

一般的な構文

編集

GASはサポートするアーキテクチャすべてで使用可能な一般構文を持つ。一般構文にはアセンブラ指示文やコメントも含まれる。デフォルトの構文はAT&A記法である。

ディレクティブ

編集

GASはピリオドで始まるキーワードである、C言語プリプロセッサに似たアセンブラ指示文(疑似命令)を使用する。ほとんどのアセンブラ指示文はすべてのアーキテクチャを対象に使用できるが、一部機種依存のものもある[4]

バージョン2.10以降では、.intel_syntaxディレクティブを使用することでIntel記法を使用できる[5][6][7]

コメント

編集

GASは2つのコメント形式をサポートしている。

複数行

Gasは、C言語と同様の「/*」「*/」で囲まれる複行コメントを実装している[8]

    movl %eax,%edx /* ここはコメント
                      改行の入った
                      説明文 */

単一行

単一行コメントには、アセンブル対象のアーキテクチャに応じていくつかの異なる形式がある。

記法

編集

批判の一つに、x86x86-64といったアーキテクチャ上で一般的なインテル記法ではなく、AT&T記法を使用することが挙げられる。mov などの命令の引数の順番が逆になっている。

しかし、バージョン2.10[9]から追加された.intel_syntaxディレクティブにより、インテル記法もサポートされた[10][11]

利用

編集

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"に代入

出典

編集
  1. ^ "GNU Binutils 2.44 Released"; 閲覧日: 2025年2月2日; 出版日: 2025年2月2日.
  2. ^ "The GNU Binutils are a collection of binary tools. The main ones are: ... as - the GNU assembler." GNU Binutils. gnu.org. 2022-03-11閲覧.
  3. ^ a b "The GNU Assembler". CiteSeerX 10.1.1.32.4503
  4. ^ The GNU Assembler - Assembler Directives”. 2008年5月16日閲覧。
  5. ^ GNU Assembler News”. 2025年2月19日閲覧。 “A new pseudo-op .intel_syntax has been implemented to allow gas to parse i386 assembly programs with intel syntax.”
  6. ^ AT&T Syntax versus Intel Syntax”. 20 June 2011時点のオリジナルよりアーカイブ。28 July 2014閲覧。
  7. ^ Ram Narayan (2007年10月17日). “Linux assemblers: A comparison of GAS and NASM”. IBM DeveloperWorks. 3 March 2009時点のオリジナルよりアーカイブ。28 July 2014閲覧。
  8. ^ The GNU Assembler - Comments”. 2008年5月16日閲覧。
  9. ^ GNU Assembler News”. 2008年5月16日閲覧。
  10. ^ AT&T Syntax versus Intel Syntax”. Using as, the GNU Assembler. 2008年5月16日閲覧。
  11. ^ Ram Narayan (2007年10月17日). “Linux assemblers: A comparison of GAS and NASM”. IBM DeveloperWorks. 2007年10月17日閲覧。

関連項目

編集

外部リンク

編集