如何更改gcc调用约定

如何更改gcc调用约定,c,gcc,calling-convention,abi,C,Gcc,Calling Convention,Abi,嗨,我想告诉gcc如何调用函数,例如: \uuuu mycall void my\u函数(arg1){ 做点什么(arg1) } 我想要生成的汇编代码: my_函数(1); 将来 我显然不想实现stdcall或fastcall之类的东西,我只是通过一个例子进行了解释 我不认为这应该很难做到,但我没有找到任何关于如何做到这一点的例子 我可以编写内联汇编并使用内联汇编调用我的函数,但它很难看,我将感谢您的帮助(:打开优化标志时,您是否尝试过检查编译器生成的程序集?如果您允许编译器进行优化,编译

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

\uuuu mycall void my\u函数(arg1){
做点什么(arg1)
}
我想要生成的汇编代码:


my_函数(1);
将来

我显然不想实现stdcall或fastcall之类的东西,我只是通过一个例子进行了解释

我不认为这应该很难做到,但我没有找到任何关于如何做到这一点的例子
我可以编写内联汇编并使用内联汇编调用我的函数,但它很难看,我将感谢您的帮助(:

打开优化标志时,您是否尝试过检查编译器生成的程序集?如果您允许编译器进行优化,编译器可能会自动为您执行此操作。我不是试图优化代码,而是试图强制编译器以某种方式调用我的函数,例如在x86中有libc_get_pc_tunk函数等等类似于获取指令指针的方法,-Fpie在gcc中实现以生成pic代码。但是如果它没有使用此方法,我们可以计算函数的绝对地址,然后调用它,例如.*(get_pc_thunk()+函数的相对地址)(arg1、arg2、arg3)我想实现类似的东西,为此,我想编写我自己的程序集,并让它按照我的意愿调用函数。如果我理解正确,你想要的是,取代RCX、RDX、R8、R9,例如,现在的调用约定是(例如):RAX,RBX,RCX,RDX?确切地说,我只是这样调用我的代码,所以应该没问题,我不会调用库函数。我猜,不修改编译器是不可能的
    __mycall:
        move $a0, (the first argument)
        jalr (the function we should call)
        nop


    move $a0, 1
    jalr my_function
    nop