powerpc instructioin set

存儲/加載指令

1 整數存儲指令

整數存儲指令如表1所示。

表1 整數存儲指令

 

名稱

助記符

語法格式

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

stb

rS, d(rA)

字節存儲(寄存器尋址)

stbx

rS, rA,rB

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

stbu

rS, d(rA)

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

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

 

 

st(ore)** 的指令都是將寄存器中值存儲到存儲器(內存等)


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

stb rSdrA  

有效地址(EffectAddr)爲rA的內容加drS的低8位內容存儲到有效地址爲EA的存儲器中。

 

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

stbx rSrArB

有效地址爲rA的內容加上rB的內容,rS的低8位內容存儲到有效地址爲EA的存儲器中。

 

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

stub rSdrA

有效地址EA=(rA)+drS的低8位內容存儲到有效地址爲EA的存儲器中。rAEA,如果rA0,則指令無效。

 

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

stbux rSrArB

有效地址EA=(rA)+(rB),rS的低8位內容存儲到有效地址爲EA的存儲器中,rAEA,如果rA0,則指令無效。

 

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

sth rSdrA

有效地址EA=(rA)+drS的低16位內容存儲到有效地址爲EA的存儲器中。

 

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

sthu rSdrA

有效地址EA=(rA)+drS的低16位內容存儲到有效地址爲EA的存儲器中。rAEA,如果rA0,則指令無效。

 

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

stw rSdrA

有效地址EA=(rA)+drS32位內容存儲到有效地址爲EA的存儲器中。

 

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

stwu rSdrA

有效地址EA=(rA)+drS32位內容存儲到有效地址爲EA的存儲器中,rAEA,如果rA0,則指令無效。

 

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

stwux rSrArB

有效地址EA=(rA)+(rB),rS32位內容存儲到有效地址爲EA的存儲器中。rAEA,如果rA0,則指令無效。

 

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

stwx rSrArB

有效地址EA=(rA)+(rB),rS32位內容存儲到有效地址爲EA的存儲器中。

2、整數加載指令

整數加載指令如表2所示。

                       表2 整數加載指令

名稱

助記符

語法格式

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

lbz

rD, d(rA)

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

lbzx

rD, rA,rB

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

lbzu

rD, d(rA)

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

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

 

l(oad)** 指令從存儲器(內存等)取數據加載到寄存器

 

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

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

 

(3)   lbzux rDrArBEA=(rA)+(rB)。從存儲器讀取EA地址一個字節的內容,並加載低8位到rDrD的其他各位清零,EA存放在rA中。如果rA0或者rArD,則指令無效。

(4)   lbzx rDrArB  EA=(rA|0)+(rB)。從存儲器讀取EA地址一個字節的內容,並加載低8位到rDrD的其他各位清0

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

 

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

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

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

 

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

 

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

 

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

 

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

 

(13)lwz rDdrA);EA=(rA|0)+d,從EA處讀取4個字節的數,並加載到rD

 

(14)lwzu rDdrA);EA=(rA)+d,從EA處讀取4個字節的數,並加載到rDrAEA,如果rA0rArD,則指令格式無效。

 

(15)lwzux rDrArBEA=(rA)+(rB),從EA處讀取4個字節的數,並加載到rDrAEA,如果rA0rArD,則指令格式無效。

 

(16)lwzx rDrArBEA=(rA|0)+(rB),從EA處讀取4個字節的數,並加載到rD

整數多字存儲/加載指令

3整數多字存儲/加載指令

 

名稱

助記符

語法格式

多字加載

lmw

rDdrA

多字存儲

stmw

rSdrA

 

 

(1)   lmw rDdrA) ;EArAd。以EA起始的n個連續的字加載到通用寄存器GPRs rDr31處,n32rDEA必須爲4的倍數,如果rA0,則指令格式無效。指令執行時間長。

(2)   stmw rSdrA) ;EArAd。把通用寄存器從GPRsrSGPRsr31,存儲到以EA起始的n個連續的字存儲器,EA必須是4的倍數。指令執行時間長。

轉移指令

4 分支控制指令

名稱

助記符

語法格式

無條件轉移

b( ba blbla)

target_addr

條件轉移

bc( bca bclbcla)

BO,BI,target_addr

條件轉移(轉移目標地址由LR指出)

bclr(bclrl)

BO,BI

條件轉移(轉移目標地址由CTR指出)

bcctr(bcctrl)

BO,BI



(1)   無條件轉移指令bxb ba bl bla

指令的編碼格式:

 

指令的語法格式:

b target_addrAA=0 LK=0

ba target_addrAA=1 LK=0

bl target_addrAA=0 LK=1

bla target_addrAA=1 LK=1

如果AA0,則轉移目標地址爲LI||0b00的值經符號位擴展後加上指令地址。(相對跳轉)

如果AA1,則轉移目標地址爲LI||0b00的值經符號擴展後的值。(絕對地址跳轉)

如果LK1,則轉移指令下一條指令的有效地址存放到連接寄存器。

(2)   條件轉移指令bcx

指令編碼格式:

條件跳轉指令皆以 bc 開頭,帶 3 個操作數,如:

bc    BO, BI, BD
bca    BO, BI, BD
bcl    BO, BI, BD
bcla   BO, BI, BD

後綴 a, l 的含義與 branch 類指令同。BO 指定跳轉的條件,5 位;BI 指定關聯的 CR 位,也是 5 位;BD 爲跳轉的立即數地址,16 位。

其中以 BO 的編碼最爲複雜(BO 從左到右編號爲 0 ~ 4):

BO[0]: 爲 1,則直接跳轉
BO[1]: 爲 1,則條件爲真時,跳轉。否則條件爲假時,跳轉
BO[2]: 爲 1,則 CTR 不自動減 1
BO[3]: 爲 1 時,則 CTR == 0 時跳轉;爲 0 時,則 CTR != 0 時跳轉
BO[4]: 靜態預測位,1 表示 unlikely,0 表示 likely

則常見的 BO 值:
0x14 (0b10100) 則表示無條件跳轉
0x0c (0b01100) 則表示 CR 的某個位爲 1 時跳轉
0x04 (0b00100) 則表示 CR 的某個位爲 0 時跳轉

至於靜態預測的策略位BO[4],

            被置爲 0黃色)或 1 (綠色) ,則其行爲爲:
I.   目標地址小於當前指令地址,預測爲 跳轉 不跳轉
II.  目標地址大於當前指令地址,預測爲 不跳轉 跳轉
III. 對於目標地址在 CTR/LR 中的條件跳轉指令,一律預測爲 不跳轉 跳轉


可以給分支指令加一個 +/- 的後綴,來簡化。加 '+' 的指令,一律預測爲跳轉。加 '-' 的分支指令,一律預測爲不跳轉。

則對於 b1,後綴 '+' 會將 y 位置 0,'-' 則將 y 位置 1。
對於 b2,後綴 '+' 會將 y 位置 1,'-' 則將 y 位置 0。
對於 b3,後綴 '+' 會將 y 位置 1,'-' 則將 y 位置 0。


BI 與關聯 CR 位的關係爲:

32 + BI

即,若 BI 爲 2,則對應於 CR[34],即爲 CR0[gt] 位。

以上針對 32 位的情形,對 64 位則使用指令 bce, bcea, bcel, bcela 功能與上同。


 

指令語法格式:

bc BO, BI,target_addrAA0LK0

bca BO, BI,target_addrAA1LK0

bcl BO, BI,target_addrAA0LK1

bcla BO, BI,target_addrAA1LK1

BI字段表示條件寄存器CR中的位用於轉移條件。BO字段操作碼定義見表5

5BO字段操作碼定義

 

BO

說明

0000y

計數器CTR減量,如果條件不成立則轉移

0001y

計數器CTR減量,如果條件不成立則轉移

001zy

如果條件不成立,則轉移

0100y

計數器CTR減量,如果條件成立則轉移

0101y

計數器CTR減量,如果條件成立則轉移

011zy

如果條件成立則轉移

1z00y

計數器CTR減量,如果CTR!=0,則發生轉移

1z01y

計數器CTR減量,如果CTR0,則發生轉移

1z1zz

發生轉移

 

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

(2)   條件轉移指令bclx(轉移目標地址由LR指出)

指令的編碼格式:

 

指令的語法格式:

bclr BO, BI(LK=0)

bclrl BO, BI(LK=1)

BI字段表示條件寄存器CR中的位用於轉移條件。

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

轉移目標地址爲LR[0-29]||0b00

如果LK1,則轉移指令下一條有效地址存放到連接寄存器。

(3)   條件轉移指令bcctrx(轉移目標地址由CTR指出)

指令的編碼格式:

 

指令的語法格式:

bcctr BO, BI(LK=0)

bcctrl BO, BI(LK=1)

轉移目標地址是CTR||0b00

如果LK1,則轉移指令下一條指令的有效地址存放到連接寄存器。

如果減量計數器(BO[2]=0),指令格式無效,則轉移到目標地址。

特殊寄存器傳送指令

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

6特殊寄存器傳送指令

 

名稱

助記符

語法格式

讀取機器狀態寄存器

mfmsr

rD

寫入機器狀態寄存器

mtmsr

rS

讀取特殊功能寄存器

mfspr

rD, SPR

寫入特殊功能寄存器

mtspr

SPR, rS

讀取段寄存器

mfsr

rD, SR

寫入段寄存器

mtsr

SR, rS

間接讀取段寄存器

mfsrin

rD, rB

間接寫入段寄存器

mtsrin

rS, rB

讀取時基寄存器

mftb

rD, TBR

 

(1)   讀取機器狀態寄存器指令mfmsr

  指令的編碼格式:

 

  指令的語法格式:

mfmsr rD

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

2)寫入機器狀態寄存器指令mtmsr

指令的編碼格式:

 

指令的語法格式:

mtmsr rS

rS的內容存入MSR中,這是超級用戶指令。

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

指令的編碼格式:

 

指令的語法格式:

mfspr rDSPR

指令操作:

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

rD<spr(n)

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

7 Power PC UISASPR編碼

 

 

spr

 

寄存器名

編碼n

spr[5-9]

spr[0-4]

 

1

00000

00001

XER

8

00000

01000

LR

9

00000

01001

CR

 

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

指令的編碼格式:

 

指令的語法格式:

mtspr sprrS

rS的內容存入到指定的特殊功能寄存器中。

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

指令的編碼格式:

指令的語法格式:

   mfsr rDSR

指令操作:

rD<SEGREGSR

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

(4)   寫入段寄存器指令mtsr

指令的編碼格式:

 

指令的語法格式:

mtsr SRrS

rS中的內容讀入SR,這是一個超級用戶層指令。

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

指令的編碼格式:

 

指令的語法格式:

mfsrin rDrB

指令操作:

rD<SEGREGrB[0-3]

rB寄存器的03位選取的段寄存器的內容,複製到rDzhong。這是一個超級用戶層指令。

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

指令的編碼格式:

 

指令的語法格式:

mtsrin rSrB

指令操作:

SEGREGrB[0-3]<—(rS

rS中的內容複製到由rB03位所指定的寄存器中。這是一個超級用戶層指令。

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

指令的編碼格式:

 

指令的語法格式:

mftb rDTBR

指令操作:

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

if n=268 then

rD<TBL

else if n=269 then

rD<TBU

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

8指令mftbTBR編碼

 

 

TBR

 

寄存器名

訪問

編碼

tbr[5-9]

tbr[0-4]

 

 

268

01000

01100

TBL

用戶

269

01000

01101

TBR

用戶

 

系統調用指令

(1)   系統調用指令sc

指令的編碼格式:

 

指令的使用:

sc指令調用操作系統去執行服務程序。當控制返回到一個執行系統調用的程序時,寄存器的內容依賴於程序提供的系統所使用的寄存器的約定。

跟在sc指令後面的有效指令地址被放在SRR0中。MSR中的位0591631被放在SRR1中對應的位置,SRR1中位141015被設置爲未定義值。當sc異常產生,異常處理程序更改MSR寄存器。異常處理程序到MSR[IP]形成基址加0xC00偏移量形成的地址去取下一條指令。

受影響的寄存器有:

依賴於系統服務、SRR0SRR1MSR

(2)   中斷返回指令rfi

指令的編碼格式:

 

指令操作:

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

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

SRR1中的位0591631被放在MSR中對應的位置。如果新的MSR值沒有使能任何未完的操作,則在MSR的控制下,從地址SRR0[0-29]||0b00取下一條指令。

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

PowerPC彙編基礎篇

PowerPC正用於和曾經用於 IBM服務器, 蘋果電腦,任天堂Gamecube遊戲機

Gekko 芯片用在了任天堂的 GameCube 中,Xenon 則用在了 Microsoft 的 Xbox 360中。Cell Broadband Engine 是近來嶄露頭角的一種體系結構,使用 PowerPC指令,並且具有八個向量處理器。Sony PlayStation 3 將使用 Cell,考慮到 PlayStation 3將用於廣泛的多媒體應用程序,因此還使用爲數衆多的其他向量。

PowerPC 指令集比 POWER 處理器系列更加有用。指令集本身可以 64 位模式操作,也可以簡化的 32位模式操作。POWER5 處理器支持這兩種模式,POWER5 上的 Linux 發佈版支持爲 32 位和 64 位 PowerPC指令集而編譯的應用程序。

應用程序二進制接口(ABI)

PPC32 Linux和NetBSD使用 SVR4 ABI
PPC64 Linux和AIX   使用 PowerOpenABi

SVR4 ABI
1)傳參數從 GPR3 開始
2)GPR3-GPR12 是容易失去的寄存器。如果需要,在調用子例程之前,必須先保存並在返回後恢復.

PowerPC 寄存器有編號,而沒有名稱。對於初學者來說,有時這會使人混淆,因爲 tts無法輕易地與寄存器區分開。3可以表示數值3或者寄存器 gpr3 ,或者浮點 fpr3 ,或者特殊用途的寄存器 spr3。習慣了就好了。:)
但是,在GDB的反彙編中, 寄存器是用 r3 表示的

通用寄存器

r0 跟stack frame有關係, 當建立stack frame時,用來保存舊的LR
r1 stack pointer
r2 toc(table of content)指針
r3 第一個參數, 返回值也放在這個寄存器

r11 常用做指針

專用寄存器

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

常用指令

li REG, VALUE
加載寄存器 REG,數字爲 VALUE

add REGA, REGB, REGC
將 REGB 與 REGC 相加,並將結果存儲在 REGA 中

addi REGA, REGB, VALUE
將數字 VALUE 與 REGB 相加,並將結果存儲在 REGA 中

mr REGA, REGB
將 REGB 中的值複製到 REGA 中

or REGA, REGB, REGC
對 REGB 和 REGC 執行邏輯 “或” 運算,並將結果存儲在 REGA 中

ori REGA, REGB, VALUE
對 REGB 和 VALUE 執行邏輯 “或” 運算,並將結果存儲在 REGA 中

and, andi, xor, xori, nand, nand, and nor
其他所有此類邏輯運算都遵循與 “or” 或 “ori” 相同的模式

ld REGA, 0(REGB)
使用 REGB 的內容作爲要載入 REGA 的值的內存地址

lbz, lhz, and lwz
它們均採用相同的格式,但分別操作字節、半字和字(“z” 表示它們還會清除該寄存器中的其他內容)

b ADDRESS
跳轉(或轉移)到地址 ADDRESS 處的指令

bl ADDRESS
對地址 ADDRESS 的子例程調用

cmpd REGA, REGB
比較 REGA 和 REGB 的內容,並恰當地設置狀態寄存器的各位

beq ADDRESS
若之前比較過的寄存器內容等同,則跳轉到 ADDRESS

bne, blt, bgt, ble, and bge
它們均採用相同的形式,但分別檢查不等、小於、大於、小於等於和大於等於

std REGA, 0(REGB)
使用 REGB 的地址作爲保存 REGA 的值的內存地址

stb, sth, and stw
它們均採用相同的格式,但分別操作字節、半字和字

sc
對內核進行系統調用

所有計算值的指令均以第一個操作數作爲目標寄存器。在所有這些指令中,寄存器都僅用數字指定。例如,將數字12 載入寄存器 5 的指令是 li 5, 12。我們知道,5 表示一個寄存器,12 表示數字12,原因在於指令格式(因爲li第一個操作數就是寄存器,第2個是立即數)。

在某些指令中,GPR0 只是代表數值 0,而不會去查找 GPR0的內容。

一個最簡單的例子

.globl .main

.main:
        li 3, 5

        blr

保存爲 simple.s
用gcc來彙編連接
$gcc simple.s -o simple
$./simple
$ echo $?
5
說明上次運行的程序,返回值是5

發佈了34 篇原創文章 · 獲贊 19 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章