Delphi中LEA指令为何编译失败?

更新于
2026-10-05 02:21:02
0阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1020个文字,预计阅读时间需要5分钟。

我正在将32位Delphi+BASM代码移植到64位FPC(Win64操作系统),想了解为什么以下一条指令不能在64位FPC中编译:

pascal{${IFDEF FPC}${{${ASMMODE INTEL}}}${{${ENDIF}}}procedure DoesNotCompile;asm LEA ECX, [ECX + ESI + $2C5E5A51]end;

这条指令在64位FPC中无法编译的原因是:

1. 寄存器使用错误:在64位模式中,寄存器的使用与32位模式不同。64位模式下,默认使用RAX、RBX、RCX、RDX等寄存器,而不是32位模式中的EAX、EBX、ECX、EDX。

2. 指令集不兼容:64位指令集与32位指令集有所不同,直接使用32位模式下的指令可能导致编译错误。

3. 内存寻址方式不同:64位模式下,内存寻址更加灵活,允许使用更多的寄存器进行寻址,而32位模式下则较为受限。

为了在64位FPC中正确编译上述代码,需要做出以下修改:

- 使用64位寄存器,例如使用RCX代替ECX。- 使用64位指令集,例如使用LEA RAX代替LEA ECX。- 使用64位内存寻址方式。

以下是修改后的代码示例:

pascal{${IFDEF FPC}${{${ASMMODE INTEL}}}${{${ENDIF}}}procedure DoesNotCompile;asm LEA RCX, [RCX + RSI + $2C5E5A51]end;

这样修改后,代码应该能够在64位FPC中编译通过。

阅读全文

本文共计1020个文字,预计阅读时间需要5分钟。

我正在将32位Delphi+BASM代码移植到64位FPC(Win64操作系统),想了解为什么以下一条指令不能在64位FPC中编译:

pascal{${IFDEF FPC}${{${ASMMODE INTEL}}}${{${ENDIF}}}procedure DoesNotCompile;asm LEA ECX, [ECX + ESI + $2C5E5A51]end;

这条指令在64位FPC中无法编译的原因是:

1. 寄存器使用错误:在64位模式中,寄存器的使用与32位模式不同。64位模式下,默认使用RAX、RBX、RCX、RDX等寄存器,而不是32位模式中的EAX、EBX、ECX、EDX。

2. 指令集不兼容:64位指令集与32位指令集有所不同,直接使用32位模式下的指令可能导致编译错误。

3. 内存寻址方式不同:64位模式下,内存寻址更加灵活,允许使用更多的寄存器进行寻址,而32位模式下则较为受限。

为了在64位FPC中正确编译上述代码,需要做出以下修改:

- 使用64位寄存器,例如使用RCX代替ECX。- 使用64位指令集,例如使用LEA RAX代替LEA ECX。- 使用64位内存寻址方式。

以下是修改后的代码示例:

pascal{${IFDEF FPC}${{${ASMMODE INTEL}}}${{${ENDIF}}}procedure DoesNotCompile;asm LEA RCX, [RCX + RSI + $2C5E5A51]end;

这样修改后,代码应该能够在64位FPC中编译通过。

阅读全文