编译包含包含 C 定义的头文件的汇编代码

标签 c gcc compiler-construction assembly avr-gcc

我正在尝试一起编译汇编和 C 代码(不是 C 到汇编),但无法完成。

例如:

文件common.h

#ifndef __COMMON_H__
#define __COMMON_H__

struct tree{
        tree* left;
        tree* right;

        void* elem;
};

void foo(int c);
#endif

文件common.S

#include "common.h"

    .text
    .globl foo
    .ent foo
foo:
     //foo implementation

    .end foo

当我尝试编译时:

# gcc -c common.S
common.h: Assembler messages:
common.h:5: Error: unrecognized opcode `struct tree{'
common.h:7: Error: unrecognized opcode `tree* left'
common.h:8: Error: unrecognized opcode `tree* right'
common.h:10: Error: unrecognized opcode `void* elem'
common.h:12: Error: junk at end of line, first unrecognized character is `}'
common.h:14: Error: unrecognized opcode `void foo(int c)'

有什么方法可以使用 gcc 将 C 语言定义转换为汇编语言吗?

最佳答案

不,您不能在汇编语言中包含 C 声明。汇编程序不知道 struct tree 是什么意思。

如果你想写一个汇编语言函数 foo 来使用你定义的 struct tree,你将不得不在不使用C 头文件。

要了解这可能是什么样子,请用 C 语言编写 foo 函数,使用 gcc -S 编译它以生成汇编列表,然后执行查看生成的编译器生成的 common.s 文件。 (您应该在单独的目录中执行此操作,以免破坏现有的 common.s 文件。)

您可能不会看到任何对 struct tree 或成员名称 leftrightelem< 的引用;相反,您会看到引用特定偏移量数据的汇编操作码。

关于编译包含包含 C 定义的头文件的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251463/

相关文章:

c - 静态断言 enum 是某种基础类型

编译器和数据类型 => c 作为引用

c++ - 即使程序无法编译/加载,g++ 是否仍会生成输出文件?

C++11 initializer_list 错误

java - 出现语法错误,但奇怪的建议?

c - Gcc 中的大数加法结果(阿贝尔群)

c - linux mkdir函数无法授予完全权限

c - C中什么样的变量不能被寻址?

C 程序编译没有错误但不会运行并且没有警告或错误

c - 忽略c文件中的stdio.h文件