2024年6月6日发(作者:)

在VC2008下将32位C++内嵌汇编迁移到64位

为什么要汇编?

现在正在做的一个项目,是关于高密度计算的,由于计算量很大,从性能考虑,除了

算法的优化外,其中的的核心代码是用汇编写的,也许有人说,现在还有用汇编的吗?编

译器的优化已经很好了,性能已经非常接近于汇编了,有必要用汇编实现吗?呵呵,再好

编译器的优化也没有人工优化好。是的,两者的性能相差不大,可是也有10%-20%的差

距啊,尤其是作为核心代码,在一个典型过程中要执行400万到1000万次,那么性能相

差是相当明显的。就拿现在的例子来讲,算法优化后,多线程(8核8线程)执行一个过

程在C++需要大约62毫秒,而用汇编实现则仅需要53毫秒。

好了,罗嗦了一段为什么要使用汇编的原因,下面进入这题。上述的汇编是采用内嵌

汇编在VC2008-x86下实现的,现在要将该工程移植到64位下,字长长了,应该对并行

计算大大得有好处,性能可以进一步提高。

在VC2008-x64下编译工程,纯C++配置,编译出来上述的典型过程需要59毫秒,

比32位快了5%。

接着打开汇编编译开关,编译内嵌汇编,编译器报告_asm{}语法错误!查资料,原来

C++还不支持内嵌的64位汇编。没办法,如果不实现汇编,那么移植是毫无意义的,毕

竟还不如32位带汇编的效率高。看来要实现汇编只有一种方法,就是写单独的汇编代码,

然后编译为obj文件再链接进原来的工程。

C++到汇编

不过本人所有的汇编经验仅限于内嵌汇编,对于独立的汇编程序,经验趋近于零。继

续查资料,OMG,独立的汇编有太多的约定,比如接口定义,各个段的定义和标志,还有

不同的调用约定,太麻烦了。而且项目的时间不允许我花上一两个星期来学习。怎么办呢?

VC++再调试中,你可以打开汇编语言页面,跟踪一条条汇编指令,也就是说VC++

一定是将源代码先编译为汇编再编译为二进制目标码的,也许编译器有汇编的开关吧,说

干就干,打开DOS窗口,到VC++编译器cl的目录下,敲入

cl /?

你在-OUTPUT FILES-一栏中可以看到这个选项:

/Fa[file] name assembly listing file

哈哈,原来还可以直接输出汇编代码。那么有办法了,我就先把核心代码那段拿出来,

单独建一个c++文件,去掉所有不相关的头文件,仅将必要的数据类型和常量定义加上,

然后在DOS窗口下编译:

cl /c /Fa decoder_

不出所料得到了汇编代码的输出:

decoder_

代码内容如下: