call传参之通过堆栈

常见的调用约定有:

【例】按__stdcall约定调用函数test2(Par1, Par2) 
 
 
push par2 ; 参数2
push par1 ; 参数1
call test2;
{
push ebp ; 保护现场原先的EBP指针,BP为基指(Base Pointer)寄存器,用它可直接存取堆栈中的数据,它的作用是在调用函数时保存ESP使函数结束时可以正确返回;加E(enhance)代表增强型寄存器,用于32位数据处理,类似AX与AL,AH的关系
mov ebp, esp ; 设置新的EBP指针,指向栈顶
mov eax, [ebp+0C] ; 调用参数2
mov ebx, [ebp+08] ; 调用参数1
sub esp, 8 ; 若函数要用局部变量,则要在堆栈中留出点空间

add esp, 8 ; 释放局部变量占用的堆栈
pop ebp ; 恢复现场的ebp指针
ret 8 ; 返回(相当于ret; add esp,8)返回调用处,并弹出栈顶8个字节!参数没有用处了,但弹出是不必要的操作,可以直接修改堆栈的指针来清理,一个参数4字节,所以2*4=8,即平衡堆栈,因为两个参数是call附加的,本不需要


}

原文地址:https://www.cnblogs.com/encode/p/2724926.html