获取64位CPUID示例代码以在VS2008中编译

时间:2010-07-08 21:18:55

标签: c visual-studio-2008 assembly

我正在努力获得一些c&我发现在Visual Studio 2008中运行的ASM示例代码。我不认为问题是VS 2005-2008之间的区别。 This example应该在64位系统上获得CPUID。 (我尝试将仅支持ASM的32位示例编译失败)

我可以将此代码复制并粘贴到新项目中,但我无法构建它。我尝试了几个不同的VS项目模板但没有成功。我相信我一直遵循指示。有人可以逐步使用项目模板和项目设置在Visual Studio 2008中运行吗?

我注意到的一件事是虽然我可以将环境设置为64位,但我似乎无法针对此项目定位x64 - 添加新平台的唯一选择是移动平台。而且我必须在命令行选项中手动定义_M_X64,我怀疑我不应该这样做。

不要直接调试,只是为了您的信息 - 错误,据我所知,如下:

1> Assembling: .\cpuid64.asm
1>.\cpuid64.asm(4) : error A2013:.MODEL must precede this directive
1>.\cpuid64.asm(5) : error A2034:must be in segment block
1>.\cpuid64.asm(7) : error A2034:must be in segment block : cpuid64
1>.\cpuid64.asm(11) : error A2034:must be in segment block
1>.\cpuid64.asm(12) : error A2008:syntax error : .
1>.\cpuid64.asm(13) : error A2034:must be in segment block
1>.\cpuid64.asm(14) : error A2008:syntax error : .
1>.\cpuid64.asm(15) : error A2008:syntax error : .
1>.\cpuid64.asm(17) : error A2034:must be in segment block
1>.\cpuid64.asm(18) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(19) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(20) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(21) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(22) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(23) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(24) : error A2085:instruction or register not accepted in current CPU mode
1>.\cpuid64.asm(26) : error A2034:must be in segment block
1>.\cpuid64.asm(27) : error A2034:must be in segment block
1>.\cpuid64.asm(29) : error A2034:must be in segment block
1>.\cpuid64.asm(30) : error A2034:must be in segment block
1>.\cpuid64.asm(31) : fatal error A1010:unmatched block nesting : cpuid64

1 个答案:

答案 0 :(得分:4)

好吧,如果你无法定位x64,那么你就会遇到一些问题,因为你没有使用x64工具链。我强烈建议您使用VS安装向导添加x64工具。您应该可以转到新平台,将其称为x64并将其基于win32

话虽如此,我实际上建议使用YASM因为它允许你与VS集成,而YASM是迄今为止比微软更好的汇编程序。

由于我碰巧有一个项目可以从中受益,我以为我会用yasm来做:

<强> gcpuid.asm

; CPUID on x64-Win32
; Ref: 

section .code
global gcpuid

; void cpuid(uint32_t* cpuinfo, char* vendorstr);

gcpuid:

    push rbp
    mov  rbp, rsp

    mov  r8, rcx   ; capture the first and second arguments into 1-> r8, 2-> r9
    mov  r9, rdx   ; cause cpuid will obliterate the lower half of those regs

    ; retrive the vendor string in its
    ; three parts
    mov eax, 0
    cpuid
    mov [r9+0], ebx    
    mov [r9+4], edx
    mov [r9+8], ecx

    ; retrieve the cpu bit string that tells us
    ; all sorts of juicy things
    mov eax, 1
    cpuid
    mov [r8], eax
    mov eax, 0

    leave
    ret

<强> CPUID-w32.c:

#include <stdio.h>
#include <stdint.h>

void gcpuid(uint32_t* cpuinfo, char* vendorstr);

int main(int argc, char** argv)
{
    char vendor[13] = { 0 };
    uint32_t flags;

    gcpuid(&flags, vendor);
    printf("Flags: %u, Vendor: %s\n", flags, vendor);

    return 0;
}

在链接下载页面上提供的vs2010存档中的 readme.txt 之后,让vs组装它是一件轻而易举的事,我认为这个解决方案比intels更清晰。< / p>

关于您使用cpuinfo参数做什么,您可以尝试使用各种掩码来查找有关cpu类型的各种信息。如果我完成实施,我可能会更新。