2012-07-08 4 views
5

저는 ASM을 배우려고 노력 중이며 C++와 결합 된 몇 가지 시도를하고 싶습니다. ASM 부분은 알몸 함수로 수행됩니다. 하지만 함수를 호출 할 때마다 (비어 있음) 응용 프로그램이 다음 함수에서 충돌합니다. 알몸 기능으로 작동하게하려면 어떻게해야합니까? esp 또는 뭔가를 팝업해야합니까? 좋은 예가 될 수 있습니다.C++ 알몸 함수 사용

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    i = 1; 

    asmfunc(); 

    cout << i << endl; // <-- crash 
    system("pause"); 

    return 0; 
} 
+2

[documentation] (http://msdn.microsoft.com/it-it/library/h5w10wxs.aspx)에 지정된대로 프롤로그/에필로그 코드를 작성해야합니다. [이 질문] (http://stackoverflow.com/questions/3021513/could-someone-explain-declspecnaked-please)을 참조하십시오. 또한 네이티브 함수가 정말로 필요한지 생각해보십시오. 원하는 것은 임베디드 어셈블리를 작성하고 정규 함수를 사용하여 컴파일러가 C++ 호출 규칙을 처리하도록하려는 경우입니다. –

+2

호출 규칙에주의하십시오. 알몸 함수는 필수 레지스터를 보존하지 않습니다. – Mysticial

답변

12

알몸 기능에는 컴파일러에서 생성 한 프롤로그 및 에필로그 코드가 포함되지 않습니다. 이것은 함수의 끝 부분에있는 암시 적 return 문에도 적용됩니다.

즉, 선언 한 함수의 끝에 ret 명령이 없음을 의미합니다. 컨트롤이 asmfunc으로 전송되면 결코 반환되지 않습니다. 이 함수는 충돌을 일으킬만한 것을 명중 할 때까지 해당 위치에 존재하는 코드를 계속 실행합니다.

기본적으로 원래 구현 인 asmfunc은 프로그램 코드 중간의 레이블로 작동합니다. 그리고 당신이 당신의 기능을 호출 할 때, 당신은 본질적으로 goto asmfunc을하고 있습니다, 즉 당신은 반환의 희망없이 어딘가에서 통제권을 넘겨야합니다. 알몸 기능으로 ret 지침을 배치하는 것은 귀하의 책임입니다

_declspec(naked) void asmfunc() 
{ 
    _asm 
    { 
     ret 
    } 
} 

이 때문에, 최소한의 알몸 기능이 보일 것입니다.

관련 문제