전체 : 4,150,784 명
어제 : 0 명
오늘 : 0 명

ReaD Time Stamp Counter (RDTSC) 명령어

Sone | 2010.02.03 18:51 | 조회 9994

IA-32 매뉴얼을 참고하여 , 해당 명령어에 관해서 설명을 하겠습니다.


1. 명령어 소개

RDTSC는 IA-32 아키텍쳐 기반으로 설계된 CPU에서 동작하는 명령어입니다.


CPU도 디지털 회로이고 , 디지털실험을 해보신분은 알겠지만 ,

그 많은 회로들중에서 카운터 회로는 디지털시스템에서 중요한 역할을 합니다.

CPU에는 클럭틱이 칩에 인가될때마다 그 횟수를 기록하는 내부 카운터를 내장하고있는데,

카운터의 결과물은 IA 32 TIME STAMP COUNTER MSR 이라고 하는 64비트 레지스터에 저장됩니다.

이 카운터 기록을 읽어들이는 작업을 타임 스탬프 카운터를 읽어들인다(ReaD Time Stamp Counter) 라고 하며 ,

명령어로는 RDTSC 라고 하는것입니다.

IA32 TSC MSR 레지스터가 64비트이기 때문에 RDTSC명령어를 수행하면 그 결과물도 64비트가 반환됩니다.

EDX(32비트):EAX(32비트) 에 결과물을 받게 됩니다.

이는 64비트 시스템에서도 RDX[31:0]:RAX[31:0] 에 받게 됩니다.


이 카운터 수치를 이용해서 , CPU의 클럭주파수를 측정하기도 하고 , 현재 시간을 계산하는데도 이용됩니다.



2. 명령어 사용 조건

어셈블리어는 다들 잘 아시다시피 , 일부 명령어를 사용하는데 조건이 있습니다.

RDTSC같은 경우는 IA-32 CPU 내부의 Control Register 4번의 두번째 비트(Second Bit)인

Time Stamp Disable 이 1로 설정되어져 있으면(Set),

Ring 0 (커널모드) 에서만 명령어를 사용할 수 있으며 , 0으로 설정되어져 있으면(Clear) Ring3(유저모드)와 Ring0(커널모드) 에서 사용가능합니다.

컨트롤 레지스터의 비트 제어는 Ring0(커널모드) 에서만 가능하기 때문에, 이를 제어하려면 Driver Development가 필요합니다.

특별한 조작을 하지않는한 대부분의 경우에는 TSD 비트가 기본값 0으로 설정되어져 있으므로 , Ring3와 Ring0에 구애받지않고 자유롭게 사용할 수 있습니다.



3. 명령어 사용 방법

사용방법은 간단합니다.

VC컴파일러에서 인라인 어셈블리 지시자를 이용할때 주로 아래와 같이 씁니다.


__asm

{

    push eax //RDTSC의 결과물이 EAX레지스터와 EDX 레지스터에 저장되기 때문에 EAX와 EDX를 스택에 먼저 백업해놓습니다.

    push edx

    rdtsc        //이 명령이 실행되면 EDX:EAX에 현재의 타임 스탬프 카운터값이 반환됩니다.

    ..............    //적절히 이용합니다.

    pop edx    //가장 마지막에 PUSH 한 데이터가 EDX의 내용이었기 때문에 EDX로 다시 데이터를 원상복귀 합니다.

    pop eax    //eax의 내용을 복원합니다.

}


일부 구형 컴파일러에서는 RDTSC라는 명령어를 인식하지 못해서 , 에러를 뿜어냅니다.

그때는 아래와 같이 사용합니다.


    __asm

    {

        __emit 0x0F

        __emit 0x31

    }


0x0F31이 RDTSC의 명령어를 뜻합니다.



twitter facebook me2day 요즘
오옹~ 형 좋은 정보 감사해요 ^^ 시간관련 안티디버깅 기술 찾던 도중&..

오옹~ 형 좋은 정보 감사해요 ^^

시간관련 안티디버깅 기술 찾던 도중 RDTSC를 사용하는 방법이 있길래

해당 명령어 찾아가 여기로 들어왔네요 ㅋㅋ

05.01 11:15 | Ezbeat님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
감사합니다
감사합니다
05.30 13:45 | mikijongs님 | 신고 | 수정 | 삭제
댓글 0
입력상자 늘리기
댓글쓰기 - 로그인한 후 댓글작성권한이 있을 경우 이용하실 수 있습니다.

비밀번호 확인

댓글 등록시에 입력했던 비밀번호를 입력해 주세요.
26개(1/2페이지)
rss
어셈블리언어
번호 제목 작성자 작성일 조회
26 push 명령어 tip[2] 휘바골드 2013.02.22 1477
25 비베이용 강좌 2 kane0202 2012.12.23 2061
24 비베 6.0 기초강좌[2] kane0202 2012.12.23 2301
23 Carry VS Overflow Flag 개념 잡기.[10] 마플 2012.06.02 9212
22 [기초]간과하기 쉬운 것들...[27] 쿨러 2011.10.13 8503
21 [중급]어셈블리어의 CPU레지스터[17] 오타해커 2011.08.18 9438
>> [고급]ReaD Time Stamp Counter (RDTSC) 명령어[2] Sone 2010.02.03 9995
19 [고급]PC ASM첨부파일[25] 디코 2009.12.23 9215
18 [기초]어셈블리로 swap 함수![8] 룰루라라라 2010.07.17 9147
17 [기초]김병희님 강좌입니다.첨부파일[101] 공돌이pooh 2010.02.14 10995
16 [기초]LEA 명령어 강좌[9] 우준 2010.01.17 10239
15 [기초][PDF] 어셈블리어의 기초.첨부파일[81] 프로그래밍 2009.06.02 18365
14 [기초]8051 어셈블리언어[18] Mrsa 2009.04.02 7709
13 [기초]ASM 강좌첨부파일[61] Нyan™ 2008.04.21 9923
12 [기초]Pop 문 정리[12] EROS 2008.04.01 7944
11 [기초]Mov 문 정리[14] EROS 2008.04.01 7426
10 [기초]Call 문 정리[18] EROS 2008.04.01 8380
9 [기초]CMP 문 정리[16] EROS 2008.04.01 8393
8 [기초]Jxx 명령어 종합[26] EROS 2008.04.01 8960
7 [기초]8051 어셈블리언어 해석[2][26] Mrsa 2007.12.10 7757
처음페이지이전 10 페이지12다음 10 페이지마지막페이지