Untuk kembali ke caller, subroutine harus memiliki return address yang benar di dalam
$ra saat intruksi
jr dilaksanakan. Tetapi alamat ini tidak harus terus menerus menetap di dalam
$ra selama subroutine berjalan. Lebih baik menyimpan nilai ini ke suatu tempat dan sewaktu-waktu bisa dikembalikan lagi.
Di dalam gambar, operating system memanggil
main. Return address untuk kembali ke operating system ada di
$ra. Selama dia mendapatkan kontrol,
main menge-push return address ke dalam stack (step 1). Return addres yang akan digunakan
main untk kembali ke operating system kini sedang ditumpuk ke dalam stack.
Push dan pop yang berada di gambar adalah secara konsep. Code yang sebenarnya di dalam melaksanakan hal ini adalah dengan cara biasa.
Setelah menge-push return address,
main melakukan komputasi beberapa dan kemudian memanggil
subC menggunakan intruksi
jal (step2). dan akhirnya mengubah isi dari
$ra menjadi return address untuk
subC kembali ke
main, beruntungnya return address untuk
main kembali ke
operating system telah disimpan dengan aman di dalam stack.
subC kemudian mendapat kontrol untuk mengerjakan bagiannya. Karena dia tidak memanggil subroutine yang lain,
subC tidak melakukan tindakan untuh mengubah $ra, dan tidak perlu menumpuknya ke dalam stack. Saat subC ingin kembali ke main maka dia hanya perlu menggunakan intruksi jr $ra (step 3).
Setelah kontrol kembali ke
main, kemudian dia bekerja sebentar dan akhirnya dia harus mengembalikan kontrol ke OS dengan cara menge-pop return addres dari stack baru kemudian melakukan instruksi
jr $ra (step 4).
Exception handler adalah salah satu cara untuk mengembalikan kontrol ke OS, tapi untuk sekarang kita tidak menggunakan itu dlu.