我们在每一次使用自定义函数的时候,有没有想过为什么这个形参为什么不能改变main函数中的参数。
不要和我杠(不同的编辑器调用过程中是有差异的)
我们开始今天的正题。
首先我们要介绍二个寄存器ebp(栈底指针),esp(栈顶指针)这二个寄存器存放的是地址,而这个地址是用来维护函数栈帧的。
首先
我们写这样一个函数。我们转到反汇编。就可以看到
1.这个push就是压栈,在内存中申请一个地方,这里放的就是ebp,2.然后就是把ebp的值赋给esp,这样ebp和esp指向的就是同一个地址。3.sub就是减,把esp的地址减0E4h(而这之间就有很大一块空间)。456.就是在esp上面(计算机是从高到低地址,我们把下面看为高地址)压三个寄存器(有什么用呢,我也不知道。但是这几个寄存器对于现在的我,不了解没影响。)78910.就是把从edi到eax全部初始化为0cccccch。然后在创建变量。
后面再调用函数,1.计算机把ebp-14h(a)赋值给eax,再把eax压到上面。2.b同理。3.call语句,
这个就是call的值这个是不是call下一条指令的地址。
然后和前面一样创建。
我们来说返回当你要返回的时候,他会把值放在eax中,因为eax是寄存器所以add函数销毁不会销毁eax,他可以正常返回。并且从开始压call地址的位置找到call下一条指令的地址。从而开始执行下一条指令。
自己理解不高,望包涵