C Assembly

Da Andreabont's Wiki.

In C è possibile iniettare manualmente del codice Assembly. Questa funzionalità dipende molto dal compilatore, la sintassi che è qui presentata funziona correttamente sui compilatori gcc e llvm. L'istruzione "asm" non fa parte dello standard C, se si deve garantire l'osservanza dello standard usare la variante "__asm__". Per approfondimenti consultare la documentazione gcc.

Codice

double sin, cos;
double x = 0.5;

asm volatile (
   "fldl %[x];"
   "fsincos;"
   "fstpl %[cos];"
   "fstpl %[sin];"
   : [sin] "=m" (sin), [cos] "=m" (cos) /* OUT */
   : [x] "m" (x) /* IN */
   : /* CLOBBERS */
);

Sintassi

Ogni istruzione assembly va inserita singolarmente come stringa, e deve terminare con un carattere separatore come il ";". E' possibile utilizzare dei marcatori personalizzati che indicano le variabili di entrata e di uscita, fondamentali per "connettere" il codice assembly iniettato con quello automaticamente generato a partire dal codice C. I marcatori vanno aggiunti in coda, preceduti dal carattere ":" e separati da virgola. Per primi vanno i marcatori delle variabili di uscita, nel nostro esempio i double sin e cos, dopo vanno inseriti i marcatori delle variabili di ingresso, nel nostro caso il double x. La stringa associata ad ogni marcatore ne definisce il comportamento. Per ultima troviamo al "Clobbers list", ovvero la dichiarazione dei registri che useremo in modo privato, e che il compilatore non deve toccare, per evitare malfunzionamenti.