PowerPC栈帧分析(7页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《PowerPC栈帧分析(7页).doc》由会员分享,可在线阅读,更多相关《PowerPC栈帧分析(7页).doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-PowerPC栈帧分析-第 7 页PowerPC栈帧分析1 .PowerPC寄存器的使用规则通用寄存器的用途:r0在函数开始(function prologs)时使用。r1堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。r2内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。系统调用时,它包含系统调用号(这个好像跟系统有关吧)。r3作为第一个参数和返回值。r4-r10函数或系统调用开始的参数。r11 用在指针的调用和当作一些语言的环境指针。r12 它用在异常处理和glink(动态连接器)代码。r13 保留作为系统线程ID。r14-r31
2、 作为本地变量,非易失性。专用寄存器的用途:lr链接寄存器,它用来存放函数调用结束处的返回地址。ctr 计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。xer 定点异常寄存器,存放整数运算操作的进位以及溢出信息。msr 机器状态寄存器,用来配置微处理器的设定。cr条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。2.栈帧的使用规则PowerPC寄存器没有专用的Pop,Push指令来执行堆栈操作,所以PowerPC构架使用存储器访问指令stwu,lwzu来代替Push和Pop指令。PowerPC处理器使用GPR1来将这个堆栈段构成一个单向
3、链表,这个单链表的每一个数据成员,我们称之为堆栈帧(Stack Frame),每一个函数负责维护自己的堆栈帧。PowerPC体系结构中栈的增长方向是从高地址到低地址,堆的增长方式是从低地址到搞地址,当两者相遇时就会产生溢出。堆栈帧的格式如下:各部分名词解释:函数参数域(Function Parameter Area):这个区域的大小是可选的,即如果如果调用函数传递给被调用函数的参数少于六个时,用GPR4至GPR10这个六个寄存器就可以了,被调用函数的栈帧中就不需要这个区域;但如果传递的参数多于六个时就需要这个区域。局部变量域(Local Variables Area):通上所示,如果临时寄存器
4、的数量不足以提供给被调用函数的临时变量使用时,就会使用这个域。CR寄存器:即使修改了CR寄存器的某一个段CRx(x=0至7),都有保存这个CR寄存器的内容。通用寄存器GPR:当需要保存GPR寄存器中的一个寄存器器GPRn时,就需要把从GPRn到GPR31的值都保存到堆栈帧中。浮点寄存器FPR:使用规则共GPR寄存器。3.PowerPC的汇编指令和栈操作 PowerPC寄存器没有专用的push和pop指令来执行堆栈操作,所以PowerPC构架使用存储器访问指令stwu、lwzu来代替push和pop指令。4.函数执行时栈帧的建立与消亡过程函数栈的建立与消亡过程如下图所示:函数栈的建立与消亡过程说
5、明如前所属,PowerPC体系结构中栈的增长方向是从高地址到低地址,故形成过程可以概括为如下几点:1) 调用函数r1指向栈顶(SP),用间接寻址方式分配一定大小栈空间;2) r31指向栈顶,以r31为基值将参数压入栈内;3) 进入被调函数,跳转到被调函数的SP处;4) 被调函数同样进行栈分配及参数压栈操作;5) 被调函数执行完毕之后,跳转LR,返回到被调用处的下一条指令,继续后续操作(此时的SP即为调用函数的SP)举例说明栈操作过程以下以一个简单的函数调用,说明PowerPC栈的操作过程。函数例子如下:int calltest2( int a) int t1=5; int t2 = 6; in
6、t result =0; char * p =0; *p =a;int calltest1( int a) int t1=3; int t2 = 4; int result =0; result = calltest2( t2); t1 =3;void calltest( ) int t1=7; int t2 = 9; int result =0; result = calltest1( t1); t1 =3;利用反汇编工具,生成汇编代码及分析如下:int calltest2( int a)Calltest2栈帧建立分析:stwu r1,-48(r1):分配48字节的栈帧,r1指向栈顶;(po
7、werpc省略了EBP,所以一上来即进行一次间接寻址)stw r31,44(r1):保存r31的原值,以后恢复;or r31,r1,r1:让r31指向栈顶r1(r31=r1 or r31)stw r3,8(r31):第一个形参0x401d4f0 calltest2: stwu r1,-48(r1)0x401d4f4 +0x004: stw r31,44(r1)0x401d4f8 +0x008: or r31,r1,r10x401d4fc +0x00c: stw r3,8(r31)局部变量赋值:li r0 5(t1,t2.result) int t1=5;0x401d500 +0x010: li
8、 r0,0x5 # 50x401d504 +0x014: stw r0,12(r31) int t2 = 6;0x401d508 +0x018: li r0,0x6 # 60x401d50c +0x01c: stw r0,16(r31) int result =0; 0x401d510 +0x020: li r0,0x0 # 00x401d514 +0x024: stw r0,20(r31) char * p =0;0x401d518 +0x028: li r0,0x0 # 00x401d51c +0x02c: stw r0,24(r31)加载函数调用参数到r9 *p =a;0x401d520
9、 +0x030: lwz r9,24(r31)0x401d524 +0x034: lbz r0,11(r31)保存r9到r00x401d528 +0x038: stb r0,0(r9)r11=r1,r31=r11-4=r1-4,恢复r31的值0x401d52c +0x03c: lwz r11,0(r1)0x401d530 +0x040: lwz r31,-4(r11)0x401d534 +0x044: or r1,r11,r11blr:跳转到LR地址,返回calltest1中调用calltest2的下一条指令地址0x401d57c的继续指向0x401d538 +0x048: blr int c
10、alltest1( int a)0x401d53c calltest1: stwu r1,-48(r1)将LR内容存入r0(存在函数调用时需要用到LR,用来存放函数调用结束处的返回地址)0x401d540 +0x004: mfspr r0,LR0x401d544 +0x008: stw r31,44(r1)0x401d548 +0x00c: stw r0,52(r1)0x401d54c +0x010: or r31,r1,r10x401d550 +0x014: stw r3,8(r31)局部变量赋值(t1,t2,result) int t1=3;0x401d554 +0x018: li r0,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PowerPC 分析
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内