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

ATL布幔之下的秘密(4)

 2006-07-22 22:54:54 来源:WEB开发网   
核心提示:介绍到现在为止,我们还没有讨论过任何有关汇编语言的东西,ATL布幔之下的秘密(4),但是如果我们真的要了解ATL底层内幕的话,就不能回避这一话题,程序56. void fun(int, int) {}void fun(int, int, int) {}int main() {fun(5, 10);fun(5, 10,

介绍

到现在为止,我们还没有讨论过任何有关汇编语言的东西。但是如果我们真的要了解ATL底层内幕的话,就不能回避这一话题,因为ATL使用了一些底层的技术以及一些内联汇编语言来使它更小巧快速。在这里,我假设读者已经拥有了汇编语言的基础知识,所以我只会集中于我的主题,而不会再另外写一份汇编语言的教程。如果你尚未足够了解汇编语言,那么我建议你看一看Matt Pietrek于1998年2月发表在Microsoft System Journal的文章《Under The Hood》,这篇文章会给予你关于汇编语言足够的信息的。

现在就要开始我们的旅行了,那么先以这个简单的程序作为热身吧:

程序55.

void fun(int, int) {
}
int main() {
 fun(5, 10);
 return 0;
}
现在在命令行模式下,使用命令行编译器cl.exe来编译它。在编译的时候,使用-FAs开关,例如,如果程序的名字是prog55的话: Cl -FAs prog55.cpp这就会生成一个带有相同文件名,扩展名为.asm的文件,这个文件中包含有以下程序的汇编语言代码。现在看看生成的输出文件,让我们首先来讨论函数的调用吧。调用函数的汇编代码是类似这个样子: push 10      ; 0000000aH
push 5
call ?fun@@YAXHH@Z ; fun
首先,函数的参数以自右而左的顺序入栈,然后再调用函数。但是,函数的名称和我们给定的有所不同,这是由于C++编译器会对函数的名称作一些修饰已完成函数的重载。让我们稍微修改一下程序,重载这个函数,再来看看代码的行为吧。

程序56. void fun(int, int) {
}
void fun(int, int, int) {
}
int main() {
 fun(5, 10);
 fun(5, 10, 15);
 return 0;
}
现在调用这两个函数的汇编代码是类似这个样子: push 10       ; 0000000aH
push 5
call ?fun@@YAXHH@Z ; fun
push 15       ; 0000000fH
push 10       ; 0000000aH
push 5
call ?fun@@YAXHHH@Z ; fun
请看函数的名字,我们编写了两个名称相同的函数,但是编译器将函数名做了修饰完成了函数重载的工作。

1 2 3 4 5 6  下一页

Tags:ATL 之下 秘密

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