View previous topic :: View next topic |
Author |
Message |
n3m0 l33t
Joined: 08 Feb 2004 Posts: 798 Location: Richville, Naples, Italy, Europe
|
Posted: Sat Oct 30, 2004 1:59 pm Post subject: [C][ASM] - macro switch_to del kernel 2.4 |
|
|
Non sono molto pratico dell'assembler embedded in codice C.
C'è qualcuno di voi che lo è?
Avrei bisogno di una spiegazione delle righe dopo i tre pop.
Non tanto di cosa facciano all'interno del kernel, questo me o scopro da solo, ma di come si "leggono".
Spero di essere stato chiaro.
Ciao!
Code: | #define switch_to(prev,next,last) do { \
asm volatile("pushl %%esi\n\t" \
"pushl %%edi\n\t" \
"pushl %%ebp\n\t" \
"movl %%esp,%0\n\t" /* save ESP */ \
"movl %3,%%esp\n\t" /* restore ESP */ \
"movl $1f,%1\n\t" /* save EIP */ \
"pushl %4\n\t" /* restore EIP */ \
"jmp __switch_to\n" \
"1:\t" \
"popl %%ebp\n\t" \
"popl %%edi\n\t" \
"popl %%esi\n\t" \
:"=m" (prev->thread.esp),"=m" (prev->thread.eip), \
"=b" (last) \
:"m" (next->thread.esp),"m" (next->thread.eip), \
"a" (prev), "d" (next), \
"b" (prev)); \
} while (0) |
_________________ Lenergia è la civiltà. Lasciarla in mano ai piromani/petrolieri è criminale. Perché aspettare che finisca il petrolio?
Letà della pietra non è mica finita per mancanza di pietre. - B.G.
Site/Blog: http://www.neminis.org |
|
Back to top |
|
|
theRealMorpheu5 l33t
Joined: 26 Feb 2004 Posts: 841 Location: Vicenza, IT
|
Posted: Sat Oct 30, 2004 2:54 pm Post subject: |
|
|
Vediamo se ho capito, tu vuoi sapere quelle cose con i : in mezzo, giusto? Ebbene, la sintassi "spannometrica" della direttiva asm() è questa:
Code: | asm("mnemonici varii":<output>:<input>:<clobbered>); |
In sostanza:
<output> è la lista dei parametri di output dei vari opcode, serve a inserire in variabili C quello che altrimenti finirebbe su registri o indirizzi di memoria, molto in soldoni;
<input> è la lista dei parametri di input come se li passassi direttamente in linea sugli mnemonici. Anche questa è una lista di variabili in cui sono contenuti i valori che intendi passare;
<clobbered> di solito è una lista di registri - ma ho visto specificare anche "memory" talvolta - e serve ad informare il compilatore di quali registri/aree di memoria andranno toccati dal codice di modo che lui possa cautelarsi come meglio crede.
Parliamo ora delle cosine tra "" tipo "=m" e via dicendo: la differenza è tra output (con "=" prima delle lettere) e input (senza "="). Per il resto i significati sono identici. quelli che ricordo a memoria sono:
a, b, c, d, S, D dovrebbero essere: (e)a(x/h/l), (e)b(x/h/l), (e)c(x/h/l), (e)d(x/h/l), (e)si ed (e)di. in pratica i registri general purpose e i due registri indice.
m dovrebbe essere per "memory" ma non conosco l'esatto significato.
p potrebbe stare per "pointer" ma non l'ho mai visto funzionare - anche se l'ho visto in qualche codice.
r sta per "register", un registro a caso che non specifichi, lasci al compilatore decidere quale sia meglio per lui. qualche volta potrebbe decidere di usare lo stack, per motivi di efficenza.
Poi gli altri non li ricordo a memoria, su www.osdever.net mi pare ci sia un tutorial in merito. |
|
Back to top |
|
|
n3m0 l33t
Joined: 08 Feb 2004 Posts: 798 Location: Richville, Naples, Italy, Europe
|
Posted: Sun Oct 31, 2004 9:38 am Post subject: |
|
|
Grazie, mi hai fornito l'input che cercavo _________________ Lenergia è la civiltà. Lasciarla in mano ai piromani/petrolieri è criminale. Perché aspettare che finisca il petrolio?
Letà della pietra non è mica finita per mancanza di pietre. - B.G.
Site/Blog: http://www.neminis.org |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|