【发布时间】:2010-11-01 15:17:58
【问题描述】:
对我来说,英特尔语法更容易阅读。如果我只专注于英特尔语法的汇编森林,我会错过任何东西吗?我有什么理由想切换到 AT&T(除了能够阅读其他人的 AT&T 程序集之外)?我的第一个线索是 gdb 默认使用 AT&T。
如果这很重要,我只关注任何关系汇编和语法可能对 Linux/BSD 和 C 语言有影响。
【问题讨论】:
标签: linux assembly x86 att intel-syntax
对我来说,英特尔语法更容易阅读。如果我只专注于英特尔语法的汇编森林,我会错过任何东西吗?我有什么理由想切换到 AT&T(除了能够阅读其他人的 AT&T 程序集之外)?我的第一个线索是 gdb 默认使用 AT&T。
如果这很重要,我只关注任何关系汇编和语法可能对 Linux/BSD 和 C 语言有影响。
【问题讨论】:
标签: linux assembly x86 att intel-syntax
英特尔语法涵盖了所有内容(假设汇编器/反汇编器是最新的,最新的垃圾英特尔添加到他们的指令集中)。我敢肯定 at&t 也一样。
美国电话电报公司 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]...随着更复杂的指令,它会变得更复杂
'nuff 说。
【讨论】:
确实没有一个比另一个有优势。我不同意 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]
...随着更复杂的指令,它会变得更复杂
'nuff 说。
PS:这个答案的存在主要是为了突出(恕我直言)在其他一些答案中的弱点,这些实际上不是答案,而是意见。当然,这个答案在现实中只是我的拙见。
PPS:我不讨厌 Intel 语法,我只是不在乎。
【讨论】:
SOMEWORD PTR[]。但是,如果将立即数移动到内存位置(AT&T 的l 和英特尔的 DWORD PTR),则需要它。是的,我的例子非常做作——但你的例子也是如此。如果您仍然不明白为什么:您在 Intel 上遗漏了不需要的字号,但在 AT&T 中有它们。您选择操作数的方式使其在 Intel 中可以很好地对齐,但在 AT&T 中却没有这样做。
-4(ebp,edx,4) 的东西比[4*edx+ebp-4] 好?我发现后者更直观。
这是专业精神的标志,您愿意适应正在使用的任何东西。两者都没有真正的优势。 intel 语法在 Microsoft 世界中很常见,AT&T 是 Linux/Unix 中的标准。由于两者都没有优势,人们倾向于在他们首先看到的任何东西上留下印记。也就是说,一个专业的程序员会提出这样的事情。使用他们在工作中或在您工作的领域中使用的任何东西。
【讨论】:
我的第一个汇编语言是 MIPS,我注意到它与 ATT 语法非常相似。所以我更喜欢 ATT 语法,不过没关系,只要你能看懂就行。
【讨论】:
lea -0x30(%rcx,%rax,8),%eax 和lea eax,[rcx+rax*8-0x30] jørgensen。与 AT&T 不同的是,MIPS 仍然像所有其他格式一样使用目标优先格式。另外,MIPS 编号不需要以 $ 为前缀,而且 MIPS 中的寄存器名称很短,所以像 AT&T 这样一路有 % 也不是很不舒服
它是“相同的语言”,因为它编译成相同的机器代码,具有相同的操作码等。另一方面,如果您使用 GCC,您可能想要学习 AT&T 语法,只是因为它是默认值——无需更改编译器选项等即可获得它。
我也开始使用 Intel-syntax x86 ASM(也在 DOS 上),并在最初切换到 C/UNIX 时发现它更直观。但是一旦你学会了 AT&T,它看起来就一样简单了。
我不会多想——一旦你了解了英特尔,就很容易学习 AT&T,反之亦然。实际的语言比语法更难进入你的脑海。因此,无论如何,只要专注于一个,然后在出现另一个时学习另一个。
【讨论】:
GNU 汇编器 (GAS) 的主要语法是 AT&T。英特尔语法是一个相对较新的补充。 Linux 内核中的 x86 程序集采用 AT&T 语法。在 Linux 世界中,这是常见的语法。在 MS 世界中,Intel 语法更为常见。
就个人而言,我讨厌 AT&T 语法。有很多免费的汇编器(NASM、YASM)以及支持 Intel 语法的 GAS,所以在 Linux 中使用 Intel 语法不会有任何问题。
除此之外,这只是句法上的差异。两者的结果将是相同的 x86 机器码。
【讨论】:
确实没有一个比另一个有优势。我同意英特尔语法非常更易于阅读。请记住,AFAIK,所有 GNU 工具也可以选择使用 Intel 语法。
看起来你可以让 GDB 使用 Intel 语法:
设置拆解-风味intelGCC 可以使用 -masm=intel 执行 Intel 语法。
【讨论】:
lea -0x30(%rcx,%rax,8),%eax 是lea eax,[rcx+rax*8-0x30] 的复杂 ATT。 + 和 * 的使用确实有助于 Intel 风格。