64位应用程序和内联汇编

我正在使用Visual C ++ 2010开发32位Windows应用程序。 有一些我真的想要使用内联汇编。 但是我刚刚意识到Visual C ++不支持64位应用程序中的内联汇编。 因此将来移植到64位是一个大问题。

我不知道64位应用程序如何与32位应用程序不同。 将来有没有机会将32位应用程序全部升级到64位? 我听说64位的CPU有更多的寄存器。 由于性能不是我的应用程序的关注,使用这些额外的寄存器不是我所关心的。 还有什么其他的原因,32位应用程序需要升级到64位? 除了64位应用程序可能使用64位CPU专有的寄存器或指令之外,64位应用程序与32位应用程序相比处理事情是否有所不同?

我的应用程序需要与其他操作系统组件进行交互,例如驱动程序,我知道它必须是64位窗口中的64位。 我的32位应用程序是否兼容?

Solutions Collecting From Web of "64位应用程序和内联汇编"

Visual c + +不支持内联汇编为x64模式,因为通常使用内联汇编是一个坏主意。

  1. 通常编译器比人类产生更好的装配。
  2. 即使您可以生成比编译器更好的汇编,使用内联汇编通常也会打败任何类型的代码优化器。 当然,你手中优化过的代码可能会更快,但是代码无法优化的事实通常会导致整个程序的运行速度变慢。
  3. 编译器内在函数可以从几乎所有主要的编译器中获得,这些编译器允许您以与C和C ++语言一致的方式访问高级CPU特性(例如SSE),并且不会击败优化器。

我想知道是否会有一个机会,32位应用程序将在未来所有必须升级到64位。

这取决于你的目标受众。 如果你的目标是服务器,那么是的,允许用户不要安装WOW64子系统是合理的,因为它是一个服务器 – 你知道它可能不会运行太多的32位代码。 我相信如果将Windows server 2008 R2作为“服务器核心”实例安装,Windows server 2008 R2已经允许这个选项。

由于性能不是我的应用程序的问题,所以使用额外的64位寄存器不是我关心的问题。 还有什么其他的原因,将来一个32位的应用程序必须升级到64位?

64位与寄存器无关。 它与可寻址虚拟内存的大小有关。

除了64位应用程序使用64位CPU独有的寄存器/指令之外,64位应用程序与32位应用程序进程有什么不同?

最有可能的。 32位应用程序受到限制,因为它们不能将超过〜2GB的内容一次映射到内存中。 64位应用程序没有这个问题。 即使不使用超过4GB的物理内存,也能够处理超过4GB的虚拟内存,这有助于将磁盘上的文件映射到内存和类似内存中。

我的应用程序需要与其他操作系统组件进行交互,例如驱动程序,我知道它必须是64位的64位窗口。 我的32位应用程序是否兼容?

这完全取决于你如何与这些司机沟通。 如果是通过“命名文件界面”的东西,那么你的应用程序可以保持为32位。 如果你想做一些像共享内存一样的东西(Yikes!共享内存可以从用户模式下用驱动程序?!?),那么你将不得不把你的应用程序构建为64位。

除了@Billy写的很好,如果你真的觉得需要使用内联64位汇编,那么你可以使用像MASM这样的外部汇编器来完成这个任务 。 (它也可以通过预建脚本加速)。

英特尔C编译器15也具有64位内联功能。 你可以把Visual Studio中的IC作为一个工具集:然后你就可以用内联汇编的VC ++ 64bit。 一个赶上,昂贵的欢呼声