gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:44:17 26 4
gpt4 key购买 nike

我在用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com