32位窗口下的64位寄存器

时间:2011-08-13 01:06:19

标签: assembly x86

我刚刚在我的32位Vista盒子上安装了mingw32来试验gcc内联汇编。不幸的是,32位gcc编译器无法识别64位寄存器, 例如%% rax。

在我花费大量时间尝试组装新工具链之前,我有几个问题:

  1. 在x86(英特尔酷睿双核处理器,T5800)上是否有一些处理器模式会阻止它在运行Vista32时使用64位寄存器(即这是一个失败的原因)?

  2. 假设对#1的回答是“当然你可以在32位窗口下使用%rax等”,可以将gcc配置为识别64位寄存器并构建将运行的可执行文件在32位窗口下?我知道gcc有一个-m64选项,但是mingw32附带的我的版本没有编译的64位支持。我当然愿意重建gcc,如果它可以构建可以访问64位的32位应用程序注册,但如果不管怎么说,我不想经历这种痛苦。

  3. 除此之外:这实际上是学习SSE2指令的第一步(是的,我知道,存在编译器内在函数,但我想从机器级别了解它。)

    提前感谢您的回答!

    -Jim

1 个答案:

答案 0 :(得分:7)

  1. 是的,64位处理器有3种大小模式,16位,32位和64位。操作系统无法以大于操作系统本身的模式运行代码。因此Vista 32位只能运行为16位和32位构建的代码。您的处理器does indeed support 64-bits,因此您应该尝试在其上安装64位操作系统。如果您的计算机附带实际的Windows Vista CD,则Vista 64可能有单独的CD。如果您使用x86-64支持构建新的工具链,您将能够编译使用64位指令和寄存器的代码,但您将除非安装64位操作系统,否则无法运行生成的可执行文件。

  2. 由于rax是64位寄存器(32位等效值为eax),因此除64位程序外无法访问它。这样做的原因是对处理器如何解释程序发送的命令的一个相当复杂的解释。

  3. 但是,您实际上不需要访问64位代码才能使用MMX,SSE,SSE2和SSE3。所有这些指令均以32位模式提供,并由处理器支持。

    您可能还想考虑运行虚拟机并将Ubuntu放入其中。这将允许您在Windows桌面上的窗口中运行Linux。我认为使用GNU工具链(gcc等)比使用mingw32更容易使用GNU工具链(gcc等)。虚拟机在这个时代很容易安装和使用,没有理由再使用mingw32了。您还可以查看MS Visual C ++ Express,这是一个基于Windows的编译器,它是免费的,但它不支持64位(您必须支付版本)。