Oppure

Loading
19/01/17 10:53
In realtà, anche per la funzione void succede la stessa cosa a parte il fatto che il valore non viene impostato nel registro.

E comunque è il chiamante che controlla il valore del registro per determinare il valore restituito. Può anche ignorarlo come avviene quando si chiama una funzione senza tenere conto del valore restituito.
19/01/17 11:01
Godrek
Ok tutto chiaro.
Scusatemi ma per ora sto studiando semplicemente il linguaggio C e non il linguaggio macchina, quindi non ho grandi conoscenze del basso livello.
aaa
19/01/17 11:07
Comunque è un fatto intuitivo ...

Puoi pensare che ritorni al chiamante restituendo un valore.
19/01/17 11:10
GN
Comunque @Nessuno secondo me la domanda un senso ce l'ha, anche se non vedo che rilevanza possa avere nella programmazione ad alto livello in C.
Se per "ritornare un valore" intendiamo "scriverlo nel registro corretto" e per "terminare la funzione" si intende "liberare lo spazio occupato sullo stack delle chiamate", allora, volendo, su una RISC in cui lo stack è gestito manualmente (conosco solo la MIPS, per questo continuo a tirare fuori quella), nello scrivere codice assembly, se all'inizio della funzione ho allocato spazio sullo stack per delle variabili locali, alla fine della funzione stessa posso anche prima far decrescere lo stack (facendo una add sullo stack pointer) e poi spostare il valore di ritorno, che magari ho in un altro registro, nel registro in cui il chiamante se lo aspetta secondo le convenzioni.

Per questo dicevo che dipende dall'architettura e da come il compilatore genera l'assembly.

Tutto dipende dal significato che diamo alle parole, se per "terminare la funzione" si intendeva "fare il jump al chiamante" (che in effetti è il significato più ovvio) allora sono d'accordo che a rigor di logica deve per forza essere quella l'ultima istruzione del chiamato.
Ultima modifica effettuata da GN 19/01/17 15:40
aaa
19/01/17 11:31
Postato originariamente da GN:

Comunque @Nessuno secondo me la domanda un senso c'e l'ha


No, mi dispiace ma la domanda un senso non "ce l'ha".

Per questo dicevo che dipende dall'architettura e da come il compilatore genera l'assembly.


Ma che c'entra? Questo avviene in ogni architettura. Ma non ha a che fare con la domanda.

NON c'è un prima e un dopo.

Puoi inserire il valore in eax (o qualunque registro deputato alla restituzione del valore), in seguito fare mille operazioni (senza modificare il valore di eax) e alla fine la ret. Oppure inserire il valore in eax e poi subito la ret. Ma il discorso non cambia.
Non è che scrivendo il valore in eax "hai restituito nulla", semplicemente "prepari il valore da restituire" che è diverso.
Quando esegui la ret e termini la funzione, il chiamante può esaminare il valore di eax per usare il valore restituito.
Parlare di "prima" o "dopo" non ha senso.

l'ultima istruzione del chiamato.


L'ultima istruzione della funzione è la ret (comunque si chiami per la CPU) che riporta l'esecuzione al chiamante.
19/01/17 12:19
Godrek
Quello che intendevo io per "ritornare il valore" era scrivere il valore nel registro corretto mentre per "terminare la funzione" intendevo "liberare lo spazio relativo alla funzione sullo stack e fare il jump alla funzione chiamante nella riga di codice immediatamente successiva alla chiamata.
Interpretata così quindi, l'ordine è il seguente?
1. ritornare il valore
2. terminare la funzione
aaa
19/01/17 12:35
Postato originariamente da Godrek:

Quello che intendevo io per "ritornare il valore" era scrivere il valore nel registro corretto mentre per "terminare la funzione" intendevo "liberare lo spazio relativo alla funzione sullo stack e fare il jump alla funzione chiamante nella riga di codice immediatamente successiva alla chiamata.
Interpretata così quindi, l'ordine è il seguente?
1. ritornare il valore
2. terminare la funzione


L'errore sta nell'intendere "ritornare il valore" come "scrivere il valore nel registro". Non è così, anche se capisco l'equivoco.

Quindi non dire prima ritorna e poi termina perché è un "non sense".
Ultima modifica effettuata da 19/01/17 12:36
19/01/17 18:47
Template
Postato originariamente da nessuno:

L'errore sta nell'intendere "ritornare il valore" come "scrivere il valore nel registro". Non è così, anche se capisco l'equivoco.



Purtroppo questa assurdità è avallata dalle traduzioni in italiano di moltissimi testi di programmazione (quelli della famigerata banda Deitel anzitutto)... una delle tante cose abominevoli delle edizioni italiane di testi che sarebbe meglio studiare in lingua inglese.
aaa