|

楼主 |
发表于 2011-12-21 02:54:47
|
显示全部楼层
ytrfamli 发表于 2011-12-21 02:04
呵,果然还是不要先看解释的好,看了LZ一步一步的说明反而我也把数据入栈时
ESP寄存器改变的方向搞混了,纠结 ...
这个问题解决了,那另外一个问题。劳驾大伙给个说法。
一个调用子程序的
具体过程是这样的。
9: x = 1;
0040B566 mov dword ptr [ebp-4],1
10: y = 2;
0040B56D mov dword ptr [ebp-8],2
11: z = add(x,y);
关键从这里开始看:
0040B574 mov eax,dword ptr [ebp-8]
0040B577 push eax
0040B578 mov ecx,dword ptr [ebp-4]
0040B57B push ecx
0040B57C call @ILT+10(add) (0040100f)
在进入CALL前,栈的最顶端没错就是存着两个参数吧?
然后进入CALL
1: int add(int a,int b)
2: {
0040B510 push ebp
0040B511 mov ebp,esp
此时,栈顶是(原)ebp,参数一,参数二,没错吧。 并且(现)ebp指向栈顶
0040B513 sub esp,40h
0040B516 push ebx
0040B517 push esi
0040B518 push edi
0040B519 lea edi,[ebp-40h]
0040B51C mov ecx,10h
0040B521 mov eax,0CCCCCCCCh
0040B526 rep stos dword ptr [edi]
3: return a+b;
问题在这里,中途ebp变动,我的理解,或者说,我纸上画出来的情况是这样的
ebp--------> (原)ebp
参数一
参数二
但是下面的代码显示,在“(原)ebp”和“参数一”之间,还有什么东西?
0040B528 mov eax,dword ptr [ebp+8]
0040B52B add eax,dword ptr [ebp+0Ch]
4: }
我一直研究这段代码,现在睡不着了。
这是我的汇编的C代码- int add(int a,int b)
- {
- return a+b;
- }
- void main()
- {
- int x = 0, y = 0;
- int z;
- x = 1;
- y = 2;
- z = add(x,y);
- }
复制代码 |
|