函数调用时栈内容和函数栈帧的分析
时间:2010-09-16 来源:Acikee
函数调用时的内存分析
(为即将调用的函数准备参数)
mov %ebp+偏移 ,%eax 将参数传到eax
mov %eax ,%esp+偏移 将参数放到当前空间。
sub $18 ,%ebp #将栈底指针向下移动以存放参数和变量。
(call 保存函数执行现场)
call %eip
相当于指令:push %eip
mov addr ,%eip
(保存栈的相关指针)
push %ebp #保存栈顶。
mov %esp, %ebp #将栈底赋给栈顶。
(将返回值放入eax中,供调用函数读取)
mov 返回变量地址, %eax
(还原栈指针,释放被调用函数的内存空间。)
leave
相当于一下指令:mov %ebp, %dsp
pop %ebp
(恢复调用前的现场)
ret
相当于一下指令: ~call
pop %eip //恢复执行前的地址。
问题:
每次为参数和变量预留空间时 sub的值是怎么确定的?
sub 的值是由被调用函数内部声明的变量和参数决定的。每多一个参数地址就加0x04,而函数中的变量为每四个,地址就增加0x10。例如:有两个整形参数,则加0x08,有一个整形参数的话加0x10,有四个整形参数也加0x10,有五个时就加0x20。
调用函数的栈帧分布