Chinaunix首页 | 论坛 | 博客
  • 博客访问: 496943
  • 博文数量: 174
  • 博客积分: 2502
  • 博客等级: 少校
  • 技术积分: 1923
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-28 09:47
文章分类

全部博文(174)

文章存档

2011年(8)

2010年(16)

2009年(68)

2008年(82)

我的朋友

分类:

2009-05-14 13:20:42

 

PowerPC简介

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   条件寄存器,它分成84位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。

 

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

寄存器r0r3-r12和特殊寄存器lrctrxerfpscr是易失性的,它们的值在函数调用过程中会发生变化。此外寄存器r0r2r11r12可能会被交叉模块调用改变,所以函数在调用的时候不能采用它们的值。

条件代码寄存器字段cr0cr1cr5cr6cr7是易失性的。cr2cr3cr4是非易失性的,函数如果要改变它们必须保存并恢复这些字段。

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

ABI

从技术而言,开发人员可以将任一 GPR 用于任何操作。例如,由于不存在:“堆栈指针寄存器”,为此程序员就可以使用任何寄存器。实际上,定义一组约定很有用,这样二进制对象就可以与不同的编译器和预先编写好的汇编代码进行互操作。

调用约定是由使用的 ABI(应用程序二进制接口)决定的。ppc32 Linux NetBSD 实现使用 SVR4System V R4ABI,而 ppc64 Linux 仿效了 AIX,使用 PowerOpen ABIABI 还指定当调用子例程时哪些寄存器被认为是易失型的(调用者保存(caller-save))以及哪些被认为是非易失型的(被调用者保存(callee-save)),以及许多其它内容。

SVR4 ABI 指定了一些行为的具体示例:

-由于 PowerPC 拥有如此多的 GPR32 个,而相比之下 IA32 只有 8 个),所以传递参数的寄存器从 gpr3 开始。

-寄存器 gpr3 gpr12 是易失型的(调用者保存)寄存器,如果需要的话,在调用子例程之前必须先保存它们并在返回之后恢复它们。

       -寄存器 gpr1 用来作为栈帧指针。

指令格式

PowerPC

指令包括操作码和操作数两部分,PowerPC支持三操作数的指令格式。如算术指令:

add rDrArB

表示把(rA)+(rB)的和存放到rD寄存器中。

注意:

指令中的点号“.”表示:指令将更新条件寄存器CR0。如add. rDrArB

指令中的字母“c”表示:指令显示说明结果影响XER寄存器中的进位位[CA],如addc rDrArB

指令中的字母“e”表示:在指令中把XER[CA]中的数据作为一个操作数,并在XER[CA]位记录进位位,如adde rDrArB

指令中的字母“o”表示:溢出标志。对于整数,在XER[OA]位记录溢出和在CR0[SO]记录溢出位,如addo rDrArB

 

条件寄存器

条件寄存器CR包括84bit的字段,即CR0CR7。每个字段可以表示整数运算或比较的结果。每个条件字段可以记录比较结果,即大于、小于、等于和总体溢出等。条件寄存器格式如图1所示。

 

 

异常处理器

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

 

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

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

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

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