FLD指令x64位

SMP*_*MP3 5 delphi assembly x86-64 fpu basm

我在x64位中的FLD指令有一点问题...想要将st0加载到st0寄存器中的堆栈指针FPU,但它似乎是不可能的.在Delphi x32中,我可以使用以下代码:

function DoSomething(X:Double):Double;
asm

  FLD    X
   // Do Something ..
  FST Result

end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,在x64中,相同的代码不起作用.

GJ.*_*GJ. 5

Delphi继承了Microsoft x64 Calling Convention.因此,如果函数/过程的参数是float/double,则它们将在XMM0L,XMM1L,XMM2L和XMM3L寄存器中传递.

但您可以使用varbefore参数作为解决方法,如:

function DoSomething(var X:Double):Double;
asm
  FLD  qword ptr [X]
  // Do Something ..
  FST Result
end;
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方法.虽然您不能传递常量文字(例如DoSomething(1.0)或声明为Single的变量)的限制. (2认同)

Vil*_*nde 4

在 x64 模式下,浮点参数在 xmm 寄存器中传递。因此,当Delphi尝试编译FLD X时,它变成FLD xmm0,但没有这样的指令。您首先需要将其移至内存中。

结果也是如此,应该在xmm0中传回。

试试这个(未测试):

function DoSomething(X:Double):Double;
var
  Temp : double;
asm
  MOVQ qword ptr Temp,X
  FLD Temp
  //do something
  FST Temp
  MOVQ xmm0,qword ptr Temp
end;
Run Code Online (Sandbox Code Playgroud)