アセンブラのAT&T記法とIntel記法

アセンブラにはAT&T記法とIntel記法の二種類が存在する。割とIntel記法のほうが使われている気はするものの、GNUアセンブラ(GAS)ではAT&T記法が用いられており、従ってGDBでもデフォルトではAT&T記法が使用される。


GDBで記法の切り替え

GDBで記法を切り替えるには、GDBを起動してコマンドラインから

set disassembly-flavor intel

と入力すれば、Intel記法へと切り替わる。逆にAT&T記法にするには"set disassembly-flavor att"とすればいい。

とはいえ毎回GDBの起動ごとに上のコマンドを叩くのも七面倒臭い。そこでホームディレクトリに.gdbinitというファイルを作り、上記の"set disassembly-flavor intel"を書き込むことで、初期設定を変更することができる。


記法の違い

#include <stdio.h>

int main(int argc, char **argv[]) {
   int a = 16;
   int b = 32;
   printf("a: %d, b: %d\n", a, b);

   return 0;
}

このプログラムをGDBでそれぞれディスアセンブルしてみる。


画像1

画像2

上がAT&T記法、下がIntel記法のアセンブラ。主な違いとしては

・ソースオペランドとディスティネーションオペランドの順番が逆。端的に言えば、

*AT&T記法: [ソースオペランド]  ->  [ディスティネーションオペランド]

*Intel記法: [ディスティネーションオペランド]  <-  [ソースオペランド]

そのため記法によって"mov %eax, %esi" だったり "mov esi, eax"だったりする。(混乱不可避)。


・アドレス指定の表記。Intel記法のほうがわかりやすい気がする。

・AT&T記法では即値には"$", レジスタには"%"がつく。個人的にはこれはあった方がありがたいと思う。


参考


いいなと思ったら応援しよう!