Delphi XE2 64位:在GraphicEx中使用内联汇编

3

这段文本的意思是:如何将汇编语言转换为纯Delphi代码?我无法编译需要GraphicEx的组件,因为JPG单元中的内联汇编不支持64位。


建议您使用其他图片处理库或者升级到支持64位的GraphicEx版本。

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;

ftol通常在链接到使用bcc32编译的.obj文件时包含。这是这里正在发生的吗? - David Heffernan
1个回答

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

更新:抱歉,我错了。双精度数在进入此函数时存储在FPU中。 然后将双精度数放入本地变量f中,并截断为整数。 所以请忘记我的答案。

这个例程在GraphicEx中没有使用,所以尝试将其注释掉。

更新2。

正如David所说,它可能被链接的.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;

虽然该例程并未被GraphicsEx显式使用,但它可能会被链接到GraphicsEx单元之一的.obj文件所使用。 - David Heffernan
不要假设参数传递在64位中与32位相同。这是完全不同的ABI。 - David Heffernan
1
@David,正确,这种参数传递约定在32位的Linux/GCC中使用。在64位中,它是以不同的方式完成的,请参见X86_calling_conventions - LU RD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接