16

rdtscプロセッサのタイムスタンプ カウンターの現在の値を、EDX と EAX の 2 つのレジスタにロードすることはわかっています。x86で取得するには、次のようにする必要があります(Linuxを使用していると仮定):

    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) );

何故ですか?誰か説明してくれませんか?

4

2 に答える 2

9

x86-64 モードでは、RDTSC は RAX の上位 32 ビットもクリアします。これらのビットを補正するには、hi を 32 ビット左にシフトする必要があります。

于 2013-07-01T10:36:36.840 に答える
9

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

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

于 2013-07-01T11:10:41.297 に答える