当前位置: 网学 > 编程文档 > 汇编语言 > 正文

VC7中汇编和C++混合的初步心得

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式

在CSDN社区与人争论语法,终极武器不外乎两把 —— 上天入地。

上天者,搬出枕头厚的大部头引经据点,说有Lipman某典故云云;又有C++标准M页N条款如是说

入地者,操起起子扳手把程序拆个凄凉八落,啪啪啪回上一大片编译器汇编的输出,说——看吧,都在这里了。

事实上,我发觉两者对于深入理解C++都是必不可少的。前些时,论坛上突然流行讨论数组的本质。怪的是,每次我以为自己真的懂了,下一次又却发现自己的轻浮。等到通晓实现细节,再回过头来看最土的C教材的定义,竟发现字字玑珠。

最近对入地颇感兴趣,动辄查汇编,写了不少混合代码研究语法。放下扳手抹抹鼻尖上的机油,倒是有些心得。各位看官——我就要跟大家乱侃近来入地一个多月,邪门歪地道挖出杂七杂八的东西——的工具——就汇编。

参考书也必不可少;可悲的是我手头仅有的两本书一本是老掉牙的8086汇编,另一本则是AT&T语法的 —— 广泛用于Linux上的编译器, 但VC 偏要使用Inter语法. 带来麻烦不少,希望大家慷慨解囊之前先看准。


1 察看编译器输出

通常来说,Debug 模式单步跟踪时Alt+8 就可以看见汇编代码。问题是 Debug 只是代表了一个侧面,并不代表最终的 Release ;另一方面 Debug 模式包含了些许额外的测试代码 —— 恩,可能代码有些多天啊,他们干嘛要加、那么多、莫名其妙的代码混淆视听阿!

好嘛,看看简洁的Release模式 —— orz. 不能单步跟踪C++程序了? 连main函数在哪里都看不见 瞎了

Release 模式单步跟踪要需要高深的技术底气。不过也没那么绝,要看 Release 模式的输出,我们可以在项目属性->C/C++->输出文件页面中把“汇编输出”项定为“带源代码的程序集(/FAs)”。这样,在Release目录下就可以看见对应的asm文件了。看asm文件,唯一的缺点是不能单步跟踪研究。

这个asm文件搞不好会非常大——主要是由于C++标准库广泛使用模板的原因,若我们放弃C++库一律使用C标准库就会看到很干净的asm文件(同时会看见一个1/4大小的可执行文件,你会明白为什么那么多人支持C )——当然这不是C++的干活。 要在这个动辄数W行的文件中里面找源代码对应的汇编,推荐大家找一行一定不会被优化掉的代码(没错,某些代码可能人间蒸发),直接F3搜索

asm中包含了很多注释,有基本的汇编知识然后连蒙带猜就能看懂了。一对挺有用的标志是:

_TEXT SEGMENT // 代码段开始标志
_TEXT ENDS // 代码段结束标志

对于观察每个函数的生成代码来说,这两个标志能起到路标的作用。


2 汇编访问类成员

若有一个类

class A{
int _i;
};

有A 的实例a,下面的代码令 a._i = 10,这只需要一个指令:

__asm mov [a]A._i, 10

但是在A 的成员函数中怎么办呢?

我们知道,成员函数调用为 thiscall, this通过 ecx传递。所以在函数的开头现场尚未被破坏的时候,可以直接用 ecx 变址访问。如下面是一个常见的set函数, 它令 A::_i = n (注意mov等指令中,两个操作数不能同时为内存内容,所以必须用寄存器eax接力):

inline void A::i( int n ){
__asm mov eax, n
__asm mov [ecx]A._i, eax
}

不过这有两个问题。一来,ecx并非总是this;它随时可能被刷掉。在某个不能确定保存this寄存器的时候,你需要手动写ecx:

__asm mov ecx, this
__asm mov eax, n
__asm mov [ecx]A._i, eax

这样写会迫使编译器把this的值复制到栈上 —— 而一般来说对于小函数而言,编译器会尽量只用寄存器。这可能是一个额外的小小开销。(注意,千万不要以为可以这么访问: [this]A._i )

另一方面,虽然在我们的确写了大大的“ inline ”几个字,但是看看输出代码—&md

  • 上一篇资讯: Linux下的汇编程序设计
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号