我的老師剛剛講過這個話題,但我還是想知道為什么要使用偏移量。它是為了借助于某種前綴來對數值進行分類嗎?如果你能以一種簡單的方式解釋為什么在這些指令中使用偏移量,我將不勝感激。
uj5u.com熱心網友回復:
偏移量被用于幾種不同的情況。 這里有一些例子:
許多演算法自然涉及像A[i 1]這樣的運算式。 編譯器將計算A i,并使用4的偏移量來獲得 1(假設A是一個4位元組元素的陣列)。
在解開甚至只涉及A[i]的回圈后,解開的部分引入了A[i 1]、A[i 2]的使用,等等。
當我們訪問基于堆疊的記憶體時,基礎暫存器將是堆疊指標,暫存器$sp. 這里的偏移量表示要訪問哪個堆疊槽,所以對于訪問基于堆疊的本地變數非常方便。
有一些對堆疊的隱藏使用(對C程式員來說是隱藏的),這涉及到保留$s暫存器值、回傳地址暫存器值$ra,還有可能是在暫存器中傳遞的引數。 這些訪問也使用$sp作為基礎暫存器和一個適當的偏移來獲得正確的槽。
不適合在暫存器中的引數被傳遞到堆疊中,并使用$sp作為基數和一個適當的偏移量,由呼叫者(設定引數)和被呼叫者(訪問它們)進行訪問。
全域變數可以使用兩個指令序列來訪問,使用lui,然后是lw或sw和一個適當的偏移量。 lui指令形成一個高16位,lw或sw指令提供一個低16位。
物件有欄位,訪問欄位是使用物件的指標和物件中欄位的偏移量來完成的。 所以,在C語言中,p->f1,其中f1的偏移量為8,將使用p作為基礎暫存器,8作為偏移量的加載或存盤。
綜上所述,有相當多的情況下,基數 非零常數是有用的。 零常數也是非常有用的,正如你已經知道的*p(簡單的解除參考)和A[i](陣列索引),因此,MIPS選擇只提供一種形式的尋址模式。
其他架構提供了幾種尋址模式,例如,帶偏移量的轉指和不帶偏移量的轉指(除此之外),因此對它們來說,你選擇不帶偏移量,而不是提供一個偏移量為零。 然而,為了利用這一點,你需要一個可變長度的指令集,以及更多的編碼,而MIPS為了保持其RISC理念,選擇了反對這兩種編碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320408.html
標籤:
