2013-07-01 12 views
14

Wiem, że rdtsc ładuje bieżącą wartość licznika znaczników czasu procesora do dwóch rejestrów: EDX i EAX. Aby dostać się na x86 muszę zrobić to w ten sposób (przy założeniu korzystania z systemu Linux):Dlaczego powinienem używać "rdtsc" inaczej na x86 i x86_x64?

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

i x86_x64:

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

dlaczego tak jest? Czy ktoś może mi to wytłumaczyć?

Odpowiedz

8

W trybie x86-64, RDTSC kasuje również 32 bity RAX. Aby skompensować te bity, musimy przesunąć się w lewo o 32 bity.

+1

Więc mam absolutną rację, że 'rdtsc' ładuje aktualną wartość licznika znaczników czasu procesora do dwóch rejestrów: EDX i EAX, a nie do rejestrów z EAX do EDX? (EAX, EBX, ECX, EDX) – mazix

+0

rdtsc zawsze zwraca wartość 64-bitową, więc dla maszyny 32-bitowej przechowuje ją w EDX i EAX i tak, masz rację. – mvv1277

6

Różnica nie występuje w rdtsc, ale w tym, co jądro Linux chce z nią zrobić.

W wersji 32-bitowej zwraca wartość 32-bitową. Wartość eax jest wystarczająco dobra.
W wersji 64-bitowej zwraca wartość 64-bitową. Musi więc połączyć wartości z obu rejestrów.

+0

Masz na myśli: system 32-bitowy/64-bitowy? ok, dzięki, teraz jest jasne :) – mazix

Powiązane problemy