复习时请访问:(超详细解答)
http://blog.chinaunix.net/uid-23069658-id-3981406.html?page=2
源代码:
#include<stdio.h>
void fun(int a, int b)
{
int c = 0xcccccccc;
printf("haha nishigehaoren");
}
int main()
{
int a = 0xaaaaaaaa;
int b = 0xbbbbbbbb;
fun(a, b);
printf("you should run here!");
}
我们进行反汇编分析一下:
提示:
1.每个函数都有栈帧结构(即有自己的ebp栈底 和esp 栈顶的活动范围)
,执行程序执行的时候只有一个函数,ebp和esp会做出如图的调整。
2.pc寄存器终保存着当前指令的下一条指令地址。
3.调用call时做两件事情:
(1)保存着当前指令的下一条指令地址。
(2)直接跳转至目标函数。
4.参数实例化是从右向左依次压栈的。
5.给变量赋值以及函数返回值都是先通过一个寄存器(eax,ebx,ecx…)进行操作的
6.了解此结构,可以修改函数的返回值,同时pop 和push 要满足平衡对称。
最后再来张牛逼版的回顾一下: