【问题标题】:How to use asm procedure and take return value in C如何在 C 中使用 asm 过程并获取返回值
【发布时间】:2014-12-13 17:46:08
【问题描述】:

我有一个 gcc 版本 2.95.2 19991024 (release) 工具链,现在我需要使用位于 makefile 同一文件夹中的文件中的 Assembly 函数。

我尝试了很多方法将该文件放入我的工具链中,但都没有成功。

基本上我在 ASM 中声明:

.globl  util_MyFunc
util_MyFunc: 
...

并且在 C 文件的主要空白处:

extern void util_MyFunc();
int main(void) {  
 util_MyFunc();
...

当我编译时,我得到了与无法识别相关的错误:

/cygdrive/c/MyDev/tmp/main.o(.text+0x8bc): undefined reference to `util_MyFunc'
make: *** [test.o] Error 1

谢谢!

编辑:

我尝试使用以下方法从 asm 文件生成“.o”文件

C:\MyDev>gcc -c test.asm -o test.o

结果:

gcc: utils.asm: linker input file unused since linking not done

或:

C:\MyDev>gcc test.asm -o test.o

但是...:

ld: cannot open crt0.o: No such file or directory

【问题讨论】:

  • 你在你的程序集文件上运行 gcc 吗?
  • 你真的应该更新你的编译器gcc-2.95 来自上个世纪,众所周知是buggy不擅长优化不符合标准。当前GCC 自 2014 年 10 月以来为 4.9.2;您可以将其编译为交叉编译器。使用 GCC 2.95 是一个错误
  • 请参阅编辑。如果我使用那个旧的 gcc,那是有原因的。无论如何我都会尝试升级,但无论如何......有人可以指出我的问题的正确方向吗?
  • 我没有看到任何关于使用 GCC 2.95 的解释(即使在您编辑之后)。它是如此的错误和陈旧,以至于没有理由使用它(除非你想成为编译器历史方面的专家)。你会受到其他问题的伤害。
  • Basile...你介意我问你一些幕后的事情吗?可以分享你的邮箱吗?

标签: c gcc assembly toolchain


【解决方案1】:

gcc 期望的汇编文件的规范扩展名是.s。您应该使用它(或直接使用as 组装)。也可能将-o test.o 放在输入文件名之前。最后,如果您想使用 libc,您将需要 libc 开发文件。否则使用-nostdlib 开关。

你应该试试:gcc -o test main.c utils.s

【讨论】:

  • 是的,它有效,但它现在给了我大量的汇编错误......但答案是正确的,所以绿色检查!
猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 2015-07-29
  • 2023-03-09
  • 1970-01-01
  • 2017-08-30
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多