32位窗口下的64位寄存器

Jim*_*Jim 14 x86 assembly

我刚刚在我的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位应用程序注册,但我不想经历那种痛苦,如果它无论如何都不会起作用.

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

提前感谢您的回答!

-Jim

Soa*_*Box 7

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

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

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

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

  • 我不会说这是令人费解的.它不受支持的主要原因是32位操作系统不能保存/恢复任务开关上的所有寄存器.操作系统始终必须知道如何保存/恢复进程看到的所有体系结构状态.(这就是为什么在用户空间进程可以使用SSE之前需要OS支持的原因,但MMX不需要额外的支持). (2认同)