PPC指令集.docx

上传人:b****2 文档编号:23454467 上传时间:2023-05-17 格式:DOCX 页数:25 大小:27.54KB
下载 相关 举报
PPC指令集.docx_第1页
第1页 / 共25页
PPC指令集.docx_第2页
第2页 / 共25页
PPC指令集.docx_第3页
第3页 / 共25页
PPC指令集.docx_第4页
第4页 / 共25页
PPC指令集.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

PPC指令集.docx

《PPC指令集.docx》由会员分享,可在线阅读,更多相关《PPC指令集.docx(25页珍藏版)》请在冰豆网上搜索。

PPC指令集.docx

PPC指令集

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(偏移地址寻址)

stbrS,d(rA)

有效地址(EffectAddr)为rA的内容加d,rS的低8位内容存储到有效地址为EA的存储器中。

(2)字节存储指令stbx(寄存器寻址)

stbxrS,rA,rB

有效地址为rA的内容加上rB的内容,rS的低8位内容存储到有效地址为EA的存储器中。

(3)记录有效地址的字节存储指令stbu(偏移地址寻址)

stubrS,d(rA)

有效地址EA=(rA)+d,rS的低8位内容存储到有效地址为EA的存储器中。

rA=EA,如果rA=0,则指令无效。

(4)记录有效地址的字节存储指令stbux(寄存器寻址)

stbuxrS,rA,rB

有效地址EA=(rA)+(rB),rS的低8位内容存储到有效地址为EA的存储器中,rA=EA,如果rA=0,则指令无效。

(5)半字存储指令sth(偏移地址寻址)

sthrS,d(rA)

有效地址EA=(rA)+d,rS的低16位内容存储到有效地址为EA的存储器中。

(6)记录有效地址的半字存储指令sthu(偏移地址寻址)

sthurS,d(rA)

有效地址EA=(rA)+d,rS的低16位内容存储到有效地址为EA的存储器中。

rA=EA,如果rA=0,则指令无效。

(7)字存储指令stw(偏移地址寻址)

stwrS,d(rA)

有效地址EA=(rA)+d,rS的32位内容存储到有效地址为EA的存储器中。

(8)记录有效地址的字存储指令stwu(偏移地址寻址)

stwurS,d(rA)

有效地址EA=(rA)+d,rS的32位内容存储到有效地址为EA的存储器中,rA=EA,如果rA=0,则指令无效。

(9)记录有效地址的字存储指令stwux(寄存器寻址)

stwuxrS,rA,rB

有效地址EA=(rA)+(rB),rS的32位内容存储到有效地址为EA的存储器中。

rA=EA,如果rA=0,则指令无效。

(10)字存储指令stwx(寄存器寻址)

stwxrS,rA,rB

有效地址EA=(rA)+(rB),rS的32位内容存储到有效地址为EA的存储器中。

2、整数加载指令

整数加载指令如表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)lbzrD,d(rA);EA=(rA|0)+d。

从存储器读取EA地址的内容,并加载低8位到rD,rD的其他位清0。

不影响其他寄存器。

(2)lbzurD,d(rA);EA=(rA)+d。

从存储器读取EA地址一个字节的内容,并加载低8位到rD,rD的其他各位清零,有效地址EA存放在rA中。

(3)lbzuxrD,rA,rB;EA=(rA)+(rB)。

从存储器读取EA地址一个字节的内容,并加载低8位到rD,rD的其他各位清零,EA存放在rA中。

如果rA=0或者rA=rD,则指令无效。

(4)lbzxrD,rA,rB;EA=(rA|0)+(rB)。

从存储器读取EA地址一个字节的内容,并加载低8位到rD,rD的其他各位清0。

(5)lharD,d(rA);EA=(rA|0)+d。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD的其他位填充最高位的值。

(6)lhaxrD,rA,rB;EA=(rA)+(rB)。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD的其他位填充最高位的值。

(7)lhaurD,d(rA);EA=(rA)+d。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD的其他位填充最高位的值。

EA存放在rA中,如果rA=0或者rA=rD,则指令格式无效。

(8)lhauxrD,rA,rB;EA=(rA)+(rB)。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD的其他位填充最高位的值。

EA存放在rA中,如果rA=0或者rA=rD,则指令格式无效。

(9)lhzrD,d(rA);EA=(rA|0)+d。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD的其他位清零。

(10)lhzurD,d(rA);EA=(rA|0)+d。

从存储器EA处读取两个字节的数,并加载到rD的低16位。

rD其他位清零。

EA存入rA,如果rA=0或者rA=rD,则指令格式无效。

(11)lhzuxrD,rA,rB;EA=(rA)+(rB)。

从存储器EA处读取两个字节的数,加载到rD的低16位,rD其他位清零。

EA存入rA,如果rA=0或者rA=rD,则指令格式无效。

(12)lhzxrD,rA,rB;EA=(rA|0)+(rB),从EA处读取两个字节的数,并加载到rD的低16位,将rD的其他位清零。

(13)lwzrD,d(rA);EA=(rA|0)+d,从EA处读取4个字节的数,并加载到rD。

(14)lwzurD,d(rA);EA=(rA)+d,从EA处读取4个字节的数,并加载到rD。

rA=EA,如果rA=0或rA=rD,则指令格式无效。

(15)lwzuxrD,rA,rB;EA=(rA)+(rB),从EA处读取4个字节的数,并加载到rD。

rA=EA,如果rA=0或rA=rD,则指令格式无效。

(16)lwzxrD,rA,rB;EA=(rA|0)+(rB),从EA处读取4个字节的数,并加载到rD。

整数多字存储/加载指令

表3整数多字存储/加载指令

名称

助记符

语法格式

多字加载

lmw

rD,d(rA)

多字存储

stmw

rS,d(rA)

(1)lmwrD,d(rA);EA=rA+d。

以EA起始的n个连续的字加载到通用寄存器GPRsrD到r31处,n=32-rD。

EA必须为4的倍数,如果rA=0,则指令格式无效。

指令执行时间长。

(2)stmwrS,d(rA);EA=rA+d。

把通用寄存器从GPRsrS到GPRsr31,存储到以EA起始的n个连续的字存储器,EA必须是4的倍数。

指令执行时间长。

转移指令

表4分支控制指令

名称

助记符

语法格式

无条件转移

b(bablbla)

target_addr

条件转移

bc(bcabclbcla)

BO,BI,target_addr

条件转移(转移目标地址由LR指出)

bclr(bclrl)

BO,BI

条件转移(转移目标地址由CTR指出)

bcctr(bcctrl)

BO,BI

(1)无条件转移指令bx(bbablbla)

指令的编码格式:

指令的语法格式:

btarget_addr(AA=0LK=0)

batarget_addr(AA=1LK=0)

bltarget_addr(AA=0LK=1)

blatarget_addr(AA=1LK=1)

如果AA=0,则转移目标地址为LI||0b00的值经符号位扩展后加上指令地址。

如果AA=1,则转移目标地址为LI||0b00的值经符号扩展后的值。

如果LK=1,则转移指令下一条指令的有效地址存放到连接寄存器。

(1)条件转移指令bcx

指令编码格式:

指令语法格式:

bcBO,BI,target_addr(AA=0LK=0)

bcaBO,BI,target_addr(AA=1LK=0)

bclBO,BI,target_addr(AA=0LK=1)

bclaBO,BI,target_addr(AA=1LK=1)

BI字段表示条件寄存器CR中的位用于转移条件。

BO字段操作码定义见表5。

表5BO字段操作码定义

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指出)

指令的编码格式:

指令的语法格式:

bclrBO,BI(LK=0)

bclrlBO,BI(LK=1)

BI字段表示条件寄存器CR中的位用于转移条件。

BO字段操作码定义如表5所示。

转移目标地址为LR[0-29]||0b00。

如果LK=1,则转移指令下一条有效地址存放到连接寄存器。

(3)条件转移指令bcctrx(转移目标地址由CTR指出)

指令的编码格式:

指令的语法格式:

bcctrBO,BI(LK=0)

bcctrlBO,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

指令的编码格式:

指令的语法格式:

mfmsrrD

读取MSR的内容放入rD中,这是超级用户层指令,不影响其他寄存器。

(2)写入机器状态寄存器指令mtmsr

指令的编码格式:

指令的语法格式:

mtmsrrS

把rS的内容存入MSR中,这是超级用户指令。

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

指令的编码格式:

指令的语法格式:

mfsprrD,SPR

指令操作:

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

rD<—spr(n)

特殊功能寄存器(SPR)的编码如表7所示,将SPR的内容存入rD中。

表7PowerPCUISASPR编码

spr

寄存器名

编码n

spr[5-9]

spr[0-4]

1

00000

00001

XER

8

00000

01000

LR

9

00000

01001

CR

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

指令的编码格式:

指令的语法格式:

mtsprspr,rS

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

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

指令的编码格式:

指令的语法格式:

mfsrrD,SR

指令操作:

rD<—SEGREG(SR)

将段寄存器SR的内容读入rD中,这是一个超级用户层指令。

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

指令的编码格式:

指令的语法格式:

mtsrSR,rS

将rS中的内容读入SR,这是一个超级用户层指令。

(2)间接读取段寄存器指令mfsrin

指令的编码格式:

指令的语法格式:

mfsrinrD,rB

指令操作:

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

由rB寄存器的0~3位选取的段寄存器的内容,复制到rDzhong。

这是一个超级用户层指令。

(3)间接写入段寄存器指令mtsrin

指令的编码格式:

指令的语法格式:

mtsrinrS,rB

指令操作:

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

将rS中的内容复制到由rB的0~3位所指定的寄存器中。

这是一个超级用户层指令。

(4)读取时基寄存器指令mftb

指令的编码格式:

指令的语法格式:

mftbrD,TBR

指令操作:

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

ifn=268then

rD<—TBL

elseifn=269then

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<—ieaSRR0[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的Xbox360中。

CellBroadbandEngine是近来崭露头角的一种体系结构,使用PowerPC指令,并且具有八个向量处理器。

SonyPlayStation3将使用Cell,考虑到PlayStation3将用于广泛的多媒体应用程序,因此还使用为数众多的其他向量。

PowerPC指令集比POWER处理器系列更加有用。

指令集本身可以64位模式操作,也可以简化的32位模式操作。

POWER5处理器支持这两种模式,POWER5上的Linux发布版支持为32位和64位PowerPC指令集而编译的应用程序。

应用程序二进制接口(ABI)

PPC32Linux和NetBSD使用SVR4ABI

PPC64Linux和AIX使用PowerOpenABi

SVR4ABI

1)传参数从GPR3开始

2)GPR3-GPR12是容易失去的寄存器。

如果需要,在调用子例程之前,必须先保存并在返回后恢复.

PowerPC寄存器有编号,而没有名称。

对于初学者来说,有时这会使人混淆,因为tts无法轻易地与寄存器区分开。

3可以表示数值3或者寄存器gpr3,或者浮点fpr3,或者特殊用途的寄存器spr3。

习惯了就好了。

:

但是,在GDB的反汇编中,寄存器是用r3表示的

通用寄存器

r0跟stackframe有关系,当建立stackframe时,用来保存旧的LR

r1stackpointer

r2toc(tableofcontent)指针

r3第一个参数,返回值也放在这个寄存器

r11常用做指针

专用寄存器

lr链接寄存器,它用来存放函数调用结束处的返回地址。

ctr计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。

xer定点异常寄存器,存放整数运算操作的进位以及溢出信息。

msr机器状态寄存器,用来配置微处理器的设定。

cr条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。

常用指令

liREG,VALUE

加载寄存器REG,数字为VALUE

addREGA,REGB,REGC

将REGB与REGC相加,并将结果存储在REGA中

addiREGA,REGB,VALUE

将数字VALUE与REGB相加,并将结果存储在REGA中

mrREGA,REGB

将REGB中的值复制到REGA中

orREGA,REGB,REGC

对REGB和REGC执行逻辑“或”运算,并将结果存储在REGA中

oriREGA,REGB,VALUE

对REGB和VALUE执行逻辑“或”运算,并将结果存储在REGA中

and,andi,xor,xori,nand,nand,andnor

其他所有此类逻辑运算都遵循与“or”或“ori”相同的模式

ldREGA,0(REGB)

使用REGB的内容作为要载入REGA的值的内存地址

lbz,lhz,andlwz

它们均采用相同的格式,但分别操作字节、半字和字(“z”表示它们还会清除该寄存器中的其他内容)

bADDRESS

跳转(或转移)到地址ADDRESS处的指令

blADDRESS

对地址ADDRESS的子例程调用

cmpdREGA,REGB

比较REGA和REGB的内容,并恰当地设置状态寄存器的各位

beqADDRESS

若之前比较过的寄存器内容等同,则跳转到ADDRESS

bne,blt,bgt,ble,andbge

它们均采用相同的形式,但分别检查不等、小于、大于、小于等于和大于等于

stdREGA,0(REGB)

使用REGB的地址作为保存REGA的值的内存地址

stb,sth,andstw

它们均采用相同的格式,但分别操作字节、半字和字

sc

对内核进行系统调用

所有计算值的指令均以第一个操作数作为目标寄存器。

在所有这些指令中,寄存器都仅用数字指定。

例如,将数字12载入寄存器5的指令是li5,12。

我们知道,5表示一个寄存器,12表示数字12,原因在于指令格式(因为li第一个操作数就是寄存器,第2个是立即数)。

在某些指令中,GPR0只是代表数值0,而不会去查找GPR0的内容。

一个最简单的例子

.globl.main.main:

li3,5blr

保存为simple.s

用gcc来汇编连接

$gccsimple.s-osimple

$./simple

$echo$?

5

说明上次运行的程序,返回值是5

看懂PowerPC汇编之指令集架构

  看懂PowerPC汇编,需要如下3方面的知识:

  1.PowerPC指令集架构即PowerISA,可以从Power.org获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符;

  2.PowerPCABI即应用程序二进制接口,即寄存器的使用规范和栈调用结构;

  3.PowerPCPseudo-ops,即.text,.alignn等汇编语言中常用的伪操作符。

  PowerPCISA分为3个级别即“Book”,分别对应于用户指令集体系结构,虚拟环境体系结构和操作环境体系结构。

其中BookIII分化出了服务器版本BookIII-S(经典PowerPC架构)和嵌入式版本BookIII-E(专门为嵌入式优化的版本)。

  1.寄存器定义:

  PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。

其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(CR),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。

PPC4xx系列处理器还有DCR寄存器,需要用专门的指令访问。

这里有两点需要注意:

  1.PowerPC处理器可以运行于两个级别,即用户模式

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1