gpt4 book ai didi

Delphi BASM 代码在针对 Win64 时出现错误。它可以转换为纯帕斯卡吗?

转载 作者:行者123 更新时间:2023-12-01 19:54:27 24 4
gpt4 key购买 nike

下面是我想要从 Delphi 内联程序集翻译的一些代码,因为在针对 Win64 进行编译时出现错误。当为 Win32 编译时,代码按预期工作。

感谢您的帮助。

var
a,b,c,d: LongWord;
CPUID: string;
begin
asm
push EAX
push EBX
push ECX
push EDX

mov eax, 1
db $0F, $A2
mov a, EAX
mov b, EBX
mov c, ECX
mov d, EDX

pop EDX
pop ECX
pop EBX
pop EAX

{
mov eax, 1
db $0F, $A2
mov a, EAX
mov b, EBX
mov c, ECX
mov d, EDX
}
end;
CPUID := IntToHex(a,8) + '-' + IntToHex(b,8) + '-' + IntToHex(c,8) + '-' + IntToHex(d,8);
ShowMessage(CPUID);
end;

最佳答案

此代码在 x86 和 x64 处理器 CPUID 上执行 native 硬件指令。该指令无法通过 native Pascal 代码访问,因此您需要进入汇编程序。您问题中的代码不起作用,因为它混合了 Pascal 和汇编程序,这在 64 位编译器中是不允许的,并且在 32 位编译器中是一个非常糟糕的主意。因此,前进的方向是将其编码为纯汇编程序例程。

有很多关于如何执行此操作的示例。例如,Rodrigo Ruz 有这个单位:https://github.com/RRUZ/vcl-styles-plugins/blob/master/Common/delphi-detours-library/CPUID.pas其中包含您所需要的内容。

自己动手并不难。它可能是这样的:

{$APPTYPE CONSOLE}

uses
System.SysUtils;

type
TRegisters = record
EAX: UInt32;
EBX: UInt32;
ECX: UInt32;
EDX: UInt32;
end;

function GetCPUID(ID: Integer): TRegisters;
asm
{$IF Defined(CPUX86)}
push ebx
push edi
mov edi, edx
cpuid
mov [edi+$0], eax
mov [edi+$4], ebx
mov [edi+$8], ecx
mov [edi+$c], edx
pop edi
pop ebx
{$ELSEIF Defined(CPUX64)}
mov r8, rbx
mov r9, rcx
mov eax, edx
cpuid
mov [r9+$0], eax
mov [r9+$4], ebx
mov [r9+$8], ecx
mov [r9+$c], edx
mov rbx, r8
{$ELSE}
{$Message Fatal 'GetCPUID has not been implemented for this architecture.'}
{$IFEND}
end;

var
Registers: TRegisters;

begin
Registers := GetCPUID(1);
Writeln(IntToHex(Registers.EAX, 8) + '-' + IntToHex(Registers.EBX, 8) + '-' + IntToHex(Registers.ECX, 8) + '-' + IntToHex(Registers.EDX, 8));
Readln;
end.

您需要了解调用约定、参数如何映射到寄存器、必须保留哪些寄存器等等。

通过一些网络搜索,您将能够找到无数更多的示例。例如,这里有一个 Stack Overflow 帖子 (Porting Assembler x86 CPU ID code to AMD64),可以说是这个问题的重复。

关于Delphi BASM 代码在针对 Win64 时出现错误。它可以转换为纯帕斯卡吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40132813/

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