add esp,8就是把esp调整到函数调用之前的状态,用以平衡堆栈
默认采用的是cdcall:外平栈
stdcall:内平栈
什么是堆栈平衡?
》原来的堆栈是什么样的,函数调用之后堆栈还是什么样的(即,esp和ebp的值保持不变),这一个线程当中的所有函数调用都是使用这同一个堆栈。
为什么需要保持堆栈平衡呢?
》因为在Windows当中它的栈默认分配的是1M大小的空间,如果每个函数为局部变量分配的栈空间不回收的话,很快就会用完了。为了重复利用堆栈,所以需要平衡堆栈。
一旦函数调用结束之后,原先函数的栈空间存储的局部变量等内容就变成了垃圾数据了,所以不要使用指针等去勾出来原来函数当中的局部变量的值,因为一旦那块内存当中的数值发生变化,很可能获取到的就是垃圾数据。
指针使用完毕之后一定要置为NULL,new出来的对象一定要delete掉
为什么fastcall速度快呢?
把参数传到寄存器里面:
一般来说通过寄存器来传参,如果参数比较多就一部分使用寄存器一部分使用push压栈来传参
在C++当中,类的成员函数的调用是通过thiscall来实现的
this指针是放在ecx寄存器进行传递的
Windows下的函数调用方式:
他们的定义都包含在windef.h头文件当中
上面是MAC,下面是Windows
不定个数的参数一般是cdcall,因为只有调用方才知道传了几个参数进去
在release版本当中,局部变量如果比较简单的话,有可能会被直接优化掉,可以使用scanf来避免这种情况出现。所以如果在ida当中,应该主要关注的是它的变量名,比如arg1这种,而不用管它究竟是多少偏移量,在ida当中,局部变量是var,外面传进来的参数是arg