Delphi中LEA指令为何编译失败?
- 内容介绍
- 文章标签
- 相关推荐
本文共计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中编译通过。

