汇编中的堆栈传参

什么是堆栈传参?

这个堆栈传参,就好比你想吃糖,可是你左边的口袋里已经装满了瓜子,所以你只能,先把糖放入右边口袋,当你需要吃糖的时候。在从右边口袋里把糖取出来,就这么简单,这就是堆栈传参,左边口袋是通用寄存器,右边口袋就是堆栈。糖果就是参数,向口袋放糖和从口袋拿糖就是调用堆栈,吃糖这个动作就是执行程序。

什么时候我们会用到堆栈传参?

当我们在执行函数调用时,寄存器不够用的时候,我们可以使用堆栈传参,比如说,我们要计算任意10个参数相加的和,如果按照之前文章的办法,我们会使用mov这个指令把参数传递到寄存器中进行计算,但是通用寄存器只有八个,我们现在要传递十个参数,这时候就可以使用堆栈传参了。

具体实现方法

直接上分析图:

  • PUSH 压入参数(放糖)
  • 运行到CALL时调用函数(打算吃糖了)
  • 从堆栈把参数传递给寄存器EAX,相加计算参数的和(拿糖)
  • 返回结果到寄存器EAX(吃糖)

在这里插入图片描述
这里函数运行多加4是因为调用CALL的时候程序会把CALL下一行的地址压入栈顶以便RETN返回,所以得多加4,这里压入10个数据太麻烦,所以简化了一下,不过具体实现方法就是如图所示。

发布了60 篇原创文章 · 获赞 68 · 访问量 8427

猜你喜欢

转载自blog.csdn.net/qq_43573676/article/details/104357256
今日推荐