Ограничения синтаксиса сборки Intel по сравнению с AT & T [закрыто]

для меня синтаксис Intel намного проще читать. Если я пойду по лесу сборки, концентрируясь только на синтаксисе Intel, я что-нибудь пропущу? Есть ли причина, по которой я хотел бы переключиться на AT&T (вне возможности читать чужую сборку AT&T)? Моя первая подсказка заключается в том, что gdb использует AT&T по умолчанию.

Если это имеет значение, мое внимание сосредоточено только на любой сборке отношений, и синтаксис может иметь Linux/BSD и язык C.

7 ответов


нет преимущества одного над другим. Я согласен, хотя синтаксис Intel много легче читать. Имейте в виду, что, AFAIK, все инструменты GNU также имеют возможность использовать синтаксис Intel.

похоже, вы можете заставить GDB использовать синтаксис Intel с этим:

set disassembly-flavor intel

GCC может делать синтаксис Intel с -masm=intel.


основным синтаксисом для ассемблера GNU (GAS) является синтаксис AT&T. Intel является относительно новым дополнением к нему. сборка x86 в ядре Linux находится в синтаксисе AT&T. В мире Linux это общий синтаксис. В мире MS синтаксис Intel более распространен.

Лично Мне ненавижу синтаксис AT&T. Есть много свободных ассемблеров (NASM, YASM) вместе с GAS, которые также поддерживают синтаксис Intel, поэтому не будет никаких проблем с синтаксисом 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]

...и это становится более сложным с более сложными инструкциями


Это "тот же язык", в котором он компилируется до того же машинного кода, имеет те же коды операций и т. д. С другой стороны, если вы используете GCC вообще, вы, вероятно, захотите изучить синтаксис AT&T, просто потому, что это по умолчанию-никаких изменений параметров компилятора и т. д. получить его.

Я тоже режу зубы на Intel-syntax x86 ASM (на DOS тоже) и нашел его более интуитивным изначально при переключении на C/UNIX. Но как только вы узнаете AT&T, это будет выглядеть так же просто.

Я бы не стал подумайте об этом-легко научиться AT&T, как только вы знаете Intel, и наоборот. Фактический язык гораздо сложнее получить в голове, чем синтаксис. Поэтому во всех смыслах просто сосредоточьтесь на одном, а затем изучите другое, когда оно появится.


это признак профессионализма, что вы готовы приспособиться к тому, что используется. Ни у того, ни у другого нет реальной выгоды. Синтаксис intel распространен в мире Microsoft, AT&T является стандартом в Linux / Unix. Поскольку ни у того, ни у другого нет преимуществ, люди склонны запечатлевать то, что они увидели первыми. Тем не менее, профессиональный программист поднимается над такими вещами. Используйте все, что они используют на работе или в домене, в котором вы работаете.


синтаксис Intel охватывает все (предполагая, что ассемблер / дизассемблер обновлен с последним мусором 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, но это не имеет значения, пока вы можете его прочитать.