与AT&T相比,英特尔汇编语法的局限性[关闭]


88

对我来说,英特尔语法更容易阅读。如果我只关注Intel语法来遍历汇编林,我会错过任何事情吗?我有什么理由要切换到AT&T(除了能够读取其他人的AT&T程序集之外)?我的第一个线索是gdb默认使用AT&T。

如果这很重要,那么我的重点仅在于与Linux / BSD和C语言有关的任何关系汇编和语法。


11
我喜欢非建设性的问题,获得超过50票的赞成票。
将于

Answers:


80

彼此之间确实没有优势。我同意Intel语法容易阅读。请记住,AFAIK,所有GNU工具都可以选择也使用Intel语法。

看起来您可以通过以下方式使GDB使用Intel语法:

设置可拆卸口味的英特尔

GCC可以使用进行Intel语法-masm=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]。+和*的使用确实有助于英特尔风格。
乔根森

9
我认为它们的“卷积”是相等的,但并不相同:如果ATT是不透明的,那么英特尔就是模棱两可的。尽管infix算术对代数学生来说是比较熟悉的,但是从语法上并不能明显看出该操作正好有4个自变量,或者仅可以对其中一个进行乘法运算,而且在两种情况下都不清楚乘数必须为a。 2的力量
bug

10
@Hawken我发现AT&T的后缀比Intel的“ ptr”好得多,因为您总是指定它,并且确实减少了错误的数量(至少对我而言)。关于其余部分(例如$和%符号)..是的,它们并不令人愉悦,这就是重点,但是它们的确有一个优势:它很明确,并且再次减少了错误。我想说的是,一个人阅读(Intel)很舒服,第二个就写作(AT&T)很舒服。
MasterMastic 2012年

43

GNU汇编程序(GAS)的主要语法是AT&T。Intel语法是相对较新的功能。Linux内核中的x86程序集采用AT&T语法。在Linux世界中,这是通用语法。在MS世界中,Intel语法更为常见。

我个人讨厌AT&T语法。有很多免费的汇编程序(NASM,YASM)以及GAS也支持Intel语法,因此在Linux中使用Intel语法不会有任何问题。

除此之外,这只是语法上的差异。两者的结果将是相同的x86机器代码。


25
同意并同意。使用AT&T语法应该是犯罪,这是违反直觉和丑陋的,为什么您要为每个数字加上前缀并用$和%进行注册,并以相反的SIB表示法指定相对地址,我一直在使用Intel语法两年,仍然看不到AT&T为何存在。
L̲̳o̲̳̳n̲̳̳g̲̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
如果要以粗体显示,至少应提供一些证据来说明为什么英特尔好得多。
霍肯2012年

8
@Hawken Haters会讨厌
Gunther Piez'Mar

8
@Hawken您是否在建议,因为他使用了粗体字,所以他以某种方式将自己的观点陈述为事实,如果他只是简单地将粗体字留在原地,那是不可能的?无论如何,这个问题实际上是在邀请这种以观点为主导的“辩论”,大概是为什么它现在已经关闭!
艾略特(Elliott)2012年

1
英特尔的ARM语法怎么样?
将于

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内容?另外,为什么您将我的差异更改为左操作数为负的和?是因为这就是指令的实际编码方式吗?用户很少需要真正关心它。在我使用的每个汇编器中,您都可以省略DWORD PTR,因为左操作数是32位,而右操作数周围有方括号。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2012年

12
而且,IDA / ollydbg甚至不会产生您所写的内容,因此,我敢肯定,从机器代码到“不错的” intel语法都没有问题。因此,您的示例似乎很虚构,除了在汇编器或反汇编器的最简单实现中,我从未见过。另一方面,我模拟的at&t指令直接来自教导at&t语法的教程的第一段。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2012年

8
我得出的结论是,您是一台机器,因此,您更喜欢直接镜像指令的位编码的语法。(这是at&t语法的作用)。我还怀疑人们在使用at&t语法时会感觉更多1337,因为它比较晦涩难懂,尽管这并不是真正的优势……
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2012年

7
@Longpoke不,如果从上下文中可以清楚地看出,AT&T语法不需要使字长明确。就像intel一样:SOMEWORD PTR[]如果操作数的大小在上下文中是清楚的,则不需要。但是在将立即数移动到内存位置的情况下(l从AT&T到Intel的DWORD PTR都需要)。是的,我的示例非常人为-但是您的示例也是如此。以防万一您仍然看不到原因:您在Intel上省略了不需要的字眼,但将它们放在AT&T中。您选择操作数的方式应使其在Intel中很好地对齐,但在AT&T中则不这样。
Gunther Piez'4

7
那么,您是说-4(ebp,edx,4)事情胜过[4*edx+ebp-4]?我发现后者更加直观。
Calmarius

24

这是“相同的语言”,因为它可以编译为相同的机器代码,具有相同的操作码等。另一方面,如果您完全使用GCC,您可能会想要学习AT&T语法,因为默认值-无需更改编译器选项等即可获取它。

我也很喜欢Intel语法x86 ASM(也在DOS上),并发现切换到C / UNIX时一开始更加直观。但是一旦您学习了AT&T,它就会变得很容易。

我不会这么想-一旦了解英特尔,就很容易学习AT&T,反之亦然。实际的语言比语法更难掌握。因此,一定要集中精力学习一种方法,然后在出现时学习另一种方法。


16
什么?因为默认情况下,GCC使用at&t,所以没有必要学习at&t语法。特别是当您可以将其切换为更直观的Intel语法时。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke学习intel语法仅仅是因为每个人都称其为“更直观”,但这并不是更好的理由。其实根本没有理由。
霍肯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
如何成为工具的“专业”用户,并知道如何对其进行更改以提高您的生产率?+1用于Intel语法。
乔纳森·莱因哈特

5
好吧,尽管我也赞成Intel语法,但他有一点要说-例如考虑维护现有的AT&T代码。知道您在这两者之间的方式绝对没有害处。
Elliott

7
虽然我也主张同时学习两者,但我将扮演Devil's Advocate,并建议您可以简单地将vim脚本化为将* .s文件自动转换为您选择的语法。
错误2012年

2
由于intel语法更易于阅读,因此intel语法具有优势。“ lea eax,[eax * 4 + 8]”比“ Leal 8(,%eax,4),%eax”具有更好的客观可读性
Lucio M. Tato 2015年

2
@bug Heh,您拼错了emacs; D
GDP2

12

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
不,还不够说。
冈瑟·皮兹

2
张贴者已经说过,他们更喜欢intel语法。对他们有好处 所以你想说服谁?
霍肯2012年

2
@Hawken不仅要阅读海报的人,还要阅读答案。
温格·森顿

我喜欢他用双字长度提到例子的方式。请在单字节或短字节上写一个内存操作数。
Ajay Brahmakshatriya

2

我的第一种汇编语言是MIPS,我注意到它与ATT语法非常相似。所以我更喜欢ATT语法,但是只要您能读懂它就没有关系。


3
MIPS程序集仅类似于加载/存储指令的地址格式中的AT&T语法。但是MIPS只有一种简单的寻址模式用于加载/存储,而Intel则有更多,这使得它更加复杂。考虑lea -0x30(%rcx,%rax,8),%eaxlea eax,[rcx+rax*8-0x30]上面发布的jørgensen。而且与AT&T不同,MIPS仍然像其他所有格式一样使用目的地优先格式。此外,MIPS编号不需要以$开头,并且MIPS中的寄存器名称很短,因此像AT&T一样一直具有%并不是很不舒服
phuclv 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.