afterjames ha scritto:Oltre a dover dichiarare la funzione fuori dal main [...]
Bhè non è verissimo. Tu puoi mettere le funzioni praticamente dovunque ti pare (con l'asm tutto è possibile
), anche se la soluzione a cui sei arrivato è sicuramente più chiara, IMHO; il vero problema è che nel listato originale tu fai queste operazioni:
Codice: Seleziona tutto
[...]
"call somma_r\n\t"
"addl $8,%esp\n\t"
"movl %eax,somma\n\t"
"somma_r: pushl %ebp\n\t"
[...]
ma questo è sbagliato perchè tu fai una call dalla quale ritorni per poi proseguire, ma se prosegui linearmente vai ad eseguire ancora il codice puntato da
somma_r il quale poi esegue delle operazioni sul base pointer e quando incontra RET esce dalla funzione
main... e insomma succede un casino.
La soluzione è semplicemente nel mettere un jump incondizionato se vuoi mantenere la struttura del programma originale:
Codice: Seleziona tutto
asm("movl miaVar,%ebx\n\t"
"movl miaVar2,%ecx\n\t"
"movl $0,%eax\n\t"
"pushl %ebx\n\t"
"pushl %ecx\n\t"
"call somma_r\n\t"
"addl $8,%esp\n\t"
"movl %eax,somma\n\t"
"jmp salto_;\n\t"
"somma_r: pushl %ebp\n\t"
"movl %esp,%ebp\n\t"
"movl 12(%ebp),%eax\n\t"
"addl 8(%ebp),%eax\n\t"
"movl %ebp,%esp\n\t"
"popl %ebp\n\t"
"ret\n\t"
"salto_:");
afterjames ha scritto:bisogna salvare all'inizio del main i registri utilizzati e poi ripristinarli
neanche questo è strettamente necessario, anche se anche io preferisco metterlo
Una cosa che forse ti può interessare: per "aumentare la visibilità" del codice puoi scrivere le funzioni così
Codice: Seleziona tutto
void funzione();
asm("funzione:\n\t"
"pushl %ebp\n\t"
"movl %esp,%ebp\n\t"
[...]
"ret\n\t");
Non so se lo sapevi già: io l'ho scoperto recentemente spulciando un kernel (Linux ovviamente
). Questo ti permette anche di rilocare la funzione dove preferisci e di chiamarla come una funziona C. Inoltre aggiunge un piccolo livello di ottimizzazione in quanto elimini le istruzioni
push %ebp,
mov %ebp e il
ret finale che la funzione s() che avevi definito aggiunge necessariamente (almeno a meno di ottimizzazioni del compilatore che non ho provato).
bye