[fpc-pascal]Default calling convention

Peter Vreman peter at freepascal.org
Fri Jul 2 10:01:39 CEST 2004


> Marco van de Voort wrote:
>> Marcel Martin wrote:
>> >
>> > I noticed that, with FPC 1.9.4, the (default) calling convention
>> > "register" depends on the fact that a routine is or is not embedded
>> > in an other routine.
>> >
>> > With "proc(A,B,C: Longint);", if "proc" is not embedded then
>> > eax = A, edx = B and ecx = C but if "proc" is embedded then edx = A,
>> > ecx = B and C is on the stack.
>> >
>> > Is this convention definitive or temporary? I am not sure it is
>> > definitive since it makes the code of assembler routines dependent
>> > on their status: embedded or not.
>
>> In general it is not wise anyway to let the assembler become to
>> dependant
>> on calling convention.
>
>> Keep on using
>
>> mov eax,param1
>> mov ecx,param2
>
>> etc. Clearer, and doesn't have the problem between
>> procedure/methods/nested
>> procedures.
>
> I agree with you but it doesn't work. For instance, take this
> procedure
>
>   procedure nx_fill(P: PLongword; Count: Longint; Value: Longword);
>   assembler;
>   asm
>           pushl  %edi
>           movl   Value,%eax
>           movl   Count,%ecx
>           movl   P,%edi
>           rep
>           stosl
>           popl   %edi
>   end;
>
> in the .s file, FPC 1.9.4 produces this:
>
>   .globl  NXKERNEL_NX_FILL$PLONGWORD$LONGINT$LONGWORD
>           pushl  %ebp
>           movl   %esp,%ebp
>           pushl  %edi
>           movl   %ecx,%eax  // eax is modified
>           movl   %edx,%ecx
>           movl   %eax,%edi  // eax is more equal to P, access violation
>           rep
>           stosl
>           popl   %edi
>           ret
>
> With this one
>
>   procedure nx_fill(P: PLongword; Count: Longint; Value: Longword);
>   assembler;
>   asm
>           pushl   %edi
>           movl    %eax,%edi  // edi <- P
>           movl    %ecx,%eax  // eax <- Value
>           movl    %edx,%ecx  // ecx <- Count
>           rep
>           stosl
>           popl    %edi
>   end;
>
> the produced code is correct but now this proc can no more be used as a
> nested proc.

Check what Delphi does for nested procedures. If it is different from FPC
then FPC will be adapted.







More information about the fpc-pascal mailing list