Ограничения синтаксиса сборки 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, но это не имеет значения, пока вы можете его прочитать.