[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]

时间:2022-01-19 01:03:59

情景

在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位自定义生成规则文件

  • 打开自定义生成规则文件窗口,项目->自定义生成规则,如图:

[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]

  • 可以看到后缀为.asm文件的编译规则设置,使用的是ml.exe;

[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]

  • 点击修改可以看到使用的是哪个规则文件:

[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]

64位自定义生成规则文件步骤

  • 我们通过上面可以知道,32位的规则文件在哪,以及放在哪,我这里的目录为:C:\Program Files (x86)\Microsoft Visual Studio 8\VC\VCProjectDefaults;
  • 把masm.rules复制一份,并命名为masm64.rules;
  • 我们再打开自定义生成规则设置窗口或者点击《自定义生成规则文件》窗口中的刷新列表,可以看到多了一条记录,点击选择多出那条也就是第三条,点击修改按钮进入修改窗口,可以看到规则文件名是masm64.rules;
  • 选中自定义规则,这里只有一条,再点击修改生成规则,进入窗口后修改,把ml.exe改成ml64.exe,如图:

[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]

  • 点击确定,如果提示不能修改只读文件,保存失败,得修改masm64.rules文件的权限;
  • 到这里基本完成设置了,不过记得把第三项的规则文件选上,要不然在64环境下,编译.asm文件是不行的,找不到规则去编译。

[32位移植到64]_[C/C++代码嵌入汇编代码移植篇]


最后

把汇编代码移出来单独形成单元文件,生成单独的.obj,链接的时候要记得加上这个.obj,要不然链接失败。我汇编不怎么样,就不献丑,就不单独写出例子来了。