Delphi7代码移植到Lazarus时CPUID获取函数无法编译如何解决?
Delphi7 CPUID 汇编代码移植Lazarus编译错误解决
错误原因
- Free Pascal(Lazarus默认编译器)的内联汇编语法与Delphi不兼容,寄存器名需要加
%前缀,内存寻址格式、操作数大小声明规则均有差异 - 架构判定宏不匹配:FPC使用
CPU386代表32位x86架构,CPUX86_64代表64位x86架构,原代码的CPUX86/CPUX64宏未命中,导致错误编译对应架构的汇编代码 - 函数结构错误:原代码在
asm块前多写了begin关键字,FPC不支持该写法,引发后续语法解析错误 - 调用约定差异:Delphi与FPC的x64参数传递寄存器规则不同,原代码的寄存器赋值逻辑完全不匹配FPC的调用约定
修复后的可编译代码
首先确认TCPUID类型定义:
type TCPUID = record EAX, EBX, ECX, EDX: LongWord; end;
适配FPC规则的GetCPUID函数实现:
function GetCPUID(Leaf, Subleaf: Integer): TCPUID; assembler; asm {$IFDEF CPU386} push %ebx push %edi mov %ecx, %edi mov %edx, %ecx cpuid mov %eax, 0(%edi) mov %ebx, 4(%edi) mov %ecx, 8(%edi) mov %edx, 12(%edi) pop %edi pop %ebx {$ELSIF DEFINED(CPUX86_64) AND DEFINED(MSWINDOWS)} // Windows平台x64调用约定适配 push %rbx mov %rdx, %r8 mov %ecx, %eax mov %r8d, %ecx cpuid mov %eax, (%r9) mov %ebx, 4(%r9) mov %ecx, 8(%r9) mov %edx, 12(%r9) pop %rbx {$ELSIF DEFINED(CPUX86_64)} // 非Windows平台x64调用约定适配 push %rbx mov %edi, %eax mov %esi, %ecx cpuid mov %eax, (%rdi) mov %ebx, 4(%rdi) mov %ecx, 8(%rdi) mov %edx, 12(%rdi) pop %rbx {$ELSE} {$FATAL GetCPUID 未适配当前编译架构} {$ENDIF} end;
额外注意事项
- 如果不需要跨平台,可根据自己的编译目标架构删除不需要的分支,减少代码复杂度
- 编译前请确认项目目标架构设置正确,避免架构宏判定错误
内容的提问来源于stack exchange,提问作者Atak_Snajpera
相关产品推荐
相关产品推荐

