一个很简单的例子,从汇编层次理解函数调用
2012-01-12 16:15
411 查看
虽然这种东西在书上网上很多,自己动手做一遍还是很有收获的。
测试例子
#include<stdio.h>
int test_function(int a, int b)
{
printf("hello world, %d,%d\n",a,b);
}
int main()
{
test_function(1,2);
}
main函数中:执行call后,eip的值进栈,存放的是从函数调用返回后继续执行的指令的地址(本例子中是leave指令,地址为0x08048424)
test_function函数中:在函数序言部分,将ebp压栈,重置esp和ebp的值,建立test_function的栈(本例子中ebp的值为0xbffff288,压在0xbffff268处,再将ebp置为0xbffff268,esp置为0xbffff250)新的ebp指向旧ebp的值(即ebp的值是一个内存地址,这个内存单元存放的是旧的ebp的值)
test_function函数中:执行leave后:test_function栈清空,将ebp恢复成main函数的ebp值,esp指向待执行的main函数中的指令的地址
test_functino函数中:执行ret后:将待执行的main函数中的指令的地址恢复到eip中,此后完全进入main函数中。
根据以上过程绘制的图示:xxxxxx表示此地址内容无意义
xxxxxxxx内容是什么东西,有待进一步学习。
测试例子
#include<stdio.h>
int test_function(int a, int b)
{
printf("hello world, %d,%d\n",a,b);
}
int main()
{
test_function(1,2);
}
main函数中:执行call后,eip的值进栈,存放的是从函数调用返回后继续执行的指令的地址(本例子中是leave指令,地址为0x08048424)
test_function函数中:在函数序言部分,将ebp压栈,重置esp和ebp的值,建立test_function的栈(本例子中ebp的值为0xbffff288,压在0xbffff268处,再将ebp置为0xbffff268,esp置为0xbffff250)新的ebp指向旧ebp的值(即ebp的值是一个内存地址,这个内存单元存放的是旧的ebp的值)
test_function函数中:执行leave后:test_function栈清空,将ebp恢复成main函数的ebp值,esp指向待执行的main函数中的指令的地址
test_functino函数中:执行ret后:将待执行的main函数中的指令的地址恢复到eip中,此后完全进入main函数中。
根据以上过程绘制的图示:xxxxxx表示此地址内容无意义
调用test_function前指针位置 | 调用test_function后指针位置 | 内容 | 地址 |
esp(test_f) | 0x8048500 | 0xbffff250 | |
1 | 0xbffff254 | ||
2 | 0xbffff258 | ||
xxxxxxxx | |||
xxxxxxxx | |||
xxxxxxxx | |||
ebp(test_f) | 0xbffff288 ($ebp(main)) | 0xbffff268 | |
0x08048424(main中leave) | 0xbffff26c | ||
esp(main) | 1 | 0xbffff270 | |
2 | 0xbffff274 | ||
xxxxxxxx | |||
xxxxxxxx | |||
xxxxxxxx | |||
xxxxxxxx | |||
ebp(main) | ebp(old) | 0xbffff288 |
相关文章推荐
- 关于vs 2005的一个O2级别函数调用的一个编译器优化(我是汇编小白)
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- 理解 C++ 中继承层次的关键在于理解如何确定函数调用
- 很简单的一个函数调用,不知道错在哪?
- 如下代码中greater10函数调用时实参是如何传递的呢? 代码是MSDN中的一个例子
- 汇编:函数调用多写了一个关键字,折腾一个上午!---offset
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- 汇编语言编程中遇到的一个跨文件函数调用问题
- 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
- 从汇编角度来理解linux下多层函数调用堆栈运行状态
- Lea指令计算地址(用于四则混合运算),附上一个函数调用例子及其反汇编代码,很清楚
- IA32汇编语言——理解函数调用时栈内容的变化
- 虚函数一个奇特例子,vfptr再调用自身函数bar()
- 一个range函数理解错误导致程序运行不正确的例子
- 关于函数调用及函数地址的一个例子
- 如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例
- 虚函数调用过程(用汇编和几个例子解释)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 从汇编角度来理解linux下多层函数调用堆栈执行状态