GAS_Intel記法の利用

GAS(GNU アセンブラ)でIntel記法を利用する。

GASは標準でAT&T形式の記法を使用しています。

設定を行うことで、Intel形式の記法でソースコードを記述することができます。


「.intel_syntax」ディレクティブ

「.intel_syntax」ディレクティブを利用することでintel記法を使用できるようになります。

アセンブリソースファイルの先頭にディレクティブを記述します。


.intel_syntax noprefix

「-masm=intel」オプション

C言語ファイルからGASファイルを生成する(-Sオプション)際に、AT&T記法ではなくintel記法で出力させたい場合には、「-masm=intel」オプションを指定します。


$ gcc -S -masm=intel source.c

また、インラインアセンブラでintel記法を使う場合にも、「-masm=intel」オプションを指定します。


$ gcc -masm=intel source.c

「.att_syntax」ディレクティブ

「.att_syntax」ディレクティブを指定する事によりAT&T記法を使用します。

デフォルトの設定であるため、ソースコードで明示したい場合に利用します。


Intel形式の構文について

AT&T記法とIntel記法で構文が異なります。

主な違いとして以下のものが挙げられます。


レジスタの指定

AT&T構文ではレジスター・オペランドの前に % が付きますが、Intel 構文では付きません


Intel: register
AT&T : %register

オペランドの順序について

AT&T構文とIntel構文ではソース・オペランドとデスティネーション・オペランドの順序が逆です。


Intel: ニーモニック [転送先], [転送元]
AT&T : ニーモニック [転送元], [転送先]

eaxレジスタに数値4を代入する命令は以下のようになります。


Intel: mov eax, 4
AT&T : movl $4, %eax

即値について

AT&T 構文では即値オペランドの前に $ が付きますが、Intel 構文では付きません。


Intel: push 4
AT&T : pushl $4

アドレッシングについて

AT&Tでは、レジスタを「()」記号で囲うと、レジスタが指しているメモリ番地の内容になります。

Intelでは、レジスタを「[]」記号で囲うことで番地の内容を操作します。


Intel記法で、ebxの値をeaxに登録されているメモリアドレスへ書き込む場合、以下のように記述します。


mov [eax], ebx

オペレーションサフィックスについて

AT&T記法では、オペランドのサイズによってオペコードに適切なサフィックスを付加する必要があります。

Intel記法では、オペランドのサイズはアセンブラが自動で判断することができるため、省略することが可能です。

ただし、確実に処理させるために、サイズを明示的に指定することが推奨されます。


Intel: オペコード [オペランド1] [オペランド2] ...
AT&T : [オペコードとサフィックス] [オペランド1] [オペランド2] ...

Intel記法でのオペランドサイズ指定方法は以下のようになります。


add esp, byte 4
mov [eax], word ptr 100
push dword msg

関連ページ