Newsgroup: it.comp.programmare
Titolo: Valore di ritorno funzione assembly

In giro per la rete ho trovato questo:
/*
Programma:     c-asm-funz.s
Autore:        Ferroni.Fulvio
Data:          31/12/2008
Descrizione:   Richiamo di asm da c - funzione asm per potenza con succ. *
*/
.data
.text
.globl pot_asm             # funzione deve essere globale
pot_asm:
    pushl %ebp              # salvo %ebp precedente (event. chiamate 
nidificate)
    movl %esp, %ebp         # imposto %ebp
    movl 8(%ebp), %ebx      # leggo primo par. (base) dopo 8 byte dalla cima
                            # della pila: 4 per ebp e 4 per ind. di rientro
    movl 12(%ebp), %ecx     # leggo altro parametro (espon)
    xorl %edx, %edx         # azzero %edx coinvoloto nella mul
    movl $1, %eax           # imposto accumulatore
ciclo:
    mull %ebx               # %eax = %eax*%ebx
    loop ciclo              # il ciclo va fatto %ecx (espon) volte
                            # al termine il ris si trova in %eax o in
                            # edx:%eax come atteso dal chiamante
    popl %ebp               # ripristino %ebp precedente
    ret
Richiamato da questo programma c:
/*
Programma:     c-asm.c
Autore:        Ferroni.Fulvio
Data:          31/12/2008
Descrizione:   Richiamo di asm da c - main in c
*/
extern int pot_asm(int b, int e);
#include <stdio.h>
int main()
{
    int base, esp, potenza;
    printf("Inserire base: ");
    scanf("%d",&base);
    printf("Inserire esponente: ");
    scanf("%d",&esp);
    potenza=pot_asm(base,esp);
    printf ("Valore della potenza = %d\n",potenza);
    return 0;
}
E' una convenzione il fatto che il c sappia che il valore di ritorno da 
assegnare a potenza sia in eax?
Grazie.
-- 
Bonus di 25 euro su 
betfair.it
, codice da inserire: AAAACGWFG
Vai sul mio sito(in fondo alla pagina) per altri dettagli:
http://digilander.libero.it/maxxam99/


Sě, in C il valore ritornato da una funzione sta sempre in EAX. Una 
funzione C puň usare l'istruzione RETURN per passare una sola variabile 
(numero o puntatore a qualcosa) per cui EAX, o EDX:EAX, bastano.

 (numero o puntatore a qualcosa) per cui EAX, o EDX:EAX, bastano.
Ok, perfetto.
Cosi come la gestione dello stack nella chiamata della funzione (come si 
vede dal codice che ho postato) corrisponde alle stesse cose che si 
farebbero in puro assembly(salva l'indirizzo di ritorno, salta a 
subroutine, ecc..)
p.s.
Non č che conosci qualche pdf da stampare(ma anche se non č un pdf ma un 
sito) ben fatto che descriva sinteticamente le istruzioni 
dell'architettura 80x86 e che spieghi il funzionamento di ogni funzione?
Mi sarebbe comodo tenerlo sempre a portata di mano.


 Mi sarebbe comodo tenerlo sempre a portata di mano.
Per farti un esempio, avevo trovato questo:
http://www.giobe2000.it/Tutorial/Schede/07-IstruzioniCpu/703.asp
Ma non mi piace perché non è stampabile, ed è poco sintetico e immediato 
(inoltre sarebbe meglio avesse la sintassi gas, ma non è essenziale, 
capito il meccanismo, è facile passare da una sintassi all'altra)


 Sì, in C il valore ritornato da una funzione sta sempre in EAX. 
Non dipende dalla calling conventions?
Il linguaggio C non ha la nozione di EAX.

 Il linguaggio C non ha la nozione di EAX.
Invece sì :-)
Il C definisce, oltre al linguaggio, anche uno standard binario: per cui 
contempla anche questo tipo di dettagli. Non ho mai letto lo standard, 
per cui non posso esserne sicuro, ma immagino che invece di EAX si 
riferisca a un più generico registro "accumulatore", che nelle prime CPU 
era pure l'unico registro di uso veramente generico e non specializzato 
per qualcosa.
Negli x86, AX è usato da molte istruzioni che fanno implicito 
riferimento a esso, per cui si può dire che sia lui il registro 
accumulatore. Negli altri processori, soprattutto nei RISC, non ci 
dovrebbe essere particolare differenza fra i molti registri dati 
disponibili... chissà nel 68000 che registro usa il C per ritornare i 
valori delle funzioni? Forse D1, ma è un tiro alla cieca.

 valori delle funzioni? Forse D1, ma è un tiro alla cieca.
perche' non D0 allora o D7, anzi mi sembra di aver visto almeno un 
compilatore C amiga che usava proprio D7 ( DICE ) ed un altro D0 ( SAS 
e/o Lattice )

 contempla anche questo tipo di dettagli. 
Secondo me è una questione troppo legata all'accoppiata sistema 
operativo/architettura, comunque anche io sono curioso di sapere se 
effettivamente c'è un riferimento nello standard.

 valori delle funzioni? Forse D1, ma è un tiro alla cieca.
Su Amiga, era D0 il registro adibito a contenere il valore di ritorno
delle funzioni del kernel, e per estensione pure quello utilizzato da
tutti i programmi e pure dal compilatore C.

 Il linguaggio C non ha la nozione di EAX.
Non solo. Quella è una questione di convenzioni come dici te.
Credo che tutte le principali piattaforme x86 seguano la convenzione, ma
di per se, scrivendosi il proprio mini-os si potrebbe fare diversamente.
-- 
-riko