介绍
到现在为止,我们还没有讨论过任何有关汇编语言的东西。但是 如果我们真的要了解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