Allora, c'e' la strada difficile e quella complicata.
La strada difficile e' quella di studiare direttamente l'assembler.
Personalmente te lo sconsiglio: fondamentalmente non ne vale la pena.
Mooooolto difficilmente ti capitera' di scrivere direttamente in assembler.
Poi c'e' la strada compliata, ma decisamente piu' interessante.
Partendo dall'idea generale che non ti capitera' mai scrivere un'intera applicazione direttamente in assembler, ma al piu' qualche funzioncina, l'idea spicciola e' quella di utilizzare un linguaggio ad alto livello che permetta l'inserimento
inline di codice assembler.
E la soluzione e' .... rullo di tamburi .... C/C++ ... applausi, prego
Esattamente come hai visto .
Quasi tutti i compilatori C/C++ permettono di inserire codice assembler direttamente inline.
Quasi vuol dire che Visual Studio lo permette solo per applicazioni a 32 bit, ma non a 64 bit. Chissa' perche', visto che piu' o meno per l'assembler ci deve passare!
Il compilatore GNU, invece, non ha di queste limitazioni.
A suo tempo, il compilatore Borland C++ permetteva di scrivere l'assembler direttamente come se fosse un pezzo di programma, con tanto di controllo sintattico. Bei tempi.
Invece i compilatori attuali vedono la parte in assembler come qualcosa da inserire nel
loro assembler, cioe' quello generato dalla compilazione del sorgente C, e quindi poi convertito in codice macchina. Si perde, cosi' il controllo sintattico, che verra' eseguito solo in fase di compilazione.
Ma puoi fare anche di meglio: invece del codice assembler, puoi utilizzare le
intrinsic functions che tutti i compilatori mettono a disposizione.
Le
intrinsic functions sono istruzioni assembler trasformate in classiche funzioni C. La parte intelligente e' che tu, da codice, le usi come se fossero delle normali funzioni, invece il compilator sa che sono funzioni assembler, che usano i registri, e quindi e' in grado di generare del codice che sfrutta i registri della CPU (che tu non vedi) in modo intelligente.
Se spulci il post
Compilatore GNU e istruzioni Intel SIMD (sezione C++) trovi un esempio di libreria C++ in cui c'e' sia del codice C++ standard, sia l'uso di
intrinsic functions sia di codice assembler inline!
Il codice scritto con le
intrinsic functions e' performante quasi quanto quello in assembler. Si perde solo qualche %. Ma e' decisamente meno complicato da scrivere.
Inoltre, ti risolvi anche una serie di rognette rognose: problemi di call convention (come si passano i parametri e come si ottiene il risultato), di come indirizzare le locazioni di memoria, (se sullo stack, nello heap, costanti, ecc.). Tutte cose che servono alla scrittura del codice, ma che possono essere delegate tranquillamente al compilatore.
Come conseguenza di cio' puoi ridurre lo studio dell'assembler alle sole parti che effettivamente risultano interessanti.
Oltre a questo, c'e', ovviamente, la documentazione Intel:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf