2013-07-01 6 views
14

rdtsc은 프로세서의 타임 스탬프 카운터의 현재 값을 EDX와 EAX의 두 레지스터에로드한다는 것을 알고 있습니다. 나는 그런 식으로 할 필요가 x86에서 그것을 얻기 위해 (리눅스를 사용하는 가정) : 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의 두 레지스터에로드합니다. 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? 좋아, 고마워, 지금은 분명히 :) – mazix