PS:上面都是按的F10哈,这里call我们要按F11,进入函数内部。
我们记住call指令的下一条指令是因为当我们执行完call指令之后会回来,
回来的时候我们就找到这一条指令然后往下执行。
PS:右边的esp也是要指向最上面的哈。
再按F11,这次就是真正的来到了Add的函数里面。
也就是为我们的Add函数准备栈帧。
下面是我们此时的main函数的栈帧哈:
PS:我们从上还可以找到,函数传参压栈是从右向左传的,
在这里也就是先压b,再压a。
这下面就是xyz的图:
下图就完全可以说明:形参是实参的临时拷贝:
我们开始是在main函数中有a和b,我们通过push a,b 压了上去,也就是x(a‘),y(b’),
这就是临时(栈区)拷贝(压栈)。所以改变形参不会影响实参。
我们函数传参的方式是函数还没有调用的时候,参数就已经过去了,就是压了两个参数,然后当
我们真正进入函数内部的时候我们就找回了之前压的两个参数。然后再计算,计算好的值再放进z里面。
以上就是函数的调用,然后下面开始讲函数的返回。
4.函数的返回
PS:就相当于用一个全局的寄存器先把z保存起来,也就是说安全了(不会消失)。等回到
主函数的时候再把eax拿出来用就可以了。
开始:
PS:一开始栈顶上是main函数的ebp。
结束:
现在就又回到了main函数里面了。
我们上面pop完之后只是要我们的ebp和esp指向了main函数的栈顶和栈底(即main函数
的这一块空间又用我们的ebp和esp开始维护了)。