PPC 指令集

一、存儲/加載指令

1 整數存儲指令

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

表2 整數存儲指令

 

名稱

助記符

語法格式

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

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 rS,d(rA)  

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

 

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

stbx rS,rA,rB

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

 

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

stub rS,d(rA)

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

 

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

stbux rS,rA,rB

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

 

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

sth rS,d(rA)

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

 

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

sthu rS,d(rA)

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

 

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

stw rS,d(rA)

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

 

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

stwu rS,d(rA)

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

 

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

stwux rS,rA,rB

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

 

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

stwx rS,rA,rB

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

二、整數加載指令

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

名稱

助記符

語法格式

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

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位到rD,rD的其他位清0。不影響其他寄存器。

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

 

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

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

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

 

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

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

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

 

(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,如果rA=0或者rA=rD,則指令格式無效。

 

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

 

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

 

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

 

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

 

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

 

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

 

 三、整數多字存儲/加載指令 

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

 

名稱

助記符

語法格式

多字加載

lmw

rD,d(rA)

多字存儲

stmw

rS,d(rA)

 

 

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

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

轉移指令

表4 分支控制指令

名稱

助記符

語法格式

無條件轉移

b( ba bl bla)

target_addr

條件轉移

bc( bca bcl bcla)

BO,BI,target_addr

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

bclr(bclrl)

BO,BI

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

bcctr(bcctrl)

BO,BI

(1)    無條件轉移指令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,則轉移目標地址爲LI||0b00的值經符號位擴展後加上指令地址。

如果AA=1,則轉移目標地址爲LI||0b00的值經符號擴展後的值。

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

(1)    條件轉移指令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中的位用於轉移條件。BO字段操作碼定義見表5。

表5 BO字段操作碼定義

 

BO

說明

0000y

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

0001y

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

001zy

如果條件不成立,則轉移

0100y

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

0101y

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

011zy

如果條件成立則轉移

1z00y

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

1z01y

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

1z1zz

發生轉移

 

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

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

指令的編碼格式:

 

指令的語法格式:

bclr BO, BI(LK=0)

bclrl BO, BI(LK=1)

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

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

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

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

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

指令的編碼格式:

 

指令的語法格式:

bcctr BO, BI(LK=0)

bcctrl BO, BI(LK=1)

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

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

如果減量計數器(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 rD,SPR

指令操作:

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

rD<—spr(n)

特殊功能寄存器(SPR)的編碼如表7所示,將SPR的內容存入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的內容存入到指定的特殊功能寄存器中。

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

指令的編碼格式:

指令的語法格式:

    mfsr rD,SR

指令操作:

rD<—SEGREG(SR)

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

 

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

指令的編碼格式:

 

指令的語法格式:

mtsr SR,rS

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

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

指令的編碼格式:

 

指令的語法格式:

mfsrin rD,rB

指令操作:

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

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

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

指令的編碼格式:

 

指令的語法格式:

mtsrin rS,rB

指令操作:

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

將rS中的內容複製到由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

用戶

 

系統調用指令

(1)    系統調用指令sc

指令的編碼格式:

 

指令的使用:

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

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

受影響的寄存器有:

依賴於系統服務、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中對應的位置。如果新的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   使用 PowerOpen ABi

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

 

轉載:http://blog.sina.com.cn/s/blog_43e437d50100ehrl.html

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