2011-10-08 9 views
3

어떻게이 것이 순수 델파이로 바뀌겠습니까? GraphicEx가 필요한 구성 요소를 컴파일 할 수 없어 JPG 단위에서 인라인 어셈블리가 64 비트 용으로 지원되지 않는 오류가 발생합니다.델파이 XE2 64 비트 : GraphicEx의 인라인 asm

function __ftol: Integer; 
var 
    f: double; 
begin 
    asm 
    lea eax, f    // BC++ passes floats on the FPU stack 
    fstp qword ptr [eax]  // Delphi passes floats on the CPU stack 
    end; 
    Result := Trunc(f); 
end; 
+0

ftol은 일반적으로 포함되어 는 동일한 매개 변수 (FPU 스택에서 더블) 통과, 여기 을하고 64 개 비트 오브젝트 파일입니다 가정은 (64 비트 모드에서) 사용할 수있는 기능입니다 bcc32로 컴파일 된 .obj 파일. 그게 여기서 일어나는거야? –

답변

1
function __ftol(f : double) : Integer; 
begin 
    Result := Trunc(f); 
end; 

업데이트 : 내가 틀렸다 죄송합니다. double은이 함수에 진입 할 때 FPU에 저장됩니다. 그런 다음 double은 로컬 var f에 저장되고 정수로 잘립니다. 내 대답을 잊어 버려.

이 루틴은 GraphicEx에서 사용되지 않으므로 주석을 제거하십시오. .OBJ 파일에 연결하여

업데이트는 2

다윗이 말했듯이, 그것은 사용할 수있다. 당신이에 연결할 때

function __ftol : Integer; 
// Assumes double value is in FPU stack on entry 
// Make a truncation to integer and put it into function result 
var 
    TmpVal: Int64; 
    SaveCW, ScratchCW: word; 

asm 
    .NOFRAME 

    fnstcw word ptr [SaveCW] 
    fnstcw word ptr [ScratchCW] 
    or word ptr [ScratchCW], 0F00h ;// trunc toward zero, full precision 
    fldcw word ptr [ScratchCW] 
    fistp qword ptr [TmpVal] 
    fldcw word ptr [SaveCW] 
    mov rax, TmpVal 
end; 
+0

루틴을 GraphicsEx에서 명시 적으로 사용하지는 않지만 GraphicsEx 단위 중 하나에 링크 된 .obj 파일에서 루틴을 사용할 수 있습니다. –

+0

매개 변수 전달이 64 비트에서 동일하다고 가정하지 마십시오. 완전히 다른 ABI. –

+1

@David, Correct이 유형의 매개 변수 전달 규칙은 linux/GCC에 의해 32 비트에서 사용되었습니다. 64 비트에서는 다르게 수행됩니다. [X86_calling_conventions] (http://en.wikipedia.org/wiki/X86_calling_conventions) –