FP寄存器及frame pointer介绍
来源:互联网 发布:淘宝客户端 编辑:程序博客网 时间:2024/05/15 08:08
PCS(Procedure Call Standard for Arm architecture)就定义了过程调用中,寄存器的特殊用途。
Role in the procedure call standard
r15 PC The Program Counter.
r14 LR The Link Register.
r13 SP The Stack Pointer.
r12 IP The Intra-Procedure-call scratch register.
实际上,还有一个r11是optional的,被称为FP,即frame pointer。
1,stack frame
stack我们都知道,每一个进程都有自己的栈。考虑进程执行时发生函数调用的场景,母函数和子函数使用的是同一个栈,在通常的情况下,我们并不需要区分母函数和子函数分别使用了栈的哪个部分。但是,当我们需要在执行过程中对函数调用进行backtrace的时候,这一信息就很重要了。简单的说,stack frame就是一个函数所使用的stack的一部分,所有函数的stack frame串起来就组成了一个完整的栈。stackframe的两个边界分别由FP和SP来限定。
2,backtrace
在程序执行过程中(通常是发生了某种意外情况而需要进行调试),通过SP和FP所限定的stack frame,就可以得到母函数的SP和FP,从而得到母函数的stack frame(PC,LR,SP,FP会在函数调用的第一时间压栈),以此追溯,即可得到所有函数的调用顺序。
3,gcc关于stack frame的优化选项
看起来FP只是在backtrace的时候有用,所以如果我们没有backstrace的需求,我们是否可以不使用FP。
其实gcc就有一个关于stack frame的优化选项:
-fomit-frame-pointer
=================================================================================
Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions. It also makes debugging impossible on some machines.
On some machines, such as the VAX, this flag has no effect, because the standard calling sequence automatically handles the frame pointer and nothing is saved by pretending it doesn't exist. The machine-description macro "FRAME_POINTER_REQUIRED" controls whether a target machine supports this flag.
=================================================================================
这里引用别人关于这一参数的实验,自己就不做了。
从实验可以看出,优化后的差别是相当明显的。当然,具体能带来多大的性能提升,不好界定。
http://blog.csdn.net/byzs/article/details/2220461
源文件如下:
void a(unsigned long a, unsigned int b){ unsigned long i; unsigned int j; i = a; j = b; i++; j += 2;}
$ arm-linux-objdump -D SFP_arm.o
SFP_arm.o : file format elf32-littlearm
Disassembly of section .text:
00000000 <a>:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4
c: e24dd010 sub sp, sp, #16 ; 0x10
10: e50b0010 str r0, [fp, -#16]
14: e50b1014 str r1, [fp, -#20]
18: e51b3010 ldr r3, [fp, -#16]
1c: e50b3018 str r3, [fp, -#24]
20: e51b3014 ldr r3, [fp, -#20]
24: e50b301c str r3, [fp, -#28]
28: e51b3018 ldr r3, [fp, -#24]
2c: e2833001 add r3, r3, #1 ; 0x1
30: e50b3018 str r3, [fp, -#24]
34: e51b301c ldr r3, [fp, -#28]
38: e2833002 add r3, r3, #2 ; 0x2
3c: e50b301c str r3, [fp, -#28]
40: e91ba800 ldmdb fp, {fp, sp, pc}
Disassembly of section .data:
优化后的版本:
$ arm-linux-objdump -D no_SFP_arm.o
no_SFP_arm.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <a>:
0: e24dd010 sub sp, sp, #16 ; 0x10
4: e58d000c str r0, [sp, #12]
8: e58d1008 str r1, [sp, #8]
c: e59d300c ldr r3, [sp, #12]
10: e58d3004 str r3, [sp, #4]
14: e59d3008 ldr r3, [sp, #8]
18: e58d3000 str r3, [sp]
1c: e59d3004 ldr r3, [sp, #4]
20: e2833001 add r3, r3, #1 ; 0x1
24: e58d3004 str r3, [sp, #4]
28: e59d3000 ldr r3, [sp]
2c: e2833002 add r3, r3, #2 ; 0x2
30: e58d3000 str r3, [sp]
34: e28dd010 add sp, sp, #16 ; 0x10
38: e1a0f00e mov pc, lr
Disassembly of section .data:
[END]
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- ARM FP寄存器及frame pointer介绍
- ARM FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- FP寄存器及frame pointer介绍
- ARM FP寄存器及frame pointer介绍
- ARM FP寄存器及frame pointer介绍
- FP寄存器
- ARM的FP寄存器
- ARM的FP寄存器
- ARM的FP寄存器
- fomit-frame-pointer, Oy
- 关于arm中的fp寄存器
- java常用实体类、集合类.
- hadoop配置文件详解、安装及相关操作
- python self
- HTML CSS Javascript完成浮动登录窗口和窗口移动
- Linux VSFTP服务器
- FP寄存器及frame pointer介绍
- Xcode中捕获iphone/ipad/ipod手机摄像头的实时视频数据
- dedecms(织梦)给栏目添加图标全攻略
- Apache移植及openssl实现SSL单/双向认证
- 第一个功能的收获___DeepSleep(fastpowerOff)
- jquery 中的 console.log(dataObj);
- php iframe ie6、7下session问题
- 记录点滴
- vector和set的区别