函数调用时进栈顺序

函数调用时入栈顺序
到底是参数先入栈,还是函数地址先入栈?两种说法的都有,感觉很困惑,请大家一起讨论

------解决方案--------------------
应该是参数先入栈,然后调用call指令,call等于两条指令push当前的地址,然后jmp到调用函数,如果实在不理解,可以多看看反汇编代码。你的理解能力会上升一个境界
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

函数代码放在代码区 
先把参数压栈或者放到寄存器
然后call 函数地址 
调用完返回
???哪里要函数地址压栈了

call的时候如果没push函数地址,那ret时又将何去何从

call 会调整CS:EIP 
函数调用之前参数压栈, 然后call指令 push 当前指令地址作为返回地址(但这个不是函数地址) 然后再把前一个栈帧压栈(维护之前的栈环境)调整CS:EIP 执行完后还原原来的环境 继续执行

打漏了call指令 push 当前指令地址的下一条指令作为返回地址(但这个不是函数地址) 
------解决方案--------------------
一般都是只压栈参数, 然后直接call函数地址.

如果想清楚的知道细节, 可以在调试的时候查看反汇编代码. 或者使用动态或者静态调试工具反汇编代码看.

int addVal(int val1, int val2)
{
return val1+val2;
}

调用代码汇编代码:
int Val = addVal(3, 4);
00B05493  push        4    
00B05495  push        3    
00B05497  call        addVal (0B022D4h)