Perché la sintassi dell'assembly AT & T è stata progettata in questo modo?

6

La sintassi dell'assembly AT & T, spesso chiamata sintassi GAS, continua a sorprendermi. Ad esempio, il suo ordine di parametri:

mov $100,%eax /* Destination after source */

Questo sembra davvero così contro-intuitivo! Quasi tutti i linguaggi di programmazione (e la buona vecchia notazione matematica) vanno in direzione opposta: destinazione prima sorgente, come questa:

int a = 100;   /* Destination before source (C-style) */
a := 100       // Destination before source (Pascal-style)
mov eax,100    ;  Destination before source (Intel assembly syntax)

Ci sono altri punti, ad esempio, sigilli ... Il % -s prima di ogni registro e il $ prima di ogni costante costante ( tranne per quelli usati come quarto operando in la sintassi di indirizzamento efficace dall'aspetto molto strano) potrebbe ingombrare il codice, quando sarebbe stato banale evitarli. Qual è, o era, il loro vantaggio?

    
posta Mints97 20.04.2015 - 10:33
fonte

2 risposte

4

Non so quale sia l'accordo con i sigilli, se non quello di spaventare i non iniziati e di infastidire quelli abbastanza saggi da sapere che potrebbero facilmente scomparire. Si spera che un altro rispondente abbia più informazioni su questo. (Come freak ratchet menzionato nei commenti, probabilmente è stato fatto in questo modo per semplificare il parser, che forse aveva senso in quei giorni in cui le risorse di calcolo erano magre.)

Ora, per quanto riguarda l'ordine degli operandi, ci sono degli argomenti che possono essere fatti per questo e contro di esso, anche se gli argomenti contro di esso vincono.

Si può sostenere che la sintassi GAS è leggermente più consistente rispetto, ad esempio, alla sintassi Intel, perché quando si pensa di "spostare" qualcosa, viene spostato da un posto a un altro Quando leggi il codice ad alta voce, ha senso dire "sposta questo valore in quel registro", ma non ha senso dire "sposta questo registro da quel valore".

Al contrario, altri linguaggi assembly (Zilog, ecc.) chiamano queste istruzioni "ld", che sta per "load", dove ha senso avere una destinazione prima della sorgente, perché qualcosa viene caricato con un valore. Questo ha l'ulteriore vantaggio di seguire l'ordine di matematica standard dell'operando, ma si può sostenere che questo non è necessario, perché la programmazione del linguaggio assembly è non matematica, e non c'è bisogno di fingere che sia . (Le cose simili dovrebbero apparire simili, e le cose dovrebbero apparire diverse.)

Ovviamente, l'argomento per la sintassi GAS è perso se si considera che "move" è la scelta sbagliata del verbo in primo luogo, perché l'operando di origine non perde il suo contenuto come conseguenza dell'operazione "mov": i bit in realtà non vengono spostati , sono copiati .

E poi le cose si complicano ancora di più dal fatto che il set di istruzioni Intel x86 include istruzioni come "lea" (carica indirizzo effettivo) che vanno con il verbo "load" invece del verbo "move", nel qual caso l'ordine degli operandi GAS è semplicemente sbagliato da qualsiasi modo tu lo guardi.

Bottom line: è solo una questione di convenzione, quindi chiunque costruisca la CPU deve scegliere la loro convenzione preferita, e quindi chiunque scriva un assemblatore che non è richiesto per essere compatibile con gli assemblatori preesistenti può, se così piace, venire con la loro convenzione. Il primo assemblatore GAS è stato probabilmente scritto per alcune architetture in cui la convenzione era source-operand-first, e quindi nelle successive porte dell'assembler ad altre architetture gli autori hanno deciso che dover modificare il set di istruzioni e il set di registri era sufficiente già carico, quindi probabilmente hanno pensato che sarebbe stato bello almeno attenersi allo stesso ordine di operando.

    
risposta data 20.04.2015 - 10:57
fonte
2

La semplice risposta è l'ordine in cui sono disposte le istruzioni binarie sulla maggior parte dei processori.

Quando gli uomini erano uomini e le pecore erano spaventate, i programmatori di assemblaggi passavano molto tempo a esaminare il codice binario grezzo (ea volte cercavano di dedurre quale istruzione fosse appesa alle luci di accensione e spegnimento nel pannello di controllo). È stato più semplice se il codice assembly ha seguito l'ordine instruction,target,source del codice macchina.

    
risposta data 20.04.2015 - 12:40
fonte

Leggi altre domande sui tag