2013-07-01 4 views
14

rdtscは、プロセッサのタイムスタンプカウンタの現在の値をEDXとEAXの2つのレジスタにロードすることがわかります。 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ビットもクリアします。これらのビットを補正するために、32ビット左にシフトする必要があります。

+1

これは、 'rdtsc'がプロセッサのタイムスタンプカウンタの現在の値をEDXとEAXの2つのレジスタにロードし、EAXからEDXへのレジスタにロードしないということです。 (EAX、EBX、ECX、EDX) – mazix

+0

rdtscは常に64ビットの値を返します.32ビットマシンの場合、EDXとEAXに格納されます。 – mvv1277

6

違いはrdtscではなく、Linuxカーネルで何をしたいのですか。

32ビットでは、32ビット値を返します。したがって、eaxの値は十分です。
64ビットでは、64ビットの値を返します。したがって、両方のレジスタの値を組み合わせる必要があります。

+0

意味:32ビット/ 64ビットOSですか? OK、ありがとう、今、そのクリア:) – mazix

関連する問題