Inline Assembly
|
E' possibile scrivere codice assembly all'interno di listati scritti in un linguaggio di livello superiore (es. C) usando gcc. La keyword __asm identifica blocchi di codice scritti in Assembly all'interno del listato in C. Il codice va scritto fra parentesi tonde e come stringa. Per far comunicare una routine inline Assembly, con il codice circostante, si utilizza il cosiddetto extended Assembly, la sintassi è: __asm( "codice asm" : operatori_di_output : operatori_di_input : registri_clobbered ); Ecco un esempio (la sintassi utilizzata è AT&T):Codice:All'interno del main c'è del semplice codice asm: "mov _a, %eax \n\t" l'istruzione indica che il valore della variabile globale a(2) viene copiato nel registro EAX. "add _b, %eax \n\t" l'istruzione indica che il valore della variabile globale b(3) viene sommato al valore che contiene il registro EAX. "add $2, %eax \n\t" l'istruzione indica che la costante di valore 2 viene sommato al valore che contiene il registro EAX. "mov %eax, _x" l'istruzione indica che la variabile globale x assume il valore del registro EAX. Le costanti vogliono il prefisso $ per distinguerli dagli operandi. Invece nella funzione somma viene utilizzato l'extended Assembly e i registri vogliono il prefisso %% invece del %, per distinguerli dagli operandi. :"=r"(x) sta ad indicare il parametro di output x. :"r"(c), "r"(d) sta ad indicare i parametri di input c e d. :"%eax" sta ad indicare il registro clobbered EAX. Un registro indicato come clobbered è un registro che è usato all'interno del codice per memorizzare i dati, e quindi diciamo al compilatore di non utilizzarlo come registro di appoggio per memorizzare dati temporanei, e quindi modificarlo, finché è in esecuzione il codice Assembly. Con %0 viene identificato il parametro di output x, e con %1 e %2 quelli di input e rispettivamente c e d. Dati m parametri di output e n parametri di input, i parametri di output verranno identificati da %0,%1,...,%(m-1), mentre i parametri di input verranno identificati da %m,%(m+1),...,%(m+n-1). L'output sarà : x = a + b + 2 = 2 + 3 + 2 = 7 y = c + d + 3 = 1 + 7 + 3 = 11#include<iostream> using namespace std; void somma(void); int a, b, x; int main(){ a = 2; b = 3; cout << "x = a + b + 2 = " << a << " + " << b; __asm( "mov _a, %eax \n\t" "add _b, %eax \n\t" "add $2, %eax \n\t" "mov %eax, _x" ); cout << " + 2 = " << x << endl; somma(); cout << endl << "Press a button to continue..."; fflush(stdin); cin.ignore(); return EXIT_SUCCESS; } void somma(){ int c = 1, d = 7, y; cout << "y = c + d + 3 = " << c << " + " << d; __asm( "mov %1, %%eax \n\t" "add %2, %%eax \n\t" "add $3, %%eax \n\t" "mov %%eax, %0" :"=r"(y) :"r"(c), "r"(d) :"%eax" ); cout << " + 3 = " << y << endl; }