Assembler (Intel) inconsistencies in 2.0.x, Was: Re: [fpc-devel] Bug: compilation loop in 2.0.2 when using -So

Konstantin Münning konstantin at muenning.com
Fri Aug 18 14:10:01 CEST 2006


Jonas Maebe wrote:
> 
> On 18 aug 2006, at 13:36, Konstantin Münning wrote:
> 
>> PROGRAM Original;
>> {$ASMMODE Intel}
>>  PROCEDURE Test(p:Pointer;l:LongInt;w:Word;b:Byte);ASSEMBLER;
>>   ASM
>>    mov eax,[p]
>>    mov eax,[l]
>>    mov ax,[w]
>>    mov al,[b]
>>   END;
>> BEGIN
>> END.
>>
>> This program is like the code I'm using which works with fpc 1.0.10 and
>> BP (BP is 16 bit only so without eax). FPC 2.0.x complains on the mov
>> ax,[w] with the error(s):
>>
>> original.pas(7,13) Error: Asm: 16 Bit references not supported
>> original.pas(7,13) Error: Asm: Invalid effective address
> 
> That's because the default calling convention is now register instead of
> oldfpccall. p is now passed in eax, l in edx and w in cx. So the the
> compiling is complaining because the above now means "mov ax, [cx]".

Does this mean above code is translated to

   mov eax,[eax]
   mov eax,[ebx]
   mov ax,[cx]

? Because that would be awfully wrong! With the new calling convention
it should be translated as

   mov eax,eax
   mov eax,ebx
   mov ax,cx

> Add {$calling stdcall} (or alternatively {$calling oldfpccall}, but
> that's not encouraged since this calling convention is FPC-specific) to
> you source to switch back to passing all parameters on the stack.

Is the $calling mixable? I mean would units compiled with {$calling
stdcall} work with programs compiled without or with some other $calling?

Konstantin



More information about the fpc-devel mailing list