我试图从汇编程序中调用C函数,但是我没有得到预期的值(参数)。
fastcall属性生成来自gcc的警告,并被忽略!
我正在使用MASM风格的编码,并使用jwasm (或uasm)编译它。
jwasm -q -10 -elf64 -mf -zf0 asmfunc.asm -Fo asmfunc.omain.c
#include <stdio.h>
__attribute__((fastcall)) void DumpRCX(unsigned long long rcx)
{
printf("%llx\n", rcx);
}
void asmfunc(void);
main(arc, *argv[])
{
asmfunc();
}asmfunc.asm
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上错过了什么!
发布于 2019-01-30 15:57:21
__attribute__((ms_abi))应该让你的代码做你想做的事情。它将告诉gcc对该函数使用Windows x64调用约定。或者sysv_abi将对该函数的调用使用该调用约定(在非默认的平台上)
(但是你为什么要这样做呢?只需像x86-64 System V中的常规方法一样在RDI中传递arg,调用者就不必保留卷影空间。)
__attribute__((fastcall)) (**-m32**),仅适用于i386 ,而不适用于x86-64目标。
The GCC manual's x86 function attributes page非常清楚地记录了这一点:在x86-32目标上,快速调用属性...
你可以把你的代码放在https://godbolt.org/上,或者在本地查看gcc -O3 -S的输出,看看它实际上复制到了RSI中的哪个寄存器作为printf的第二个参数。
https://stackoverflow.com/questions/54435052
复制相似问题