函数调用时进栈顺序
函数调用时入栈顺序
到底是参数先入栈,还是函数地址先入栈?两种说法的都有,感觉很困惑,请大家一起讨论
------解决方案--------------------
应该是参数先入栈,然后调用call指令,call等于两条指令push当前的地址,然后jmp到调用函数,如果实在不理解,可以多看看反汇编代码。你的理解能力会上升一个境界
------解决方案--------------------
打漏了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)
到底是参数先入栈,还是函数地址先入栈?两种说法的都有,感觉很困惑,请大家一起讨论
------解决方案--------------------
应该是参数先入栈,然后调用call指令,call等于两条指令push当前的地址,然后jmp到调用函数,如果实在不理解,可以多看看反汇编代码。你的理解能力会上升一个境界
------解决方案--------------------
打漏了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)