情景
在C/C++一些代码中为了高效及方便,是允许嵌入汇编。这在VS的32位编译中,直接嵌入都是没问题的,不需要另外处理,但在64位中编译就会报错了。64位就不支持混编了,错误如下:
1>.\test2.cpp(16) : error C4235: 使用了非标准扩展: 不支持在此结构上使用“__asm”关键字
1>.\test2.cpp(19) : error C2065: “rdtsc”: 未声明的标识符
我的代码例子是
int _tmain(int argc, _TCHAR* argv[]) { __asm { rdtsc mov lowtick, eax mov hightick, edx } return 0; }
开发环境
我用的开发环境是
开发工具:VS 2005
操作系统:win 8 pro
CPU:AMD
解决步骤
VS支持C/C++跟汇编混编,不需要其他设置,64位不支持混合编怎么办呢,还好vs支持自定义生成规则,可以通过自定义生产规则文件设置达到64汇编编译;
因为VS有默认对32位汇编编译支持,所以我们只要参照着32位的自定义规则设置就行;
在说解决步骤之前我们先看看32的汇编生成规则文件设置。
32位自定义生成规则文件
- 打开自定义生成规则文件窗口,项目->自定义生成规则,如图:
- 可以看到后缀为.asm文件的编译规则设置,使用的是ml.exe;
- 点击修改可以看到使用的是哪个规则文件:
64位自定义生成规则文件步骤
- 我们通过上面可以知道,32位的规则文件在哪,以及放在哪,我这里的目录为:C:\Program Files (x86)\Microsoft Visual Studio 8\VC\VCProjectDefaults;
- 把masm.rules复制一份,并命名为masm64.rules;
- 我们再打开自定义生成规则设置窗口或者点击《自定义生成规则文件》窗口中的刷新列表,可以看到多了一条记录,点击选择多出那条也就是第三条,点击修改按钮进入修改窗口,可以看到规则文件名是masm64.rules;
- 选中自定义规则,这里只有一条,再点击修改生成规则,进入窗口后修改,把ml.exe改成ml64.exe,如图:
- 点击确定,如果提示不能修改只读文件,保存失败,得修改masm64.rules文件的权限;
- 到这里基本完成设置了,不过记得把第三项的规则文件选上,要不然在64环境下,编译.asm文件是不行的,找不到规则去编译。
最后
把汇编代码移出来单独形成单元文件,生成单独的.obj,链接的时候要记得加上这个.obj,要不然链接失败。我汇编不怎么样,就不献丑,就不单独写出例子来了。