|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[SPIM] Simulatore MIPS
Ciao a tutti!!!
Mi serve un aiuto sul codice assembler dello SPIM per un esame universitario. C'è qualcuno disposto a spiegarmi come si fa a passare più di quattro argomenti ad una funzione tramite lo stack pointer e a ritornare ad esempio altrettanti argomenti? Grazie. |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
devi fare il push degli argomenti nello stack e il pop in ordine inverso.
siccome nei fantastici RISC (-__-') non esistono istruzioni di PUSH e POP, il push di un argomento consiste nel sottrarre il valore 4 allo stack pointer (se lo stack è allineato ai 4 byte) e mettere in memoria l'argomento di turno all'indirizzo puntato sempre dallo stack pointer; al contrario il pop consiste nel prelevare il valore puntato da $SP in un registro e addizionare 4 a $SP. in genere gli argomenti vengono spinti da destra a sinistra, cioè dall'ultimo al primo, in modo tale che quando vai a prelevarli te li ritrovi in ordine (quelli di sinistra nelle locazioni più basse). tieni anche presente che potrebbe essere necessario mettere nello stack anche il return address, e se questo avviene in genere lo si mette *dopo* gli argomenti, cioè nelle locazioni immediatamente inferiori, quindi una volta entrato nella funzione non puoi fare direttamente il pop degli argomenti: devi prelevarli manualmente quando ti servono e fare il cleanup dello stack tutto alla fine. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Grazie ma gli argomenti che passo (mettiamo il caso siano più di 4) in quali registri devo metterli dato che per gli argomenti ho solo $a0,$a1,$a2,$a3? E per ritornare più di due valori dato che ho solo $v1 e $v2 come posso fare?
![]() |
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
come ti ho detto sopra, no? se non hai abbastanza registri li metti nello stack; l'operazione di aggiungere un valore allo stack si chiama PUSH (gli Intel hanno un'istruzione apposita, mentre nei PPC devi maneggiare $SP a mano con ADD e SUB, ricordando che lo stack cresce verso il basso), mentre la rimozione si chiama POP.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:15.