对我来说,英特尔语法更容易阅读。如果我只关注Intel语法来遍历汇编林,我会错过任何事情吗?我有什么理由要切换到AT&T(除了能够读取其他人的AT&T程序集之外)?我的第一个线索是gdb默认使用AT&T。
如果这很重要,那么我的重点仅在于与Linux / BSD和C语言有关的任何关系汇编和语法。
Answers:
彼此之间确实没有优势。我同意Intel语法更容易阅读。请记住,AFAIK,所有GNU工具都可以选择也使用Intel语法。
看起来您可以通过以下方式使GDB使用Intel语法:
设置可拆卸口味的英特尔
GCC可以使用进行Intel语法-masm=intel
。
lea -0x30(%rcx,%rax,8),%eax
是令人费解的ATT lea eax,[rcx+rax*8-0x30]
。+和*的使用确实有助于英特尔风格。
GNU汇编程序(GAS)的主要语法是AT&T。Intel语法是相对较新的功能。Linux内核中的x86程序集采用AT&T语法。在Linux世界中,这是通用语法。在MS世界中,Intel语法更为常见。
我个人讨厌AT&T语法。有很多免费的汇编程序(NASM,YASM)以及GAS也支持Intel语法,因此在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语法x86 ASM(也在DOS上),并发现切换到C / UNIX时一开始更加直观。但是一旦您学习了AT&T,它就会变得很容易。
我不会这么想-一旦了解英特尔,就很容易学习AT&T,反之亦然。实际的语言比语法更难掌握。因此,一定要集中精力学习一种方法,然后在出现时学习另一种方法。
这是您愿意适应使用情况的专业精神的标志。彼此之间没有真正的优势。intel语法在Microsoft世界中很常见,AT&T是Linux / Unix中的标准。由于任何一方都没有优势,因此人们倾向于在他们最初看到的东西上留下印记。就是说,专业的程序员提出了类似的问题。使用他们在工作中或工作所在的域中使用的任何东西。
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]
上面发布的jørgensen。而且与AT&T不同,MIPS仍然像其他所有格式一样使用目的地优先格式。此外,MIPS编号不需要以$开头,并且MIPS中的寄存器名称很短,因此像AT&T一样一直具有%并不是很不舒服