私にとって、Intel構文ははるかに読みやすいです。Intel構文のみに集中してアセンブリフォレストをたどる場合、何かを見逃しますか?AT&Tに切り替えたい理由はありますか(他のAT&Tアセンブリを読むことができる以外に)?私の最初の手がかりは、gdbがデフォルトでAT&Tを使用していることです。
これが重要な場合、私の焦点は、Linux / BSDおよびC言語との関係アセンブリおよび構文にのみ焦点を当てています。
回答:
どちらか一方に利点はありません。私は、Intel構文がはるかに読みやすいことに同意します。AFAIK、すべてのGNUツールにはIntel構文を使用するオプションもあることに注意してください。
これにより、GDBにIntel構文を使用させることができるようです。
セット分解-フレーバーインテル
GCCは-masm=intel
。を使用してIntel構文を実行できます。
lea -0x30(%rcx,%rax,8),%eax
の複雑なATTですlea eax,[rcx+rax*8-0x30]
。+と*の使用は、Intelスタイルで非常に役立ちます。
GNUアセンブラ(GAS)の主要な構文はAT&Tです。Intel構文は、比較的新しいものです。Linuxカーネルのx86アセンブリはAT&T構文です。Linuxの世界では、これが一般的な構文です。MSの世界では、Intel構文がより一般的です。
個人的に、私はAT&T構文が嫌いです。Intel構文もサポートするGASに加えて無料のアセンブラ(NASM、YASM)がたくさんあるので、LinuxでIntel構文を実行しても問題はありません。
それを超えて、それは単に構文上の違いです。両方の結果は同じx86マシンコードになります。
どちらか一方に利点はありません。個人的にはIntel構文が嫌いなので、Intel構文の方がはるかに読みやすいということに同意しません。AFAIK、すべてのGNUツールにはIntel構文を使用するオプションもあることに注意してください。
at&t noprefix intel
mov eax, -4(ebp,edx,4) mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp) mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx) mov DWORD PTR[ecx], edx
lea ( ,eax,4), eax lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax lea eax, DWORD PTR[eax*2+eax]
...そしてそれはより複雑な命令でより複雑になります
'言っ途切れる。
PS:この回答は主に、実際には回答ではなく意見である他のいくつかの回答の(IMHO)弱点を強調するために存在します。そしてもちろん、この答えは実際には私の謙虚な意見にすぎません。
PPS:私はIntel構文を嫌いではありません、私は気にしません。
SOMEWORD PTR[]
場合とまったく同じです。オペランドのサイズがコンテキストから明らかである場合は必要ありません。ただし、すぐにメモリの場所に移動する場合に必要です(l
AT&Tからの両方とIntelのDWORD PTRから)。はい、私の例はかなり工夫されていますが、あなたの例もそうです。それでも理由がわからない場合:Intelで不要な言葉遣いを省略しましたが、AT&Tで使用しています。Intelでうまく整列するようにオペランドを選択しますが、AT&Tではそうしません。
-4(ebp,edx,4)
物事がより良いと言っています[4*edx+ebp-4]
か?後者の方が直感的だと思います。
これは「同じ言語」であり、同じマシンコードにコンパイルされたり、同じオペコードを持ったりします。一方、GCCを使用している場合は、AT&T構文を学習する必要があります。デフォルト-それを取得するためのコンパイラオプションの変更などはありません。
私もIntel-syntaxx86 ASM(DOSでも)に歯を食いしばり、C / UNIXに切り替えると最初はより直感的になることがわかりました。しかし、AT&Tを学べば、同じように簡単に見えるでしょう。
あまり考えないでしょう--- Intelを知ったら、AT&Tを学ぶのは簡単ですし、その逆も同様です。実際の言語は、構文よりも頭の中で理解するのがはるかに困難です。ですから、必ず一方に焦点を合わせ、それが出てきたらもう一方を学びましょう。
それはあなたが使用されているものに順応することをいとわないというプロ意識のしるしです。どちらにも本当の利点はありません。intel構文はMicrosoftの世界では一般的であり、AT&TはLinux / Unixの標準です。どちらにも利点がないため、人々は最初に見たものに刻印する傾向があります。そうは言っても、プロのプログラマーはそのようなことを上回っています。彼らが職場で、またはあなたが働いているドメインで使用するものは何でも使用してください。
Intel構文はすべてをカバーします(アセンブラー/逆アセンブラーが最新であり、最新のジャンクIntelが命令セットに追加されていることを前提としています)。at&tも同じだと思います。
at&t intel movl -4(%ebp、%edx、4)、%eax mov eax、[ebp-4 + edx * 4] movl -4(%ebp)、%eax mov eax、[ebp-4] movl(%ecx)、%edx mov edx、[ecx] leal 8(、%eax、4)、%eax lea eax、[eax * 4 + 8] leal(%eax、%eax、2)、%eax lea eax、[eax * 2 + eax]
...そしてそれはより複雑な命令でより複雑になります
'言っ途切れる。
私の最初のアセンブリ言語はMIPSでしたが、これはATT構文と非常によく似ていることに気づきました。だから私はATT構文が好きですが、それを読める限り、それは実際には問題ではありません。
lea -0x30(%rcx,%rax,8),%eax
とlea eax,[rcx+rax*8-0x30]
ヨルゲンセンの上に掲示。また、AT&Tとは異なり、MIPSは他のすべてのフォーマットと同様に宛先優先フォーマットを使用します。さらに、MIPS番号の前に$を付ける必要はなく、MIPSのレジスタ名は短いため、AT&Tのように%を使用することはそれほど不快ではありません