Ограничения синтаксиса сборки 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 intelGCC может сделать синтаксис 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]
...и это становится все сложнее с более сложными инструкциями
'Nuff сказал.
PS: этот ответ существует в основном по причине выделения слабых мест (IMHO) в некоторых других ответах, которые на самом деле не ответы, а мнения. И конечно этот ответ на самом деле только мое скромное мнение.
PPS: я не ненавижу синтаксис Intel, мне просто все равно.
Это "тот же язык", в котором он компилируется до того же машинного кода, имеет те же коды операций и т. д. С другой стороны, если вы вообще используете GCC, вы, вероятно, захотите изучить синтаксис AT&T, просто потому, что это по умолчанию-никаких изменений параметров компилятора и т. д. получить его.
Я тоже режу зубы на Intel-синтаксис 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]...и это становится все сложнее с более сложными инструкциями
'Nuff сказал.