如何从C调用内联汇编中的函数

如何从C调用内联汇编中的函数,c,assembly,inline-assembly,C,Assembly,Inline Assembly,我现在只是在玩在线游戏,我有点卡住了。我已经成功地调用了一个没有参数的函数,但是当涉及到调用一个有两个参数的函数时,我陷入了困境 下面的代码应该调用一个函数(add),该函数将预定义的数字相加,它应该调用第二个函数(add parameter),其中两个参数应该相加 #include <stdio.h> int c = 4; int d = 5; void add() { int result = 1 + 2; printf("R

我现在只是在玩在线游戏,我有点卡住了。我已经成功地调用了一个没有参数的函数,但是当涉及到调用一个有两个参数的函数时,我陷入了困境

下面的代码应该调用一个函数
(add)
,该函数将预定义的数字相加,它应该调用第二个函数
(add parameter)
,其中两个参数应该相加


  #include <stdio.h>

  int c = 4;
  int d = 5;
  void add() {
      int result = 1 + 2;
      printf("Result: %d\n", result);
  }

  void add_parameter(int a, int b) {
      int result = a + b;
      printf("Result: %d\n", result);
  }


int main()
{
       __asm__ __volatile__ ( "call add" );

    //    __asm__ __volatile__(
    //     "mov     eax, offset c"
    //     "push    eax"
    //     "mov     eax, offset d"
    //     "push    eax"
    //     "call add_parameter"
    //     "pop     ebx"
    //     "pop     ebx"
    //    );

    __asm__ __volatile__ ( "mov eax, offset c" );
    __asm__ __volatile__ ( "push eax" );
    __asm__ __volatile__ ( "mov eax, offset d" );
    __asm__ __volatile__ ( "push eax" );
    __asm__ __volatile__ ( "call add_parameter" );
    __asm__ __volatile__ ( "pop ebx" );
    __asm__ __volatile__ ( "pop ebx" );

    return 0;
}

在我的程序中,我尝试了两种方法,一种是一个单独的ASM调用,其中包含整个ASM代码,另一种是我将每行拆分为自己的ASM调用

不幸的是,我不确定这些方法中哪一种是正确的,更不用说最有效的了,但无论我使用哪种方法,我都会得到相同的错误。 如何解决此问题并调用函数
add\u参数


感谢

即使您使用AT&T语法(或使用
gcc-masm=intel
将其作为intel语法阅读)来修复您现在收到的错误消息,使用基本asm(无约束)也不安全;您可以修改寄存器值,也可以修改被调用的函数。您需要写入%eax而不是eax。我将其添加到重复项列表中,作为调用函数以确保安全所需的clobber声明示例。(即通过clobber列表描述呼叫约定)。这个问题是针对x86-64的,因此实际的arg传递是不同的(在regs中而不是堆栈中)。您在函数中使用基本Asm语句的整个方法完全有缺陷(始终使用扩展Asm),这与Intel与AT&T的语法混淆不同。
p_function.c:31: Error: too many memory references for `mov'
p_function.c:33: Error: too many memory references for `mov'