[fpc-pascal] How to translate Delphi Assembly MOV EAX,[EBP+4]

Sven Barth pascaldragon at googlemail.com
Wed Jul 18 18:41:15 CEST 2018


Dennis <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

>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20180718/59a46322/attachment.html>


More information about the fpc-pascal mailing list