« Forum anonimo (sperimentale)

Dubbio sulla jal e $ra

3 replies
Last
Buon giorno professor Sorrenti, vorrei chiedere se possibile un chiarimento riguardo alle jal, dato che memorizzano l'indirizzo di ritorno all'interno del registro 31 ($ra), allora non è possibile utilizzare due jal all'interno dello stesso programma o nel caso ce ne siano due il primo indirizzo di ritorno viene spostato?
3 replies
  1. Re: Dubbio sulla jal e $ra

    Essendo il programma eseguito in modo sincrono (non ci saranno mai due istruzioni eseguite contemporaneamente) il problema non si pone, quando viene eseguito il primo jal,  $ra avrá un valore, quando viene eseguito il secondo questo valore verrá rimpiazzato da un altro valore.

  2. Re: Dubbio sulla jal e $ra

    Ti rispondo al volo, in attesa di una risposta corretta / completa da parte di un prof / tutor.

    Il registro a disposizione per salvare l'indirizzo di ritorno (ra) è uno solo ed è il 31 (convenzione), se chiami due jal una dopo l'altra nella stessa "procedura" non succede nulla perchè prima viene eseguita una jal, ritorna al chiamante ed esegue l'istruzione dopo (in questo caso una seconda jal) e nota che quindi sono tutte procedure foglia, però se chiami una jal ad una funzione non foglia che quindi a sua volta chiama nuovamente una jal il registro con l'indirizzo di ritorno viene sovrascritto e perdi l'indirizzo di ritorno precedente che in questo caso è essenziale per procedere con l'esecuzione del codice, quello che devi fare è salvare nello stack il vecchio indirizzo di ritorno in modo che non venga sovrascritto (vedi push / pop dello stack) e prosegui tranquillamente con l'esecuzione del codice sapendo che puoi recuperare il vecchio indirizzo di ritorno dallo stack.

  3. Re: Dubbio sulla jal e $ra
    Confermo quanto detto dal suo collega: nel caso di più jal nello stesso "main" il problema non si pone, mentre nel caso di procedure annidate il valore di $ra viene salvato nello stack.