PDA

Visualizza la versione completa : [ASSEMBLY] Procedure annidate e utilizzo dei registri


christian4488
22-09-2011, 11:01
Ciao,
Voglio scrivere questo programma da pseudo C a linguaggio assembly che prende in input il parametro n intero e restituisce un intero.



•function calcola (n : integer) : integer;
•var m,x : integer;
•begin
•x := resto di n diviso 3 # usare la divisione del MIPS
•if (x<2)
•thenrisultato := 2
•else m := call(x)# calle’ una funzione data
•risultato := calcola (m) + calcola (x)
•end;


Potete spiegarmi secondo le regole del metodo chiamante e del metodo chiamato dove e quando si devono salvare determinati registri nello stack e quando si devo ripristinare?
La regola sarebbe:
Quando il Main chiama Procedura:
1.Dentro Proc creo spazio, nello stack, per tutte le variabili usate
2.memorizzo tali variabili nello stack
QuandoProc rida’ il controllo al Main:
3.rimetto nei registri utilizzati da Proc i valori iniziali
4.puliscolo stack

Inoltre in questo codice che ho trovato online non ho capito esattamente perchè vengono ripristinati i registri due volte.



addi$sp, $sp, -8 # alloco spazio nello stack
sw$ra, 4($sp)
sw$a0, 0($sp)
slti$t0, $a0, 1 # se a0<1, $t0 diventa1
beq$t0, $zero, Else # Controllon < 1
addi$v0, $zero, 1
lw$a0, 0($sp)
lw$ra, 4($sp)
addi$sp, $sp, 8 # aggiorno stack
jr$ra
Else: sub $a0, $a0,1 # calcolo n-1
jal Fatt # chiamo il fattoriale
lw$a0, 0($sp) # ripristino $a0
lw$ra, 4($sp) # ripristino $ra
addi$sp, $sp, 8 # aggiorno stack
mul$v0, $a0, $v0 # setto il risultaton * fatt (n-1)
jr $ra


Cioè riuscite a spiegarmi in modo semplice come procedere con procedure ricorsive e annnidate?


Grazie

linoma
22-09-2011, 12:13
Intanto il load dei registri viene fatto 2 volte xche una volta è l'if e la seconda è l'else.

Se lo avessi scritto una sola volta la cpu avrebbe dovuto saltare alla parte di codice in comune e nonstante le cpus siano ottimizzate per i salti sicurmante avrebbe fatto si che la pipeline fosse in qualche modo rinializzata, poi potrebbero esserci motivi di allineamento di codice e roba simile, cs che poi l'architettura della cpu predilige o no. MIPS?

christian4488
28-09-2011, 12:02
Perfetto ti ringrazio comunque si MIPS32.

Inoltre puoi anche dirmi che errore c'è in questo programma? E cosa fa esattamente? non riesco a capirlo.

http://img268.imageshack.us/img268/4350/sadacg.jpg (http://imageshack.us/photo/my-images/268/sadacg.jpg/)

oregon
28-09-2011, 12:11
Dovresti dirlo tu cosa fa ... e che errore mostra o quale comportamento anomalo ha ...

linoma
28-09-2011, 12:13
X questo ho il mio IBAN :) ma pare faccia moltiplicazioni usando le somme, ad occhio.

christian4488
28-09-2011, 13:46
Originariamente inviato da oregon
Dovresti dirlo tu cosa fa ... e che errore mostra o quale comportamento anomalo ha ...

Lo so ma proprio non capisco. Cioè mi sembra che i registri t7 e t8 vengano prima caricati dalla memoria e poi scritti in memoria il che non credo sia giusto.
Inoltre non capisco una cosa: le due istruzioni di load (lw) che ci sono non si dovrebbero usare per gli array? Oppure in questo caso sono usate per indicare che i registri t6 e t4 sono già in memoria?

christian4488
28-09-2011, 13:49
Originariamente inviato da linoma
X questo ho il mio IBAN :) ma pare faccia moltiplicazioni usando le somme, ad occhio.

Come in tuo IBAN? Comunque secondo voi per capire cosa fa mi conviene fare un esempio con parametri costanti tipo 2 e 3? Cioè in questo caso pare che i parametri siano due. Se provo a scorrere il prog mettendo ai parametri 2 e 3 dovrei riuscire a capire che succede?

oregon
28-09-2011, 13:52
Originariamente inviato da christian4488
Come in tuo IBAN?

Traduzione di IBAN ... se lo paghi, ti risolve il problema ... :D


Comunque secondo voi per capire cosa fa mi conviene fare un esempio con parametri costanti tipo 2 e 3? Cioè in questo caso pare che i parametri siano due. Se provo a scorrere il prog mettendo ai parametri 2 e 3 dovrei riuscire a capire che succede?

Prova ... ma avresti potuto provare prima di proporre il quesito sul forum ...

christian4488
28-09-2011, 13:56
Infatti ho provato, ma siccome non ho capito comunque cosa fa il prog allora ho chiesto se il metodo unico per capire un programma così era fare una prova con parametri a caso.

Dunque non puoi dirmi cosa fa e che errori ci sono nel caso ce ne siano?

alka
28-09-2011, 14:51
Originariamente inviato da christian4488
Dunque non puoi dirmi cosa fa e che errori ci sono nel caso ce ne siano?

Non è un problema di potere: il problema è che il forum non è un luogo in cui buttare codice e chiedere ad altri la spiegazione di quello che fa, cioè non è un servizio di interpretariato, ma tutt'al più uno strumento per ottenere aiuto nell'attività di programmazione, cioè nella stesura del proprio codice sorgente.

Inoltre, per comprendere un programma basta studiare i principi fondamentali del linguaggio, della piattaforma e dell'architettura di riferimento, e il forum non sostituisce la necessità di documentarsi, né è uno strumento per farlo (per questo ci sono libri, guide, tutorial, ecc.).

Loading