다들 잘 아시다시피, x64기반에서는 인라인어셈블리를 사용하지 못합니다. 그래서 VC컴파일러가 제공하는 Intrinsics를 써야합니다. 그런데 DDK환경에서 개발할때, WinDDK라이브러리에는 intrin.h 파일이 포함되어져 있지 않기때문에, 이것을 모른다면 좀 골치아픕니다. 오늘 구글링을 하다가 알아내었는데, 다음과 같이 선언을 해주면 해결이 됩니다.

 #ifdef _X86_
unsigned long __readcr0(void);
void __writecr0(unsigned long);
#else
unsigned __int64 __readcr0(void);
void __writecr0(unsigned __int64);
#endif

#pragma intrinsic(__readcr0)
#pragma intrinsic(__writecr0)

  만약에 cr0 레지스터를 읽어오고 싶다면 __readcr0 라는 펑션을 사용합니다. 그런데 cr0는 32비트환경에서는 32비트만 사용되고, 64비트 환경에서는 64비트로 확장됩니다.(물론 상위 32비트는 Reserved로써 현재로썬 사용이 되고 있지 않습니다.) 따라서 32비트와 64비트에서 Intrinsic이 동작하는 방식이 다릅니다. 그래서 X86과 X64일때 선언을 달리해주어야합니다.


  하나 예를 더 들어볼까요. MSR레지스터를 읽어오는 Intrinsic을 선언하고싶다면 아래와 같이 하면 됩니다.

 unsigned __int64 __readmsr(unsigned long);
void __writemsr(unsigned long, unsigned __int64);
#pragma intrinsic(__readmsr)
#pragma intrinsic(__writemsr)

MSR은 32비트 환경이건, 64비트 환경이건간에,  64비트 레지스터이므로 X86과 X64나눠서 선언을 달리 해줄 필요가 없습니다.
 
저작자 표시 비영리 변경 금지
신고
by Sone 2012.01.06 02:41
| 1 |