Calling convention for ASM on Linux AMD64

Eugene Wissner belka at caraus.de
Sat Aug 18 06:47:36 UTC 2018


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.


More information about the Digitalmars-d-learn mailing list