汇编学习1--函数调用过程

来源:互联网 发布:百度的黑洞源码是什么 编辑:程序博客网 时间:2024/05/17 16:56

一、函数调用过程(ebp,esp) 

#include <stdio.h>

int func(int param1 ,int param2,int param3)
{
        int var1 = param1;
        int var2 = param2;
        int var3 = param3;
 
        printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);
        return var1;
}
 
int main(int argc, char* argv[])
{
        int result = func(1,2,3);
 
        return 0; 
}

首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。

 

下面来逐步分析函数的调用过程

1.函数main执行,main各个参数从右向左逐步压入栈中,最后压入返回地址

2.执行第15行,3个参数以从左向右的顺序压入堆栈,及从param3到param1,栈内分布如下图:

 3.然后是返回地址入栈:此时的栈内分布如下:

4.第3行函数调用时,通过跳转指令进入函数后,函数地址入栈后,EBP入栈,然后把当前ESP的值给EBP,对应的汇编指令

push ebpmov ebp esp

   此时栈顶和栈底指向同一位置,栈内分布如下:

 

5.第5行开始执行, int var1 = param1; int var2 = param2; int var3 = param3;按申明顺序依次存储。对应的汇编:

mov 0x8(%ebp),%eaxmov %eax,-0x4(%ebp)

  其中将[EBP+0x8]地址里的内容赋给EAX,即把param的值赋给EAX,然后把EAX的中的值放到[EBP-4]这个地址里,即把EAX值赋给var1,完成C代码 int var1 = param1,其他变量雷同。

6.第9行,输出结果,第10行执行 对应的汇编代码:

mov  -0x4(%ebp),%eax

 最后通过eax寄存器保存函数的返回值


7.调用执行函数完毕,局部变量var3,var2,var1一次出栈,EBP恢复原值,返回地址出栈,找到原执行地址,param1,param2,param3依次出栈,函数调用执行完毕

转载自:http://blog.163.com/yichangjun1989@126/blog/static/131972028201442221956603/


将静态库文件.a还原成.o文件:ar -x xxx.a


如何在LINUX下查看一个.o文件里有哪些函数?

使用命令:nm foo.o

查看某个函数xxx在静态库的那个文件中使用

那就是到libunp.a中去找,利用um命令和grep命令的组合来找。

nm libunp.a | grep Readable_timeo  -B5
nm比较有用的参数在这里: 
这里写图片描述 
-B表示输出匹配行前面的NUM行,这也是我前面为什么要用-B5的原因,输出含有Readable_timeo行的前面的5行,可以显示出该函数所在的.o文件名。

使用 objdump -S xxx.o,将.o文件转为汇编代码


0 0
原创粉丝点击