Apri illimity bonus di 25€ + 5€ di buono Amazon

Inline Assembly

|di Andrea Fallico
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:
#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;
}
 
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
assembly, asm, inline, gcc

Condividi

Required

Required

Optional

Optional

BB Code/Smilies

Error CodeCaptcha ReloadDevi utilizzare i caratteri maiuscoli.
La vocale "O" è esclusa.