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

88

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

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

Овна
источник
11
Мне нравится, когда за неконструктивные вопросы набирают более 50 голосов.
откр

Ответы:

80

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

Похоже, вы можете заставить GDB использовать синтаксис Intel следующим образом:

установить разборку-вкус интел

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

Зифре
источник
18
а также echo set dis intel >> ~ / .gdbinit
oevna 09
9
Почему синтаксис AT&T менее читабелен? Я считаю, что суффиксы размера в операндах более целесообразны, чем использование слова «двойное слово». Что-то еще мне не хватает?
Hawken
54
lea -0x30(%rcx,%rax,8),%eaxзапутанный ATT для lea eax,[rcx+rax*8-0x30]. Использование + и * действительно помогает в стиле Intel.
jørgensen 01
9
Я считаю их «свертку» равной, но неидентичной: если ATT непрозрачен, то Intel неоднозначен. Хотя инфиксная арифметика более знакома изучающим алгебру, из синтаксиса не очевидно, что у операции есть ровно 4 аргумента или что только один из них может быть умножен, и ни в том, ни в другом случае не ясно, что множитель должен быть мощность 2.
ошибка
10
@Hawken Я считаю, что суффиксы AT&T намного лучше, чем «ptr» Intel, потому что вы всегда указываете их, и это действительно уменьшает количество ошибок (по крайней мере, для меня). Об остальном (например, о символах $ и%) ... да ... они неприятны, и в этом суть, но у них есть преимущество: это явно и еще раз уменьшает количество ошибок. Я бы сказал, что один удобен для чтения (Intel), а второй - для записи (AT&T).
MasterMastic
43

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

Лично я ненавижу синтаксис AT&T . Существует множество бесплатных ассемблеров (NASM, YASM), а также GAS, которые также поддерживают синтаксис Intel, поэтому проблем с синтаксисом Intel в Linux не возникнет.

Кроме того, это просто синтаксическая разница. Результатом обоих будет один и тот же машинный код x86.

Мехрдад Афшари
источник
25
Договорились и согласились. Использование синтаксиса AT&T должно быть преступлением, это противоречит интуиции и уродливо, почему вы хотите ставить префикс каждого отдельного числа и регистрировать с помощью $ и% и указывать относительную адресацию в обратной нотации SIB, я использовал синтаксис Intel для два года и до сих пор не могу понять, зачем вообще существует AT&T.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Если вы собираетесь выделить это жирным шрифтом, по крайней мере, предоставьте некоторые доказательства того, почему интеллект намного лучше.
Hawken
8
@Hawken Haters собираются ненавидеть
Гюнтер Пьез
8
@Hawken Вы предполагаете, что из-за того, что он использовал жирный шрифт, он каким-то образом заявлял свое мнение как факт, чего бы он не стал, если бы он просто оставил жирный шрифт в покое? В любом случае вопрос фактически был приглашением к подобного рода «дебатам», основанным на мнениях, возможно, почему они сейчас закрыты!
Эллиотт
1
Как насчет синтаксиса Intel для ARM?
откр
33

У одного действительно нет преимущества перед другим. Я не согласен с тем, что синтаксис 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]

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

'достаточно.

PS: Этот ответ существует в основном по причине выделения (ИМХО) слабых мест в некоторых других ответах, которые на самом деле являются не ответами, а мнениями. И, конечно, на самом деле это лишь мое скромное мнение.

PPS: Я не ненавижу синтаксис Intel, мне все равно.

Гюнтер Пьез
источник
19
Я ужасно запутался. Вы имеете в виду, что синтаксис at & t никогда не требует явного указания размера слова? Почему вы скопировали мой пример и добавили размеры слов и бесполезную штуку с PTR? Также почему вы изменили мои разницы на суммы с отрицательным левым операндом? Это потому, что так на самом деле кодируется инструкция? Пользователь редко об этом заботится. В каждом ассемблере, который я использовал, вы можете опустить DWORD PTR, поскольку левый операнд 32-битный, а правый операнд заключен в квадратные скобки.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
Более того, IDA / ollydbg даже не производит ничего похожего на то, что вы написали, так что я почти уверен, что нет проблем с переходом от машинного кода к "красивому" синтаксису Intel. Итак, ваш пример кажется довольно надуманным, и я никогда не увижу его, кроме самой тривиальной реализации ассемблера или дизассемблера. С другой стороны, инструкции at & t, которые я высмеиваю, взяты непосредственно из одного из первых абзацев учебного пособия по синтаксису & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
Я пришел к выводу, что вы машина, поэтому вы предпочитаете синтаксис, который напрямую отражает битовую кодировку инструкции. (что и делает синтаксис at & t). У меня также есть подозрение, что люди чувствуют себя более 1337, когда используют синтаксис at & t, поскольку он более неясен, хотя на самом деле это не является преимуществом ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 01
7
@Longpoke Нет, синтаксис AT&T не требует явного указания размера слова, если это ясно из контекста. Точно так же, как с Intel: вам не нужно, SOMEWORD PTR[]если размер операнда ясен из контекста. Но он вам понадобится в случае немедленного перемещения в место в памяти (как lот AT&T, так и от DWORD PTR от Intel). И да, мой пример довольно надуманный, но и ваш тоже. Если вы все еще не понимаете, почему: вы не учли ненужные слова в Intel, но оставили их в AT&T. Вы выбираете операнды таким образом, чтобы они хорошо согласовывались в Intel, но не делайте этого в AT&T.
Gunther Piez 01
7
Так ты говоришь, -4(ebp,edx,4)что лучше чем [4*edx+ebp-4]? Я считаю последнее более интуитивным.
Calmarius 05
24

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

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

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

Джейкоб Б.
источник
16
Какие? Поскольку GCC по умолчанию использует at & t, нет причин изучать синтаксис at & t. Особенно, если вы можете просто переключить его на более интуитивно понятный синтаксис Intel.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@longpoke Изучение синтаксиса Intel только потому, что все называют его «более интуитивным», - не лучшая причина. На самом деле это вообще не причина.
Hawken
1
Вы оба правы по тем же причинам, что и Verilog, и VHDL.
ошибка
@Hawken: Верно. Настоящая причина изучения синтаксиса Intel заключается в том, что он используется в руководствах Intel и AMD. Не существует справочных руководств по ISA, использующих синтаксис AT&T, столь же подробных, как руководства для поставщиков, например, felixcloutier.com/x86/cmppd (извлеченные из PDF-файлов Intel). Также информация о производительности, например uops.info и agner.org/optimize . Я думаю, что читал, что какой-то поставщик Unix в какой-то момент сделал ссылку на AT&T ISA, но она определенно устарела и не будет охватывать инструкции AVX. 100% согласны с этим ответом: тот же машинный код, другой синтаксис для его выражения, ничего страшного.
Питер Кордес,
20

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

phorgan1
источник
5
Как насчет того, чтобы быть «профессиональным» пользователем этих инструментов и знать, как изменить их, чтобы повысить свою продуктивность? +1 для синтаксиса Intel.
Jonathon Reinhart
5
Что ж, хотя я тоже предпочитаю синтаксис Intel, он прав - подумайте, например, об обслуживании существующего кода AT&T. Определенно нет ничего плохого в том, чтобы разобраться в обоих.
Elliott
7
Хотя я также рекомендую изучить и то, и другое, я поиграю в Devil's Advocate и предложу вам просто скрипт vim для автоматического преобразования файлов * .s в синтаксис по вашему выбору.
ошибка
2
поскольку синтаксис Intel легче читать, синтаксис Intel имеет преимущество. «lea eax, [eax * 4 + 8]» имеет гораздо лучшую объективную читаемость, чем «leal 8 (,% eax, 4),% eax»
Lucio M. Tato
2
@bug Хех, вы неправильно написали emacs; D
GDP2
12

Синтаксис Intel охватывает все (при условии, что ассемблер / дизассемблер обновлен с последним мусором, добавленным Intel в их набор инструкций). Я уверен, что у & 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]

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

'достаточно.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
источник
17
Нет, недостаточно сказано.
Gunther Piez
2
В плакате уже говорилось, что они предпочитают синтаксис Intel; хорошо для них; так кого вы пытаетесь убедить?
Hawken
2
@Hawken, это не просто плакат, который будет читать ответы.
Winger Sendon
Мне нравится, как он упоминает пример с длиной двойного слова. Пожалуйста, запишите операнд памяти в однобайтовом или коротком формате.
Аджай Брахмакшатрия
2

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

gsk
источник
3
Сборка MIPS похожа только на синтаксис AT&T в формате адреса инструкции загрузки / сохранения. Но у MIPS есть только 1 простой режим адресации для загрузки / сохранения, в то время как у Intel гораздо больше, что усложняет задачу. Учтите lea -0x30(%rcx,%rax,8),%eaxи lea eax,[rcx+rax*8-0x30]Йоргенсен, размещенный выше. И в отличие от AT&T, MIPS, как и все остальные, по-прежнему использует формат «сначала адресат». Кроме того, номер MIPS не обязательно должен начинаться с префикса $, а имена регистров в MIPS короткие, поэтому не очень неудобно иметь% полностью, как у AT&T
phuclv