2016-02-05 19 views
3

我正在重新訪問我之前寫過的代碼,它在大量數據上做了一些數學計算。當我編寫代碼時,實驗室有幾個x86分爲32位和64位。我的工作是在UltraSPARC上,我隱約記得從英特爾手冊中提取這行代碼以確保代碼在64位CPU上使用。在這個asm行中.byte是什麼意思?

unsigned long x[4]; 
x[0] = 0; 
x[1] = 0; 
x[2] = 0; 
x[3] = 0; 
asm volatile(".byte 15;.byte 162" : "=a"(x[0]),"=b"(x[1]),"=c"(x[3]),"=d"(x[2]) : "0"(0)); 

如果x [0]是0,一切都很好,程序開始慢慢消失。

任何人都可以向我解釋這行代碼實際上做了什麼?

+0

15是爲0x0F,所以我想這是一些操作碼。乘? –

+3

0FA2(15,162,十進制)是CPUID指令。我想有更簡單的方法來使用它。 – harold

回答

3

字節.byte 15.byte 162代表CPUID指令。
當它執行時,得到EAX,EBX,ECXEDX的結果。

這些結果將被存儲在數組元素:

x[0] <- EAX 
x[1] <- EBX 
x[2] <- EDX 
x[3] <- ECX 
+0

謝謝!多麼愚蠢的方式來指定0FA2的CPUID指令。我想在那個時候程序集一定不能支持CPUID或者其他奇怪的東西。 –

+0

@bdegnan:看起來確實如此,他們確保可能不支持CPUID操作碼的GCC編譯器仍然可以工作。我注意到一個這樣的變化,在線代碼從CPUID轉到了.byte編碼,具體原因如下:http://sourceforge.net/p/vice-emu/code/27857 –