Newsgroup: it.comp.programmare
Titolo: Il secondo esercizio è sbagliato?

Presi direttamente dal sito del mio professore(corso di calcolatori):
Il Primo:
* Passaggio dei parametri per riferimento:
*
* Procedura che effettua lo swap di due aree di memoria
            org $3000
swap       move.w  (a0),-(SP)
            move.w  (a1),(a0)
            move.w  (sp)+,(a1)
            rts
            org $3100
main       lea.l varp,a0
            lea.l varq,a1
            jsr swap
*
varp       dc.w 5
varq       dc.w 7
            end main
Il secondo:
* Passaggio dei parametri per valore:
*
* Procedura che effettua lo swap di due aree di memoria
            org $3000
swap       move.w  d0,-(SP)
            move.w  d1,d0
            move.w  (sp)+,d1
            rts
            org $3100
main       lea.l varp,a0
            lea.l varq,a1
            jsr swap
*
varp       dc.w 5
varq       dc.w 7
            end main
A me pare che il secondo non scambi per nulla i due valori(che non 
vengono copiati da nessuna parte)
Sbaglio o nel main, per funzionare il passaggio per valore, ci sarebbe 
dovuto essere(prima della jsr) un qualcosa tipo:
move.w (a0),d0
move.w (a1),d1
Sbaglio a pensarla cosi' o ha sbagliato(dimenticato qualche riga) il 
docente?
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/

 Grazie.
Ovviamente provandolo il mio funziona, quello del Prof. no, per� prima 
di dare torno a qualcuno molto pi� esperto di me ci penso 100 volte :-)


 di dare torno a qualcuno molto pi esperto di me ci penso 100 volte :-)
Secondo me hai ragione tu.
Non capisco che cosa venga scambiato.
La seconda subroutine scambia d0 con d1, ma vengono inizializzati i
registri a0 e a1.
La prima invece scambia correttamete i contenuti degli indirizzi che
vengono passati come argomenti.
Io poi non userei lo stack come buffer temporaneo ma un registro, tipo
d0, il quale poi automaticamente ritorna col valore del secondo (o del
primo) dato.

 
no, l'uso dello stack come temporaneo e' corretto, se all'interno della 
funzione si fosse voluto usare un registro per fare lo scambio, questo 
andava comunque salvato all'inizio della funzione ( un push ) e 
ripristinato all'uscita ( un pop ) vanificando il vantaggio di usarlo 
nello scambio, e' buona norma ( ottima direi ) che le subroutine non 
alterino lo stato dei registri ( i puristi salvano ANCHE il registro di 
stato ) non direttamente coinvolti nel passaggio dei parametri.

 Roberto Montaruli wrote:
Thanks both of you ;-)



Naturalmente, ma il d0 convenzionalmente e' usato per ospitare il
valore di ritorno della subroutine.
Solo per quello ho ipotizzato di usarlo al posto dello stack.
E comunque non puo' essere la subroutine a salvare lo stato dei
registri, ma il chiamante.
Il chiamante, se ha delle informazioni in alcuni registri che la
subroutine altera, pusha in stack, chiama, e quando torna recupera
dallo stack.
O meglio, io facevo cosi' quando operavo in assembly.

 O meglio, io facevo cosi' quando operavo in assembly.
ecco! pero' questa mi sembra una estrapolazione un po' azzardata, mi sta 
anche bene, nella programmazione assembler, considerare un paio di 
registri come scratch e quindi da ritenere sempre non validi ma 
l'estensione di questo principio a tutti i registri e' quanto meno azzardata

 l'estensione di questo principio a tutti i registri e' quanto meno azzardata
Certo. Non e' affatto generalizzabile.
Normalmente si definisce una convenzione e la si applica.
Una convenzione nota del 68000 e' quella che D0 contiene sempre il
codice di ritorno di una sub.
Tutto il kernel di Amiga rispettava quella convenzione e siccome io ho
usato il 68000 in quell'ambiente, mi e' rimasta.