2013-09-28 65 views
4

我的环境是64位win7,VC2010。是否有可能在intel/64位win7上的32位应用程序中使用64位指令

当然,intel里面是64位的CPU。

我可以在32位应用程序中使用64位指令/本机机器字(64位)吗?由于我的大部分代码都是32位的,我不想将它移植到64位。我想通过编译器内部或内联汇编(也是64位VC编译器不支持内联汇编)手动优化它,是否有可能运行64位代码fox示例mov rax ,在32位模式应用程序中的rbx?

+0

可能的重复[在32位Windows下使用Amd64指令的轻量级方法?](http://stackoverflow.com/questions/7133078/lightweight-method-to-use-amd64-instructions-under-32bit -windows) –

+3

@John Zwinck:不,它不是重复的。这里的操作系统是64位。 –

+0

顺便说一下,当使用MSVC定位64位时,您仍可以链接分别汇编的代码。 – harold

回答

4

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

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

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

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

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

有,当然,一些限制,你可以以这种方式进入的,因为你在一个64位的过程确实不是64位的代码做什么。

+0

您可以在Windows上以PE32-in-seg64的身份执行64位系统调用(您可以在Linux中)(http://stackoverflow.com/a/32384358/673852)? – Ruslan

+0

@Ruslan在原始系统调用?我从来没有尝试过,但我没有看到他们不工作的直接原因。在kernel32.dll中调用东西的通常方式比较困难,因为加载了错误的版本,并且不能使用'LoadLibrary',但是仍然有一些技巧可以加载它 – harold

+0

我的意思是原始系统调用 - 那些由'syscall'指令调用的系统调用。 – Ruslan

相关问题