那么函数调用的时候,入参是怎么处理的呢?
53: process(20);
0040EFA4 push 14h
0040EFA6 call @ILT+40(process) (0040102d)
0040EFAB add esp,4
上面一段代码就是process函数含有一个参数时候的情形。函数调用后esp+4,堆栈恢复。堆栈+4,主要是因为参数的空间就是4个字节。所以用一幅图说明一下,函数调用的时候堆栈空间应该是这样的:
| 函数参数 |
| 返回地址 |
| 临时变量 | <------------------------ ebp
| 压栈寄存器 |
| 栈顶 | <-------------------------esp
其他知识:
(1) 全局运算cpu寄存器很多,一般有eax,ebx,ecx,edx等等。我们通常说的ax,bx,cx,dx指的只是他们的低位部分。
(2)段寄存器寄存了程序的代码段,数据段和堆栈段。代码段保存了全部的程序代码,数据段保存了全据变量的代码,而堆栈则是全部堆栈空间。
(3)目前vc编译器支持嵌入式汇编,大家有兴趣的话可以在函数内部试试身手。下面的代码只是一个范例:
void process(int* q)
{
_asm {
push eax
push ebx
push ecx
mov eax, 0x10
mov ebx, 0x15
add eax, ebx
mov ecx, q
mov [ecx], eax
pop ecx
pop ebx
pop eax
}
}
(全部完)