【问题标题】:Converting this inline Assembler function to Delphi Pascal将此内联汇编程序函数转换为 Delphi Pascal
【发布时间】:2021-11-21 04:30:08
【问题描述】:

我目前正在使用 Delphi 开发一个包含一些内联汇编的遗留产品,我需要帮助了解该函数的作用以及如何将其转换为 Pascal。

代码是:

function lswap(i : longint) : longint; assembler;
asm
{$IFDEF CPU64}
    mov eax,ecx
{$ENDIF CPU64}
    db $0f,$c8  {bswap eax  !! requires at least 486 CPU!!}
end;

【问题讨论】:

  • 您可以在这里找到更多信息,stackoverflow.com/q/33586049/576719
  • 你可以在网上搜索一下 bswap 的作用,这就是我会做的。只需在搜索引擎中输入 bswap。
  • @DavidHeffernan - 在代码中 bswap 似乎被注释掉了 - 那么为什么 OP 会考虑搜索 bswap 的作用呢?
  • @RobLambden,bswap 指令可能不包含在实际的 Delphi 版本中,但使用 db 您也可以表达该指令。所以评论是用 intel 助记符描述内联命令。

标签: delphi assembly pascal cpu-registers translate


【解决方案1】:

通过帮助您了解它的作用:

您可以使用调试器查看代码中发生的情况,包括汇编程序。

如果您有一个测试程序调用此例程(可能多次使用不同的参数)并将结果存储在标准 Delphi 变量中,那么要进行调试,您将:

  • 在第一次调用的地方设置断点
  • 当您遇到断点时,请确保您已将调试设置为“全 CPU”并选择“混合源”显示。

查看编译器生成的代码。编译器要做的第一件事是为您正在调用的例程准备参数。对于 Pascal 例程,这通常意味着将值放入适当的 CPU 寄存器中。

逐行进入代码。在 Registers 窗口(完整 cpu 显示的一部分)中,您将看到寄存器的值以及它们是如何随每条指令更改的。

从例程返回时,编译器会将结果存储在某处,以便您了解编译器如何解释结果。

只需查看输入和输出就足够了,您无需了解例程中的所有内容。

内联汇编器已广泛用于许多代码库,但随着越来越多地远离固定的 x86 架构,删除此类代码的理由越来越多。

【讨论】:

  • 在这种情况下,确保您的调试器以十六进制显示寄存器值很重要,但是是的,这是一个好方法。另一个关键是您可以在手册中查找指令助记符以了解它们的作用。 felixcloutier.com/x86/bswap
  • 但是如果没有任何 ASM 知识,这将只是一个黑盒测试:我知道它应该交换一些东西 - 现在我必须找出什么以及在什么程度上。然后,根据我的测试结果,我假设 Pascal 函数可能是什么样子 - 但我也不能 100% 确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多