PowerPC 常用寄存器簡介

PowerPC 體系結構規範(PowerPC Architecture Specification)發佈於 1993 年,它是一個 64 位規範 ( 也包含 32 位子集 )。幾乎所有常規可用的 PowerPC(除了新型號 IBM RS/6000 和所有 IBM pSeries 高端服務器)都是32位的。PowerPC 處理器有 32 個(32 位或 64 位)GPR(通用寄存器)以及諸如 PC(程序計數器,也稱爲 IAR/指令地址寄存器或 NIP/下一指令指針)、LR(鏈接寄存器)、CR(條件寄存器)等各種其它寄存器。有些 PowerPC CPU 還有 32 個 64 位 FPR(浮點寄存器)。MPC555使用的PowerPC CPU是帶有FPR的。一些常用寄存器介紹如下:

--------------------------------------------------------------------------------

通用寄存器的用途:

    r0   在函數開始(function prologs)時使用。
    r1   堆棧指針,相當於ia32架構中的esp寄存器,idapro把這個寄存器反彙編標識爲sp。
    r2   內容表(toc)指針,idapro把這個寄存器反彙編標識爲rtoc。系統調用時,它包含系統調用號(這個好像跟系統有關吧)。
    r3   作爲第一個參數和返回值。
    r4-r10 函數或系統調用開始的參數。
    r11   用在指針的調用和當作一些語言的環境指針。
    r12   它用在異常處理和glink(動態連接器)代碼。
    r13   保留作爲系統線程ID。
    r14-r31 作爲本地變量,非易失性。

專用寄存器的用途:
    lr   鏈接寄存器,它用來存放函數調用結束處的返回地址。
    ctr   計數寄存器,它用來當作循環計數器,會隨特定轉移操作而遞減。
    xer   定點異常寄存器,存放整數運算操作的進位以及溢出信息。
    msr   機器狀態寄存器,用來配置微處理器的設定。
    cr   條件寄存器,它分成8個4位字段,cr0-cr7,它反映了某個算法操作的結果並且提供條件分支的機制。

--------------------------------------------------------------------------------

寄存器r1、r14-r31是非易失性的,這意味着它們的值在函數調用過程保持不變。寄存器r2也算非易失性,但是隻有在調用函數在調用後必須恢復它的值時才被處理。寄存器r0、r3-r12和特殊寄存器lr、ctr、xer、fpscr是易失性的,它們的值在函數調用過程中會發生變化。此外寄存器r0、r2、r11和r12可能會被交叉模塊調用改變,所以函數在調用的時候不能採用它們的值。
條件代碼寄存器字段cr0、cr1、cr5、cr6和cr7是易失性的。cr2、cr3和cr4是非易失性的,函數如果要改變它們必須保存並恢復這些字段。
在AIX上,svca指令(sc是PowerPC的助記符)用來表示系統調用,r2寄存器指定系統調用號,r3-r10寄存器是給該系統調用的參數。在執行系統調用指令之前有兩個額外的先決條件:LR寄存器必須保存返回系統調用地址的值並且在系統調用前執行crorc cr6, cr6, cr6指令。

 

應用程序二進制接口(ABI)
從技術而言,開發人員可以將任一 GPR 用於任何操作。例如,由於不存在:“堆棧指針寄存器”,爲此程序員就可以使用任何寄存器。實際上,定義一組約定很有用,這樣二進制對象就可以與不同的編譯器和預先編寫好的彙編代碼進行互操作。
調用約定是由使用的 ABI(應用程序二進制接口)決定的。ppc32 Linux 和 NetBSD 實現使用 SVR4(System V R4)ABI,而 ppc64 Linux 仿效了 AIX,使用 PowerOpen ABI。ABI 還指定當調用子例程時哪些寄存器被認爲是易失型的(調用者保存(caller-save))以及哪些被認爲是非易失型的(被調用者保存(callee-save)),以及許多其它內容。
SVR4 ABI 指定了一些行爲的具體示例:

-由於 PowerPC 擁有如此多的 GPR(32 個,而相比之下 IA32 只有 8 個),所以傳遞參數的寄存器從 gpr3 開始。
-寄存器 gpr3 到 gpr12 是易失型的(調用者保存)寄存器,如果需要的話,在調用子例程之前必須先保存它們並在返回之後恢復它們。
-寄存器 gpr1 用來作爲棧幀指針。

指令格式
指令包括操作碼和操作數兩部分,PowerPC支持三操作數的指令格式。如算術指令:

add rD,rA,rB
表示把(rA)+(rB)的和存放到rD寄存器中。
注意:
指令中的點號“.”表示:指令將更新條件寄存器CR0。如add. rD,rA,rB。
指令中的字母“c”表示:指令顯示說明結果影響XER寄存器中的進位位[CA],如addc rD,rA,rB。
指令中的字母“e”表示:在指令中把XER[CA]中的數據作爲一個操作數,並在XER[CA]位記錄進位位,如adde rD,rA,rB。
指令中的字母“o”表示:溢出標誌。對於整數,在XER[OA]位記錄溢出和在CR0[SO]記錄溢出位,如addo rD,rA,rB

條件寄存器
條件寄存器CR包括8個4bit的字段,即CR0~CR7。每個字段可以表示整數運算或比較的結果。每個條件字段可以記錄比較結果,即大於、小於、等於和總體溢出等。

異常處理器
整數異常寄存器XER是一個特殊功能寄存器,它包括一些對增加計算精度有用的信息和出錯信息。XER的格式如下:
SO爲總體溢出標誌:一旦有溢出位OV置位,SO就會置位。
OV爲溢出標誌:當發生溢出時置位,否則清零;在作乘法或除法運算時,如果結果超過寄存器的表達範圍,則溢出置位。
CA爲進位標誌:當最高位產生進位時,置位,否則清零;擴展精度指令(後述)可以用CA作爲操作符參與運算。

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