免責聲明:無法用言語形容我有多討厭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