1
我正在使用MARS模擬器在MIPS組件中編寫程序。我使用jal
進行函數調用,然後在末尾使用jr $ra
返回程序中的原始點。如何使用臨時寄存器 - 返回後保存值?
我感到困惑的是$t
寄存器,我已經在我的函數中使用仍然有返回到主程序後的值。
我應該在返回之前清零這些寄存器,以便使用臨時寄存器的未來函數可以以乾淨的版本開始?我在這裏錯過了什麼嗎?
我正在使用MARS模擬器在MIPS組件中編寫程序。我使用jal
進行函數調用,然後在末尾使用jr $ra
返回程序中的原始點。如何使用臨時寄存器 - 返回後保存值?
我感到困惑的是$t
寄存器,我已經在我的函數中使用仍然有返回到主程序後的值。
我應該在返回之前清零這些寄存器,以便使用臨時寄存器的未來函數可以以乾淨的版本開始?我在這裏錯過了什麼嗎?
我很困惑的是,在我的函數中使用的$ t寄存器在返回主程序後仍然有值。
是的,就像所有其他寄存器具有相同的值(沒有什麼特別的事情只是因爲你從你的函數返回)。
我應該在返回之前將這些寄存器調零,以便使用臨時寄存器的未來函數可以以乾淨的版本開始?我在這裏錯過了什麼嗎?
無需將它們歸零,它們在那裏供您使用!你可以隨意在臨時寄存器中做任何你喜歡的事情,只要記住,如果你調用另一個函數(或你自己的!)他們會做同樣的事情,所以你不能依賴函數中的值調用。將此與$s
寄存器進行對比,如果您修改了這些寄存器,則需要保存和恢復,但您可以(通常)依賴於其他功能爲您執行相同的操作。這是calling convention的一部分。
「我應該在返回之前將這些寄存器清零,以便使用臨時寄存器的未來函數可以從乾淨的平臺開始?」不需要。你也應該注意到,當你的函數被調用時,臨時寄存器的狀態是未知的,它們通常不會包含零。 – markgz