有关子程序参数传递和堆栈平衡问题
有关子程序参数传递和堆栈平衡问题发现网上一些资料对这问题解答不十分正确,所以有必要跟大家讨论一下,欢迎提意见。
子程序参数的传递是通过堆栈进行的,就是把子程序的参数压入堆栈,然后子程序在堆栈取出,比如下面例子:
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编辑过]