GAS_基本文法

GAS (The GNU Assembler)ファイル拡張子

GAS(GNU アセンブラ)のファイル拡張子は「.s」または「.S」となります。

異なる拡張子を用いることもできますが、リンカを適切に設定する必要があります。

アセンブリファイルの拡張子が「.s」であれば、gccが自動的にアセンブリ(as)とリンカ(ld)を適切に呼び出します。


コメントの記述

GASは、3種類のコメントをサポートしています。

ただし、「//」記号はアセンブラや環境によって使用できないことがあります。


# 1行のコメント:一般的なアセンブリにおけるコメント記号

// 1行のコメント:C/C++と同様のコメント記号

/*
 * 複数行コメントはC言語などのようにスラッシュ、アスタリクスです。
 */ 

基本構造

以下はGASによるhelloworldソースコードです。


.file   "hello.s"
.data
msg:    .ascii  "hello world\n"
msgend: .equ    len, msgend - msg

.bss
.text
.globl main
main:
        movl $4,        %eax # write system call(sys_write)
        movl $1,        %ebx # arg1:stdout
        movl $msg,      %ecx # arg2:str
        movl $len,      %edx # arg3:strlen
        int  $0x80           # system call
        ret

セクション (section)

セクションは、プログラム本体やプログラム中で使用する定数、文字列、変数を必要な性質に応じて区別して管理するためにあります。

.data 初期化が必要なデータを置きます。データの書き換え可能な領域です。
.text プログラム本体や初期化されて変更する必要のないデータを置きます。データの書き換え不可能な領域です。
.bss 実行時にメモリを割り当てる領域です。実行開始時に定義済みの値を持つ必要のないメモリ領域に使用します。Block Started by Symbolの略

ディレクティブ (Directive:擬似命令:psuedo-opcode)

ディレクティブとは、アセンブラに対する命令です。

ドットで始まる文字列で定義します。

.file ソースファイルのファイル名を記述します。
.globl 呼び出される関数を指定します。(アセンブラのバージョンによっては「.global」と指定することもできます。)
.ascii アスキー文字列の定数を定義します。
.equ 定数の定義

※「.globl .global」は指定したシンボルをリンカに知らせる役割となります。


ラベル(シンボル)

ラベルは、コロン「:」が後ろに付いたシンボルであり、宣言された場所のメモリアドレスを値として持ちます。

英文字の大文字と小文字は区別され、異なるシンボル名とみなされます。

同じシンボル名は一度だけ宣言でき、重複することはできません。


GASアセンブリ命令

GASの命令はAT&T形式に従った順序で記述します。


ニーモニック 転送元 転送先

ニーモニック (mnemonic)

アセンブラの命令はニーモニック(mnemonic:(形)記憶を助ける)と呼ばれます。

ニーモニックは、オペコードとオペレーションサフィックスで構成されます。


movl : mov(オペコード) + l(サフィックス)

オペコード (op-code)

オペコードはマシン語命令のことです


オペレーションサフィックス (suffix)

オペレーションサフィックスとは、オペランドとして扱うデータサイズを指定する指示語です。

サフィックスはオペコードの最後に付けます。

b バイト(8ビット)
s ショート (16ビット整数)またはsingle(32ビット浮動小数点数)
w ワード(16ビット)
l ロング(32ビット整数または64ビット浮動小数点数)
q クワッド(64ビット)

オペランド(operand)

オペランドはオペコードの引数のことです。

転送元(ソース・オペランド)や転送先(デスティネーション・オペランド)を設定します。


ニーモニック [第一オペランド] [第二オペランド] ...

プレフィクス (prefix)

レジスタを参照する場合には、レジスタ名の前に「%」をプレフィクスとして付けます。

定数の場合には、プレフィクスとして「$」を付けます。

例えば、数値0をeaxレジスタに代入する場合には下記の形式になります。


movl $0, %eax

関連ページ