对我来说,Intel语法更易于阅读。如果我只集中精力阅读Intel语法的汇编代码,我会错过什么吗?除了能够阅读其他人的AT&T汇编之外,是否有任何理由要切换到AT&T?我的第一个线索是gdb默认使用AT&T。
如果这很重要,我的重点只在于汇编和语法与Linux/BSD和C语言的关系。
对我来说,Intel语法更易于阅读。如果我只集中精力阅读Intel语法的汇编代码,我会错过什么吗?除了能够阅读其他人的AT&T汇编之外,是否有任何理由要切换到AT&T?我的第一个线索是gdb默认使用AT&T。
如果这很重要,我的重点只在于汇编和语法与Linux/BSD和C语言的关系。
两者之间真的没有优劣之分。我同意 Intel 语法更易于阅读。请注意,据我所知,所有 GNU 工具都有使用 Intel 语法的选项。
看起来您可以使用以下命令使 GDB 使用 Intel 语法:
set disassembly-flavor intel
使用-masm = intel
可以让 GCC 使用 Intel 语法。
实际上,它们之间没有任何优劣之分。尽管个人非常讨厌Intel语法,但我不同意Intel语法更易读的说法。请记住,据我所知,所有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]
更复杂的指令会让情况变得更加复杂。
话说回来。
附注:这个答案存在的主要原因是为了突出其他答案中(在我看来)的弱点,它们实际上不是答案,而是意见。当然,这个答案实际上只是我的谦虚意见。
附注2:我不讨厌英特尔语法,我只是不关心。
-4(ebp,edx,4)
这个东西比[4*edx+ebp-4]
更好吗?我认为后者更易懂。 - Calmarius它是"同一种语言",编译后会生成相同的机器码和操作码等。但另一方面,如果你在使用GCC,你可能需要学习AT&T语法,因为它是默认设置——不需要更改编译器选项等。
我也是用Intel语法x86汇编开始学习(还是在DOS上),当转到C/UNIX时发现它更直观。但是一旦你学会了AT&T,它看起来同样容易。
我不会过多考虑这个——一旦你掌握了Intel语法或AT&T语法,就很容易学习另一个。实际的难点在于掌握语言而非语法。所以请专注于其中一个,等到需要使用另一个时再去学习。
成为专业人士的标志之一就是你愿意适应任何正在使用的东西。没有真正的优势可以选择其中之一。Intel语法在微软世界中很常见,AT&T是Linux / Unix的标准。既然两者都没有优势,人们倾向于按照他们最先接触到的那种方式去学习。尽管如此,专业程序员不会被这些琐事所影响。使用你所在工作领域或公司所使用的语法即可。
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一样。 - phuclv
lea -0x30(%rcx,%rax,8),%eax
这句话是Intel格式下的复杂汇编语句,翻译成通俗易懂的形式为lea eax,[rcx+rax*8-0x30]
。在Intel格式中使用加号和乘号可以更好地表示计算方式。 - jørgensen