对我而言,英特尔语法更容易阅读。如果我只是通过汇编森林来专注于英特尔语法,我会错过什么吗?有什么理由我想换到AT& T(除了能够读他人的AT& T组装)?我的第一个线索是gdb默认使用AT& T.
如果这很重要,我的重点只是任何关系汇编和语法可能有Linux / BSD和C语言。
答案 0 :(得分:70)
一个人在另一个人身上确实没有优势。我同意英特尔语法 更容易阅读。请记住,AFAIK,所有GNU工具都可以选择使用Intel语法。
看起来你可以让GDB使用英特尔语法:
set disassembly-flavor intel
GCC可以使用-masm=intel
执行英特尔语法。
答案 1 :(得分:38)
GNU汇编程序(GAS)的主要语法是AT& T.英特尔语法是一个相对较新的补充。 Linux内核中的x86程序集采用AT& T语法。在Linux世界中,它是常见的语法。在MS世界中,英特尔语法更为常见。
就个人而言,我讨厌AT& T语法。有很多免费的汇编程序(NASM,YASM)以及支持Intel语法的GAS,因此在Linux中执行Intel语法不会有任何问题。
除此之外,它只是一种语法差异。两者的结果将是相同的x86机器代码。
答案 2 :(得分:31)
一个人在另一个人身上确实没有优势。我不同意英特尔语法更容易阅读,因为个人我讨厌英特尔语法。请记住,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:我不讨厌英特尔语法,我只是不在乎。答案 3 :(得分:21)
它是“同一种语言”,因为它编译为相同的机器代码,具有相同的操作码等。另一方面,如果你正在使用GCC,你可能想要学习AT& T语法,只是因为它是默认的 - 没有改变编译器选项等等。
我也对Intel-syntax x86 ASM(在DOS上也是如此)进行了研究,并且在切换到C / UNIX时发现它更直观。但是一旦你学习AT& T,它看起来就会那么容易。
我不会那么认为 - 一旦你了解英特尔就很容易学习AT& T,反之亦然。实际的语言比语法更难掌握。因此,只要专注于一个,然后在它出现时学习另一个。
答案 4 :(得分:20)
这是一种专业的标志,你愿意适应任何正在使用的东西。一个或另一个没有真正的优势。 intel语法在Microsoft世界中很常见,AT& T是Linux / Unix中的标准。由于任何一个都没有优势,人们倾向于在他们首先看到的任何东西上留下印记。也就是说,一个专业的程序员提出了类似的东西。使用他们在工作中或您正在工作的域中使用的任何内容。
答案 5 :(得分:8)
英特尔语法涵盖了所有内容(假设汇编程序/反汇编程序是最新的英特尔添加到其指令集中的垃圾)。我确定& 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]
......使用更复杂的指令会变得更复杂
'努夫说。
答案 6 :(得分:3)
我的第一个汇编语言是MIPS,我注意到它与ATT语法非常相似。所以我更喜欢ATT语法,但只要你能阅读它就没关系。