首页 > 解决方案 > 如何从 C 调用内联汇编中的函数

问题描述

我目前正在简单地玩在线游戏,但我有点卡住了。我设法调用了一个没有参数的函数,但是当涉及到调用一个有两个参数的函数时,我被卡住了。

我下面的代码应该调用一个(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;
}

我目前的问题是,当我尝试编译程序时,我收到一条错误消息

p_function.c:31: Error: too many memory references for `mov'
p_function.c:33: Error: too many memory references for `mov'

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

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

谢谢

标签: cassemblyinline-assembly

解决方案


推荐阅读