我试图从汇编程序调用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上缺少什么!
__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。