prinsun 发表于 2011-9-27 19:22:35

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

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

我的疑问:
CALL的实现,是把IP压入栈后JMP.
RET的实现是POP IP.
那么问题就来了:
   顺序问题:1-5步顺序是什么?按照栈的机制,应该就是1-5顺序执行.我的问题就是,当跳转到目的代码时,函数的参数是怎样取出呢?因为,如果这个时候POP,那么出来的应该是IP值.就算POP出来的是参数,那也不对,如果是这样的话,最后为什么还要清空栈?
那么按照我的想法,取参数的时候不是通过POP,是类似SS这样的方式来,是这样么?
不知道大家明白我想问什么了么?希望大家给个合理的解释...

topcookie 发表于 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,    取参数1
mov ebx,取参数2
mov ecx,   取局部变量1
mov edx,   取局部变量2
......
mov esp,ebp          释放局部变量空间
pop ebp
retn 8                  平衡堆栈并返回

topcookie 发表于 2011-9-27 20:23:34

建议你看下罗云彬的琢石成器windows汇编语言程序设计,了解下堆栈平衡

prinsun 发表于 2011-9-27 20:57:25

的确要看.对于80X86的寄存器,还不太清楚.
页: [1]
查看完整版本: 关于WIN32汇编[函数调用]的问题