2010-07-08 56 views
4

我試圖讓一些C & ASM示例代碼,我發現在運行Visual Studio 2008中,我不認爲這個問題是VS 2005 - 2008年之間的差異。 This example應該在64位系統上獲得CPUID。 (我嘗試獲得ASM-僅32位的例子編譯太失敗了)獲得64位CPUID示例代碼編譯VS2008

我可以複製和將此代碼粘貼到一個新的項目,但我一直沒能建立它。我嘗試了幾個不同的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 
+0

我剛剛發佈了一個相關的問題,但不完全一樣,這(不同的方法)http://stackoverflow.com/questions/3216535/x86-x64-cpuid-in-c – 2010-07-09 21:01:07

回答

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

的readme.txt在鏈接下載頁面上提供的vs2010存檔中,用vs來組裝這個是一件輕而易舉的事情,我認爲這個解決方案比intels更清晰。

至於你在做了什麼與cpuinfo參數,以及,你可以嘗試各種掩模來找出各種關於CPU類型的信息。如果我完成實施,我可能會更新。

+0

我還沒有機會驗證這個答案,但我很欣賞你爲回答它所付出的努力。我會給你獎勵點數。 – 2011-03-23 17:41:15

+0

@JasonKleban你能幫我拿到cpu ** id **使用這段代碼嗎?不是標誌或供應商。 – Woland 2017-10-13 21:29:04

+0

@JasonKleban我發現英特爾手冊[鏈接](http://www.jaist.ac.jp/iscenter-new/mpc/altix/altixdata/opt/intel/vtune/doc/IA_32_Instructions_2A.pdf)見第25頁,它關於cpuid語法。但它是不可讀的... – Woland 2017-10-13 21:32:28