这会如何从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;
答案 0 :(得分:1)
function __ftol( f : double) : Integer;
begin
Result := Trunc(f);
end;
更新:对不起,我错了。进入此功能后,double将存储在FPU中。 然后将double放入局部var f并截断为整数。 所以忘了我的回答。
此例程未在GraphicEx中使用,因此请尝试将其注释掉。
更新2。
正如David所说,它可以被链接在.obj文件中使用。 假设它们是64位目标文件,执行相同的参数传递(在FPU堆栈中为double), 这是一个可以使用的函数(在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;