| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5266 人关注过本帖
标题:有关子程序参数传递和堆栈平衡问题
取消只看楼主 加入收藏
tigerdown
Rank: 1
等 级:新手上路
帖 子:72
专家分:8
注 册:2017-8-21
结帖率:64.29%
收藏
已结贴  问题点数:20 回复次数:3 
有关子程序参数传递和堆栈平衡问题
有关子程序参数传递和堆栈平衡问题
发现网上一些资料对这问题解答不十分正确,所以有必要跟大家讨论一下,欢迎提意见。
子程序参数的传递是通过堆栈进行的,就是把子程序的参数压入堆栈,然后子程序在堆栈取出,比如下面例子:

Sub(Var1, Var2)  - StdCall类型

编译后:

push Var2  (待定)
push Var1  (待定)
call Sub

但是参数压入堆栈顺序是如何的呢?是Var2还是Var1先压入?看下面例子和图示:
Sub proc _Var1, _Var2
    mov  eax, _Var1
    mov  ebx, _Var2
    ret
Sub endp

反汇编后:

:00401018 55          push ebp  -  保存ebp指针
:00401019 8BEC        mov  ebp, esp  -  esp指向这里
:0040101B 8B4508      mov  eax, dword ptr[ebp+08] - Var1
:0040101E 8B5D0C      mov  ebx, dword ptr[ebp+0C] - Var2   
:00401021 C9          leave
:00401022 C20800      ret 0008 - 堆栈平衡:esp+0008 = ebp

图片附件: 游客没有浏览图片的权限,请 登录注册

可以看出Var2地址大于Var1, 所以Var2先入。完成调用后,要清除堆栈空间,由子程序用ret 0008来实现。


[此贴子已经被作者于2020-9-3 17:46编辑过]

搜索更多相关主题的帖子: 平衡 堆栈 参数 子程序 mov 
2020-09-03 17:44
tigerdown
Rank: 1
等 级:新手上路
帖 子:72
专家分:8
注 册:2017-8-21
收藏
得分:0 
回复 2楼 Valenciax
我有一个疑问,有的堆栈是从低地址向高地址生长的(有可能是不同处理器),在这种情况下是不是也是Var2先压入?
2020-09-03 20:08
tigerdown
Rank: 1
等 级:新手上路
帖 子:72
专家分:8
注 册:2017-8-21
收藏
得分:0 
回复 4楼 Valenciax
多谢了,不过对C类型的调用完后,要加上add esp, 8 指令来清除参数空间.
2020-09-03 21:08
tigerdown
Rank: 1
等 级:新手上路
帖 子:72
专家分:8
注 册:2017-8-21
收藏
得分:0 
谢了。
2020-09-03 21:16
快速回复:有关子程序参数传递和堆栈平衡问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034347 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved