Получение примера кода 64-битного CPUID для компиляции в VS2008 - PullRequest
4 голосов
/ 09 июля 2010

Я пытаюсь получить пример кода c & ASM, который я обнаружил в Visual Studio 2008. Не думаю, что проблема в разнице между VS 2005-2008. Этот пример должен получить CPUID в 64-битных системах. (Мои попытки получить 32-битные примеры только для ASM для компиляции тоже провалились)

Я могу скопировать и вставить этот код в новый проект, но я не смог его создать. Я пробовал несколько разных шаблонов проектов 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 Ответ

4 голосов
/ 20 января 2011

Ну, если вы не можете нацелиться на x64, у вас есть небольшая проблема, потому что вы не используете x64 набор инструментов.Я настоятельно рекомендую вам использовать мастер установки VS, чтобы добавить в x64 инструменты.Вы должны иметь возможность перейти на новую платформу, назвать ее x64 и основать ее на win32.

Сказав это, я на самом деле рекомендую использовать YASM , поскольку она позволяет интегрироватьс VS, и YASM намного лучше ассемблера, чем Microsoft.

Поскольку у меня есть проект, который все равно выиграет от этого, я подумал, что сделаю это, используя 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;
}

После readme.txt в архиве vs2010, представленном на странице загрузки ссылок, было непросто заставить vs собрать это, и я думаю, что это решение намного яснее, чем intels.

Относительно того, что вы делаете с параметром cpuinfo, ну, вы можете попробовать различные маски, чтобы узнать все виды информации о типе процессора.Я мог бы обновить, если я закончу реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...