是否可以在intel / 64-bit win7上的32位应用程序中使用64位指令

时间:2013-09-28 01:02:02

标签: c++ assembly

我的环境是64位win7,VC2010。

当然,内部的intel是64位CPU。

我可以在32位应用程序中使用64位指令/本地机器字(64位)吗?由于我的大部分代码都是32位,我不想将其移植到64位。

对于一些性能关键的热门代码,我想通过编译器内部或内联汇编手动优化它(另外64位VC编译器不支持内联汇编),是否可以运行64位代码fox示例mov rax,在32位模式应用程序中的rbx?

2 个答案:

答案 0 :(得分:10)

实际上,你可以。用于从32位模式切换到64位模式的机制(显然必须存在于能够运行32位代码的64位操作系统上)不受任何方式保护,并且可以从用户代码中使用。在Windows上,它被称为Heaven's Gate,它非常简单:只需要​​一个33h的段选择器进行远程调用。

那么,如何运行64位代码?

call 33h:your64bitcode
...
your64bitcode:
; do something
retf

当然,对于以这种方式输入的64位代码可以做些什么有一些限制,因为你不是真正的64位进程。

答案 1 :(得分:4)

如果您的应用程序使用32位指令集,那么不,您不能选择在同一应用程序中“有时”使用64位指令。但是有一些选择:

  • 使用SIMD说明,例如SSE,AVX等。此处记录在此:http://msdn.microsoft.com/en-us/library/t467de55(v=vs.90).aspx
  • 将32位代码移植到64位。也许这不是很难?
  • 将您的程序拆分为两个:使用遗留代码的32位进程和使用新代码的64位进程。你可以在它们之间映射内存,一个可以启动另一个,所以它有点像多线程程序。它是否表现良好取决于我们目前不知道的细节。