什么是堆栈传参?
这个堆栈传参,就好比你想吃糖,可是你左边的口袋里已经装满了瓜子,所以你只能,先把糖放入右边口袋,当你需要吃糖的时候。在从右边口袋里把糖取出来,就这么简单,这就是堆栈传参,左边口袋是通用寄存器,右边口袋就是堆栈。糖果就是参数,向口袋放糖和从口袋拿糖就是调用堆栈,吃糖这个动作就是执行程序。
什么时候我们会用到堆栈传参?
当我们在执行函数调用时,寄存器不够用的时候,我们可以使用堆栈传参,比如说,我们要计算任意10个参数相加的和,如果按照之前文章的办法,我们会使用mov这个指令把参数传递到寄存器中进行计算,但是通用寄存器只有八个,我们现在要传递十个参数,这时候就可以使用堆栈传参了。
具体实现方法
直接上分析图:
- PUSH 压入参数(放糖)
- 运行到CALL时调用函数(打算吃糖了)
- 从堆栈把参数传递给寄存器EAX,相加计算参数的和(拿糖)
- 返回结果到寄存器EAX(吃糖)
这里函数运行多加4是因为调用CALL的时候程序会把CALL下一行的地址压入栈顶以便RETN返回,所以得多加4,这里压入10个数据太麻烦,所以简化了一下,不过具体实现方法就是如图所示。