0

我最近想将一个 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
}
4

1 回答 1

3

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

就您的GetVendorID_0功能而言,我会使用 Microsoft 的_cpuid功能,如下所示:

int GetVendorID_0(char *pVendorID, int iLen) { 
    DWORD data[4];

    _cpuid(0, data);
    memcpy(pVendorID, data+1, 12);
    return data[0];
}

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

于 2013-04-18T16:33:33.213 回答