2013-07-01 42 views
14

我知道rdtsc將處理器時間戳計數器的當前值加載到兩個寄存器:EDX和EAX中。爲了得到它在x86我需要做的是這樣的(使用Linux假設):爲什麼我應該在x86和x86_x64上以不同的方式使用'rdtsc'?

unsigned long lo, hi; 
    asm("rdtsc" : "=a" (lo), "=d" (hi)); 
    return lo; 

和x86_x64:

 unsigned long lo, hi; 
     asm("rdtsc" : "=a" (lo), "=d" (hi)); 
     return(lo | (hi << 32)); 

這是爲什麼?有人可以向我解釋嗎?

回答

8

在x86-64模式下,RDTSC也會清除RAX的高32位。爲了補償這些位,我們必須將hi向左移動32位。

+1

所以我絕對正確,'rdtsc'將處理器時間戳計數器的當前值加載到兩個寄存器:EDX和EAX中,而不是從EAX到EDX的寄存器中? (EAX,EBX,ECX,EDX) – mazix

+0

rdtsc總是返回64位值,因此對於存儲在EDX和EAX中的32位機器,是的,你是對的。 – mvv1277

6

這個區別不在rdtsc,而是Linux內核想要處理的內容。

在32位,它返回一個32位的值。所以eax的價值就足夠了。
在64位,它返回一個64位的值。所以它需要結合兩個寄存器的值。

+0

您的意思是:32位/ 64位操作系統?好的,謝謝,現在清楚:) – mazix

相關問題