2010-08-20 5 views
1

C++/CLI에서 인라인 asm을 사용하고 있습니다. 끔찍한 문제는 내가 깨닫지 못한 버그 일 수 있습니다. 하나의 함수 호출에서 다른 호출로 벡터를 전달했습니다. 다른 함수에서 벡터를 사용하는 호출 된 함수 내에서 _asm {.... some assembly code}의 전체 코드 조각에 주석을 달면 문제가없는 전체 벡터가 문제없이 호출되고 함수의 인수로 성공적으로 복사됩니다. 정확한 방식으로.C++/CLI의 인라인 asm이 왜 끔찍한 문제를 일으키는 지 알고 싶습니다.

그러나 uncmment _asm {}은 호출 된 함수에서 _asm {} 패치를 사용하면 벡터 및 기타 문자열 데이터가 포함 된 전체 객체 손상을 일으키는 객체 전체 벡터를 손상시키고 객체 내부의 모든 데이터 npos = 4294967295처럼.

왜 이렇게 되니? CLI에서 문제가 발생합니까 아니면 인라인 asm을 잘못 사용하고 있습니까?

내가 여기 붙어있어서 친절하게 도와주세요.

   strParamType = strReturnType; 
      if(strParamType.find("IDispatch")!=string::npos) 
      { 
       IDispatch* pIDispatch; 
       _asm 
       { 
        mov esi,esp 
         lea eax,[pIDispatch] 
        push eax 
      } 
       } 

여기 _asm {} 안에 아무 것도 쓰지 않으면 내가 설명한 문제가 발생합니다.

감사 우스만 당신은 내가 매우 당신이하려는 것을 추측 할 수는 없지만 몇 가지 관찰 거라고 제공하는 소스에서

+0

추가 정보가 없으면 사용자의 asm이 잘못되었다고 생각합니다. 스 니펫을 게시해야합니다. –

답변

3

: 특히 .NET 환경에서 _asm을 사용하는

  1. 을 당신은 일련의 규칙을 고수해야합니다. 예를 들어, Microsoft's advice을 참조하십시오.
  2. 코드가 pIDispatch으로 초기화되지 않습니다. 실제 코드에서 무엇이 뒤 따르는 지 모르지만 어셈블러 코드는 스택의 포인터 주소를 가져 와서 스택에 다시 저장합니다. 귀하의 코드가 포인터를 초기화하려고 시도하지 않는 한 그것은 문제를 요구합니다. 그러나 if 절 다음에 포인터가 범위를 벗어납니다!
  3. 어셈블리 코드는 스택 포인터를 복원하지 않고 변경합니다. 이렇게하면 프로세스가 중단됩니다. 운영 체제 작성과 같은 작업을 실제로 알지 못하면하지 마십시오.