Discussion:
[fpc-pascal] How to translate Delphi Assembly MOV EAX,[EBP+4]
Dennis
2018-07-18 15:19:26 UTC
Permalink
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;
_______________________________________________
fpc-pascal maillist - fpc-***@lists.freepascal.org
http://lists.freepascal.org/cgi-bin
Sven Barth via fpc-pascal
2018-07-18 16:41:15 UTC
Permalink
Post by Dennis
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
Dennis
2018-07-18 16:59:02 UTC
Permalink
Thanks.

So the following will give an address+frame of the calling routine ?
    get_caller_addr(get_frame),  get_caller_frame(get_frame)

Dennis
Post by Dennis
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
=== 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
_______________________________________________
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-***@lists.freepascal.org
http://lists.fr
Sven Barth via fpc-pascal
2018-07-18 18:31:08 UTC
Permalink
Post by Dennis
Thanks.
So the following will give an address+frame of the calling routine ?
get_caller_addr(get_frame), get_caller_frame(get_frame)
As long as you pass it to the "raise ... at", yes.

Regards,
Sven
Giuliano Colla
2018-07-18 16:42:10 UTC
Permalink
Post by Dennis
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;
_______________________________________________
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
It looks like Intel asm syntax, while fpc defaults to AT&T assembler.
According the docs you should prepend a switch
{$ASMMODE intel)
to your asm section, or at the top of the unit.

Hope that it helps,

Giuliano

_______________________________________________
fpc-pascal maillist - fpc-***@lists.freepascal.org
http://
Loading...