免责声明:无法用言语形容我有多讨厌AT & T型语法哪个内联汇编代码对于rdtscp是正确的?
我有,我希望是由寄存器重挫造成的问题。如果不是,我有一个更大的问题。
我使用的第一个版本是
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或两者兼而有之?
分享你对语法的讨厌。当我到达这一点时,我寻找编译器的内部函数,或者只是把函数放在一个.s文件中,然后自己将它们组合起来...... – 2013-02-09 01:04:55
@MichaelDorgan不幸的是VC++提供了一个可爱的内在的gcc。 – James 2013-02-09 01:07:10
+1只是'憎恨AT&T风格的语法' – 2013-02-09 09:05:28