2013-06-14 1 views
1

vs2008을 사용하여 x64로 프로그램을 이식하려고합니다. 그러나 문제는 x64에서 지원되지 않는 인라인 asm 코드입니다. 이 asm 코드는 알 수없는 유형 또는 숫자의 인수를 dll의 함수로 푸시하는 데 사용됩니다. 특정 dll에서 사용할 함수를 지정할 수있는 interpeter 기반 프로그램이며 프로그램은 인수를 푸시하고 컴파일시 함수를 호출합니다.ASM이 함수 인수를 스택에 푸시합니다.

다양한 소스를 사용하여 나는 unsmast masm을 컴파일 할 수있는 asm 함수와 vs2008에 연결된 obj 파일을 포함하는 별도의 .asm 파일을 생성한다고 결론을 냈습니다. x86 및 x64 용으로 서로 다른 파일을 사용하면 두 가지 문제가 모두 해결됩니다. 그러나 문제는 인라인 asm이 수행하는 기능을 복제하지 않는다는 것입니다.

double a = Evaluate(arg[i]).num; 
_asm push a + 4 
_asm push a 
j += 8; 

하려면 :

double a = Evaluate(arg[i]).num; 
EvaluateFuncArgFloat(a); 
j += 8; 

때라도 .ASM 파일 :

나는 예를 들어, 다음과 같은 인라인 코드를 변환이하지 않는

TITLE EvaluateFuncArgFloat      (evaluate_asm.asm) 

.386 
.model flat, C 

.code 
EvaluateFuncArgFloat PROC a:DWORD 

     push a + 4 
     push a 
     ret 

EvaluateFuncArgFloat ENDP 

END 

내가 기대하고있어. double은 단순히 인라인 asm을 사용할 때처럼 함수에서 끝나지 않습니다.

제 생각에는 약간의 실수가 있었거나 제가 빠뜨린 것이 있습니다.하지만 많은 시도 후에는 제대로 작동하지 않는 것 같습니다. 잘만되면 누군가가이 문제에 대해 저를 도울 수 있기를 바랍니다. 매우 만족 스럽습니다.

+1

함수를 호출하면 인라인 어셈블리와 동일한 의미를 가질 수 없습니다 ... 함수 호출이 관련되어 스택을 수정합니다. –

+0

이 코드 이후에 어떤 일이 발생합니까? 함수 인수는 x86-64의 스택이 아니라 레지스터에서 발견 될 것으로 예상됩니다. – Michael

+0

도움 주셔서 감사합니다. Michael :이 코드 뒤에는 해석 된 이름과이 선언을 사용하여 함수를 호출합니다. double (* func_d) (void); – user2486757

답변

0

문제는 당신이 스택에이 개 숫자를 밀어 아니라 그들에게 원래의 + 4와

아마도 다른 부분을 제거했습니다있다

EvaluateFuncArgFloat PROC a:DWORD 

    pop eax   ;ret address popped to a safe register (if not ax/eax) 
    push a + 4 
    push a 
    push eax   ;ret address back at top of stack 
    ret 

EvaluateFuncArgFloat ENDP 

이 수 할 수있는 교활한 방법 코드는 원래 프로그램에서 이것을 처리합니다.

+0

감사합니다. Ady! 위의 Michael이 주석을 작성한 코드를 사용했습니다. 여기에는 dword ptr이 포함되어있어 매우 효과적이었습니다.덧글을 추가하면 나중에 코드에서 스택이 복원됩니다. – user2486757

관련 문제