分类: LINUX
2013-07-06 11:47:15
要重点分析函数的栈结构。要了解由于体系设计的问题,堆栈指针向内存低方向增长,但是数据复制操作等,则是往高内存增长。
当函数调用时候,首先把参数从右往左入栈(通常),然后把当前的指令地址压入堆栈--------------这一部分在函数调用外部进行
函数体内 ,首先要保存ebp,压入堆栈三后,把当前的sp作为该函数的帧指针FP,依据FP界定该函数区域-------------这部分通常在被调函数内处理
从FP往低地址便开始存放该函数的局部变量。
例子源代码:
#include
int
fun(int a,int b);
int
main(void)
{
int
a;
a
=fun(1,2);
return
a;
}
int
fun(int a,int b)
{
int c;
c =a+b;
return
c;
}
[root@localhost
test]# gcc –g tiny.c
对应汇编代码:
[root@localhost
test]# gdb a.out -q
(gdb)
disass main
Dump
of assembler code for function main:
0x
0x
0x
0x080482fa
0x080482fd
0x08048302
0x08048304
0x08048307
0x08048309
0x0804830b
0x08048310
0x08048313
0x08048316
0x08048319
0x
End
of assembler dump.
(gdb)
disass fun
Dump
of assembler code for function fun:
0x0804831b
0x
0x0804831e
0x08048321
0x08048324
0x08048327
0x
0x0804832d
0x0804832e
End
of assembler dump.