首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改变gcc的召唤惯例

如何改变gcc的召唤惯例
EN

Stack Overflow用户
提问于 2021-01-09 17:33:10
回答 1查看 184关注 0票数 4

你好,我想告诉gcc如何调用函数,例如:

代码语言:javascript
运行
复制
    __mycall void my_function(arg1) {
        do_something(arg1)
    }
代码语言:javascript
运行
复制
    __mycall:
        move $a0, (the first argument)
        jalr (the function we should call)
        nop

我希望生成以下程序集代码:

代码语言:javascript
运行
复制
    my_function(1);

成为

代码语言:javascript
运行
复制
    move $a0, 1
    jalr my_function
    nop

我显然不想实现stdcall或fastcall之类的东西,我只是用一个例子来解释。

我认为这样做并不难,但我找不到如何编写内联程序集并使用内联程序集调用我的函数的例子,但这很难看,我将感谢帮助(:

EN

Stack Overflow用户

发布于 2022-04-13 22:08:21

您可以使用fastcall或thiscall函数属性(x86-32)

在x86-32目标上,fastcall属性使编译器在寄存器ECX中传递第一个参数(if为整型),在寄存器EDX中传递第二个参数(if为整型)。随后的和其他类型的参数被传递到堆栈中。被调用的函数从堆栈中弹出参数。如果参数的数量是可变的,则将所有参数推送到堆栈上。

在x86-32目标上,这个调用属性导致编译器在寄存器ECX中传递第一个参数(如果是整型的)。随后的和其他类型的参数被传递到堆栈中。被调用的函数从堆栈中弹出参数。如果参数的数量是可变的,则将所有参数推送到堆栈上。此调用属性用于C++非静态成员函数。作为GCC的扩展,这个调用约定可以用于C函数和静态成员方法。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65645610

复制
相关文章

相似问题

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