WEB开发网
开发学院软件开发VC ATL布幔之下的秘密(4) 阅读

ATL布幔之下的秘密(4)

 2006-07-22 22:54:54 来源:WEB开发网   
核心提示: 在用这一知识武装起来之后,现在我们来玩一个函数参数的游戏,ATL布幔之下的秘密(4)(5),看以下这个简单的程序:程序62. #include <cstdio>extern "C" int fun(int a, int b) {return a + b;}i

在用这一知识武装起来之后,现在我们来玩一个函数参数的游戏,看以下这个简单的程序:

程序62. #include <cstdio>
extern "C" int fun(int a, int b) {
 return a + b;
}
int main() {
 printf("%d\n", fun(4, 5));
 return 0;
}
就像我们所期望的那样,程序的输出为9。现在让我们来对程序作少许修改。

程序63. #include <cstdio>
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;
}
程序的输出为29。我们知道参数的地址,并且在程序中我们改变了参数的值。因而,在我们将两个变量相加时,新的变量值15和14就被加起来了。

VC中函数拥有naked属性。如果你将任何函数指定为naked,那么它就不会为该函数产生prolog代码和epilog代码。那么什么是prolog代码和epilog代码呢?prolog是一个英文词汇,意思是“Opening(开始的)”,当然它也是一种用于AI的程序设计语言的名称——但是在这里,这门语言和编译器产生的prolog代码没有任何关系。prolog代码是编译器自动产生的,它会被插入到函数的开始处来设置堆栈帧。你可以看看程序61产生的汇编语言代码,在函数的开头处,编译器会自动插入以下的代码来设置堆栈帧。

push ebp
mov  ebp, esp
sub  esp, 12 ; 0000000cH
这段代码就称作prolog代码。同样,插入在函数末尾的代码就称作epilog代码。在程序61中,编译器生成的epilog代码为: mov  esp, ebp
pop  ebp
ret  0
现在来看看带有naked属性的函数。

上一页  1 2 3 4 5 6  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接