Domanda

  1. Qualcuno può spiegarmi perché ogni costante nella sintassi AT & T ha un '$' di fronte ad essa?
  2. Perché tutti i registri hanno un '%'?
  3. E 'questo solo un altro tentativo di farmi fare un sacco di battitura zoppo?
  4. Inoltre, sono io l'unico che trova:? 16(%esp) davvero un controsenso rispetto al [esp+16]
  5. so che compila la stessa cosa, ma perché qualcuno dovrebbe voler digitare un sacco di '$' e '%' s senza bisogno di? - Perché ha fatto GNU scegliere questa sintassi come predefinita
  6. Altra cosa, perché è ogni istruzione in AT & T sintassi preceduta da un: l? - io so la sua per le dimensioni operandi, però perché non lasciare che la figura assembler che fuori? (Mai dovrei voler fare un movl su operandi che non sono di quelle dimensioni?)
  7. Ultima cosa: perché sono gli argomenti mov invertiti

Non è più logico che:

eax = 5
mov eax, 5

dove, come AT & T è:

mov 5, eax
5 = a (? wait what ?)

Nota: Non sto cercando di troll. Io proprio non capisco le scelte progettuali che hanno fatto e sto cercando di conoscere il motivo per cui hanno fatto quello che hanno fatto.

È stato utile?

Soluzione

1, 2, 3 e 5: la notazione è un po 'ridondante, ma trovo che sia una buona cosa quando si sviluppa in assemblea. Ridondanza aiuta lettura. Il punto di "lasciare che l'assemblatore figura fuori" si converte facilmente in "lasciare che il programmatore che legge il codice cifra fuori", e non mi piace quando io sono quello che fa la lettura. La programmazione non è un compito di sola scrittura; anche il programmatore si deve leggere il proprio codice, e la ridondanza della sintassi aiuta un po '.

Un altro punto è che il '%' e '$' significano che nuove registri possono essere aggiunte senza rompere compatibilità: nessun problema in aggiunta, per esempio, un registro chiamato xmm4, come sarà scritto come %xmm4, che non può essere confuso con una chiamata xmm4 variabile che sarebbe stato scritto senza un '%'.

Per quanto riguarda la quantità di digitazione: normalmente, durante la programmazione nel complesso, il collo di bottiglia è il cervello, non la mano. Se il '$' e '%' rallentare, allora o si sta pensando modo più veloce di quello che normalmente è considerato fattibile per un essere umano, o, più probabilmente, il vostro compito a portata di mano è troppo meccanica e non deve essere fatto in montaggio; dovrebbe essere lasciato a un generatore di codice automatico, qualcosa colloquialmente nota come "compilatore C".

Il suffisso 'l' inserito gestire alcune situazioni in cui l'assemblatore "non può" capire. Per esempio, questo codice:

mov  [esp], 10

è ambigua, perché non dice se si vuole scrivere un byte di valore 10, o una parola a 32 bit con lo stesso valore numerico. La sintassi Intel chiama poi per:

mov  byte ptr [esp], 10

che è abbastanza brutto, quando si pensa a questo proposito. Le persone a AT & T ha voluto fare qualcosa di più razionale, in modo che si avvicinò con:

movb   $10, (%esp)

e hanno preferito essere sistematico, e hanno la 'b' (o 'l' o 'w') suffisso in tutto il mondo . Si noti che il suffisso non è sempre richiesta . Per esempio, è possibile scrivere:

mov   %al, (%ebx)

e lasciare che l'assemblatore "Capire" GNU che da quando si sta parlando di '% al', la mossa è per un singolo byte. Funziona veramente ! Eppure, trovo ancora meglio specificare le dimensioni (in realtà aiuta il lettore, e il programmatore stesso è il primo e più importante lettore del suo codice).

Per la "inversione": è il contrario. I imita sintassi Intel quanto avviene in C, in cui i valori sono calcolati sulla destra, poi a ciò che è scritto sulla sinistra. Così, la scrittura va da destra a sinistra, in direzione "inversa", considerando che la lettura va da sinistra a destra. I ripristini sintassi AT & T alla direzione "normale". Almeno così considerati; dal momento che sono state decise di usare la propria in ogni caso la sintassi, hanno pensato che avrebbero potuto utilizzare gli operandi in quello che pensate come "l'ordinamento giusto". Questo è principalmente una convenzione, ma non un uno logico. Imita C convenzione di notazione matematica, eccetto che la matematica sono circa definente valori ( "x lasciare il valore 5") e non circa assegnazione valori ( "si scrive il valore 5 in di uno slot chiamato 'x' "). La scelta di AT & T ha un senso. Si confonde solo quando si sta convertendo il codice C per il montaggio, un compito che di solito dovrebbe essere lasciato a un compilatore C.

L'ultima parte della tua domanda 5 è interessante, da un punto di vista storico. Gli strumenti GNU per x86 hanno seguito la sintassi AT & T perché in quel momento, stavano cercando di prendere piede nel mondo Unix (significa "GNU" "GNU non è Unix") e in competizione con gli strumenti Unix; Unix era sotto il controllo di AT & T. Questo è prima dei giorni di Linux o anche Windows 3.0; PC erano sistemi a 16 bit. Unix usata la sintassi AT & T, quindi GNU usato AT & T sintassi.

La buona domanda è allora: perché AT & T trovato intelligente di inventare la propria sintassi? Come descritto in precedenza, hanno avuto alcuni motivi, che non erano prive di fondamento. Il costo di utilizzo della vostra sintassi, ovviamente, è che limita l'interoperabilità. In quellegiorni, un compilatore C o assembler fatto alcun senso reale come uno strumento separato: in un sistema Unix, sono stati concepiti per essere fornito dal produttore del sistema operativo. Inoltre, Intel non è stato un grande giocatore del mondo Unix; grandi sistemi per lo più utilizzati VAX o Motorola 680x0 derivati. Nessuno aveva capito che i PC MS-DOS si trasformerebbe in, vent'anni dopo, l'architettura dominante nel mondo desktop e server.

Altri suggerimenti

1-2, 5: Probabilmente scelto di registri prefisso e tali da rendere più facile da analizzare; si conosce direttamente al primo carattere che tipo di gettone è.

4:. No

. 6: Anche in questo caso, probabilmente per rendere più facile per il parser di capire cosa istruzione di uscita

7: In realtà questo ha più senso in un senso grammaticale, mossa cosa per , dove . Forse il mov di istruzioni dovrebbe essere un ld di istruzioni.

Non fraintendetemi, penso che la sintassi AT & T è orribile.

sintassi AT & T del assemblatore GNU trae le sue origini al Unix assembler 1 , che a sua volta ha preso la sua sintassi di ingresso per lo più dalla PDP-11 PAL-11 assembler (circa 1970).

Qualcuno può spiegarmi perché ogni costante nella sintassi AT & T ha un '$' di fronte ad essa?

Permette di distinguere le costanti immediati da indirizzi di memoria. sintassi Intel fa il contrario, con i riferimenti di memoria come [foo].

Per inciso, MASM (Microsoft Assembler) non ha bisogno di una distinzione a livello di sintassi, dal momento che può dire se l'operando è una costante simbolica, o un'etichetta. Altri assemblatori per x86 evitare attivamente tali ipotesi, in quanto possono essere fonte di confusione per i lettori, per esempio:. TASM in modalità IDEAL (che mette in guardia sui riferimenti di memoria non tra parentesi), NASM, FASM

PAL-11 # utilizzato per la Immediata modalità, in cui l'operando ha seguito l'istruzione di indirizzamento. Una costante senza # significava relativa modalità, dove un indirizzo relativo all'istruzione seguita indirizzamento.

Unix usati la stessa sintassi per modi di indirizzamento come assemblatori DEC, con * anziché @ e $ invece di #, poiché @ e # erano apparentemente scomoda per digitare 2 .

Perché tutti i registri hanno un '%'?

In PAL-11, registri sono stati definiti come R0 = 0%, R1 =% 1, ... con R6 indicato anche come SP, e R7 indicato anche come PC. DEC MACRO-11 macro-assemblatore accettati riferendosi ai registri come %x, dove x potrebbe essere un'espressione arbitraria, ad esempio %3+1 cui %4.

E 'questo solo un altro tentativo di farmi fare un sacco di battitura zoppo?

No.

Inoltre, sono io l'unico che trova:? 16 (% esp) davvero un controsenso rispetto al [esp + 16]

Questo deriva dal PDP-11 N modalità, dove un indirizzo di memoria è formata sommando il contenuto di un registro e una parola indice seguendo le istruzioni di indirizzamento.

Lo so che compila la stessa cosa, ma perché qualcuno dovrebbe voler digitare un sacco di '$' e '%' s senza bisogno di? - Perché ha GNU scegliere questa sintassi come predefinita?

E 'venuto dalla PDP-11.

Un'altra cosa, perché è ogni istruzione in AT & T sintassi preceduta da un: l? - io so la sua per le dimensioni operandi, però perché non solo lascia la figura assembler che fuori? (Mai dovrei voler fare un movl su operandi che non sono quelle dimensioni?)

Il gas di solito può capirlo. Altri assemblatori anche bisogno di aiuto in casi particolari.

Il PDP-11 userebbe b per le istruzioni di byte, per esempio: CLR vs CLRB. Altri suffissi apparso in VAX-11: l per lungo tempo, w per parola, f per galleggiare, d per il doppio, q per quad-word, ...

Last thing: why are the mov arguments inverted?

Probabilmente, dal momento che i microprocessori Intel PDP-11 è precedente, è il contrario.


  1. Secondo gas info-page, attraverso la BSD 4.2 assembler.
  2. Unix Assembler riferimento §8.1 Manuale - Dennis M. Ritchie

Il motivo inverte operandi ordine AT & T sintassi rispetto a Intel è più probabile perché il PDP-11, su cui Unix è stato originariamente sviluppato, utilizza lo stesso ordine degli operandi.

Intel e DEC semplicemente scelto ordini opposti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top