Caller-saved register and Callee-saved register

 

Caller-saved register(又名易失性寄存器AKA volatile registers, or call-clobbered)用於保存不需要在各個調用之間保留的臨時數量。

因此,如果要在過程調用後恢復該值,則調用方有責任將這些寄存器壓入堆棧或將其複製到其他位置。不過,讓調用銷燬這些寄存器中的臨時值是正常的。從被調用方的角度來看,您的函數可以自由覆蓋(也就是破壞)這些寄存器,而無需保存/恢復。Or you have to understand that "caller-saved" means "saved somehow if you want the value later".

 

Callee-saved register(又稱非易失性寄存器AKA non-volatile registers, or call-preserved)用於保存應在每次調用中保留的長壽命值。

當調用者進行過程調用時,可以期望這些寄存器在被調用者返回後將保持相同的值,這使被調用者有責任在返回調用者之前保存它們並恢復它們, 還是不要碰它們。

 

 

Callee vs caller saved 的約定是約定誰負責在整個調用中保存和恢復寄存器中的值。所有寄存器都是“全局”的,因爲任何地方的任何代碼都可以看到(或修改)一個寄存器,而這些修改將被任何以後的任何代碼看到。 寄存器保存約定的重點是,不應將代碼修改某些寄存器,而其他代碼則假定未修改該值。

 

 

 

寄存器從硬件上都是一樣的,但是爲了軟件的正確性和協同工作,對寄存器進行了區分。所有軟件在x86上都需要遵循一樣的規則才能保證正確性。該誰保存就誰保存

“ 調用者保存”( caller saving )方法:如果採用調用者保存策略,那麼在一個調用者調用別的過程時,必須保存調用者所要保存的寄存器,以備調用結束返回後,能夠再次訪問調用者。
“ 被調用者保存”( callee saving )方法:如果採用被調用者保存策略,那麼被調用的過程必須保存它要用的寄存器,保證不會破壞過程調用者的程序執行環境,並在過程調用結束返回時,恢復這些寄存器的內容。

 被調用者保存 更爲簡單通用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章