对我来说,英特尔语法更容易阅读.如果我只是通过汇编森林来专注于英特尔语法,我会错过什么吗?有什么理由我想转换到AT&T(除了能够阅读其他人的AT&T组装)?我的第一个线索是gdb默认使用AT&T.
如果这很重要,我的重点只是任何关系汇编和语法可能有Linux/BSD和C语言.
1> Zifre..:
一个人在另一个人身上确实没有优势.我同意英特尔语法更容易阅读.请记住,AFAIK,所有GNU工具都可以选择使用Intel语法.
看起来你可以让GDB使用Intel语法:
set disassembly-flavor intel
GCC可以使用英特尔语法-masm=intel
.
`lea -0x30(%rcx,%rax,8),%eax`是'lea eax,[rcx + rax*8-0x30]`的复杂ATT.+和*的使用确实有助于英特尔风格.
同样,echo set dis intel >>〜/ .gdbinit
AT&T语法的可读性如何?我发现操作数上的大小后缀比"dword"更简洁.还有什么我想念的吗?
我认为他们的"卷积"是平等但不同寻常的:如果ATT不透明,那么英特尔就不明确了.虽然对于代数学生来说,中缀算术更为熟悉,但从语法中可以明显看出,操作只有4个参数,或者只有其中一个可以相乘,并且在任何一种情况下都不清楚乘数必须是2的力量.
@Hawken我发现AT&T的后缀比英特尔的"ptr"要好得多,因为你总是指定它并且**真的**减少了错误的数量(至少对我而言).关于其余部分(例如$和%符号)..是啊......它们并不令人愉快,这就是重点,但它们确实有一个优势:它是明确的,并且再次减少了错误.我会说一个人适合阅读(英特尔),第二个适合写作(AT&T).
AT&T语法最令人讨厌的特性之一是参数的回归.其他架构的组件最初都有目的地,就像高级语言的分配一样
@Ken在我的测试中意味着数字被评估为内存地址.所以,'movl 4,%eax`是'mov eax,[0x4]`在intel中,`movl $ 4,%eax`表示`mov eax,[0x4]`.
2> Mehrdad Afsh..:
GNU汇编程序(GAS)的主要语法是AT&T.英特尔语法是一个相对较新的补充.Linux内核中的x86程序集采用AT&T语法.在Linux世界中,它是常见的语法.在MS世界中,Intel语法更为常见.
就个人而言,我讨厌AT&T语法.有很多免费的汇编程序(NASM,YASM)以及支持Intel语法的GAS,因此在Linux中执行Intel语法不会有任何问题.
除此之外,它只是一种语法差异.两者的结果将是相同的x86机器代码.
同意并同意.使用AT&T语法应该是犯罪,这是违反直觉和丑陋的,为什么你要为每个数字加前缀并用$和%注册,并以反向SIB表示法指定相对寻址,我一直在使用英特尔语法两年仍然不明白为什么AT&T甚至存在.
如果你要用粗体说明它至少提供一些证据,说明为什么英特尔**更好**.
@Hawken Haters会讨厌
@Hawken你是否在暗示,因为他使用了大胆的类型,他以某种方式将他的观点表达为事实,如果他只是单独留下大胆的话就不会这样做?无论如何,问题实际上是邀请这种以意见为主导的"辩论",大概是为什么它现在已经关闭了!
3> Gunther Piez..:
一个人在另一个人身上确实没有优势.我不同意英特尔语法更容易阅读,因为我个人讨厌英特尔语法.请记住,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:这个答案的存在主要是因为在其他一些答案中突出(恕我直言)的弱点,这些答案实际上不是答案,而是意见.当然,这个答案实际上只是我的拙见.
PPS:我不讨厌英特尔语法,我只是不在乎.
我非常困惑.您是否暗示at&t语法永远不需要使单词大小明确?你为什么要复制我的例子并添加单词大小和无用的PTR东西?另外你为什么用差的左操作数改变我的差异?是因为这是指令实际编码的方式吗?用户很少需要关心这一点.在我使用的每个汇编程序中,您可以省略DWORD PTR,因为左操作数是32位而右操作数是围绕它的方括号.
而且,IDA/ollydbg甚至不会像你写的那样产生任何东西,因此,我很确定从机器代码到"漂亮"的intel语法都没有问题.所以你的例子似乎是非常人为的,除了最简单的汇编程序或反汇编程序实现之外,我从未见过.另一方面,我模拟的at&t指令直接来自&t语法教程的第一段.
我得出的结论是,您是一台机器,因此您更喜欢直接反映指令位编码的语法.(这是&t语法的作用).我还怀疑人们在使用at&t语法时会感觉更多1337,因为它更加模糊,尽管这不是真正的优势......
@Longpoke不,如果从上下文中清楚,AT&T语法不需要使字大小显式.与intel相同:如果操作数大小从上下文中清除,则不需要`SOMEWORD PTR []`.但是,如果将立即数移动到内存位置(AT&T的"l"和英特尔的DWORD PTR),则需要它.是的,我的例子非常人为 - 但你的也是如此.如果您仍然不明白原因:您在英特尔上遗漏了不必要的单词,但在AT&T中将它们排除在外.您可以选择操作数,以便它们在英特尔中很好地匹配,但在AT&T中不这样做.
你是说'-4(ebp,edx,4)`比'[4*edx + ebp-4]更好?我发现后者更直观.
@Calmarius不,我不说它更好.我只是说通过挑选语法的最佳(或最差)示例,您可以使一个看起来比另一个好 - 就像在其他答案中已经完成的那样.但这主要是品味问题.我个人适应已经在项目中使用的语法,对我而言,它完全相同;-)
啊,忘了`objdump -M intel`.嗯,这只是贫民窟.但它并不是真正的英特尔语法.这是at&t语法分析器的一个黑客,使它看起来像英特尔.
+1诙谐的复出并提出一个好点.我笑了.
@Longpoke我真的不喜欢AT&T而非英特尔.我正在使用那里的东西.我同意AT&T包含很多`%`的方式(除非你把它关闭)并且英特尔偶尔需要的DWORD PTR真的很难看,但除此之外我觉得这都是个人喜好.这里的很多答案都是非常主观的,但也许这就是因为这个问题实际上是主观的.顺便说一下,我没有向你投票(但我受到了诱惑).我认为你的答案很糟糕,因为它是主观的,但OTOH很好你至少给出了一些例子(虽然选择不当).
我通过在搜索引擎上查找"at&t语法教程"找到了我的例子.他们并没有真正做作......你在反汇编中总会看到这样的东西.与此同时你的`mov DWORD PTR [-4 + ebp + edx*4],eax` ...我从未见过*任何*以这种形式产生语法.
只需尝试`objdump -M intel`作为开始.
与操作数顺序相比,SIB语法的这些差异是微不足道的。参见例如“ sub eax,ecx”。从精神上直接将此Intel语法指令直接转换为C语句“ eax- = ecx;”很容易。在AT&T阅读该示例代码时,您必须在头脑上颠倒顺序,或者将其读为`-eax + ecx→ecx`(是的,这是减法...)。对于所有其他非交换操作(如cmp,idiv等)也是如此。
4> Jacob B..:
它是"相同的语言",因为它编译为相同的机器代码,具有相同的操作码等.另一方面,如果你正在使用GCC,你可能想要学习AT&T语法,因为它是默认 - 没有改变编译器选项等来获得它.
我也对Intel-syntax x86 ASM(在DOS上也是如此)进行了研究,并且在切换到C/UNIX时发现它更直观.但是一旦你学习了AT&T,它看起来就会那么简单.
我不会那么想的 - 一旦你了解英特尔,就很容易学习AT&T,反之亦然.实际的语言比语法更难掌握.因此,只要专注于一个,然后在它出现时学习另一个.
什么?因为默认情况下GCC使用at&t是没有理由学习at语法.特别是当您可以将其切换到更直观的Intel语法时.
@longpoke学习英特尔语法只是因为每个人都称它为"更直观"并不是更好的理由.实际上根本没有理由.
5> phorgan1..:
这是一种专业的标志,你愿意适应任何正在使用的东西.一个或另一个没有真正的优势.intel语法在Microsoft世界中很常见,AT&T是Linux/Unix中的标准.由于任何一个都没有优势,人们倾向于在他们首先看到的任何东西上留下印记.也就是说,一个专业的程序员提出了类似的东西.使用他们在工作中或您正在使用的域中使用的任何内容.
虽然我也提倡学习两者,但我会玩Devil的倡导者,并建议你可以简单地将vim编写为自动转换*.s文件到你选择的语法.
好吧,虽然我也支持英特尔语法,但他有一点 - 例如,考虑维护现有的AT&T代码.知道你的方式绝对没有害处.
如何成为这些工具的"专业"用户,并知道如何更改它们以提高工作效率?英特尔语法为+1.
6> L̲̳o̲̳̳n̲̳̳g..:
英特尔语法涵盖了所有内容(假设汇编程序/反汇编程序是最新的英特尔添加到其指令集中的垃圾).我肯定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]
......随着更复杂的指令,它变得更加复杂
'努夫说.
不,还不够.
@Hawken不仅要阅读海报的人,还要阅读答案。