[fpc-pascal] How to translate Delphi Assembly MOV EAX,[EBP+4]
Dennis
dec12 at avidsoft.com.hk
Wed Jul 18 18:59:02 CEST 2018
Thanks.
So the following will give an address+frame of the calling routine ?
get_caller_addr(get_frame), get_caller_frame(get_frame)
Dennis
Sven Barth via fpc-pascal wrote:
> Dennis <dec12 at avidsoft.com.hk <mailto:dec12 at avidsoft.com.hk>> schrieb
> am Mi., 18. Juli 2018, 17:19:
>
> The following delphi code when compiled by FPC, raised these errors:
> Compile Project, Target: lib\x86_64-win64\Project1.exe: Exit code 1,
> Errors: 10, Warnings: 2
> StrBuffer.pas(100,19) Error: Unknown identifier "EAX"
> StrBuffer.pas(100,23) Error: Assembler syntax error in operand
> StrBuffer.pas(100,24) Error: Unknown identifier "EBP"
> StrBuffer.pas(100,29) Error: Invalid constant expression
> StrBuffer.pas(100,29) Error: Invalid reference syntax
> StrBuffer.pas(100,29) Warning: No size specified and unable to
> determine
> the size of the operands, using DWORD as default
> StrBuffer.pas(207,19) Error: Unknown identifier "EAX"
> StrBuffer.pas(207,23) Error: Assembler syntax error in operand
> StrBuffer.pas(207,24) Error: Unknown identifier "EBP"
> StrBuffer.pas(207,29) Error: Invalid constant expression
> StrBuffer.pas(207,29) Error: Invalid reference syntax
> StrBuffer.pas(207,29) Warning: No size specified and unable to
> determine
> the size of the operands, using DWORD as default
>
> Can anyone help me?
>
> class procedure TStrBuffer.Error(const Msg: string; Data: Integer);
>
> function ReturnAddr: Pointer;
> asm
> MOV EAX,[EBP+4]
> end;
>
> begin
> raise EListError.CreateFmt(Msg, [Data])at ReturnAddr;
> end;
>
>
> There are two ways to solve this.
>
> The first one is an easy one, however the code still won't be platform
> independent due to the assembly code. For this simply add "{$asmmode
> intel}" at the top.
>
> The second solution is cross platform and with correct checks also
> Delphi compatible:
>
> === code begin ===
> raise EListError.CreateFmt(Msg, [Data]) at
> {$ifdef fpc}
> get_caller_addr(get_frame),
> get_caller_frame(get_frame)
> {$else}
> ReturnAddr
> {$endif} ;
> === code end ===
>
> Disable the ReturnAddr function also with "{$ifndef fpc}...{$endif}"
> and you should be set.
>
> Regards,
> Sven
>
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
More information about the fpc-pascal
mailing list