没有通过__attribute __((fastcall))通过寄存器将函数参数从asm传递到C

问题描述 投票:2回答:1

我试图从汇编程序调用C函数,但我没有按预期传递值(参数)。

fastcall属性从gcc生成警告并被忽略!

我正在使用MASM样式编码并使用jwasm(或uasm)进行编译。

jwasm -q -10 -elf64 -mf -zf0 asmfunc.asm -Fo asmfunc.o

main.c中

#include <stdio.h>

__attribute__((fastcall)) void DumpRCX(unsigned long long rcx)
{
    printf("%llx\n", rcx);
}

void asmfunc(void);

main(arc, *argv[])
{
    asmfunc();
}

Asamfudakkasm

EXTERN  DumpRCX: PROC

PUBLIC asmfunc
asmfunc PROC
    sub rsp, 28h
    mov rcx, 84h ; any value for testing
    call DumpRCX
    add rsp, 28h
    ret
asmfunc ENDP

它运行并进入DumpRCX函数,但RCX中的值永远不会是84h。

我的理解是fastcall应该传递RCX寄存器中函数调用的第一个参数。

我在mingw gcc + jwasm和VS 2015下进行了测试,它运行正常。

我不确定我在Linux上缺少什么!

gcc assembly x86-64 calling-convention
1个回答
4
投票

__attribute__((ms_abi))应该让你的代码做你想做的。它将告诉gcc使用该函数的Windows x64调用约定。或者sysv_abi将使用该调用约定来调用该函数(在不是默认值的平台上)

(但是你为什么要这样做?只需在x86-64 System V中正常传递RDI中的arg,然后调用者就不必保留阴影空间。)

__attribute__((fastcall))只为i386(-m32)做任何事情,而不是x86-64目标。

The GCC manual's x86 function attributes page清楚地证明了这一点:在x86-32目标上,fastcall属性......


您可以将代码放在https://godbolt.org/上或在本地查看gcc -O3 -S输出,并查看它实际复制到RSI的寄存器作为printf的第二个arg。

© www.soinside.com 2019 - 2024. All rights reserved.