アセンブラの違いで混乱しないために
MASM | GAS(AT&T) | GAS(Intel) | |
---|---|---|---|
instruction | mov |
mov |
mov |
comment | # comment | # comment | @ comment |
literal | 29 | $29 | #29 |
register | reg | %reg | reg |
まず、書式が AT&T 方式と Intel 方式で二通りあること。MASM は Intel 記法で、GAS は元々 AT&T 記法だったんだけど、後から Intel 記法もサポートされた(ため混乱に拍車がかかる)。
本当によく間違えるのが、オペランドの順序で、何故間違えるかというと、両方の書式で書かれたコードを同時にメンテナンスしているからだ(何とかならないものか)。
次に面倒くさいのが '#' の扱い。GAS は AT&T 記法ではコメント、Intel 記法だと数値を表すのに使用され、さらに C のプリプロセスも書かれているので、意味がごちゃごちゃだ。
MASM は最初に勉強したアセンブラで、当時は AT&T 記法が冗長に感じて MASM を選んだんだけど、今でも MASM がもっとも記述がすっきりしていると感じる。ただし、悲しいかなターゲットプラットフォームが Windows だけなので、いまいち使いにくい(というか使う用途がない。だって C で十分じゃん)。
ついでに(表は作らないけど)x86 と ARM を比較すると、ARM の方がコードを書きやすい。いや、どっちもほぼ同じなんだけど、ARM の方が命令が豊富なので、コード量が少なくて済む、というのが書きやすい理由だ。その分、その豊富な命令を覚えなきゃならないという代償はあるんだけど、これは高級言語プログラマも標準クラスライブラリの API、というケースで同じ経験があるはずだ(x86 と ARM は C と C++ のようなそこまで大きな違いはないけれど)。