c++ - 将Windows上运行的Delphi中的汇编函数转换为delphi/c++以在Linux上执行

标签 c++ linux delphi assembly

我在用delphi编写的应用程序中有这个汇编器函数,它在Windows上执行得很好。但是我的要求是在Linux上执行它,因为我正在Linux上迁移我的应用程序。在 Linux 中编译此函数时,我收到错误:“不支持的语言功能:'ASM'”。

任何人都可以帮助或建议如何在 c++ 或 delphi 中实现它,以便它适用于 Linux。 分享我的代码:

type 
  PVersionizedPointer = ^TVersionizedPointer; 
  TVersionizedPointer = packed record 
    Ver : NativeInt; 
    Ptr : Pointer; 
  end; 
  TVersionizedPointerStorage = array[0 .. 2 * sizeof(TVersionizedPointer) - 1] of byte; 

function GetVersionizedPointer(var PointerStorage : TVersionizedPointerStorage) : 
    PVersionizedPointer; assembler;
const
  vp_size = sizeof(TVersionizedPointer);  
      // Note: sizeof(any) inside asm is always $31
  asm
    {$ifdef CPUX86}
      add EAX, vp_size - 1
      and EAX, not(vp_size - 1)
    {$endif}
    {$ifdef CPUX64}
      mov RAX, RCX
      add RAX, vp_size - 1
      and RAX, not(vp_size - 1)
    {$endif}
  end;
end;

最佳答案

专注于 x86 版本的功能可能是最简单的:

function GetVersionizedPointer(var PointerStorage: TVersionizedPointerStorage): PVersionizedPointer;
const
  vp_size = sizeof(TVersionizedPointer);
asm
  add EAX, vp_size - 1
  and EAX, not(vp_size - 1)
end;

x86 ABI 意味着PointerStorage 的地址被传递到EAX 中的函数中。返回值,另一个地址,也在EAX中返回。这些知识让我们了解该函数的作用,并允许我们在 Pascal 中这样编写它:

function GetVersionizedPointer(var PointerStorage: TVersionizedPointerStorage): PVersionizedPointer;
var
  Address: NativeUInt;
begin
  Address := NativeUInt(@PointerStorage);
  Address := Address + (SizeOf(TVersionizedPointer) - 1);
  Address := Address and not (SizeOf(TVersionizedPointer) - 1);
  Result := PVersionizedPointer(Address);
end;

我已经相当详细地写了它,以清楚地表明每个步骤正在做什么。地址变量被分配为PointerStorage的地址,因此与原始版本中的EAX的作用相同。

通过使用这个纯 Pascal 版本并丢失汇编代码,让您将来的生活更轻松。

关于c++ - 将Windows上运行的Delphi中的汇编函数转换为delphi/c++以在Linux上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61340279/

相关文章:

c++ - 在 C++ 上具有公共(public)访问器的私有(private)字段

c++ - C++ 中的什么数据类型等同于 vb6 中的 const CURRENCY?

string - Delphi函数用于测试位置x处的字符串

Delphi - 在现有表格上分配 OnClose 表格

delphi - 使用 Delphi 2010 进行高级编程的基本技能是什么?

c++ - 在主程序和 QProcess 之间同步输出?

c++ - 从速度值中滤除噪声和变化

python -/usr/local/bin/python3 : bad interpreter: No such file or directory for ubuntu 14. 04

c - `longjmp` 进入终止函数

linux - 无法检测到USB摄像头