2013-12-18 2 views
3

gcc에있는 다음 Visual Studio jmp와 동일한 것은 무엇입니까?동등한 gcc 어셈블리?

extern "C" __declspec(naked) void __stdcall Proxy_Function() 
{ 
    __asm 
    { 
     jmp Procs[0]; 
    } 
} 

위의 비주얼 스튜디오에서 잘 작동합니다. GCC와

, 나는 시도했다 : 나는 그렇게 할 때

extern "C" void __stdcall Proxy_Function() 
{ 
    __asm("jmp *%0":: "r" (Procs[0]):); 
} 

그러나, 내 프로그램이 충돌합니다. 어떤 아이디어?

+1

나는'Procs [0]'을 추측하고 있지만'Procs'의 C 레벨 선언을 보는 것이 도움이 될 것입니다 –

+0

Procs는'FARPROC Procs [10];과 같습니다. 그런 다음 배열의 각 색인을 채 웁니다. GetProcAddress를 사용하여. 나는 그들이 물론 유효하다는 것을 확인했다. – Brandon

+0

'FARPROC'? 그것은 정상적인 함수 포인터 또는 비정상적인 크기 중 하나입니까? 나는 "먼 포인터"가 DOS로 죽었다고 생각했다. –

답변

0

여기의 문제는 gcc-for-x86이 __declspec(naked)과 동등하지 않기 때문에 gcc 컴파일 코드가 가지고 있으면 안되는 스택에 무언가를 수행하여 Procs[0]에서 돌아 오는 것이 잘못되었습니다 장소. 나는 Proxy_Function을 위해 생성 된 어셈블리를 확인해야 할 것이다.

나는 이것을 GCC에 넣는 대신에 .asm 파일을 쓰는 것이 좋습니다.

.text 
    .globl Proxy_Function 
    .type Proxy_Function,@object 
Proxy_Function: 
     movl Procs, %eax 
     jmp *%eax 
    .size Proxy_Function, .-Proxy_Function 

그러나 Windows가 하지 엘프 시스템입니다, 그래서 필요한 보일러는 다른 나는 그게 뭔지 모르겠어요 : 엘프 시스템에서이 작동합니다. 당신은 아마 -S -O2

extern void (*Procs[10])(void); 
void P(void) { Procs[0](); } 

를 컴파일하고 출력을 검사하여 무엇인지 찾을 수 있습니다.

관련 문제