簡體   English   中英

匯編 (MIPS) 正確使用:寄存器與堆棧

[英]Assembly (MIPS) proper use: Registers vs. Stack

在編寫 MIPS 程序時,我聽說保持寄存器清潔通常是好的做法,即在程序結束時將寄存器的值清除為 0。 所以我的第一個問題是如何/為什么這是必要的/好的做法?

其次,如果我們有一個函數調用,參數(p1, p2) 存儲在 $4 和 $5 中; 在我們的函數定義結束時,是否有必要清除 $4 和 $5 處的值或更好地保留它們在函數調用開始時的狀態?

我還看到了像這樣將參數推送到堆棧的示例:

addi $29, $29, -8
sw $4, 0($29)
sw $5, 4($29)
; At the end of our program:
addi $29, $29, 8

什么時候以及為什么這是必要的/好的做法?

最后,如果我們要在我們的程序中使用一些常量,比如 4 和 1,將它們保存在寄存器中還是堆棧中更好? 例如:

lis $8
.word 4
lis $9
.word 1

然后我們可能會以某種方式為我們的程序使用這些值,然后將它們清除為 0。

或者我們可以選擇通過來回移動堆棧指針來將它們存儲在堆棧中。 哪個是更好的方法?

首先, 您通常希望使用$zero而不是$0$v0–$v1而不是$2–$3等……它們比普通數字更容易理解(和記憶),並且匯編程序也理解這種表示法,因此沒有這方面的問題。 這也從數字中抽象出您的代碼,因此如果標准發生變化(例如,$zero 不再是 $0,而是 $256),您的代碼仍將正確組裝。

在每個 CPU 體系結構中,關於如何使用寄存器進行調用以及如何在函數內使用寄存器的行為都有一些約定。 這稱為調用約定 您可以在此處查看 MIPS 調用約定的簡要說明。

我聽說保持寄存器清潔通常是好的做法,即在程序結束時將寄存器的值清除為 0。 所以我的第一個問題是如何/為什么這是必要的/好的做法?

我個人從未聽說過這種做法,但我不太同意。 更好的做法是在程序開始之前恢復以前的值。

其次,如果我們有一個函數調用,參數(p1, p2) 存儲在 $4 和 $5 中; 在我們的函數定義結束時,是否有必要清除 $4 和 $5 處的值或更好地保留它們在函數調用開始時的狀態?

您應該保持它們在函數調用開始時的狀態。 對於調用者來說,修改這個寄存器是沒有意義的。

堆棧上的空間是為 $a0-$a3 保留的,以防被調用者需要保存其參數,但調用者不會將寄存器存儲在那里。

我還看到了像這樣將參數推送到堆棧的示例。 什么時候以及為什么這是必要的/好的做法?

堆棧如果根據定義是臨時存儲。 如果您想備份寄存器值(例如,您想使用 $aX 或 $sX),請將它們放在那里。 和以前一樣:

棧上的空間是為 $a0-$a3 保留的,以防被調用者需要保存它的參數

addi $sp, $sp, -8

移動堆棧指針寄存器(按照慣例,它是 29 美元)。 這在堆棧中保留了 8 個字節。

sw $a0, 0($sp)
sw $a1, 4($sp)

將 $a0 保存到堆棧的頂部,將 $a1 保存為堆棧中的第二個(請記住,堆棧會朝着較低的地址增長)。 這將填充保留空間(8 個字節)。 這稱為函數入口協議

; At the end of our program:
; You forgot, and it's important:
lw $a0, 0($sp)
lw $a1, 4($sp)
addi $sp, $sp, 8

您恢復保存的寄存器並將堆棧指針放回原始值。 然后調用者將保持其堆棧和參數不變。 這稱為函數退出協議

如果我們要在我們的程序中使用一些常量,比如 4 和 1,將它們保存在寄存器中還是堆棧中更好?

兩者都不。 常量應該用作立即操作數:

li $t0, C   ; Load 16-bit constant into $t0
lui $t0, C  ; Load upper 16-bit half-word of $t0

還不能發表評論,所以我正在“回答”評論。

在上面答案中提到的約定中,有一些寄存器必須保存在堆棧中 - $s0-$s7 寄存器在過程中使用時“應該”保存。 這意味着將值保存到堆棧中,如果您發現自己需要使用它們。 當輸出 ($v0, $v1) 和輸入 ($a0-$a3) 寄存器不足以滿足您的程序目的時,通常會發生這種情況。

$ra(返回地址寄存器)在使用過程時也應該保存到堆棧中,如果你正在使用一個調用另一個過程的過程或者你的代碼會中斷,則需要保存。

如果您需要在過程中使用臨時寄存器,則可以使用 $t0-$t7 而不保留它們的值,正如它們的名稱(臨時)所暗示的那樣。 這在循環計數器或其他非保留值的情況下通常很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM