PowerPC汇编指令集文档格式.docx
- 文档编号:19144103
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:19
- 大小:26.67KB
PowerPC汇编指令集文档格式.docx
《PowerPC汇编指令集文档格式.docx》由会员分享,可在线阅读,更多相关《PowerPC汇编指令集文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
ppc32Linux和NetBSD实现使用SVR4(SystemVR4)ABI,而ppc64Linux仿效了AIX,使用PowerOpenABI。
ABI还指定当调用子例程时哪些寄存器被认为是易失型的(调用者保存(caller-save))以及哪些被认为是非易失型的(被调用者保存(callee-save)),以及许多其它内容。
SVR4ABI指定了一些行为的具体示例:
-由于PowerPC拥有如此多的GPR(32个,而相比之下IA32只有8个),所以传递参数的寄存器从gpr3开始。
-寄存器gpr3到gpr12是易失型的(调用者保存)寄存器,如果需要的话,在调用子例程之前必须先保存它们并在返回之后恢复它们。
-寄存器gpr1用来作为栈帧指针。
指令格式
PowerPC
指令包括操作码和操作数两部分,PowerPC支持三操作数的指令格式。
如算术指令:
addrD,rA,rB
表示把(rA)+(rB)的和存放到rD寄存器中。
注意:
指令中的点号“.”表示:
指令将更新条件寄存器CR0。
如,rA,rB。
指令中的字母“c”表示:
指令显示说明结果影响XER寄存器中的进位位[CA],如addcrD,rA,rB。
指令中的字母“e”表示:
在指令中把XER[CA]中的数据作为一个操作数,并在XER[CA]位记录进位位,如adderD,rA,rB
指令中的字母“o”表示:
溢出标志。
对于整数,在XER[OA]位记录溢出和在CR0[SO]记录溢出位,如addorD,rA,rB
条件寄存器
条件寄存器CR包括8个4bit的字段,即CR0~CR7。
每个字段可以表示整数运算或比较的结果。
每个条件字段可以记录比较结果,即大于、小于、等于和总体溢出等。
条件寄存器格式如图1所示。
异常处理器
整数异常寄存器XER是一个特殊功能寄存器,它包括一些对增加计算精度有用的信息和出错信息。
XER的格式如下:
SO为总体溢出标志:
一旦有溢出位OV置位,SO就会置位。
OV为溢出标志:
当发生溢出时置位,否则清零;
在作乘法或除法运算时,如果结果超过寄存器的表达范围,则溢出置位。
CA为进位标志:
当最高位产生进位时,置位,否则清零;
扩展精度指令(后述)可以用CA作为操作符参与运算。
存储/加载指令
1整数存储指令
整数存储指令如表2所示。
表2整数存储指令
名称
助记符
语法格式
字节存储(偏移地址寻址)
stb
rS,d(rA)
字节存储(寄存器寻址)
stbx
rS,rA,rB
记录有效地址的字节存储(偏移地址寻址)
stbu
记录有效地址的字节存储(寄存器寻址)
stbux
半字存储(偏移地址寻址)
sth
半字存储(寄存器寻址)
sthx
记录有效地址的半字存储(偏移地址寻址)
sthu
记录有效地址的半字存储(寄存器寻址)
sthux
字存储(偏移地址寻址)
stw
字存储(寄存器寻址)
stwx
记录有效地址的字存储(偏移地址寻址)
stwu
记录有效地址的字存储(寄存器寻址)
stwux
(1)字节存储指令stb(偏移地址寻址)
stbrS,d(rA)
有效地址为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)
(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的存储器中。
(10)字存储指令stwx(寄存器寻址)
stwxrS,rA,rB
2、整数加载指令
整数加载指令如表3所示。
高位清零加载字节指令(偏移地址寻址)
lbz
rD,d(rA)
高位清零的加载字节指令(寄存器寻址)
lbzx
rD,rA,rB
高位清零的加载字节并记录有效地址指令(偏移地址寻址)
lbzu
高位清零的加载字节并记录有效地址指令(寄存器寻址)
lbzux
高位清零的加载半字指令(偏移地址寻址)
lhz
高位清零的加载半字指令(寄存器寻址)
lhzx
高位清零的加载半字并记录有效地址指令(偏移地址寻址)
lhzu
高位清零的加载半字并记录有效地址指令(寄存器寻址)
lhzux
加载半字指令(偏移地址寻址)
lha
加载半字指令(寄存器寻址)
lhax
加载半字并记录有效地址指令(偏移地址寻址)
lhau
加载半字并记录有效地址指令(寄存器寻址)
lhaux
加载字指令(偏移地址寻址)
lwz
加载字指令(寄存器寻址)
lwzx
加载字并记录有效地址指令(偏移地址寻址)
lwzu
加载字并记录有效地址指令(寄存器寻址)
lwzux
(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处读取两个字节的数,并加载到rD的低16位。
rD的其他位填充最高位的值。
(6)lhaxrD,rA,rB;
(7)lhaurD,d(rA);
EA存放在rA中,如果rA=0或者rA=rD,则指令格式无效。
(8)lhauxrD,rA,rB;
(9)lhzrD,d(rA);
rD的其他位清零。
(10)lhzurD,d(rA);
rD其他位清零。
EA存入rA,如果rA=0或者rA=rD,则指令格式无效。
(11)lhzuxrD,rA,rB;
从存储器EA处读取两个字节的数,加载到rD的低16位,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。
(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);
把通用寄存器从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)
(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
001zy
如果条件不成立,则转移
0100y
计数器CTR减量,如果条件成立则转移
0101y
011zy
如果条件成立则转移
1z00y
计数器CTR减量,如果CTR!
=0,则发生转移
1z01y
计数器CTR减量,如果CTR=0,则发生转移
1z1zz
发生转移
注:
位z表示该位可以被忽略,位y表示是不是条件转移
(2)条件转移指令bclx(转移目标地址由LR指出)
bclrBO,BI(LK=0)
bclrlBO,BI(LK=1)
BO字段操作码定义如表5所示。
转移目标地址为LR[0-29]||0b00。
如果LK=1,则转移指令下一条有效地址存放到连接寄存器。
(3)条件转移指令bcctrx(转移目标地址由CTR指出)
bcctrBO,BI(LK=0)
bcctrlBO,BI(LK=1)
转移目标地址是CTR||0b00。
如果减量计数器(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
01000
LR
9
01001
CR
(2)写入特殊功能寄存器指令mtspr
mtsprspr,rS
把rS的内容存入到指定的特殊功能寄存器中。
(3)读取段寄存器指令mfsr
mfsrrD,SR
—SEGREG(SR)
将段寄存器SR的内容读入rD中,这是一个超级用户层指令。
(1)写入段寄存器指令mtsr
mtsrSR,rS
将rS中的内容读入SR,这是一个超级用户层指令。
(2)间接读取段寄存器指令mfsrin
mfsrinrD,rB
—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
—tbr[5-9]||tbr[0-4]
ifn=268then
—TBL
elseifn=269then
—TBU
该指令的TBR编码如表8所示。
表8指令mftb的TBR编码
TBR
访问
编码
tbr[5-9]
tbr[0-4]
268
01100
TBL
用户
269
01101
系统调用指令
(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汇编,需要如下3方面的知识:
指令集架构即PowerISA,可以从获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符;
即应用程序二进制接口,即寄存器的使用规范和栈调用结构;
,即.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寄存器,需要用专门的指令访问。
这里有两点需要注意:
处理器可以运行于两个级别,即用户模式和特权模式。
用户模式下,仅有GPR,FPR,CR,FPSCR,LR,CTR,XER以及TBL/TBU可以访问。
从开始,DCR寄存器也可以在通过用户模式DCR访问指令进行访问。
处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。
2.数据模型:
PowerPC支持如下数据格式:
byte,halfword,word,doubleword,quadword,同时默认支持big-endian
PowerPC习惯,msb(最高有效位)为bit0,lsb为bit31.
3.寻址方式
PowerPC没有专门的IO操作指令,所有地址访问一视同仁,并且只支持地址和寄存器
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PowerPC 汇编 指令