PDA

Visualizza la versione completa : [asm] Passaggio di parametri


pistilloi
14-12-2012, 18:22
Ho scritto questo programma giocatolo, per approfondire il passaggio di parametri a una subroutine, tramite lo stack nel mio calcolatore.


void function(int a, int b){}

void main()
{
function(1,2);
}


(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004004c0 <+0>: push %rbp
0x00000000004004c1 <+1>: mov %rsp,%rbp
0x00000000004004c4 <+4>: mov $0x2,%esi
0x00000000004004c9 <+9>: mov $0x1,%edi
0x00000000004004ce <+14>: callq 0x4004b4 <function>
0x00000000004004d3 <+19>: pop %rbp
0x00000000004004d4 <+20>: retq
End of assembler dump.


I parametri della funzione, vengono semplicemente caricati in dei registri (esi,edi). Qualcuno sa spiegarmi quale subdolo meccanismo, fa si che i dati siano effettivamente messi nello stack senza il push???

oregon
14-12-2012, 18:46
In questo caso il compilatore non ha ritenuto di passare gli argomenti nello stack ma tramite i due registri.

pistilloi
14-12-2012, 19:02
Non lo facevo cosi erudito! Grazie.

pistilloi
14-12-2012, 19:10
Un momento, ma se un'altro processo in esecuzione, scrive qualcosa in quei registri prima che siano caricati nel frame della subroutine; allora i dati vengono persi? Oppure il compilatore, quando traduce codice in questo modo, è certo che venga eseguito tutto nel periodo che intercorre tra un processo e l'altro?

oregon
14-12-2012, 19:16
Un altro processo?

Tu hai idea di come lavorino i vari processi in un sistema e come utilizzino la CPU ?

pistilloi
14-12-2012, 19:20
Si, condividono la macchina, quindi la usano un po l'uno e un po l'altro. Ma il multiplexing è cosi rapido che a noi pare vengano eseguiti simultaneamente. O sbaglio?

oregon
14-12-2012, 20:17
E che c'è una componente che si occupa di fare il context switch (http://en.wikipedia.org/wiki/Context_switch) ?

MItaly
14-12-2012, 20:22
Originariamente inviato da pistilloi
Non lo facevo cosi erudito! Grazie.
Nota comunque che il compilatore può fare più o meno quello che gli pare nelle chiamate a funzione finché si tratta di funzioni definite nello stesso modulo, se si parla di funzioni definite in altri moduli oggetto (o in librerie) invece deve rispettare una qualche calling convention (che indica quali e quanti parametri vanno nei registri, quanti sullo stack, chi si occupa di ripulire lo stack, che registri vengono preservati, ...).

pistilloi
14-12-2012, 20:33
Very well, ora tutto torna!

MItaly
14-12-2012, 21:03
:ciauz:

Loading