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.
Odpowiedzi:
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:
GCC może wykonywać składnię Intel z
-masm=intel
.źródło
lea -0x30(%rcx,%rax,8),%eax
jest zagmatwany ATT dlalea eax,[rcx+rax*8-0x30]
. Użycie + i * naprawdę pomaga w stylu Intela.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.
źródło
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.
... 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.
źródło
SOMEWORD PTR[]
jeśli rozmiar operandu jest jasny z kontekstu. Ale potrzebujesz go w przypadku natychmiastowego przeniesienia do lokalizacji pamięci (zarównol
z 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.-4(ebp,edx,4)
to jest lepsze niż[4*edx+ebp-4]
? Uważam, że to drugie jest bardziej intuicyjne.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.
źródło
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.
źródło
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.
... a przy bardziej złożonych instrukcjach sprawa staje się bardziej skomplikowana
powiedział nuff.
źródło
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ć.
źródło
lea -0x30(%rcx,%rax,8),%eax
ilea 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