鱼C论坛

 找回密码
 立即注册
查看: 3069|回复: 3

关于WIN32汇编[函数调用]的问题

[复制链接]
发表于 2011-9-27 19:22:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看了小甲鱼的视频感觉有一点点小小的疑惑,关于传递参数的问题.
按照视频中的讲解是这样的:
1.PUSH参数到栈中.
2.Call这一个函数.
3.执行这个函数.
4.Ret
5.清空栈

我的疑问:
CALL的实现,是把IP压入栈后JMP.
RET的实现是POP IP.
那么问题就来了:
   顺序问题:1-5步顺序是什么?按照栈的机制,应该就是1-5顺序执行.我的问题就是,当跳转到目的代码时,函数的参数是怎样取出呢?因为,如果这个时候POP,那么出来的应该是IP值.就算POP出来的是参数,那也不对,如果是这样的话,最后为什么还要清空栈?
  那么按照我的想法,取参数的时候不是通过POP,是类似SS[DX]这样的方式来,是这样么?
  不知道大家明白我想问什么了么?希望大家给个合理的解释...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-27 20:09:00 | 显示全部楼层
本帖最后由 topcookie 于 2011-9-27 20:18 编辑

是这样的push参数2
              push参数1
              call
在call的时候把下一条指令的地址入栈
call的内部是这样的
push ebp
mov ebp,esp
sub esp,8   为局部变量留出空间,这里只是随便打的一个8,具体程序中预留的要大
mov eax,[ebp+8]    取参数1
mov ebx,[ebp+0c]  取参数2
mov ecx,[ebp-4]     取局部变量1
mov edx,[ebp-8]     取局部变量2
......
mov esp,ebp          释放局部变量空间
pop ebp
retn 8                    平衡堆栈并返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-27 20:23:34 | 显示全部楼层
建议你看下罗云彬的琢石成器windows汇编语言程序设计,了解下堆栈平衡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 20:57:25 | 显示全部楼层
的确要看.对于80X86的寄存器,还不太清楚.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表