アセンブラの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でそれぞれディスアセンブルしてみる。
上がAT&T記法、下がIntel記法のアセンブラ。主な違いとしては
・ソースオペランドとディスティネーションオペランドの順番が逆。端的に言えば、
*AT&T記法: [ソースオペランド] -> [ディスティネーションオペランド]
*Intel記法: [ディスティネーションオペランド] <- [ソースオペランド]
そのため記法によって"mov %eax, %esi" だったり "mov esi, eax"だったりする。(混乱不可避)。
・アドレス指定の表記。Intel記法のほうがわかりやすい気がする。
・AT&T記法では即値には"$", レジスタには"%"がつく。個人的にはこれはあった方がありがたいと思う。