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