ATL布幔之下的秘密(4)

介绍

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

时间: 2025-01-07 18:07:10

ATL布幔之下的秘密(4)的相关文章

ATL布幔之下的秘密(5)

介绍 很多人认为ATL只是用来编写COM组件的,其实你也可以使用ATL 中的窗口类来创建基于窗口的应用程序.虽然你可以将基于MFC的程序转换为ATL ,但是ATL中对于UI(译注:用户界面)组件的支持太少了.所以,这就要求你 需要自己编写很多代码.例如,在ATL中没有文档/视图,所以在你想使用它的时 候就需要自己实现了.在本篇中,我们将要探究一些关于窗口类的秘密,以及 ATL技术实现的秘密.WTL(Window Template Library,窗口模板库),虽然到 现在(译注:本文于2002年

ATL布幔之下的秘密(3)

介绍 如果你是个模板的高手,你就可以将ATL的学习作为一种享受. 在这一节中,我将要尝试解释一些ATL使用的模板技术.我不能保证你读完本节 后能成为一个模板高手,只能是尽我所能让你在读完本文后能够更轻松地理解 ATL的源码. 程序35. #include <iostream> using namespace std; template <typename T> T Maximum(const T& a, const T& b) { return a > b ?

ATL布幔之下的秘密(2)

介绍 在本系列的教程中,我要讨论一些ATL的内部工作方式以及它所 使用的技术,这是本系列的第二篇文章. 现在让我们来探究一些虚函数 背后更加有趣的资料.为了和上文保持一致,在本文的讨论中我将使用相同的顺 序,程序的序号从20开始. 让我们看看下面这个程序: 程序 20. #include <iostream> using namespace std; class Base { public: virtual void fun() { cout << "Base::fun&

ATL布幔之下的秘密(1)

介绍 在本系列的教程中,我要讨论一些ATL的内部工作方式以及它所 使用的技术. 在讨论的开始,让我们先看看一个程序的内存分布.首先 ,编写一个简单的程序,它没有任何的数据成员,你可以看看它的内存结构. 程序1. #include <iostream> using namespace std; class Class { }; int main() { Class objClass; cout << "Size of object is = " <<

《2040大预言:高科技引擎与社会新秩序》——1.3众目睽睽之下的秘密

1.3众目睽睽之下的秘密 高科技被五个相互促进的趋势所驱动--数字化.网络化.微型化.仿真以及一个全新的趋势,它们都在以爆发式的指数方式增长.全球经济的发展经历了一系列漫长的持续爆发过程.其中最重要的一次发生在50多年以前,并且引发了连锁反应,经济发展从那时开始加快了步伐.这次爆发的影响一开始很小,甚至在20年间都没有受到重视.它就像一棵破土而出的大树,到了20世纪80年代,它的生长已经开始震颤大地,很多人此时才开始感受到它的存在,而正是在这个10年里,全球的经济发展速度达到了顶峰.然而时至今日

VC ATL专题

ATL的GUI程序设计(前言) ATL的GUI程序设计(2) ATL的GUI程序设计(1) ATL/COM简单工程 ATL COM和ADO VC++与MATLAB混合编程及其应用 MATLAB与VC++混合编程实现一维小波多尺度分解. 基于VC++中ATL创建ActiveX控件的探讨 精通VC与MATLAB联合编程<十>--综合举例二 精通VC与MATLAB联合编程<九>--综合举例一 精通VC与MATLAB联合编程(八) 精通VC与MATLAB联合编程(七) 精通VC与Matla

《2040大预言:高科技引擎与社会新秩序》—— 导读

https://yqfile.alicdn.com/683bee5af9406274fec3a64d0320f1e6c1a543c2.png" > 前 言从上世纪80年代初开始,一连串的客户邀请我分析世界经济的不同部分,"解码"国际社会实际如何工作并互相影响.在那段时间里,我自始至终都被授予独一无二的权力,以获取全世界所有企业.事业单位.政府机构.秘密团体.协会和非正式组织的资料,而正是它们共同构成了世界经济.这些经历真的是让我大开眼界.由于接触了这么多全球范围内的经济

揭开小米那些不为人知的秘密

雷军又摔手机了. 2011年8月19日,在北京车库咖啡的一个论坛上,面对网友"国产山寨货"的质疑,雷军掏出手机,当众示范了摔手机.另两位小米联合创始人黎万强.周光平坐在旁边,则是心惊肉跳."前两次摔手机一次是在小米发布会的台子上,铺了地毯,一次是雷军坐着演示的.但这回,车库咖啡可以实打实的大理石地,雷总个头又高,站着摔的,质量再好的手机也悬呀!" 命悬一线,是当时业界对小米的主流看法,也是小米七大创始人头上悬的一把看不见的剑.特别在2011年8月到10月份,可能是雷

在MFC和ATL工程中使用动画GIF

CPictureEx 是一个为 MFC 程序使用的 C++ 类,对于一些需要使用JPEG 和 GIF 图像格式作为 banner 的应用程序可以借助这个类来实现.对于静态 banner 的显示使用 OleLoadPicture 函数和 IPicture 接口并不难实现,但处理带动画的 GIF实现方法则完全不同. 在网上查了很多相关资料,仅仅发现一个可以免费使用的资源--CodeGuru上一个由George Tersaakov 写的COM 对象.不幸的是,我用自己的 GIF 测试这个 COM 对象