AT&Tと比較したIntelアセンブリ構文の制限[クローズ]


88

私にとって、Intel構文ははるかに読みやすいです。Intel構文のみに集中してアセンブリフォレストをたどる場合、何かを見逃しますか?AT&Tに切り替えたい理由はありますか(他のAT&Tアセンブリを読むことができる以外に)?私の最初の手がかりは、gdbがデフォルトでAT&Tを使用していることです。

これが重要な場合、私の焦点は、Linux / BSDおよびC言語との関係アセンブリおよび構文にのみ焦点を当てています。


11
私は50以上の賛成票を獲得する非建設的な質問が大好きです。
2017年

回答:


80

どちらか一方に利点はありません。私は、Intel構文がはるかに読みやすいことに同意します。AFAIK、すべてのGNUツールにはIntel構文を使用するオプションもあることに注意してください。

これにより、GDBにIntel構文を使用させることができるようです。

セット分解-フレーバーインテル

GCCは-masm=intel。を使用してIntel構文を実行できます。


18
同様に、echo set dis intel >>〜/ .gdbinit
oevna

9
AT&T構文はどのように読みにくくなっていますか?オペランドにサイズの接尾辞を付ける方が、「dword」を使用するよりも簡潔であることがわかりました。他に足りないものはありますか?
ホーケン2012年

54
lea -0x30(%rcx,%rax,8),%eaxの複雑なATTですlea eax,[rcx+rax*8-0x30]。+と*の使用は、Intelスタイルで非常に役立ちます。
ヨルゲンセン

9
私は彼らの「畳み込み」は等しいが同一ではないと考えています。ATTが不透明な場合、Intelはあいまいです。中置算術は代数の学生にはよく知られていますが、構文から、演算に正確に4つの引数があること、またはそれらの1つだけを乗算できることは明らかではなく、どちらの場合も、乗数が2の累乗
バグ

10
あなたは常にそれを指定するため@Hawken私ははるかに良い、Intelの「PTR」s以下AT&Tの接尾辞を見つけて、それが本当に(少なくとも私にとっては)ミスの量を減少させます。残りについて(たとえば、$記号と%記号)。ええ..それらは快適ではなく、それがポイントですが、利点があります。それは明示的であり、もう一度間違いを減らします。1つは読み取り(Intel)に快適で、もう1つは書き込み(AT&T)に快適だと思います。
MasterMastic 2012

43

GNUアセンブラ(GAS)の主要な構文はAT&Tです。Intel構文は、比較的新しいものです。Linuxカーネルのx86アセンブリはAT&T構文です。Linuxの世界では、これが一般的な構文です。MSの世界では、Intel構文がより一般的です。

個人的に、私はAT&T構文が嫌いです。Intel構文もサポートするGASに加えて無料のアセンブラ(NASM、YASM)がたくさんあるので、LinuxでIntel構文を実行しても問題はありません。

それを超えて、それは単に構文上の違いです。両方の結果は同じx86マシンコードになります。


25
同意し、同意しました。AT&T構文を使用することは犯罪であるはずです、それは直感に反し、醜いです、なぜあなたはすべての数字にプレフィックスを付けて$と%で登録し、逆SIB表記で相対アドレス指定を指定したいのですか?私はIntel構文を使用しています2年経っても、AT&Tが存在する理由がまだわかりません。
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

11
太字で述べる場合は、少なくともIntelがはるかに優れている理由についていくつかの証拠を提供してください。
ホーケン2012年

8
@Hawken Hatersは嫌いになる
Gunther

8
@Hawken太字を使用しているので、太字をそのままにしておけば、どういうわけか自分の意見を事実として述べているのではないでしょうか。とにかく、この種の意見主導の「討論」を実際に招いたのは問題でした。おそらく、なぜ今は閉鎖されているのでしょうか。
エリオット

1
ARM用のIntel構文はどうですか?
2017年

33

どちらか一方に利点はありません。個人的には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構文を嫌いではありません、私は気にしません。


19
私はひどく混乱しています。at&t構文でワードサイズを明示する必要がないことを意味していますか?なぜ私の例をコピーして、単語サイズと役に立たないPTRを追加したのですか?また、なぜ私の差を負の左オペランドの合計に変更したのですか?それが命令が実際にエンコードされる方法だからですか?ユーザーがそれを本当に気にする必要はめったにありません。私が使用したすべてのアセンブラでは、左側のオペランドが32ビットで、右側のオペランドが角かっこで囲まれているため、DWORDPTRを省略できます。
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

12
さらに、IDA / ollydbgは、あなたが書いたようなものさえも生成しないので、マシンコードから「素敵な」インテル構文に移行するのに問題はないと確信しています。したがって、あなたの例はかなり不自然に見え、アセンブラまたは逆アセンブラの最も些細な実装を除いて、私が決して見ることのないものです。一方、私がモックするat&t命令は、at&t構文を教えるチュートリアルの最初の段落の1つから直接のものです。
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

8
あなたはマシンであるため、命令のビットエンコーディングを直接ミラーリングする構文を好むという結論に達しました。(これはat&t構文が行うことです)。私はまた、人々が感じていることを疑いを持っているより多くの1337年、彼らは時に使用した場合&T構文それは...本当にメリットはありませんけれども、それは、よりあいまいだから
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

7
@Longpokeいいえ、AT&T構文では、文脈から明らかな場合、ワードサイズを明示的にする必要はありません。IntelのSOMEWORD PTR[]場合とまったく同じです。オペランドのサイズがコンテキストから明らかである場合は必要ありません。ただし、すぐにメモリの場所に移動する場合に必要です(lAT&Tからの両方とIntelのDWORD PTRから)。はい、私の例はかなり工夫されていますが、あなたの例もそうです。それでも理由がわからない場合:Intelで不要な言葉遣いを省略しましたが、AT&Tで使用しています。Intelでうまく整列するようにオペランドを選択しますが、AT&Tではそうしません。
Gunther Piez 2012

7
それで、あなたは-4(ebp,edx,4)物事がより良いと言っています[4*edx+ebp-4]か?後者の方が直感的だと思います。
カルマリウス2013

24

これは「同じ言語」であり、同じマシンコードにコンパイルされたり、同じオペコードを持ったりします。一方、GCCを使用している場合は、AT&T構文を学習する必要があります。デフォルト-それを取得するためのコンパイラオプションの変更などはありません。

私もIntel-syntaxx86 ASM(DOSでも)に歯を食いしばり、C / UNIXに切り替えると最初はより直感的になることがわかりました。しかし、AT&Tを学べば、同じように簡単に見えるでしょう。

あまり考えないでしょう--- Intelを知ったら、AT&Tを学ぶのは簡単ですし、その逆も同様です。実際の言語は、構文よりも頭の中で理解するのがはるかに困難です。ですから、必ず一方に焦点を合わせ、それが出てきたらもう一方を学びましょう。


16
何?GCCはデフォルトでat&tを使用するため、at&t構文を学ぶ理由はありません。特に、より直感的なIntel構文に切り替えることができる場合は特にそうです。
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

7
@longpoke誰もが「より直感的」と呼んでいるという理由だけでインテル構文を学習することは、それほど良い理由ではありません。実際、それはまったく理由がありません。
ホーケン2012年

1
VerilogとVHDLの両方が立ち往生しているのと同じ理由で、あなたは両方とも正しいです。
バグ

@ホーケン:本当です。Intelの構文を学ぶ本当の理由は、IntelとAMDのマニュアルが使用しているものだからです。ベンダーのマニュアルほど詳細なAT&T構文を使用したISAリファレンスマニュアルはありません。例:felixcloutier.com/x86/cmppd(IntelのPDFから抽出)。また、uops.infoagner.org/optimizeなどのパフォーマンス情報。一部のUnixベンダーがAT&T ISAリファレンスを作成したことを読んだと思いますが、それは確かに今では時代遅れであり、AVX命令をカバーしていません。この答えに100%同意しました:同じマシンコード、それを表現するための異なる構文、大したことはありません。
ピーターコーデス

20

それはあなたが使用されているものに順応することをいとわないというプロ意識のしるしです。どちらにも本当の利点はありません。intel構文はMicrosoftの世界では一般的であり、AT&TはLinux / Unixの標準です。どちらにも利点がないため、人々は最初に見たものに刻印する傾向があります。そうは言っても、プロのプログラマーはそのようなことを上回っています。彼らが職場で、またはあなたが働いているドメインで使用するものは何でも使用してください。


5
ツールの「プロの」ユーザーであり、ツールを変更して生産性を高める方法を知ってはどうでしょうか。Intel構文の場合は+1。
Jonathon Reinhart 2011年

5
ええと、私もIntel構文を好みますが、彼にはポイントがあります。たとえば、既存のAT&Tコードの保守を検討してください。両方を回避する方法を知っていても、間違いなく害はありません。
エリオット

7
私も両方を学ぶことを提唱しますが、悪魔の代弁者を演じて、vimをスクリプト化して* .sファイルを選択した構文に自動変換することを提案します。
バグ

2
intel構文は読みやすいので、intel構文には利点があります。「leaeax、[eax * 4 + 8]」は、「leal 8(、%eax、4)、%eax」よりもはるかに優れた客観的な読みやすさを備えています
Lucio M. Tato 2015年

2
@bug Heh、emacsのスペルを間違えました; D
GDP2 2017

12

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]

...そしてそれはより複雑な命令でより複雑になります

'言っ途切れる。


17
いいえ、十分ではありません。
Gunther Piez 2012年

2
ポスターはすでに、彼らはインテル構文を好むと述べています。彼らにとって良い; それで、あなたは誰を説得しようとしていますか?
ホーケン2012

2
@Hawken答えを読むのはポスターだけではありません。
ウィンガーセンドン2016

私は彼がdwordの長さの例に言及する方法が好きです。メモリオペランドはシングルバイトまたはショートで書き込んでください。
Ajay Brahmakshatriya 2017年

2

私の最初のアセンブリ言語はMIPSでしたが、これはATT構文と非常によく似ていることに気づきました。だから私はATT構文が好きですが、それを読める限り、それは実際には問題ではありません。


3
MIPSアセンブリは、ロード/ストア命令のアドレス形式のAT&T構文にのみ類似しています。しかし、MIPSにはロード/ストア用の単純なアドレッシングモードが1つしかないのに対し、Intelにはそれ以上のものがあるため、これはより複雑になります。考えてみましょうlea -0x30(%rcx,%rax,8),%eaxlea eax,[rcx+rax*8-0x30]ヨルゲンセンの上に掲示。また、AT&Tとは異なり、MIPSは他のすべてのフォーマットと同様に宛先優先フォーマットを使用します。さらに、MIPS番号の前に$を付ける必要はなく、MIPSのレジスタ名は短いため、AT&Tのように%を使用することはそれほど不快ではありません
phuclv 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.