免责声明:言语无法描述我对 AT&T 风格语法的厌恶程度
我有一个问题,我希望是由寄存器破坏引起的。如果没有,我有一个更大的问题。
我使用的第一个版本是
static unsigned long long rdtscp(void)
{
unsigned int hi, lo;
__asm__ __volatile__("rdtscp" : "=a"(lo), "=d"(hi));
return (unsigned long long)lo | ((unsigned long long)hi << 32);
}
我注意到这个版本中没有“破坏”的东西。这是否是我不知道的问题......我想这取决于编译器是否内联函数。使用这个版本会给我带来一些并不总是可重现的问题。
我找到的下一个版本是
static unsigned long long rdtscp(void)
{
unsigned long long tsc;
__asm__ __volatile__(
"rdtscp;"
"shl $32, %%rdx;"
"or %%rdx, %%rax"
: "=a"(tsc)
:
: "%rcx", "%rdx");
return tsc;
}
这是令人放心的不可读和官方外观,但就像我说的那样,我的问题并不总是可重现的,所以我只是试图排除我的问题的一个可能原因。
我认为第一个版本存在问题的原因是它覆盖了以前保存函数参数的寄存器。
什么是正确的...版本 1 或版本 2,或两者兼而有之?