Calling convention for ASM on Linux AMD64

Eugene Wissner belka at caraus.de
Sat Aug 18 06:51:16 UTC 2018


On Saturday, 18 August 2018 at 06:47:36 UTC, Eugene Wissner wrote:
> On Saturday, 18 August 2018 at 04:16:11 UTC, Sean O'Connor 
> wrote:
>> What calling convention is used for assembly language in Linux 
>> AMD64?
>> Normally the parameters go in fixed order into designated 
>> registers.
>>
>> import std.stdio;
>> // Linux AMD64
>> float* test(float *x,ulong y){
>> 	asm{
>> 		naked;
>> 		align 16;
>> 		mov RAX,RDI;
>> 		ret;
>> 	}
>> }
>>
>> void main(){
>> 	float[] f=new float[16];
>> 	writeln(&f[0]);
>> 	float* a=test(&f[0],7);
>> 	writeln(a);
>> }
>>
>> If the ulong y parameter is removed from the function 
>> definition the pointer x goes into RDI as expected.  When y is 
>> added it all goes wrong. According to AMD64 the pointer should 
>> stay in RDI and the ulong go into RSI.
>
> If you compile with DMD, DMD passes the arguments in reverse 
> order. LDC and GDC use normal C calling conventions.

You can define test() as exter(C) to force dmd to use the 
expected arguments order.


More information about the Digitalmars-d-learn mailing list