Обмеження синтаксису збірки 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 таким чином:

набір розбирання-смак intel

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


18
також, echo set dis intel >> ~ / .gdbinit
oevna

9
Як синтаксис AT&T менш читабельний? Я вважаю, що суфікси розміру на операндах більш стислі, ніж наявність "dword". Щось ще мені не вистачає?
Хокен

54
lea -0x30(%rcx,%rax,8),%eaxє заплутаним АТТ для lea eax,[rcx+rax*8-0x30]. Використання + та * дійсно допомагає у стилі Intel.
Йоргенсен,

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-нотації, два роки і досі не може зрозуміти, чому AT&T взагалі існує.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
Якщо ви збираєтеся викласти це напівжирним шрифтом, принаймні наведіть деякі докази того, чому Intel набагато кращий.
Хокен

8
@Hawken Haters gonna hate
Gunther Piez

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: Ця відповідь існує головним чином з метою виділення (IMHO) слабких місць у деяких інших відповідях, які насправді є не відповідями, а думками. І, звичайно, ця відповідь насправді є лише моєю скромною думкою.

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


19
Я страшенно розгублений. Ви натякаєте, що в & 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
Я дійшов висновку, що ви машина, тому ви віддаєте перевагу синтаксису, який безпосередньо відображає бітове кодування інструкції. (що робить синтаксис & t). У мене також є підозра, що люди відчувають більше 1337, коли використовують синтаксис & t, оскільки він є більш неясним, хоча це насправді не є перевагою ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@Longpoke Ні, синтаксис AT&T не повинен вказувати розмір слова явним, якщо це зрозуміло з контексту. Так само, як і з intel: Вам не потрібно, SOMEWORD PTR[]якщо розмір операнда зрозумілий із контексту. Але він вам потрібен на випадок негайного переміщення до місця пам'яті (як lвід AT&T, так і DWORD PTR від Intel). Так, мій приклад досить надуманий - але ваш теж. Якщо ви все ще не розумієте, чому: Ви залишили непотрібні великі розміри слів на Intel, але мають їх в AT&T. Ви вибираєте операнди таким чином, щоб вони добре поєднувалися в Intel, але не робіть цього в AT&T.
Гюнтер Пієз,

7
То ти хочеш сказати, що -4(ebp,edx,4)справа краща ніж [4*edx+ebp-4]? Останній мені здається більш інтуїтивним.
Calmarius

24

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

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

Я б не замислювався над цим - легко навчитися AT&T, коли ти знаєш Intel, і навпаки. Дійсну мову набагато важче отримати в голові, ніж синтаксис. Тож неодмінно просто зосередьтеся на одному, а потім навчіться іншому, коли він з’явиться.


16
Що? Оскільки GCC використовує at & t за замовчуванням, це не є підставою для вивчення синтаксису & t. Особливо, коли ви можете просто переключити його на більш інтуїтивний синтаксис Intel.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke Навчання синтаксису Intel лише тому, що всі називають його "більш інтуїтивним", не набагато краща причина. Насправді це зовсім не причина.
Хокен

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. Оскільки жодна з них не має переваг, люди схильні відбиватись на тому, що побачили спочатку. Тим не менш, професійний програміст піднімає вище подібних речей. Використовуйте все, що вони використовують на роботі або в домені, в якому ви працюєте.


5
Як щодо того, щоб бути «професійним» користувачем інструментів і знати, як їх змінити, щоб зробити вас більш продуктивними? +1 для синтаксису Intel.
Джонатан Рейнхарт,

5
Ну, хоча я також віддаю перевагу синтаксису Intel, він має сенс - подумайте про підтримку існуючого коду AT&T, наприклад. Однозначно не шкодить знати свій шлях до обох.
Елліот

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]

... і це ускладнюється завдяки більш складним інструкціям

'Нафф сказав.


17
Ні, недостатньо сказано.
Гюнтер Пієз

2
У плакаті вже було зазначено, що вони віддають перевагу синтаксису Intel; добре для них; так кого ви намагаєтесь переконати?
Хокен

2
@Hawken відповіді читатиме не лише той, хто рекламує.
Вінгер Сендон

Мені подобається, як він згадує приклад із довжиною слова. Будь ласка, напишіть операнд пам'яті на один байт або короткий.
Аджай Брахмакшатрія,

2

Моєю першою мовою збірки був MIPS, який, як я помітив, дуже схожий на синтаксис ATT. Тому я віддаю перевагу синтаксису ATT, але це не має значення, поки ви можете його прочитати.


3
Збірка MIPS лише схожа на синтаксис AT&T у форматі адреси інструкції завантаження / зберігання. Але MIPS має лише 1 простий режим адресації для завантаження / зберігання, тоді як Intel має набагато більше, що робить це більш складним. Розглянемо lea -0x30(%rcx,%rax,8),%eaxі lea eax,[rcx+rax*8-0x30]jørgensen розміщено вище. І на відміну від AT&T, MIPS як і раніше використовують формат першого місця призначення. Крім того, номер MIPS не повинен мати префікс $, а імена в MIPS короткі, тому не дуже незручно мати% до кінця, як AT&T
phuclv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.