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


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

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

7 66

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]

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

'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 сказал.

мой первый язык ассемблера был MIPS, который, как я заметил, очень похож на синтаксис ATT. Поэтому я предпочитаю синтаксис ATT, но это не имеет большого значения, если вы можете его прочитать.