C/C++ 로 개발을 하다보면 '인라인 어셈블리' 를 사용하게 되는 경우도 있습니다.
SEH 를 '인라인 어셈블리' 로 구현하면 보통은~ SEH 를 등록하는 코드가 아래의 예제코드처럼 됩니다.
int main() { ... __asm { push _SEH_Handler PUSH DWORD PTR FS:[0] MOV DWORD PTR FS:[0], ESP // C4733 } ... }
이렇게 코드를 작성하고 컴파일을 해보면...
VC++ 7.1 에서는 "MOV DWORD PTR FS:[0], ESP" 코드에서 'C4733' 경고가 발생합니다;;;
( 테스트를 해보지는 못했지만 6.0 에서는 왠지 그냥 넘어갈 것 같고.. 7.0, 8.0 등에서는 7.1 처럼 경고가 발생할 듯한;;; )
"인라인 asm 이 'FS:[0]'에 할당되었습니다. 처리기가 안전한 처리기로 등록되지 않았습니다" 요런 메시지와 함께~;;;
그냥 간단하게 생각하면 'FS:[0]' 에 값을 임의로 넣으려고 해서 경고가 발생했다~~ 라고나 할까요..;
( 참고 페이지 : http://msdn.microsoft.com/ko-kr/library/ha52ak6a(VS.80).aspx )
=0=;; 동작하는데는 별다른 이상이 없는듯 하지만 경고 메시지가 뜨는게~~ 은근히 거슬립니다~
그래서~~ 어셈코드를 아래와 같이 살짝 변경해봤더니 :) 경고가 사라지더군요~~ㅋ
int main() { ... __asm { push _SEH_Handler XOR EAX, EAX PUSH DWORD PTR FS:[EAX] MOV DWORD PTR FS:[EAX], ESP } ... }
컴파일러는 소스코드를 파싱하면서 오류를 찾을테고~
그러면 'FS:[0]' 요렇게만 사용하지 않으면 될 것 같아서...
"XOR EAX, EAX" 로 EAX 를 0 으로 만든 다음~~ 'FS:[0]' 대신 'FS:[EAX]' 로 ~~ 샤샤샥~!! :)
실제 코드가 실행될 때는... "MOV DWORD PTR FS:[0]" 이나...
"XOR EAX, EAX" -> "MOV DWORD PTR FS:[EAX]" 이나 동작은 동일하거든요..
( 한 스텝에 할 수 있는 걸 두 스텝으로 나눠서 한다는 차이는 있겠지만요... )
공개된 소스들을 뒤져봤더니 SEH 를 '인라인 어셈블리'로 구현할 때...
이 방법으로 경고를 피한 경우도 많이 있더군요~~ㅋ
=0= 잠수해제 신호탄으로 간단한 팁하나 올려봤습니다~~ :)ㅋ
'Programming' 카테고리의 다른 글
Visual Studio 2010 출시... (2) | 2010.04.13 |
---|---|
[C/C++] RichEdit 컨트롤과 IMF_AUTOFONT 옵션 (0) | 2010.03.19 |
[C/C++] 투명창 만들기~ ( SetLayeredWindowAttributes 사용 ) (3) | 2008.08.01 |
[C/C++] Rotate ~ 구현 (5) | 2008.07.19 |
[VB] Visual Basic 에서 C/C++ 로 만든 DLL 불러쓰기... (4) | 2007.12.14 |