【问题标题】:How can I call a function written in ARM assembly within C code?如何在 C 代码中调用用 ARM 汇编编写的函数?
【发布时间】:2018-07-05 10:43:22
【问题描述】:

具体来说:

  1. arm 汇编函数写在单独的文件中,例如 .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 文件。

感谢任何帮助,如果我在表达上犯了错误,请原谅,但我希望我的问题很清楚。

【问题讨论】:

  • 这不是标准化的,所以它取决于编译器。
  • “无法工作”不是一个好的描述。你有错误吗?如果是这样,具体是什么?你用什么命令来编译、汇编和链接?如果遇到运行时错误,调试器会说什么?
  • 很抱歉我在汇编代码上弄错了。它是“br x30”而不是“bx lr”。
  • 报告了1个错误。 “错误:ld 返回 1 个退出状态”。老实说,我不知道这意味着什么。编译器给出的另一个信息是使用未定义的 a_add(int, int) 函数。似乎编译器没有将这两个文件链接在一起,这就是我的问题所在。
  • @Lazyloper 你能发布完整的编译器调用和你得到的完整错误消息吗?

标签: c assembly extern


【解决方案1】:

我已使用 extern "C" 修复了代码并解决了问题。所需要的只是在 main.cpp 或 main.c 中声明如下函数

extern "C" {int a_add(int a, int b);}

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

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

【讨论】:

  • 这是正确的,如果您将代码编译为 C(就像您的 [c] 标记表明的那样),您将不需要这个。顺便说一句,您可以使用 #ifdef __cplusplus 并将 extern "C" 放在单独的行上,以使代码在 C++ 中执行您想要的以及有效的 C。
【解决方案2】:

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 是一个很好的工具,可以在玩组装时了解。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2013-09-21
    • 2017-01-19
    • 2016-09-07
    • 2017-02-18
    • 1970-01-01
    • 2016-08-27
    • 2013-03-13
    • 2011-09-04
    相关资源
    最近更新 更多