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