Hello,

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.

This is exactly the same as Delphi (7) behaves.

 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;

In this case

  procedure nx_fill(P: PLongword; Count: Longint; Value: Longword);
  assembler;
  asm
          pushl   %edi
          movl    P,%edi  // edi <- P
          movl    Value,%eax  // eax <- Value
          movl    Count,%ecx  // ecx <- Count
          rep
          stosl
          popl    %edi
  end;

works both as embedded and non-embedded assembler procedure because the order of assignments is ok in both cases.

Btw, there's already a method in the system unit which does the same thing as your routine: filldword()...

Regards,
  Thomas


_______________________________________________ fpc-pascal maillist - [EMAIL PROTECTED] http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to