日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PPC 调用约定 r0-r31寄存器介绍

發(fā)布時間:2025/3/19 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PPC 调用约定 r0-r31寄存器介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在做kernel從ARM到一款PPC處理器的移植,需要學(xué)下下PPC的通用寄存器,找到的文檔整理如下:
?

Register

ClassificationNotes
r0localcommonly used to hold the old link register when building the stack frame
r1dedicatedstack pointer
r2dedicatedtable of contents pointer
r3localcommonly used as the return value of a function, and also the first argument in
r4–r10localcommonly used to send in arguments 2 through 8 into a function
r11–r12local?
r13–r31global?
lrdedicatedlink register; cannot be used as a general register. Use?mflr?(move from link register) or?mtlr?(move to link register) to get at, e.g.,?mtlr r0
crdedicatedcondition register

?

?

r0 - r31都是32位長度的寄存器,其中使用上各有區(qū)別:

r0?????????????連接寄存器?

r1?????????????堆棧指針--通俗點叫sp,程序在內(nèi)存中運行時當(dāng)前的地址指針

r2?????????????目錄表的指針?

r3 - r10?????函數(shù)參數(shù)(1-8),r3是函數(shù)第一個參數(shù),r4是函數(shù)第二個參數(shù),依次類推...,r3也用在函數(shù)返回值時。

PowerPC簡介

PowerPC 體系結(jié)構(gòu)規(guī)范(PowerPC Architecture Specification)發(fā)布于 1993 年,它是一個 64 位規(guī)范 ( 也包含 32 位子集 )。幾乎所有常規(guī)可用的 PowerPC(除了新型號 IBM RS/6000 和所有 IBM pSeries 高端服務(wù)器)都是 32 位的。

PowerPC 處理器有 32 個(32 位或 64 位)GPR(通用寄存器)以及諸如 PC(程序計數(shù)器,也稱為 IAR/指令地址寄存器或 NIP/下一指令指針)、LR(鏈接寄存器)、CR(條件寄存器)等各種其它寄存器。有些 PowerPC CPU 還有 32 個 64 位 FPR(浮點寄存器)。MPC555使用的PowerPC CPU是帶有FPR的。一些常用寄存器介紹如下:

通用寄存器的用途:

r0   在函數(shù)開始(function prologs)時使用。

r1   堆棧指針,相當(dāng)于ia32架構(gòu)中的esp寄存器,idapro把這個寄存器反匯編標(biāo)識為sp。

r2   內(nèi)容表(toc)指針,idapro把這個寄存器反匯編標(biāo)識為rtoc。系統(tǒng)調(diào)用時,它包含系統(tǒng)調(diào)用號(這個好像跟系統(tǒng)有關(guān)吧)。

r3   作為第一個參數(shù)和返回值。

r4-r10 函數(shù)或系統(tǒng)調(diào)用開始的參數(shù)。

r11   用在指針的調(diào)用和當(dāng)作一些語言的環(huán)境指針。

r12   它用在異常處理和glink(動態(tài)連接器)代碼。

r13   保留作為系統(tǒng)線程ID。

r14-r31 作為本地變量,非易失性。

?

專用寄存器的用途:

lr   鏈接寄存器,它用來存放函數(shù)調(diào)用結(jié)束處的返回地址。

ctr   計數(shù)寄存器,它用來當(dāng)作循環(huán)計數(shù)器,會隨特定轉(zhuǎn)移操作而遞減。

xer   定點異常寄存器,存放整數(shù)運算操作的進(jìn)位以及溢出信息。

msr   機器狀態(tài)寄存器,用來配置微處理器的設(shè)定。

cr   條件寄存器,它分成8個4位字段,cr0-cr7,它反映了某個算法操作的結(jié)果并且提供條件分支的機制。

?

寄存器r1、r14-r31是非易失性的,這意味著它們的值在函數(shù)調(diào)用過程保持不變。寄存器r2也算非易失性,但是只有在調(diào)用函數(shù)在調(diào)用后必須恢復(fù)它的值時才被處理。

寄存器r0、r3-r12和特殊寄存器lr、ctr、xer、fpscr是易失性的,它們的值在函數(shù)調(diào)用過程中會發(fā)生變化。此外寄存器r0、r2、r11和r12可能會被交叉模塊調(diào)用改變,所以函數(shù)在調(diào)用的時候不能采用它們的值。

條件代碼寄存器字段cr0、cr1、cr5、cr6和cr7是易失性的。cr2、cr3和cr4是非易失性的,函數(shù)如果要改變它們必須保存并恢復(fù)這些字段。

在AIX上,svca指令(sc是PowerPC的助記符)用來表示系統(tǒng)調(diào)用,r2寄存器指定系統(tǒng)調(diào)用號,r3-r10寄存器是給該系統(tǒng)調(diào)用的參數(shù)。在執(zhí)行系統(tǒng)調(diào)用指令之前有兩個額外的先決條件:LR寄存器必須保存返回系統(tǒng)調(diào)用地址的值并且在系統(tǒng)調(diào)用前執(zhí)行crorc cr6, cr6, cr6指令(?)。

應(yīng)用程序二進(jìn)制接口(ABI)

從技術(shù)而言,開發(fā)人員可以將任一 GPR 用于任何操作。例如,由于不存在:“堆棧指針寄存器”,為此程序員就可以使用任何寄存器。實際上,定義一組約定很有用,這樣二進(jìn)制對象就可以與不同的編譯器和預(yù)先編寫好的匯編代碼進(jìn)行互操作。

調(diào)用約定是由使用的 ABI(應(yīng)用程序二進(jìn)制接口)決定的。ppc32 Linux 和 NetBSD 實現(xiàn)使用 SVR4(System V R4)ABI,而 ppc64 Linux 仿效了 AIX,使用 PowerOpen ABI。ABI 還指定當(dāng)調(diào)用子例程時哪些寄存器被認(rèn)為是易失型的(調(diào)用者保存(caller-save))以及哪些被認(rèn)為是非易失型的(被調(diào)用者保存(callee-save)),以及許多其它內(nèi)容。

SVR4 ABI 指定了一些行為的具體示例:

-由于 PowerPC 擁有如此多的 GPR(32 個,而相比之下 IA32 只有 8 個),所以傳遞參數(shù)的寄存器從 gpr3 開始。

-寄存器 gpr3 到 gpr12 是易失型的(調(diào)用者保存)寄存器,如果需要的話,在調(diào)用子例程之前必須先保存它們并在返回之后恢復(fù)它們。

???????-寄存器 gpr1 用來作為棧幀指針。

指令格式

PowerPC

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

add rD,rA,rB

表示把(rA)+(rB)的和存放到rD寄存器中。

注意:

指令中的點號“.”表示:指令將更新條件寄存器CR0。如add. rD,rA,rB。

指令中的字母“c”表示:指令顯示說明結(jié)果影響XER寄存器中的進(jìn)位位[CA],如addc rD,rA,rB。

指令中的字母“e”表示:在指令中把XER[CA]中的數(shù)據(jù)作為一個操作數(shù),并在XER[CA]位記錄進(jìn)位位,如adde rD,rA,rB

指令中的字母“o”表示:溢出標(biāo)志。對于整數(shù),在XER[OA]位記錄溢出和在CR0[SO]記錄溢出位,如addo rD,rA,rB

?

條件寄存器

條件寄存器CR包括8個4bit的字段,即CR0~CR7。每個字段可以表示整數(shù)運算或比較的結(jié)果。每個條件字段可以記錄比較結(jié)果,即大于、小于、等于和總體溢出等。條件寄存器格式如圖1所示。

?

?

異常處理器

整數(shù)異常寄存器XER是一個特殊功能寄存器,它包括一些對增加計算精度有用的信息和出錯信息。XER的格式如下:

?

SO為總體溢出標(biāo)志:一旦有溢出位OV置位,SO就會置位。

OV為溢出標(biāo)志:當(dāng)發(fā)生溢出時置位,否則清零;在作乘法或除法運算時,如果結(jié)果超過寄存器的表達(dá)范圍,則溢出置位。

CA為進(jìn)位標(biāo)志:當(dāng)最高位產(chǎn)生進(jìn)位時,置位,否則清零;擴展精度指令(后述)可以用CA作為操作符參與運算。

存儲/加載指令

1 整數(shù)存儲指令

整數(shù)存儲指令如表2所示。

表2 整數(shù)存儲指令

名稱

助記符

語法格式

字節(jié)存儲(偏移地址尋址)

stb

rS, d(rA)

字節(jié)存儲(寄存器尋址)

stbx

rS, rA, rB

記錄有效地址的字節(jié)存儲(偏移地址尋址)

stbu

rS, d(rA)

記錄有效地址的字節(jié)存儲(寄存器尋址)

stbux

rS, rA, rB

半字存儲(偏移地址尋址)

sth

rS, d(rA)

半字存儲(寄存器尋址)

sthx

rS, rA, rB

記錄有效地址的半字存儲(偏移地址尋址)

sthu

rS, d(rA)

記錄有效地址的半字存儲(寄存器尋址)

sthux

rS, rA, rB

字存儲(偏移地址尋址)

stw

rS, d(rA)

字存儲(寄存器尋址)

stwx

rS, rA, rB

記錄有效地址的字存儲(偏移地址尋址)

stwu

rS, d(rA)

記錄有效地址的字存儲(寄存器尋址)

stwux

rS, rA, rB

(1)????字節(jié)存儲指令stb(偏移地址尋址)

stb rS,d(rA)??

有效地址為rA的內(nèi)容加d,rS的低8位內(nèi)容存儲到有效地址為EA的存儲器中。

(2)????字節(jié)存儲指令stbx(寄存器尋址)

stbx rS,rA,rB

有效地址為rA的內(nèi)容加上rB的內(nèi)容,rS的低8位內(nèi)容存儲到有效地址為EA的存儲器中。

(3)????記錄有效地址的字節(jié)存儲指令stbu(偏移地址尋址)

stub rS,d(rA)

有效地址EA=(rA)+d,rS的低8位內(nèi)容存儲到有效地址為EA的存儲器中。rA=EA,如果rA=0,則指令無效。

(4)????記錄有效地址的字節(jié)存儲指令stbux(寄存器尋址)

stbux rS,rA,rB

有效地址EA=(rA)+(rB),rS的低8位內(nèi)容存儲到有效地址為EA的存儲器中,rA=EA,如果rA=0,則指令無效。

(5)????半字存儲指令sth(偏移地址尋址)

sth rS,d(rA)

有效地址EA=(rA)+d,rS的低16位內(nèi)容存儲到有效地址為EA的存儲器中。

(6)????記錄有效地址的半字存儲指令sthu(偏移地址尋址)

sthu rS,d(rA)

有效地址EA=(rA)+d,rS的低16位內(nèi)容存儲到有效地址為EA的存儲器中。rA=EA,如果rA=0,則指令無效。

(7)????字存儲指令stw(偏移地址尋址)

stw rS,d(rA)

有效地址EA=(rA)+d,rS的32位內(nèi)容存儲到有效地址為EA的存儲器中。

(8)????記錄有效地址的字存儲指令stwu(偏移地址尋址)

stwu rS,d(rA)

有效地址EA=(rA)+d,rS的32位內(nèi)容存儲到有效地址為EA的存儲器中,rA=EA,如果rA=0,則指令無效。

(9)????記錄有效地址的字存儲指令stwux(寄存器尋址)

stwux rS,rA,rB

有效地址EA=(rA)+(rB),rS的32位內(nèi)容存儲到有效地址為EA的存儲器中。rA=EA,如果rA=0,則指令無效。

(10)字存儲指令stwx(寄存器尋址)

stwx rS,rA,rB

有效地址EA=(rA)+(rB),rS的32位內(nèi)容存儲到有效地址為EA的存儲器中。

2、整數(shù)加載指令

整數(shù)加載指令如表3所示。

名稱

助記符

語法格式

高位清零加載字節(jié)指令(偏移地址尋址)

lbz

rD, d(rA)

高位清零的加載字節(jié)指令(寄存器尋址)

lbzx

rD, rA, rB

高位清零的加載字節(jié)并記錄有效地址指令(偏移地址尋址)

lbzu

rD, d(rA)

高位清零的加載字節(jié)并記錄有效地址指令(寄存器尋址)

lbzux

rD, rA, rB

高位清零的加載半字指令(偏移地址尋址)

lhz

rD, d(rA)

高位清零的加載半字指令(寄存器尋址)

lhzx

rD, rA, rB

高位清零的加載半字并記錄有效地址指令(偏移地址尋址)

lhzu

rD, d(rA)

高位清零的加載半字并記錄有效地址指令(寄存器尋址)

lhzux

rD, rA, rB

加載半字指令(偏移地址尋址)

lha

rD, d(rA)

加載半字指令(寄存器尋址)

lhax

rD, rA, rB

加載半字并記錄有效地址指令(偏移地址尋址)

lhau

rD, d(rA)

加載半字并記錄有效地址指令(寄存器尋址)

lhaux

rD, rA, rB

加載字指令(偏移地址尋址)

lwz

rD, d(rA)

加載字指令(寄存器尋址)

lwzx

rD, rA, rB

加載字并記錄有效地址指令(偏移地址尋址)

lwzu

rD, d(rA)

加載字并記錄有效地址指令(寄存器尋址)

lwzux

rD, rA, rB

?

?

(1)????lbz rD, d(rA) ;EA=(rA|0)+d。從存儲器讀取EA地址的內(nèi)容,并加載低8位到rD,rD的其他位清0。不影響其他寄存器。

(2)????lbzu rD, d(rA) ;EA=(rA)+d。從存儲器讀取EA地址一個字節(jié)的內(nèi)容,并加載低8位到rD,rD的其他各位清零,有效地址EA存放在rA中。

?

(3)????lbzux rD,rA,rB ;EA=(rA)+(rB)。從存儲器讀取EA地址一個字節(jié)的內(nèi)容,并加載低8位到rD,rD的其他各位清零,EA存放在rA中。如果rA=0或者rA=rD,則指令無效。

(4)????lbzx rD,rA,rB???;EA=(rA|0)+(rB)。從存儲器讀取EA地址一個字節(jié)的內(nèi)容,并加載低8位到rD,rD的其他各位清0。

(5)????lha rD, d(rA) ;EA=(rA|0)+d。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD的其他位填充最高位的值。

?

(6)????lhax rD,rA,rB ;EA=(rA)+(rB)。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD的其他位填充最高位的值。

(7)????lhau rD, d(rA) ;EA=(rA)+d。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD的其他位填充最高位的值。EA存放在rA中,如果rA=0或者rA=rD,則指令格式無效。

(8)????lhaux rD,rA,rB ;EA=(rA)+(rB)。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD的其他位填充最高位的值。EA存放在rA中,如果rA=0或者rA=rD,則指令格式無效。

?

?

(9)????lhz rD, d(rA) ;EA=(rA|0)+d。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD的其他位清零。

?

(10)lhzu rD, d(rA) ;EA=(rA|0)+d。從存儲器EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位。rD其他位清零。EA存入rA,如果rA=0或者rA=rD,則指令格式無效。

?

(11)lhzux rD,rA,rB ;EA=(rA)+(rB)。從存儲器EA處讀取兩個字節(jié)的數(shù),加載到rD的低16位,rD其他位清零。EA存入rA,如果rA=0或者rA=rD,則指令格式無效。

?

(12)lhzx rD,rA,rB ;EA=(rA|0)+(rB),從EA處讀取兩個字節(jié)的數(shù),并加載到rD的低16位,將rD的其他位清零。

?

(13)lwz rD,d(rA) ;EA=(rA|0)+d,從EA處讀取4個字節(jié)的數(shù),并加載到rD。

?

(14)lwzu rD,d(rA) ;EA=(rA)+d,從EA處讀取4個字節(jié)的數(shù),并加載到rD。rA=EA,如果rA=0或rA=rD,則指令格式無效。

?

(15)lwzux rD,rA,rB ;EA=(rA)+(rB),從EA處讀取4個字節(jié)的數(shù),并加載到rD。rA=EA,如果rA=0或rA=rD,則指令格式無效。

?

(16)lwzx rD,rA,rB ;EA=(rA|0)+(rB),從EA處讀取4個字節(jié)的數(shù),并加載到rD。

整數(shù)多字存儲/加載指令

表3 整數(shù)多字存儲/加載指令

名稱

助記符

語法格式

多字加載

lmw

rD,d(rA)

多字存儲

stmw

rS,d(rA)

(1)????lmw rD,d(rA) ;EA=rA+d。以EA起始的n個連續(xù)的字加載到通用寄存器GPRs rD到r31處,n=32-rD。EA必須為4的倍數(shù),如果rA=0,則指令格式無效。指令執(zhí)行時間長。

(2)????stmw rS,d(rA) ;EA=rA+d。把通用寄存器從GPRs rS到GPRs r31,存儲到以EA起始的n個連續(xù)的字存儲器,EA必須是4的倍數(shù)。指令執(zhí)行時間長。

轉(zhuǎn)移指令

表4 分支控制指令

名稱

助記符

語法格式

無條件轉(zhuǎn)移

b( ba bl bla)

target_addr

條件轉(zhuǎn)移

bc( bca bcl bcla)

BO,BI,target_addr

條件轉(zhuǎn)移(轉(zhuǎn)移目標(biāo)地址由LR指出)

bclr(bclrl)

BO,BI

條件轉(zhuǎn)移(轉(zhuǎn)移目標(biāo)地址由CTR指出)

bcctr(bcctrl)

BO,BI

(1)????無條件轉(zhuǎn)移指令bx(b ba bl bla)

指令的編碼格式:

?

指令的語法格式:

b target_addr(AA=0 LK=0)

ba target_addr(AA=1 LK=0)

bl target_addr(AA=0 LK=1)

bla target_addr(AA=1 LK=1)

如果AA=0,則轉(zhuǎn)移目標(biāo)地址為LI||0b00的值經(jīng)符號位擴展后加上指令地址。

如果AA=1,則轉(zhuǎn)移目標(biāo)地址為LI||0b00的值經(jīng)符號擴展后的值。

如果LK=1,則轉(zhuǎn)移指令下一條指令的有效地址存放到連接寄存器。

(1)????條件轉(zhuǎn)移指令bcx

指令編碼格式:

?

指令語法格式:

bc BO, BI, target_addr(AA=0 LK=0)

bca BO, BI, target_addr(AA=1 LK=0)

bcl BO, BI, target_addr(AA=0 LK=1)

bcla BO, BI, target_addr(AA=1 LK=1)

BI字段表示條件寄存器CR中的位用于轉(zhuǎn)移條件。BO字段操作碼定義見表5。

表5 BO字段操作碼定義

BO

說明

0000y

計數(shù)器CTR減量,如果條件不成立則轉(zhuǎn)移

0001y

計數(shù)器CTR減量,如果條件不成立則轉(zhuǎn)移

001zy

如果條件不成立,則轉(zhuǎn)移

0100y

計數(shù)器CTR減量,如果條件成立則轉(zhuǎn)移

0101y

計數(shù)器CTR減量,如果條件成立則轉(zhuǎn)移

011zy

如果條件成立則轉(zhuǎn)移

1z00y

計數(shù)器CTR減量,如果CTR!=0,則發(fā)生轉(zhuǎn)移

1z01y

計數(shù)器CTR減量,如果CTR=0,則發(fā)生轉(zhuǎn)移

1z1zz

發(fā)生轉(zhuǎn)移

注:位z表示該位可以被忽略,位y表示是不是條件轉(zhuǎn)移

(2)????條件轉(zhuǎn)移指令bclx(轉(zhuǎn)移目標(biāo)地址由LR指出)

指令的編碼格式:

?

指令的語法格式:

bclr BO, BI(LK=0)

bclrl BO, BI(LK=1)

BI字段表示條件寄存器CR中的位用于轉(zhuǎn)移條件。

BO字段操作碼定義如表5所示。

轉(zhuǎn)移目標(biāo)地址為LR[0-29]||0b00。

如果LK=1,則轉(zhuǎn)移指令下一條有效地址存放到連接寄存器。

(3)????條件轉(zhuǎn)移指令bcctrx(轉(zhuǎn)移目標(biāo)地址由CTR指出)

指令的編碼格式:

?

指令的語法格式:

bcctr BO, BI(LK=0)

bcctrl BO, BI(LK=1)

轉(zhuǎn)移目標(biāo)地址是CTR||0b00。

如果LK=1,則轉(zhuǎn)移指令下一條指令的有效地址存放到連接寄存器。

如果減量計數(shù)器(BO[2]=0),指令格式無效,則轉(zhuǎn)移到目標(biāo)地址。

特殊寄存器傳送指令

特殊寄存器傳送指令如表6所示。

表6 特殊寄存器傳送指令

名稱

助記符

語法格式

讀取機器狀態(tài)寄存器

mfmsr

rD

寫入機器狀態(tài)寄存器

mtmsr

rS

讀取特殊功能寄存器

mfspr

rD, SPR

寫入特殊功能寄存器

mtspr

SPR, rS

讀取段寄存器

mfsr

rD, SR

寫入段寄存器

mtsr

SR, rS

間接讀取段寄存器

mfsrin

rD, rB

間接寫入段寄存器

mtsrin

rS, rB

讀取時基寄存器

mftb

rD, TBR

(1)????讀取機器狀態(tài)寄存器指令mfmsr

???指令的編碼格式:

?

???指令的語法格式:

mfmsr rD

讀取MSR的內(nèi)容放入rD中,這是超級用戶層指令,不影響其他寄存器。

(2)寫入機器狀態(tài)寄存器指令mtmsr

指令的編碼格式:

?

指令的語法格式:

mtmsr rS

把rS的內(nèi)容存入MSR中,這是超級用戶指令。

(1)????讀取特殊功能寄存器指令mfspr

指令的編碼格式:

?

指令的語法格式:

mfspr rD,SPR

指令操作:

n<—spr[5-9]||spr[0-4]

rD<—spr(n)

特殊功能寄存器(SPR)的編碼如表7所示,將SPR的內(nèi)容存入rD中。

表7 Power PC UISA SPR編碼

?

spr

?

寄存器名

編碼n

spr[5-9]

spr[0-4]

?

1

00000

00001

XER

8

00000

01000

LR

9

00000

01001

CR

(2)????寫入特殊功能寄存器指令mtspr

指令的編碼格式:

?

指令的語法格式:

mtspr spr,rS

把rS的內(nèi)容存入到指定的特殊功能寄存器中。

(3)????讀取段寄存器指令mfsr

指令的編碼格式:

?

????指令的語法格式:

????mfsr rD,SR

指令操作:

rD<—SEGREG(SR)

將段寄存器SR的內(nèi)容讀入rD中,這是一個超級用戶層指令。

(1)????寫入段寄存器指令mtsr

指令的編碼格式:

?

指令的語法格式:

mtsr SR,rS

將rS中的內(nèi)容讀入SR,這是一個超級用戶層指令。

(2)????間接讀取段寄存器指令mfsrin

指令的編碼格式:

?

指令的語法格式:

mfsrin rD,rB

指令操作:

rD<—SEGREG(rB[0-3])

由rB寄存器的0~3位選取的段寄存器的內(nèi)容,復(fù)制到rDzhong。這是一個超級用戶層指令。

(3)????間接寫入段寄存器指令mtsrin

指令的編碼格式:

?

指令的語法格式:

mtsrin rS,rB

指令操作:

SEGREG(rB[0-3])<—(rS)

將rS中的內(nèi)容復(fù)制到由rB的0~3位所指定的寄存器中。這是一個超級用戶層指令。

(4)????讀取時基寄存器指令mftb

指令的編碼格式:

?

指令的語法格式:

mftb rD,TBR

指令操作:

n<—tbr[5-9]||tbr[0-4]

if n=268 then

rD<—TBL

else if n=269 then

rD<—TBU

該指令的TBR編碼如表8所示。

表8 指令mftb的TBR編碼

?

TBR

?

寄存器名

訪問

編碼

tbr[5-9]

tbr[0-4]

?

?

268

01000

01100

TBL

用戶

269

01000

01101

TBR

用戶

?

系統(tǒng)調(diào)用指令

(1)????系統(tǒng)調(diào)用指令sc

指令的編碼格式:

?

指令的使用:

sc指令調(diào)用操作系統(tǒng)去執(zhí)行服務(wù)程序。當(dāng)控制返回到一個執(zhí)行系統(tǒng)調(diào)用的程序時,寄存器的內(nèi)容依賴于程序提供的系統(tǒng)所使用的寄存器的約定。

跟在sc指令后面的有效指令地址被放在SRR0中。MSR中的位0、5~9和16~31被放在SRR1中對應(yīng)的位置,SRR1中位1~4和10~15被設(shè) 置為未定義值。當(dāng)sc異常產(chǎn)生,異常處理程序更改MSR寄存器。異常處理程序到MSR[IP]形成基址加0xC00偏移量形成的地址去取下一條指令。

受影響的寄存器有:

依賴于系統(tǒng)服務(wù)、SRR0、SRR1及MSR。

(2)????中斷返回指令rfi

指令的編碼格式:

?

指令操作:

MSR[16-23,25-27,30-31] <—SRR1[16-23,25-27,30-31]

NIA<—iea SRR0[0-29]||0b00

SRR1中的位0、5~9和16~31被放在MSR中對應(yīng)的位置。如果新的MSR值沒有使能任何未完的操作,則在MSR的控制下,從地址SRR0[0-29]||0b00取下一條指令。

指令的使用中受影響的寄存器為MSR。

總結(jié)

以上是生活随笔為你收集整理的PPC 调用约定 r0-r31寄存器介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。