3

これは、asmから純粋なdelphiにどのようになりますか?GraphicExを必要とするコンポーネントをコンパイルできません。JPGユニットで、インラインアセンブリが64ビットでサポートされていないというエラーが発生します。

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;
4

1 に答える 1

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

更新:申し訳ありませんが、私は間違っています。ダブルは、この機能に入るとFPUに保存されます。次に、doubleはローカル変数fに入れられ、整数に切り捨てられます。だから私の答えを忘れてください。

このルーチンはGraphicExでは使用されないため、コメントを付けてください。

アップデート2。

Davidが言うように、.objファイルにリンクして使用できます。それらが同じパラメーターの受け渡し(FPUスタックではdouble)を実行する64ビットオブジェクトファイルであると仮定すると、(64ビットモードで)使用できる関数は次のとおりです。

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;
于 2011-10-08T06:30:52.440 に答える