执行test(int p1,int p2)
假设执行函数前堆栈指针ESP为A
push p2 ; 参数2入栈,ESP =ESP- 4h —–>ESP = A – 4h
push p1 ; 参数1入栈,ESP =ESP- 4h —–>ESP = A – 8h —–>①
call test ; 压入返回地址 ESP =ESP- 4h —–>ESP = A – 0Ch —–>②
进入函数内
{
push ebp ;保护先前EBP指针, EBP入栈, ESP=ESP- 4h —–>ESP = A – 10h
mov ebp, esp ;设置EBP指针指向栈顶 A-10h —–>③
mov eax, dword ptr [ebp+0ch] ;ebp+0ch为A-4h,即参数2的位置 —–>④
mov ebx, dword ptr [ebp+08h] ;ebp+08h为A-8h,即参数1的位置 —–>⑤
sub esp, 8 ;局部变量所占空间ESP-=8 —–>ESP = A-18h —–>⑥
…
add esp, 8 ;释放局部变量, ESP+=8 —–>ESP = A-10h —–>⑦
pop ebp ;出栈,恢复EBP, ESP+=4 —–>ESP = A-0Ch —–>⑧
ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=A-08h —–>⑨
;后面加操作数8为平衡堆栈,ESP+=8,ESP=A, 恢复进入函数前的堆栈.—–>⑩
}