跳至內容

MIPS 彙編/子程式

來自華夏公益教科書,自由的教科書

本頁將討論在 MIPS 彙編中使用子程式結構。此外,本頁還將討論將高階語言結構和子程式轉換為 MIPS 彙編程式碼的一些常見方法。

子程式機制

[編輯 | 編輯原始碼]

在 MIPS 中,通用暫存器通常被用作函式引數和函式變數,根據需要。通用暫存器的先前值儲存在堆疊中。在子程式結束時,所有以這種方式儲存的暫存器值都從堆疊中恢復。

MIPS 使用堆疊來儲存這些暫存器。堆疊指標指向堆疊的底部,但幀指標指向區域性幀的頂部。從堆疊或幀指標偏移可以根據需要檢索各種儲存的值和函式引數。

莖和葉

[編輯 | 編輯原始碼]

在函式層次結構中,呼叫其他函式的函式稱為函式。不呼叫任何其他函式的函式稱為函式。莖函式必須將$ra的值儲存在堆疊上,以便其內容在其他函式呼叫中得以保留,以便被呼叫函式可以返回到呼叫函式或其父函式。

重要的是要注意,葉函式不需要儲存$ra暫存器的值,因為它不呼叫任何其他子函式,因此其返回地址儲存在$ra中。

堆疊幀

[編輯 | 編輯原始碼]

函式可以設定堆疊幀,其中$sp暫存器指向堆疊的底部,$fp暫存器指向子程式開始時堆疊的頂部。透過這種方式,$fp將指向函式的輸入引數(如果任何引數都在堆疊上),而$sp將指向函式的區域性變數。

$fp的值需要在函式呼叫中保留,莖函式需要在呼叫子函式之前儲存$fp的值,並在呼叫子函式之後從堆疊中恢復它。

$sp的值不需要儲存在堆疊上,但函式需要確保在函式返回之前將$sp返回到函式開始時它所具有的值。這意味著在子程式開始時,可以將值壓入堆疊,並且在子程式結束時,所有這些值都需要從堆疊中彈出。如果操作不正確,它將破壞父函式的堆疊幀,並可能導致計算機崩潰。

儲存的暫存器

[編輯 | 編輯原始碼]

有一些暫存器必須在子程式呼叫期間保留。這意味著如果子程式想要使用這些暫存器,它必須將先前的值儲存到堆疊(或其他地方),然後在函式結束時重新載入這些值。$tx暫存器都是臨時暫存器,不需要儲存。同樣,$ax暫存器都是函式引數,也不需要儲存。$v0$v1暫存器都是函式返回值,也不需要儲存。

以下暫存器需要在函式呼叫期間保留,如果函式要使用它們,則應由函式儲存

$sx
"已儲存的臨時"暫存器

MIPS 和 C 語言連結

[編輯 | 編輯原始碼]

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書