Limitazioni della sintassi Intel Assembly rispetto ad AT&T [chiuso]


88

Per me, la sintassi Intel è molto più facile da leggere. Se vado in giro attraverso la foresta di assembly concentrandomi solo sulla sintassi Intel, mi mancherà qualcosa? C'è qualche motivo per cui vorrei passare ad AT&T (oltre a poter leggere l'assembly AT&T di altri)? Il mio primo indizio è che gdb utilizza AT&T per impostazione predefinita.

Se questo è importante, il mio focus è solo su qualsiasi relazione di assembly e sintassi che potrebbe avere con Linux / BSD e il linguaggio C.


11
Adoro le domande non costruttive che ottengono più di 50 voti positivi.
Ceving

Risposte:


80

Non c'è davvero alcun vantaggio per l'uno sull'altro. Sono d'accordo però che la sintassi Intel sia molto più facile da leggere. Tieni presente che, AFAIK, tutti gli strumenti GNU hanno la possibilità di utilizzare anche la sintassi Intel.

Sembra che tu possa fare in modo che GDB usi la sintassi Intel con questo:

impostare informazioni sullo smontaggio

GCC può eseguire la sintassi Intel con -masm=intel.


18
inoltre, echo set dis intel >> ~ / .gdbinit
oevna

9
In che modo la sintassi AT&T è meno leggibile? Trovo che avere suffissi di dimensione sugli operandi sia più consono di avere "dword". C'è qualcos'altro che mi manca?
Hawken

54
lea -0x30(%rcx,%rax,8),%eaxè contorto ATT per lea eax,[rcx+rax*8-0x30]. L'uso di + e * aiuta davvero nello stile Intel.
jørgensen

9
Vedo la loro "convoluzione" come uguale ma non identica: se ATT è opaco, allora Intel è ambigua. Sebbene l'aritmetica degli infissi sia più familiare agli studenti di algebra, non è ovvio dalla sintassi che ci siano esattamente 4 argomenti per l'operazione, o che solo uno di essi possa essere moltiplicato, e in nessun caso è chiaro che il moltiplicatore deve essere un potenza di 2.
bug

10
@ Hawken trovo i suffissi di AT & T molto meglio di "ptr" di Intel perché lo specifichi sempre e riduce davvero la quantità di errori (almeno per me). Per il resto (ad esempio i simboli $ e%) .. sì .. non sono piacevoli, e questo è il punto, ma hanno un vantaggio: è esplicito e ancora una volta riduce gli errori. Direi che uno è comodo per la lettura (Intel) e il secondo per la scrittura (AT&T).
MasterMastic

43

La sintassi principale per l'assemblatore GNU (GAS) è AT&T. La sintassi Intel è un'aggiunta relativamente nuova. L'assembly x86 nel kernel Linux è nella sintassi AT&T. Nel mondo Linux, è la sintassi comune. Nel mondo MS, la sintassi Intel è più comune.

Personalmente, odio la sintassi AT&T . Ci sono molti assemblatori gratuiti (NASM, YASM) insieme a GAS che supportano anche la sintassi Intel, quindi non ci saranno problemi con la sintassi Intel in Linux.

Oltre a ciò, è solo una differenza sintattica. Il risultato di entrambi sarà lo stesso codice macchina x86.


25
Concordato e concordato. Dovrebbe essere un crimine usare la sintassi AT&T, è controintuitivo e brutto, perché dovresti voler anteporre ogni singolo numero e registrarti con $ e% e specificare l'indirizzo relativo nella notazione SIB inversa, ho usato la sintassi Intel per due anni e ancora non riesco a capire perché esista AT&T.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
Se hai intenzione di dichiararlo in grassetto, fornisci almeno alcune prove del motivo per cui Intel è molto meglio.
Hawken

8
@ Hawken Haters ti odierà
Gunther Piez

8
@ Hawken Stai suggerendo che, poiché ha usato il grassetto, in qualche modo sta affermando la sua opinione come un fatto in un modo che non sarebbe stato se avesse semplicemente lasciato il grassetto da solo? Comunque la domanda stava praticamente invitando questo tipo di "dibattito" guidato dall'opinione, presumibilmente perché ora è chiuso!
Elliott

1
Che ne dici della sintassi Intel per ARM?
Ceving

33

Non c'è davvero alcun vantaggio per l'uno sull'altro. Non sono d'accordo però sul fatto che la sintassi Intel sia molto più facile da leggere, perché personalmente odio la sintassi Intel . Tieni presente che, AFAIK, tutti gli strumenti GNU hanno la possibilità di utilizzare anche la sintassi 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]

... e diventa più complicato con istruzioni più complesse

nuff ha detto.

PS: questa risposta esiste principalmente per evidenziare (IMHO) i punti deboli in alcune altre risposte, che in realtà non sono risposte, ma opinioni. E ovviamente questa risposta in realtà è solo la mia modesta opinione.

PPS: Non odio la sintassi Intel, semplicemente non mi interessa.


19
Sono terribilmente confuso. Stai insinuando che la sintassi at & t non debba mai rendere esplicita la dimensione della parola? Perché hai copiato il mio esempio e hai aggiunto le dimensioni delle parole e l'inutile cosa PTR? Inoltre perché hai modificato le mie differenze in somme con un operando sinistro negativo? È perché è così che l'istruzione viene effettivamente codificata? L'utente raramente deve preoccuparsene davvero. In ogni assembler che ho usato, puoi omettere DWORD PTR poiché l'operando sinistro è a 32 bit e l'operando destro ha parentesi quadre attorno ad esso.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

12
Inoltre, IDA / ollydbg non produce nemmeno nulla di simile a quello che hai scritto, quindi sono abbastanza sicuro che non ci siano problemi a passare dal codice macchina alla sintassi Intel "carina". Quindi il tuo esempio sembra piuttosto artificioso e qualcosa che non vedrei mai tranne nella più banale implementazione di un assemblatore o disassemblatore. D'altra parte, le istruzioni at & t che derido provengono direttamente da uno dei primi paragrafi di un tutorial che insegna la sintassi at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

8
Sono giunto alla conclusione che sei una macchina, quindi preferisci una sintassi che rispecchi direttamente la codifica in bit dell'istruzione. (che è ciò che fa la sintassi at & t). Ho anche il sospetto che le persone si sentano più 1337 quando usano la sintassi at & t poiché è più oscura, anche se non è davvero un vantaggio ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@ Longpoke No, la sintassi AT&T non ha bisogno di rendere esplicita la dimensione della parola se è chiara dal contesto. Proprio come con Intel: non è necessario SOMEWORD PTR[]se la dimensione dell'operando è chiara dal contesto. Ma è necessario in caso di spostamento di un immediato in una posizione di memoria (sia lda AT&T che DWORD PTR da Intel). E sì, il mio esempio è piuttosto artificioso, ma lo era anche il tuo. Nel caso in cui continui a non capire il motivo: hai tralasciato le parole non necessarie su Intel, ma le hai in AT&T. Scegli gli operandi in modo che si allineino bene in Intel, ma non farlo in AT&T.
Gunther Piez

7
Quindi stai dicendo -4(ebp,edx,4)che è meglio di [4*edx+ebp-4]? Trovo quest'ultimo più intuitivo.
Calmarius

24

È la "stessa lingua", in quanto si compila fino allo stesso codice macchina, ha gli stessi codici operativi, ecc. D'altra parte, se stai usando GCC, probabilmente vorrai imparare la sintassi AT&T, solo perché è l'impostazione predefinita - nessuna modifica delle opzioni del compilatore, ecc. per ottenerlo.

Anch'io mi sono fatto le ossa su ASM x86 con sintassi Intel (anche su DOS) e l'ho trovato inizialmente più intuitivo quando si passa a C / UNIX. Ma una volta che impari AT&T, sembrerà altrettanto facile.

Non ci penserei molto: è facile imparare AT&T una volta che conosci Intel e viceversa. La lingua reale è molto più difficile da capire rispetto alla sintassi. Quindi con tutti i mezzi concentrati su uno e poi impara l'altro quando si presenta.


16
Che cosa? Poiché GCC usa at & t per impostazione predefinita non è un motivo per imparare la sintassi at & t. Soprattutto quando puoi semplicemente passare alla sintassi Intel più intuitiva.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke Imparare la sintassi delle informazioni solo perché tutti la chiamano "più intuitiva" non è una ragione migliore. In realtà non è affatto un motivo.
Hawken

1
Avete entrambi ragione, per gli stessi motivi per cui sia Verilog che VHDL sono rimasti bloccati.
bug

@ Hawken: vero. La vera ragione per imparare la sintassi Intel è che è ciò che usano i manuali di Intel e AMD. Non ci sono manuali di riferimento ISA che utilizzano la sintassi AT&T dettagliata come i manuali del fornitore, ad esempio felixcloutier.com/x86/cmppd (estratto dai PDF di Intel). Anche informazioni sulle prestazioni come uops.info e agner.org/optimize . Penso di aver letto che qualche fornitore Unix ha fatto un riferimento ISA AT&T ad un certo punto, ma è certamente obsoleto ormai e non coprirà le istruzioni AVX. 100% d'accordo con questa risposta: stesso codice macchina, sintassi diversa per esprimerlo, nessun problema.
Peter Cordes

19

È un segno di professionalità che sei disposto ad adattarti a ciò che è in uso. Non c'è un vero vantaggio per l'uno o per l'altro. La sintassi Intel è comune nel mondo Microsoft, AT&T è lo standard in Linux / Unix. Poiché non c'è alcun vantaggio per nessuno dei due, le persone tendono a imprimere su ciò che hanno visto per primo. Detto questo, un programmatore professionista alza al di sopra di cose del genere. Usa quello che usano al lavoro o nel dominio in cui stai lavorando.


5
Che ne dici di essere un utente "professionale" degli strumenti e sapere come cambiarli per renderti più produttivo? +1 per la sintassi Intel.
Jonathon Reinhart

5
Bene, anche se preferisco la sintassi Intel, ha un punto: considera la manutenzione del codice AT&T esistente, ad esempio. Non c'è assolutamente nulla di male nel sapere come aggirare entrambi.
Elliott

7
Mentre vorrei anche sostenere l'apprendimento di entrambi, giocherò a Devil's Advocate e suggerirei che potresti semplicemente scrivere vim in file * .s di conversione automatica con la sintassi che preferisci.
bug

2
poiché la sintassi di Intel è più facile da leggere, la sintassi di Intel ha un vantaggio. "lea eax, [eax * 4 + 8]" ha una leggibilità oggettiva molto migliore di "leal 8 (,% eax, 4),% eax"
Lucio M. Tato

2
@bug Heh, hai scritto male emacs; D
GDP2

13

La sintassi Intel copre tutto (assumendo che l'assemblatore / disassemblatore sia aggiornato con l'ultima spazzatura Intel aggiunta al set di istruzioni). Sono sicuro che at & t è lo stesso.

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]

... e diventa più complicato con istruzioni più complesse

nuff ha detto.


17
No, non è stato detto abbastanza.
Gunther Piez

2
Il poster ha già affermato di preferire la sintassi Intel; buono per loro; quindi chi stai cercando di convincere?
Hawken

2
@ Hawken non è solo il poster che leggerà le risposte.
Ala Sendon

Mi piace come menziona l'esempio con la lunghezza della parola chiave. Si prega di scrivere un operando di memoria su byte singolo o breve.
Ajay Brahmakshatriya

2

Il mio primo linguaggio assembly è stato MIPS, che ho notato è molto simile alla sintassi ATT. Quindi preferisco la sintassi ATT, ma non importa fintanto che puoi leggerlo.


3
L'assembly MIPS è simile alla sintassi AT&T solo nel formato dell'indirizzo dell'istruzione di caricamento / memorizzazione. Ma MIPS ha solo 1 semplice modalità di indirizzamento per caricamento / archiviazione mentre Intel ne ha molto di più, il che rende tutto più complesso. Considera lea -0x30(%rcx,%rax,8),%eaxe lea eax,[rcx+rax*8-0x30]jørgensen postato sopra. E a differenza di AT&T, MIPS utilizza ancora il formato destinazione prima come tutti gli altri. Inoltre, il numero MIPS non ha bisogno di essere preceduto da $ e i nomi dei registri in MIPS sono brevi, quindi non è molto scomodo avere% completamente come AT&T
phuclv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.