建栈过程
参数2 由INVOKE或PUSH+CALL实现
参数1
返回地址
EBP原值 <-- EBP指向
由stdCall自动实现(PUSH EBP和MOVE EBP,ESP)
局部变量1 由stdCall局部变量实现
局部变量2
PUSH寄存器1 手工实现(PUSHFD,PUSHAD)
PUSH寄存器2
PUSH寄存器3
ß ESP指向
处理过程:
XXXX PTR [EBP + 4*(X+1)]
访问参数的格式,
手工实现
XXXX PTR [EBP - 4*X]
访问局部变量的格式
恢复过程:
恢复寄存器:
POP 寄存器3 手工实现(POPAD,PUSHFD)
POP 寄存器2
POP 寄存器1
清除局部变量并恢复EBP寄存器:
mov ESP,EBP 由stdCall自动实现
pop EBP
清除参数:
ret 参数使用的字节数(向上取为4的倍数) 由stdCall的ret实现
注意:
1、EBP:参数和局部变量的偏移基地址,使用PUSH EBP 和MOV EBP,ESP设置
2、ESP:总是指向当前堆栈栈顶,并以dword为单位上下移动
3、ret 后面的数字是4(dword)的整数倍
4、过程参数都是
dword类型
5、局部变量在堆栈中以
dword方式对齐