2012-03-11 21 views
5

Posso leggere o scrivere su una variabile definita nel mio file assembly nel mio file C? Non riuscivo a capirlo da solo. Ad esempio il file C si presenta come segue:È possibile accedere a variabili definite in assembly da C?

int num = 33;

e produce questo codice assembly:

.file "test.c" 
.globl _num 
.data 
.align 4 

_num: .long 33

Come ho iniziato a imparare il montaggio ho sentito spesso la velocità è il motivo per cui devo ritirare il montaggio del ADN di file inferiore dimensioni e tutta quella roba ...

sto usando minGW (32 bit) assemblaggio GNU su Windows7

+5

non essere così difensivo :) – UmNyobe

+6

* Come ho iniziato a imparare il montaggio ho sentito spesso la velocità è il motivo per cui devo scegliere il montaggio e ridurre le dimensioni del file e tutte quelle cose ... * Qualcuno che è in grado di mano ottimizzando assemblatore meglio del compilatore sa esattamente quando è appropriato e quando non lo è. Non sembri esserci ancora. Il tuo compilatore produce probabilmente un assemblaggio migliore di quello che fai (ma ciò non significa smettere di imparare!). –

+0

esattamente per questo motivo I'am a fare domande, anche se potrebbero sembrare sciocco in un primo sguardo – orustam

risposta

5

Sì, Linker combina tutti i file .s e crea un singolo file oggetto. Quindi tutti i tuoi file c diventeranno prima file di assemblaggio. Ogni file di assembly avrà un elenco di importazione e un elenco di esportazione. La lista di esportazione contiene tutte le variabili che hanno una direttiva .global. L'elenco di importazione contiene tutte le variabili che iniziano con un extern nel file c. Così, se il file assembly contiene questo:

.file "test.c" 
.globl _num 
.data 
.align 4 

Tutto quello che dovete fare per poter utilizzare num, è quello di creare una variabile extern come questo

extern int num 

e poi sarete in grado di leggere o modificarlo.

4

Sì, è possibile condividere le variabili entrambi i modi. usa il .globl come hai e poi in C dichiara una variabile esterna come se fosse in un altro modulo C, ma invece è in un modulo asm.

+0

ho provato ma aveva alcuni problemi di linker, qui è la parte di montaggio: \t 'num Globale \t num: \t \t. int 13' e il mio file C: '#include extern int num; int main() { \t printf ("% d \ n", num); } 'Ho un problema con il linker:' math.c :(. Text + 0xf): riferimento indefinito a 'num'' cosa sto facendo male? – orustam

+0

stai compilando entrambi i file insieme o solo il tuo file c? – theRealWorld

+0

Li sto compilando come segue: gcc -m32 -o test test.c myasm.s – orustam

Problemi correlati