Obtention d’un exemple de code CPUID 64 bits à comstackr dans VS2008

J’essaie d’obtenir un exemple de code c & ASM que j’ai trouvé sous Visual Studio 2008. Je ne pense pas que le problème réside dans la différence entre VS 2005-2008. Cet exemple est censé obtenir le CPUID sur les systèmes 64 bits. (Mes tentatives d’obtention de la compilation des exemples 32 bits ASM uniquement ont également échoué)

Je peux copier et coller ce code dans un nouveau projet, mais je n’ai pas pu le construire. J’ai essayé quelques modèles de projet VS différents sans succès. Je crois avoir suivi les instructions jusqu’au bout. Quelqu’un peut-il fournir une procédure étape par étape pour que cela fonctionne dans Visual Studio 2008 avec le modèle de projet et les parameters de projet?

Une chose que j’ai remarquée est que, même si je peux créer un environnement 64 bits, je ne peux pas sembler cibler x64 pour ce projet – les seules options permettant d’append de nouvelles plates-formes sont des plates-formes mobiles. Et j’ai dû définir manuellement _M_X64 dans les options de ligne de commande, ce qui, je le soupçonne, ne devrait pas être dû.

Ne pas être débogué directement, mais juste pour votre information – Les erreurs, autant que je sache, sont les suivantes:

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 

Eh bien, si vous ne pouvez pas cibler x64 , vous avez un léger problème car vous n’utilisez pas la chaîne d’outils x64 . Je vous suggère fortement d’utiliser l’assistant d’installation de VS pour append les outils x64 . Vous devriez pouvoir aller sur une nouvelle plate-forme, appelez-le x64 et x64 -vous sur win32 .

Cela dit, je recommande en fait d’utiliser YASM, car cela vous permet d’intégrer VS, et YASM est de loin un assembleur plus agréable que celui de Microsoft.

Comme j’ai un projet qui en profiterait de toute façon, j’ai pensé le faire en utilisant 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 ; resortingve the vendor ssortingng in its ; three parts mov eax, 0 cpuid mov [r9+0], ebx mov [r9+4], edx mov [r9+8], ecx ; resortingeve the cpu bit ssortingng that tells us ; all sorts of juicy things mov eax, 1 cpuid mov [r8], eax mov eax, 0 leave ret 

cpuid-w32.c:

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

Après readme.txt dans l’archive vs2010 fournie sur la page de téléchargement de liens, c’était un peu fastidieux d’obtenir vs de l’assembler, et cette solution est beaucoup plus claire, je pense, que l’intel.

En ce qui concerne ce que vous faites avec le paramètre cpuinfo, vous pouvez essayer différents masques pour trouver toutes sortes d’informations sur le type de cpu. Je pourrais mettre à jour si je termine la mise en œuvre.