Ograniczenia składni zespołu Intel w porównaniu z AT&T [zamknięte]

88

Dla mnie składnia Intela jest znacznie łatwiejsza do odczytania. Jeśli przejdę przez las montażowy, koncentrując się tylko na składni Intela, czy coś mi umknie? Czy jest jakiś powód, dla którego chciałbym przejść na AT&T (poza możliwością czytania zestawu AT&T innych)? Moja pierwsza wskazówka jest taka, że ​​gdb domyślnie używa AT&T.

Jeśli to ma znaczenie, skupiam się tylko na jakimkolwiek montażu relacji i składni, które mogą mieć do Linuksa / BSD i języka C.

oevna
źródło
11
Uwielbiam nie konstruktywne pytania, które uzyskują więcej niż 50 pozytywnych głosów.
ceving

Odpowiedzi:

80

Tak naprawdę nie ma żadnej przewagi nad innymi. Zgadzam się jednak, że składnia Intela jest dużo łatwiejsza do odczytania. Pamiętaj, że AFAIK, wszystkie narzędzia GNU mają również opcję używania składni Intela.

Wygląda na to, że możesz sprawić, by GDB używał składni Intela w ten sposób:

ustaw informacje o demontażu-smaku

GCC może wykonywać składnię Intel z -masm=intel.

Zifre
źródło
18
również, echo set dis intel >> ~ / .gdbinit
oevna
9
W jaki sposób składnia AT&T jest mniej czytelna? Uważam, że przyrostki rozmiaru na operandach są bardziej rozsądne niż posiadanie „dword”. Czy jest coś jeszcze, czego mi brakuje?
Hawken
54
lea -0x30(%rcx,%rax,8),%eaxjest zagmatwany ATT dla lea eax,[rcx+rax*8-0x30]. Użycie + i * naprawdę pomaga w stylu Intela.
jørgensen
9
Postrzegam ich „splot” jako równy, ale nieidentyczny: jeśli ATT jest nieprzejrzysty, to Intel jest niejednoznaczny. Chociaż arytmetyka wrostkowa jest bardziej znana studentom algebry, ze składni nie wynika jasno, że operacja ma dokładnie 4 argumenty lub że tylko jeden z nich może być pomnożony, aw żadnym przypadku nie jest jasne, że mnożnik musi być moc 2.
błąd
10
@Hawken Uważam, że przyrostki AT&T są znacznie lepsze niż "ptr" Intela, ponieważ zawsze je określasz i naprawdę zmniejsza to liczbę błędów (przynajmniej dla mnie). Co do reszty (na przykład symbole $ i%)… tak… nie są przyjemne i o to chodzi, ale mają przewagę: są wyraźne i ponownie redukują błędy. Powiedziałbym, że jeden jest wygodny do czytania (Intel), a drugi do pisania (AT&T).
MasterMastic
43

Podstawowa składnia asemblera GNU (GAS) to AT&T. Składnia Intela jest do niej stosunkowo nowym dodatkiem. x86 w jądrze Linuksa jest w składni AT&T. W świecie Linuksa jest to powszechna składnia. W świecie MS składnia Intela jest bardziej powszechna.

Osobiście nienawidzę składni AT&T . Istnieje wiele darmowych asemblerów (NASM, YASM) wraz z GAS, które również obsługują składnię Intela, więc nie będzie żadnych problemów ze składnią Intela w Linuksie.

Poza tym to tylko różnica składniowa. Wynikiem obu będzie ten sam kod maszynowy x86.

Mehrdad Afshari
źródło
25
Uzgodnione i uzgodnione. Używanie składni AT&T powinno być przestępstwem, jest sprzeczne z intuicją i brzydkie, dlaczego miałbyś chcieć poprzedzać każdą pojedynczą liczbę i rejestrować się za pomocą $ i% oraz określać względne adresowanie w odwrotnej notacji SIB. Używam składni Intela do dwa lata i nadal nie rozumiem, dlaczego AT&T w ogóle istnieje.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Jeśli zamierzasz wyrazić to pogrubioną czcionką, przedstaw przynajmniej kilka dowodów, dlaczego dane wywiadowcze są o wiele lepsze.
Hawken
8
@Hawken Haters gonna hate
Gunther Piez
8
@Hawken Czy sugerujesz, że ponieważ użył odważnej czcionki, w jakiś sposób określa swoją opinię jako fakt w sposób, w jaki nie byłby, gdyby po prostu zostawił śmiałego samego? Pytanie i tak praktycznie zapraszało do tego rodzaju opiniotwórczej „debaty”, prawdopodobnie dlaczego jest teraz zamknięta!
Elliott
1
A co ze składnią Intel dla ARM?
ceving
33

Tak naprawdę nie ma żadnej przewagi nad innymi. Nie zgadzam się jednak, że składnia Intela jest dużo łatwiejsza do odczytania, ponieważ osobiście nienawidzę składni Intela . Pamiętaj, że AFAIK, wszystkie narzędzia GNU mają również opcję używania składni Intela.

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]

... a przy bardziej złożonych instrukcjach sprawa staje się bardziej skomplikowana

powiedział nuff.

PS: Ta odpowiedź istnieje głównie z powodu podkreślenia (IMHO) słabości w niektórych innych odpowiedziach, które w rzeczywistości nie są odpowiedziami, ale opiniami. I oczywiście ta odpowiedź w rzeczywistości jest tylko moją skromną opinią.

PPS: Nie nienawidzę składni Intela, po prostu mnie to nie obchodzi.

Gunther Piez
źródło
19
Jestem strasznie zdezorientowany. Czy sugerujesz, że składnia at & t nigdy nie musi wyraźnie określać rozmiaru słowa? Dlaczego skopiowałeś mój przykład i dodałeś rozmiary słów i bezużyteczny PTR? Dlaczego zmieniłeś moje różnice na sumy z ujemnym lewym operandem? Czy to dlatego, że tak faktycznie jest kodowana instrukcja? Użytkownik rzadko musi się tym przejmować. W każdym asemblerze, którego użyłem, możesz pominąć DWORD PTR, ponieważ lewy operand jest 32-bitowy, a prawy operand ma nawiasy kwadratowe.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
Co więcej, IDA / ollydbg nawet nie produkuje niczego takiego, jak to, co napisałeś, więc jestem prawie pewien, że nie ma problemu z przejściem od kodu maszynowego do "ładnej" składni Intel. Więc twój przykład wydaje się dość wymyślony i coś, czego nigdy bym nie zobaczył, z wyjątkiem najbardziej banalnej implementacji asemblera lub deasemblera. Z drugiej strony, wyśmiewane przeze mnie instrukcje at & t pochodzą bezpośrednio z jednego z pierwszych akapitów samouczka uczącego składni at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
Doszedłem do wniosku, że jesteś maszyną, więc wolisz składnię, która bezpośrednio odzwierciedla kodowanie bitowe instrukcji. (co robi składnia at & t). Podejrzewam również, że ludzie czują się bardziej 1337, gdy używają składni at & t, ponieważ jest ona bardziej niejasna, chociaż to nie jest zaleta ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@Longpoke Nie, składnia AT&T nie musi wyraźnie określać rozmiaru słowa, jeśli wynika to z kontekstu. Tak samo jak w przypadku intel: nie potrzebujesz, SOMEWORD PTR[]jeśli rozmiar operandu jest jasny z kontekstu. Ale potrzebujesz go w przypadku natychmiastowego przeniesienia do lokalizacji pamięci (zarówno lz AT&T, jak i DWORD PTR firmy Intel). I tak, mój przykład jest dość wymyślony - ale tak jak twój. Na wypadek, gdybyś nadal nie rozumiał dlaczego: pominąłeś niepotrzebne słowa w Intel, ale masz je w AT&T. Wybierasz operandy w taki sposób, aby ładnie się zgadzały w Intelu, ale nie rób tego w AT&T.
Gunther Piez
7
Więc mówisz, że -4(ebp,edx,4)to jest lepsze niż [4*edx+ebp-4]? Uważam, że to drugie jest bardziej intuicyjne.
Calmarius,
24

Jest to „ten sam język”, ponieważ kompiluje się do tego samego kodu maszynowego, ma te same kody operacyjne itp. Z drugiej strony, jeśli w ogóle używasz GCC, prawdopodobnie będziesz chciał nauczyć się składni AT&T, tylko dlatego, że jest to wartość domyślna - brak zmiany opcji kompilatora itp., aby ją pobrać.

Ja również wyciąłem zęby na Intel-syntax x86 ASM (także w DOS) i stwierdziłem, że początkowo jest bardziej intuicyjny po przejściu na C / UNIX. Ale kiedy nauczysz się AT&T, będzie to wyglądać równie łatwo.

Nie zastanawiałbym się nad tym zbyt wiele - łatwo jest nauczyć się AT&T, gdy znasz Intel i odwrotnie. Rzeczywisty język jest znacznie trudniejszy do zrozumienia niż składnia. Więc jak najbardziej skoncentruj się na jednym, a potem naucz się drugiego, gdy się pojawi.

Jacob B.
źródło
16
Co? Ponieważ GCC domyślnie używa at & t, nie ma powodu, aby uczyć się składni at & t. Zwłaszcza, gdy możesz po prostu przełączyć się na bardziej intuicyjną składnię Intela.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@longpoke Nauka składni Intel tylko dlatego, że wszyscy nazywają ją „bardziej intuicyjną”, nie jest lepszym powodem. Właściwie to nie ma żadnego powodu.
Hawken
1
Oboje macie rację, z tych samych powodów, z których utknęli Verilog i VHDL.
błąd
@Hawken: Prawda. Prawdziwym powodem do nauki składni Intela jest to, że używają jej podręczniki Intela i AMD. Nie ma podręczników referencyjnych ISA używających składni AT&T tak szczegółowych, jak podręczniki dostawcy, np. Felixcloutier.com/x86/cmppd (wyodrębnione z plików PDF firmy Intel). Również informacje o wydajności, takie jak uops.info i agner.org/optimize . Wydaje mi się, że czytałem, że jakiś dostawca Uniksa stworzył w pewnym momencie odniesienie do AT&T ISA, ale z pewnością jest ono już nieaktualne i nie obejmuje instrukcji AVX. W 100% zgadzam się z tą odpowiedzią: ten sam kod maszynowy, inna składnia wyrażania tego, nic wielkiego.
Peter Cordes
20

To oznaka profesjonalizmu, że jesteś gotów dostosować się do tego, co jest w użyciu. Nie ma żadnej realnej korzyści ani dla jednego, ani dla drugiego. Składnia Intel jest powszechna w świecie Microsoft, AT&T jest standardem w Linuksie / Uniksie. Ponieważ żadna z nich nie ma żadnej korzyści, ludzie mają tendencję do nadruku na tym, co zobaczyli jako pierwsi. To powiedziawszy, profesjonalny programista podnosi takie rzeczy. Używaj tego, czego używają w pracy lub w domenie, w której pracujesz.

phorgan1
źródło
5
Co powiesz na bycie „profesjonalnym” użytkownikiem narzędzi i wiedząc, jak je zmieniać, aby zwiększyć produktywność? +1 dla składni Intel.
Jonathon Reinhart
5
Cóż, chociaż ja też wolę składnię Intela, ma rację - rozważ na przykład utrzymanie istniejącego kodu AT&T. Zdecydowanie nie ma nic złego w znajomości obu.
Elliott
7
Chociaż zalecałbym również nauczenie się obu, zagram Devil's Advocate i zasugeruję, że możesz po prostu napisać skrypt vim do automatycznej konwersji plików * .s na wybraną składnię.
błąd
2
ponieważ składnia Intel jest łatwiejsza do odczytania, składnia Intel ma przewagę. „lea eax, [eax * 4 + 8]” ma znacznie lepszą obiektywną czytelność niż „leal 8 (,% eax, 4),% eax”
Lucio M. Tato
2
@bug Heh, błędnie napisałeś emacs; D
GDP2
12

Składnia Intela obejmuje wszystko (zakładając, że asembler / deasembler jest na bieżąco z najnowszymi śmieciami Intel dodanymi do ich zestawu instrukcji). Jestem pewien, że at & t jest takie samo.

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]

... a przy bardziej złożonych instrukcjach sprawa staje się bardziej skomplikowana

powiedział nuff.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
źródło
17
Nie, nie wystarczy powiedzieć.
Gunther Piez
2
Plakat już stwierdził, że wolą składnię Intel; dobrze dla nich; więc kogo próbujesz przekonać?
Hawken
2
@Hawken to nie tylko plakat, który przeczyta odpowiedzi.
Skrzydłowy Sendon
Podoba mi się, jak przytacza przykład z długością dworda. Proszę napisać operand pamięci jednobajtowy lub krótki.
Ajay Brahmakshatriya
2

Moim pierwszym językiem asemblera był MIPS, który, jak zauważyłem, jest bardzo podobny do składni ATT. Więc wolę składnię ATT, ale tak naprawdę nie ma to znaczenia, o ile możesz ją przeczytać.

gsk
źródło
3
Zespół MIPS jest tylko podobny do składni AT&T w formacie adresu instrukcji ładowania / przechowywania. Ale MIPS ma tylko 1 prosty tryb adresowania do ładowania / przechowywania, podczas gdy Intel ma znacznie więcej, co czyni to bardziej złożonym. Rozważ lea -0x30(%rcx,%rax,8),%eaxi lea eax,[rcx+rax*8-0x30]jørgensen zamieszczone powyżej. I w przeciwieństwie do AT&T, MIPS nadal używa formatu docelowego, tak jak wszystkie inne. Poza tym numer MIPS nie musi być poprzedzony znakiem $, a nazwy rejestrów w MIPS są krótkie, więc nie jest zbyt niewygodne mieć% tak samo jak AT&T
phuclv