从32位c++到64位c++,使用Visual Studio 2010

32-bit C++ to 64-bit C++ using Visual Studio 2010

本文关键字:c++ Visual Studio 使用 2010 64位 32位      更新时间:2023-10-16

我最近想将一个32位的c++项目转换为64位,但我坚持了第一次尝试。在VS中将32位c++转换为64位时(如将32位Delphi转换为64位),您能指出任何建议/检查表/要点吗?

int GetVendorID_0(char *pVendorID,int iLen)
{
#ifdef WIN64  // why WIN64 is not defined switching to Active (x64) ?
    // what to put here?
#else
    DWORD   dwA,dwB,dwC,dwD;
    __asm
    {
        PUSHAD
        MOV     EAX,0
        CPUID   //CPUID(EAX=0),
        MOV     dwA,EAX
        MOV     dwC,ECX
        MOV     dwD,EDX
        MOV     dwB,EBX
        POPAD
    }
    memset( pVendorID,      0,iLen);
    memcpy( pVendorID,      &dwB,4);
    memcpy(&pVendorID[4],   &dwD,4);
    memcpy(&pVendorID[8],   &dwC,4);
    return dwA;
#endif
}

微软的编译器(至少是其中的一些)有一个标志来指出至少一些常见的问题,这些问题的代码可能需要修改才能作为64位代码工作。

至于你的GetVendorID_0函数,我会使用微软的_cpuid函数,就像这样:

int GetVendorID_0(char *pVendorID, int iLen) { 
    DWORD data[4];
    _cpuid(0, data);
    memcpy(pVendorID, data+1, 12);
    return data[0];
}

显然不能取代内联汇编语言的所有实例。您的选择相当简单(尽管不一定容易)。一种是找到像这样的内在力量来完成这项工作。另一种方法是将汇编代码移动到一个单独的文件中,并将其与c++中的代码链接(并学习x64调用约定)。第三种方法是简单地放弃现在正在做的事情,用更可移植的代码编写最接近的等效代码。