如何在C代码中调用用ARM汇编语言编写的函数?

时间:2018-07-05 10:43:23

标签: c assembly extern

具体来说:

  1. 臂装配功能写入一个单独的文件中,例如.S文件或.asm文件。
  2. 我需要在main.c中调用此函数
  3. ARM程序集采用ARMv8体系结构。

我已经编写了一些测试代码,但是它无法正常工作。

#include <stdio.h>
extern int a_add(int a, int b);
int main(){
    int fi=5;
    int se=7;
    int result=a_add(fi, se);
    printf("result is %d", result);
    return 0;
}

然后是汇编代码。(a_add.S)

.section .text
.globl a_add
a_add:
    add x3,x1,x0
    mov x0,x3
    br x30

有人知道我如何修复这两个文件以使a_add函数起作用? 我还没有尝试过.asm文件。

如果我在表达上有失误,​​请多多帮助,请原谅,但我希望我的问题很清楚。

2 个答案:

答案 0 :(得分:0)

我通过使用外部字符“ C”修复了代码,并解决了该问题。只需声明main.cpp或main.c

中的以下函数即可
extern "C" {int a_add(int a, int b);}

用“ C”替换旧的“ extern”行。 如果编译器是针对C ++代码而不是C代码的,这将很有帮助,基本上是通过让函数以C代码而不是C ++代码的方式进行编译。

我还没有做过这样的测试,但是我想如果编译器是C编译器,就不会有这样的问题。

答案 1 :(得分:0)

ma​​in.c

#include<stdio.h>

extern int a_add(int, int);

int main() {
  int a = 5;
  int b = 3;
  printf("%d + %d = %d \n",  a, b, a_add(a, b));
}

add.s

        .text
        .global a_add
a_add:
        add     w0, w0, w1
        ret

在 AArch64 机器(带有 ubuntu 20.04 的 docker 容器)上使用 gcc (9.3.0) 编译,使用:

gcc main.c add.s -o run.exe && ./run.exe

为目标程序集中的所需功能准备好骨架的快速方法是:

  1. 编写一个与所需函数签名匹配的简单 c 函数,例如,对于上面的 add 函数:
int a_add(int a, int b){
  return a + b;
}
  1. 开始为此类 C 函数生成程序集。
gcc -S -O2 add.c

注意:使用更高的优化级别可能会产生不太明显的代码。

提示Compiler Explorer 是在玩程序集时了解的好工具。