2016-02-05 36 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 –