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 放入本地 var f 并截断为整数。所以忘记我的回答。

此例程在 GraphicEx 中未使用,因此请尝试将其注释掉。

更新 2。

正如大卫所说,它可以通过 .obj 文件中的链接来使用。假设它们是执行相同参数传递的 64 位目标文件(FPU 堆栈中的双倍),这里有一个可以使用的函数(在 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 回答