2014-06-20 5 views
-1

나는 내가 필요로하는이이 어셈블리 코드를 제거하는 방법은 무엇입니까?

void foo(int i, int j) 
{ 
    std::cout << i << " , " << std::endl; 
} 

void bar() 
{ 
    void (*ffptr)(int, int); 
    ffptr = &foo; 
    __asm push 100 
    __asm push 318 

    void* faddr = (void*)ffptr; 
    ((void(*)())faddr)(); 
} 

같은 코드 세그먼트는 C/C++ 코드 세그먼트를 대체하여이 Visual Studio를 특정 어셈블리 코드를 제거해야합니다. OS 특정 호출의 사용은 중요하지 않습니다. 하지만 어셈블리 코드는 더 이상 필요하지 않습니다.

코드는 x86 및 x64 모두에서 컴파일되고 작동해야합니다.

도와 주실 수 있습니까? 나는 내가 대처하고 싶지 않은이 어셈블리에 아주 참신합니다. 모든 의견을 주시면 감사하겠습니다.

p.s

나는 함수 호출 행을 변경할 수 없습니다. 함수 호출 전에 스택에 매개 변수를 넣고 함수 호출을 일반화해야합니다.

+8

음,'foo (318, 100)'? 나는 회의에서 물지 않기 때문에 무언가를 엉망으로 만들었지 만 ... – chris

+0

이 숙제가 있습니까? – NPE

+0

Chris .. 나는 함수 호출 행을 변경할 수 없다. 함수 호출 전에 스택에 매개 변수를 넣고 함수 호출을 일반화해야합니다. – Doonyx

답변

1

많은 다른 기능이있는 기능을 간략화했으며 각 기능에는 고유 한 서명이 있습니다.

실제 콜 라인을 변경하지 않고도이 문제를 해결할 수있는 방법은 없습니다 (물론 다른 컴파일러가 없어도 작동하지 않을 수 있습니다). x86_64에는 스택에 인수가 전달되지 않으므로 값을 올바른 레지스터에로드해야합니다.

단일 함수 유형으로 변환하는 대신 일반적인 방식으로 문제를 해결할 수 있습니다. 실제로 원하는 함수 유형으로 변환 할 수 있습니다.

예.

void foo(int i, int j) 
{ 
    std::cout << i << " , " << j << std::endl; 
} 

void foo2(float i, char *j) 
{ 
    std::cout << i << " , " << j << std::endl; 
} 

이 전체 문제에 대한 올바른 솔루션, 그리고 다른 재 작성

void bar() 
{ 
    void* faddr; 
    int type; 
    if (something) 
    { 
     void (*ffptr)(int, int); 
     ffptr = &foo1; 
     faddr = (void*)ffptr; 
     type = 1; 
    } 
    else 
    { 
     void (*ffptr)(float, char*); 
     ffptr = &foo2; 
     faddr = (void*)ffptr; 
     type = 2; 
    } 

    .... 
    switch(type) 
    { 
     case 1: 
      (void (*)(int, int)faddr)(100,318); 
      break; 
     case 2: 
      (void (*)(float, char*)faddr)(7.2,"hello"); 
      break; 
    } 
} 

내가 지금까지 확신에서 해요 [그런데, 명확하게하기 위해, 위의 j 출력에 추가] 아마도이 문제를 해결하기위한 실제로 올바른 방법 일 것입니다. 그러나 전체 코드를 보지 않고 올바른 솔루션이 무엇인지 확실히 말하는 것은 어렵습니다.

관련 문제