2014-07-21 4 views
0

인라인 어셈블리가 x64에서 지원되지 않습니다. 나는 집회에 익숙하지 않아서 나를 잘 돕는 누군가에게 나에게 도움을 청하고 싶다. 누구든지이 코드를 32 비트에서 64 비트로 변환 할 수 있습니까? MASM이나 컴파일러 내장 함수를 사용할 수 있지만이 코드를 변환하는 방법은 약간 혼란 스럽습니다.32 비트 ASM을 64 비트로 변환하십시오.

#define get_member_function_address_vc8(member_function_address, member_function_type)\ 
void* member_function_address;   \ 
{          \ 
    __asm        \ 
{          \ 
    mov eax,offset member_function_type \ 
};          \ 
__asm         \ 
{          \ 
    mov member_function_address, eax \ 
};          \ 
} 

안부, 마크

+0

아날로그와 eax의 64 비트 레지스터를 rax라고합니다. –

+0

무엇을하려고합니까? 이 매크로는 두 번째 인수의 내용을 첫 번째 인수로 옮기는 함수를 선언합니다 (호출하지 않습니다). 또한 현대 컴파일러가 싫어할 수있는 구식 C (K & R 인수 유형 선언, 암시 적 int)입니다. –

+0

'member_function_type'이란 무엇입니까? –

답변

0

어그는 ... 그 못생긴, 추한 코드입니다. David Wohlferd는 Visual C++는 64 비트 프로세서를 대상으로 할 때 인라인 어셈블리를 지원하지 않으므로 다른 것을해야한다고 설명했습니다.

먼저이 매크로가 수행하려고하는 것을 설명하려고합니다. 모든 어셈블리 명령어는 두 번째 매크로 인수에서 가져온 32 비트 값을 첫 번째 인수로 전달 된 이름으로 선언 된 변수에 할당합니다. 매크로의 저자는 인라인 어셈블리를 사용하는 최대 길이에 갈 것이 필요 느꼈다 왜

#define get_member_function_address(varname, member_function) \ 
    void *varname = (void *)&(member_function); 

다음은 그 매크로가 get_member_function_address라고 사실 우리에게 단서를 제공합니다 : 무슨 일이 일을하는 것은이 매크로에 해당하는 것으로 보인다 그냥 개체의 주소를 얻으려면. 그것은 멤버 함수의 주소를 얻으려고 시도하지만 쉽지 않습니다. 멤버 함수에서 단항 & 연산자를 사용하면 예상 한 것처럼 멤버 함수에 대한 포인터를 얻을 수 있지만 C++에서는 멤버 함수에 대한 포인터가 특별합니다. 그것들은 단지 멤버 함수의 주소 이상을 표현하기 때문에 그들을 void *으로 형변환 할 수 없습니다.

불행히도 C++에서 멤버 함수의 주소를 찾을 수있는 이식성이 없습니다. 매크로는 멤버 함수 개체에 대한 포인터가 개체의 시작 부분에있는 함수의 주소를 가지고 있다고 가정합니다. 그러나 컴파일러는 원하는 곳이라면 어디든지 둘 수 있습니다. 분명히이 가정은 Visual Studio 2005 (VS8)의 32 비트 버전에서 맞지만 다른 버전에서도 마찬가지입니다.

다음 코드보다 변경되지 않았다고 가정하면 매크로를 대체 할 수 있습니다. 32 비트 및 64 비트 환경 모두를 대상으로 할 때 작동해야합니다. 즉, 멤버 함수에 대한 포인터가 시작시 멤버 함수의 주소를 가지고 있다고 가정합니다.

+0

감사합니다. 이는 32 비트 OS에서 64 비트 OS로 마이그레이션하려는 기존 코드의 일부입니다. 가능한 빨리이 코드를 체크 아웃하려고합니다. –