2010-03-10 59 views
2

我試圖用C++中的彙編器讀取CPUID。我知道它有功能,但我想要的方式。因此,在CPUID執行後,它應該用ASCII編碼的字符串填充eax,ebx,ecx寄存器。但我的問題是,因爲我可以在asm地址只有完整的,或半eax寄存器,如何將這32位分成4個字節。我用過這個:C++字到字節

#include <iostream> 
#include <stdlib.h> 

int main() 
{ 
_asm 
{ 
cpuid 
/*There I need to mov values from eax,ebx and ecx to some propriate variables*/ 
} 
system("PAUSE"); 
return(0); 
} 
+0

這個問題可能被錯誤地理解爲「如何在沒有學習裝配的情況下在程序集中編程?」根據你的要求。顯而易見的答案是您要學習如何爲您的首選環境(Visual C++,x86 Linux上的GCC等)執行_x86內聯assembly_。 – mctylr 2010-03-10 21:34:33

+0

爲什麼?我實際上比C更熟悉程序集。這個_asm {}實現在Visual C++中運行良好。我只是不知道如何使用C++將這些4字節分成4個字符。 – Vit 2010-03-10 21:52:13

回答

2

Linux內核源碼shows how使用內聯彙編執行x86 cpuid。語法是GCC特有的;如果你在Windows上,這可能沒有幫助。

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, 
           unsigned int *ecx, unsigned int *edx) 
{ 
     /* ecx is often an input as well as an output. */ 
     asm volatile("cpuid" 
      : "=a" (*eax), 
       "=b" (*ebx), 
       "=c" (*ecx), 
       "=d" (*edx) 
      : "0" (*eax), "2" (*ecx)); 
} 

一旦你有這種格式的函數(注意EAX,ECX是輸入,而所有四個是輸出),則可以很容易地打破了在呼叫方的各個位/字節。

0

我不明白你爲什麼不使用所提供的功能,反正

+0

Becouse我喜歡自己寫簡單的函數:) – Vit 2010-03-10 21:52:51

+0

那麼,我是否看到了第一個鏈接,並看到了你的內容? – stacker 2010-03-10 22:16:41

+0

當然,我有。但我擔心它現在對我來說太多了。你知道,我在8051兼容的CPU上學習了基本的asm,所以x86是一個挑戰。但是,你能告訴我一件事嗎?當我將內聯asm編寫成C代碼時,沒有預處理器指令,我相信它全部由C代碼設置,對吧?你知道,我是新來的遊戲:) – Vit 2010-03-10 22:54:59