首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未使用__attribute__((fastcall))获取通过寄存器从asm传递到C的函数参数

未使用__attribute__((fastcall))获取通过寄存器从asm传递到C的函数参数
EN

Stack Overflow用户
提问于 2019-01-30 15:10:37
回答 1查看 119关注 0票数 2

我试图从汇编程序中调用C函数,但是我没有得到预期的值(参数)。

fastcall属性生成来自gcc的警告,并被忽略!

我正在使用MASM风格的编码,并使用jwasm (或uasm)编译它。

代码语言:javascript
复制
jwasm -q -10 -elf64 -mf -zf0 asmfunc.asm -Fo asmfunc.o

main.c

代码语言:javascript
复制
#include <stdio.h>

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

void asmfunc(void);

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

asmfunc.asm

代码语言:javascript
复制
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上错过了什么!

EN

回答 1

Stack Overflow用户

发布于 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的第二个参数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54435052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档