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;