函数调用过程
- 调用函数操作
- 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定
- 一般为从右至左
mov 地址,参数
的一个操作并不直接pop而是定位到地址将参数传递进去
call offset
: 调用函数,call标识符或地址.同时为要调用的函数开辟新的栈帧- 向栈中压入当前指令的地址,即返回地址
- 跳转到调用函数的入口地址
- 返回的时候有类似retn的操作
- 调整栈顶和栈底
push ebp
:将上一个函数栈底入栈,在上一个函数的栈顶mov ebp,esp
sub esp ,10h
:10h指的是新栈的大小
- 一系列新的函数的操作…
- 调用结束:
leave
: 调整栈帧的指令mov esp,ebp
pop ebp
retn
:- POP EIP
- jmp offset
- 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定
- 调用main函数时有
and esp, 0FFFFFFF0h
: 字节对齐(16位)的一个操作,编译优化需要
- 返回地址
- 将要调用函数的参数2
- 将要调用函数的参数1
- 当前函数的一系列变量,参数,地址
- 以上即是调用完一个函数后属于上一个函数的栈空间的内容