Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1908340
  • 博文数量: 376
  • 博客积分: 2147
  • 博客等级: 大尉
  • 技术积分: 3642
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-06 10:47
文章分类

全部博文(376)

文章存档

2019年(3)

2017年(28)

2016年(15)

2015年(17)

2014年(182)

2013年(16)

2012年(115)

我的朋友

分类: 嵌入式

2014-03-11 16:33:03

PowerPC 体系结构规范(PowerPC Architecture Specification)发布于 1993 年,它是一个 64 位规范 ( 也包含 32 位子集 )。几乎所有常规可用的 PowerPC(除了新型号 IBM RS/6000 和所有 IBM pSeries 高端服务器)都是 32 位的。

PowerPC 处理器有 32 个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC(程序计数器,也称为 IAR/指令地址寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它寄存器。有些 PowerPC CPU 还有 32 个 64 位 FPR(浮点寄存器)。MPC555使用的PowerPC CPU是带有FPR的。一些常用寄存器介绍如下:

通用寄存器的用途:

r0   在函数开始(function prologs)时使用。

r1   堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。

r2   内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。系统调用时,它包含系统调用号(这个好像跟系统有关吧)。

r3   作为第一个参数和返回值。

r4-r10 函数或系统调用开始的参数。

r11   用在指针的调用和当作一些语言的环境指针。

r12   它用在异常处理和glink(动态连接器)代码。

r13   保留作为系统线程ID。

r14-r31 作为本地变量,非易失性。

专用寄存器的用途:

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

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

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

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

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

寄存器r1、r14-r31是非易失性的,这意味着它们的值在函数调用过程保持不变。寄存器r2也算非易失性,但是只有在调用函数在调用后必须恢复它的值时才被处理。

寄存器r0、r3-r12和特殊寄存器lr、ctr、xer、fpscr是易失性的,它们的值在函数调用过程中会发生变化。此外寄存器r0、r2、r11和r12可能会被交叉模块调用改变,所以函数在调用的时候不能采用它们的值。

条件代码寄存器字段cr0、cr1、cr5、cr6和cr7是易失性的。cr2、cr3和cr4是非易失性的,函数如果要改变它们必须保存并恢复这些字段。

在 AIX上,svca指令(sc是PowerPC的助记符)用来表示系统调用,r2寄存器指 定系统调用号,r3-r10寄存器是给该系统调用的参数。在执行系统调用指令之前有两个额外的先决条件:LR寄存器必须保存返回系统调用地址的值并且在系 统调用前执行crorc cr6, cr6, cr6指令(?)。



异常处理器

整数异常寄存器XER是一个特殊功能寄存器,它包括一些对增加计算精度有用的信息和出错信息。XER的格式如下:

SO为总体溢出标志:一旦有溢出位OV置位,SO就会置位。

OV为溢出标志:当发生溢出时置位,否则清零;在作乘法或除法运算时,如果结果超过寄存器的表达范围,则溢出置位。

CA为进位标志:当最高位产生进位时,置位,否则清零;扩展精度指令(后述)可以用CA作为操作符参与运算。


存储/加载指令

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


(1) 字节存储指令stb(偏移地址寻址)

stb rS,d(rA)

有效地址为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的存储器中。


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


(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,则转移指令下一条指令的有效地址存放到连接寄存器。

阅读(9758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~