티스토리 뷰

개발/Windows

[ WIN ] Inline __asm 64bit 변경

최우림 -=HaeJuK=- 2013. 6. 21. 15:15

32비트 모듈을 작성 할 때 급하거나 떄론 귀찮아서 inline __asm 을 이용하어 코딩을 한다.
asm을 바로 쓸 수 있기에 해당 방식을 많이 사용한다. 

하지만 이제 64비트 시대 아닌가!!
그리고 고객사에서 점점 64비트 전용 프로그램들을 지원하기 시작하면서 난관에 봉착하기에 이른다. 

그것은 바로!!
Microsoft Visual Studio 에서는 64bit 컴파일러에서 inline __asm 코드를 더이상 지원 하지 않는다!! 

참고 : http://msdn.microsoft.com/en-us/library/wbk4z78b(VS.80).aspx

그럼 이제 우리는 더 이상 asm을 사용할 수 없는것인가? 
절대 그렇지 않다!! 분명한것은 인라인 어셈을 이용하지 못하도록 하고 있는것이지 asm을 사용하지 못하도록 하는 것은 아니다.
MS Visual Stuio에서는 MASM이라는 방식을 사용하도록 권고 하고 있다. 

그럼 우리는 아래와 같이 정리 할 수 있다. 

1. C/C++ 소스에서 인라인 어셈을 사용하지 못한다.
2. 그런데 어셈을 이용하여 프로그램은 만들 수 있다. 
3. 결국 각자 따로 만들면 이상이 없다는 것이다. 

 

우리는 프로그램을 만들 때 컴파일을 하고 링크 과정을 한다. 
그렇다!! lib로 만들어서 링크를 하면 되는 것이다. 즉 DLL 이던 LIB던 라이브러리 형태로 asm을 사용 하면 된다!! 

이제 그 방법을 알아보자!! 
우선 소스코드상의 모든 ASM 코드를 별도의 XXX.asm 파일에 넣고 함수화 시킨다.

.code

CeckMyDebugger PROC

mov eax, fs:[30h] ;

mov eax, [eax + 2h] ;

ret ;

CheckMyDebugger ENDP

End

 

이렇게 함수화 시킨 후 32비트에서 사용하던 레지스터들을 64비트에 맞추어서 변경해준다.

.code

CeckMyDebugger PROC

mov rax, gs:[60h] ;

mov rax, [rax + 2h] ;

ret ;

CheckMyDebugger ENDP

End

 

자 이제 준비가 다 되었다. 
우리는 LIB파일로 만들어서 링크 과정에서 해당 함수를 링크 할 것이다.
우선 어셈 파일을 동적으로 빌드 한 후 자동으로 링크 할 수 있도록 하자 

 

그런데 어떻게?? 빌드를 할 수 있을까!! 
MASM!! 이 방식이다. 

1.

우선 XXX.ASM 파일을 선택 한다. 

 

이와 같이 빌드에서 제외 옵션은 "아니요" 을 선택한다.
이유는 동적으로 동시에 빌드 되기 위해서 이다. 
도구는 "사용자 지정 빌드 도구"이다. 절대 MS ASM 계열을 선택 해서는 않된다!! 명심하자!! 

 

 

이제 사용자 지정 빌드 단계 옵션중 일반 탭을 선택하여 빌드를 할 수 있게 도와주는 옵션 및 파일을 선택 해야한다. 
MS VisualStudio 2005 이상에서는 MASM을 사용 할 수 있도록 ML.EXE을 기본 제공하고 있다. 
하지만 우리는 64비트를 사용해야 함으로 ML64.EXE을 사용한다.

Visual Studio 2005 기준
명령줄 : "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\x86_amd64\ml64" /c /Cx vrdet.asm

출력    : "사용자가 원하는.lib" 
이렇게 하면 준비는 완료 되었다. 
빌드를 하게 되면 빌드는 잘 될 것이다. 
 
그럼 이제 ASM 함수를 호출 하는 방법을 알아 보자 
LIB나 DLL의 함수를 호출 하는 방법은 다양하지만 
"extern "c" ~~~~" 의 형식을 자주 사용한다. 여기에서도 해당 방식을 이용할 것이다. 이유는 LIB파일이기 때문이다. 
 
ASM 파일에 지정항 함수 명을 이용하여 HEADER 파일에 명시한다.
extern "C" int CheckMyDebugger();
그리고 나서 CPP파일에는 아래와 같이 Try, excpt을 이용하여 안전하게 사용하자. 
__try
{
result = CheckMyDebugger();
}
__except(1)
{
result = -1;
}

이상 끝이 났다!! ASM 코드는 열심히 공부해서 사용하도록하자 !! 

댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
65,461
Today
3
Yesterday
9