用汇编的眼光看C++ (之x86汇编)(二)

2014-11-24 12:47:57 · 作者: · 浏览: 1
最后三句特别关键,我们看到ebp复制给esp,ebp出栈,函数返回,这样一切都恢复到函数调用之前的状态了。

那么函数调用的时候,入参是怎么处理的呢?

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

}

}

(全部完)