E' impossibile creare una variabile C in assembler: compilatore C deve conoscere la variabile (cioè la sua tipologia e indirizzo), che significa che deve essere dichiarato nel codice C.
Ciò che è possibile fare è accedere ai simboli definiti nell'assembler tramite le dichiarazioni extern
in C. Ciò non funzionerà per le variabili con durata di archiviazione automatica, tuttavia, poiché questi non hanno un indirizzo fisso ma sono riferiti rispetto alla base puntatore.
Se non si desidera accedere alle variabili esterne al blocco asm
, è possibile utilizzare lo stack per la memorizzazione dei dati locali dell'assemblatore. Basta tenere a mente che è necessario ripristinare lo stack pointer al valore precedente al momento di lasciare il blocco asm
, ad esempio
sub esp, 12 ; space for 3 asm-local 32bit vars
mov [esp-8], 42 ; set value of local var
[...]
push 0xdeadbeaf ; use stack
[...] ; !!! 42 resides now in [esp-12] !!!
add esp, 16 ; restore esp
Se non si desidera che i relativi indirizzi delle variabili locali di cambiare ogni volta che si manipolare lo stack (ad esempio, utilizzare push
o pop
), è necessario stabilire un frame di stack (ovvero salvare la base della pila in ebp
e indirizzare i locali in relazione a questo valore) come descritto in cedrou's answer.
Sei sicuro sub esp, 3 darà spazio per 3 32bit vars? Ho avuto l'idea che per ogni 32 bit var dovrei prendere 4 da esp. –
Almeno C++ definisce internamente in questo modo: var_4 = dword ptr -4 –
hai ragione - non dovresti rispondere alle domande a tarda notte;) – Christoph