ATL布幔之下的秘密(4)
2006-07-22 22:54:54 来源:WEB开发网在用这一知识武装起来之后,现在我们来玩一个函数参数的游戏,看以下这个简单的程序:
程序62. #include <cstdio>
就像我们所期望的那样,程序的输出为9。现在让我们来对程序作少许修改。
extern "C" int fun(int a, int b) {
return a + b;
}
int main() {
printf("%d\n", fun(4, 5));
return 0;
}
程序63. #include <cstdio>
程序的输出为29。我们知道参数的地址,并且在程序中我们改变了参数的值。因而,在我们将两个变量相加时,新的变量值15和14就被加起来了。
extern "C" int fun(int a, int b) {
_asm mov dword ptr[ebp+12], 15
_asm mov dword ptr[ebp+8], 14
return a + b;
}
int main() {
printf("%d\n", fun(4, 5));
return 0;
}
VC中函数拥有naked属性。如果你将任何函数指定为naked,那么它就不会为该函数产生prolog代码和epilog代码。那么什么是prolog代码和epilog代码呢?prolog是一个英文词汇,意思是“Opening(开始的)”,当然它也是一种用于AI的程序设计语言的名称——但是在这里,这门语言和编译器产生的prolog代码没有任何关系。prolog代码是编译器自动产生的,它会被插入到函数的开始处来设置堆栈帧。你可以看看程序61产生的汇编语言代码,在函数的开头处,编译器会自动插入以下的代码来设置堆栈帧。
push ebp
这段代码就称作prolog代码。同样,插入在函数末尾的代码就称作epilog代码。在程序61中,编译器生成的epilog代码为:
mov ebp, esp
sub esp, 12 ; 0000000cHmov esp, ebp
现在来看看带有naked属性的函数。
pop ebp
ret 0
更多精彩
赞助商链接