代码之家  ›  专栏  ›  技术社区  ›  Jason Kleban

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

  •  4
  • Jason Kleban  · 技术社区  · 14 年前

    我想买些c&我发现ASM示例代码在VisualStudio2008中运行。我不认为问题在于与2005-2008的区别。 This example 应该在64位系统上获取CPUID(我试图让ASM只编译32位示例也失败了)

    不需要直接调试,但仅针对您的信息-据我所知,错误如下:

    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 回复  |  直到 14 年前
        1
  •  4
  •   user257111 user257111    13 年前

    如果你不能瞄准 x64 ,您有一个小问题,因为您没有使用 工具链。我强烈建议您使用VS安装向导来添加 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
    

    #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;
    }
    

    跟随 自述文件.txt 在链接下载页面上提供的vs2010归档文件中,让vs来组装这个是一件很困难的事情,我认为这个解决方案比intels更清楚。

    至于你想说什么