【问题标题】:delphi asm code win32 vs win64delphi asm代码win32 vs win64
【发布时间】:2016-10-04 08:37:57
【问题描述】:

我在 Delphi 10.1 中的项目有一些像这样的汇编函数:

  function MyFunc: Word;
  asm
    PUSH   0
    FNSTCW [ESP].Word
    POP    EAX
  end;

我需要在 win64 中编译项目,但是像 POP EAX 这样的一些行有 E2116 Invalid combination of opcode and operands 错误。

【问题讨论】:

  • 使用系统单元的 Get8087CW 函数,它应该适用于两个平台(Win32/Win64)。
  • x86_64 不支持 32 位推送/弹出
  • 请注意,x86 和 x64 在其调用约定中使用不同命名的寄存器,并且通常使用不同的操作码。强烈考虑@AndreiGalatyn 的建议,因为您将不得不(至少)复制所有功能。
  • 您的问题是什么?努力解决?
  • 为什么你的64位码要知道8087控制字?它不使用 8087 单元进行浮点数学运算。它使用 SSE 单元。你已经超前了。第 1 步是全面了解您的代码存在的原因以及它的用途。不要只按字面意思翻译。

标签: delphi assembly win64


【解决方案1】:

您应该使用System 单元中的Get8087CW() 函数,而不是将程序集转换为x64。它应该适用于两个平台(Win32/Win64):

function MyFunc: Word;
begin
  Result := Get8087CW;
end;

为了将任何其他汇编代码(您在此处未提供)从 x86 转换为 x64,我建议您学习 x64 汇编编程。

【讨论】:

  • 这是真的,但可能没有抓住重点。 x64 代码不使用 8087 单元。它使用 SSE 单位。
  • @David:我猜问题中的代码只是示例,对于这个示例,他不需要使用 asm。如果他开始将代码重写为 x64,则无论如何该函数将无法使用。但是你说得对,在 x64 模式下访问 FPU 控制寄存器是毫无用处的。
  • 好的,但是一旦他删除了读取 8087 CW 的代码,问题就没有了。问题在其当前形式中并没有真正有用。
  • 谢谢大家;这个项目制作了一个 delphi 包并用于使用 directshow 捕获视频。它由 Delphi 7 编写并使用 DSPack 组件。现在,客户需要delphi 10.1下的64位版本的包。它的开发人员不可用,我不知道。因此,我在这个问题上犯了一个错误。实际上,我需要 64 位的 DSPack 或任何替代方案。我认为必须提出另一个问题。很抱歉,感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2015-03-14
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多