arm编程中使用的gnu和as分别是什么,他们的作用是什么
好的,这是一个关于 ARM 开发中两个核心工具的优秀问题。
简单来说:
- GNU 指的是一整套工具集合(工具链),它包含了编译器、汇编器、链接器等,是进行开发的“工具箱”。
- as 是这个工具箱里一个特定的工具,即“汇编器”,它负责将人类可读的汇编代码转换成机器可执行的二进制代码。
下面我们进行详细的分解。
1. GNU
是什么?
在 ARM 编程的上下文中,“GNU” 通常指的是 GNU 工具链,更具体地说是 GNU Compiler Collection 以及其相关的二进制工具集。这套工具链是开源且免费的,是 Linux 系统和嵌入式开发领域最主流、最强大的工具链之一。
对于 ARM 架构,这个工具链通常被称为 GNU Arm Embedded Toolchain 或类似的名字(现在由 Arm 官方直接维护和发布)。
它的作用是什么?
GNU 工具链提供了一个完整的软件开发环境,用于将源代码(C, C++, Assembly等)转换为可以在 ARM 处理器上运行的二进制可执行文件。它包含多个关键组件:
- 编译器 (
arm-none-eabi-gcc):将 C/C++ 等高级语言源代码编译成汇编代码。 - 汇编器 (
arm-none-eabi-as):这就是as,它将汇编代码编译成目标文件(.o文件)。 - 链接器 (
arm-none-eabi-ld):将一个或多个目标文件以及库文件链接在一起,生成最终的二进制可执行文件(如.elf文件)。 - 其他工具:
objcopy:用于转换二进制文件格式,例如从.elf文件中提取出纯二进制镜像.bin或英特尔十六进制文件.hex,用于烧录到芯片中。objdump:用于反汇编,查看二进制文件的汇编代码和结构。size:查看生成的可执行文件中各个段(如代码段、数据段)的大小。gdb:GNU 调试器,用于调试程序。
总结:GNU 提供了一个从“编写代码”到“生成可烧录文件”的完整解决方案。
2. as
是什么?
as 是 GNU Assembler 的命令。在 ARM 开发中,它的具体命令通常是 arm-none-eabi-as。它是一个汇编器。
它的作用是什么?
它的作用非常专一:将用汇编语言(Assembly Language)编写的源代码文件(通常是 .s 或 .S 后缀)转换成目标文件(Object File,通常是 .o 后缀)。
- 输入:人类可读的汇编指令(如
MOV R0, #42,B loop)和汇编伪指令(Assembler Directives)。 - 输出:机器可识别的二进制代码(目标文件),但还不是最终的可执行程序。这个目标文件包含了机器码、符号表等信息,还需要链接器进行进一步处理。
一个关键区别:.s vs .S 文件
.s(小写s):告诉工具链,这是一个“纯”汇编文件,直接交给汇编器as处理。.S(大写S):告诉工具链,这是一个“需要预处理的”汇编文件。在交给汇编器as之前,会先由 C 预处理器 处理。这意味着你可以在汇编文件中使用#include,#define,#ifdef等宏指令,非常有用。
它们如何协同工作?
在一个典型的 ARM 项目编译过程中,gcc、as 和 ld 是协同工作的。即使你只调用 gcc,它也在后台自动调用了 as 和 ld。
示例流程:
假设你有一个 C 文件 main.c 和一个汇编文件 startup.S。
-
编译 C 代码:
arm-none-eabi-gcc -c main.c -o main.ogcc调用编译器本身将main.c编译成汇编代码。- 然后
gcc自动调用as将这个临时的汇编代码汇编成目标文件main.o。
-
编译汇编代码:
arm-none-eabi-gcc -c startup.S -o startup.o- 因为
startup.S是大写 S,gcc会先调用 C 预处理器对文件进行宏扩展。 - 然后,
gcc自动调用as将处理后的汇编代码汇编成目标文件startup.o。 - (你也可以直接调用
arm-none-eabi-as startup.S -o startup.o,但这会跳过预处理阶段,可能导致错误如果文件里用了#include)
- 因为
-
链接所有目标文件:
arm-none-eabi-gcc main.o startup.o -o program.elf -T linkerscript.ldgcc自动调用链接器ld,将main.o、startup.o以及标准的 C 库(如需要)根据链接脚本linkerscript.ld的指示,组合成最终的可执行文件program.elf。
-
生成烧录文件:
arm-none-eabi-objcopy -O binary program.elf program.bin- 使用 GNU 工具链中的
objcopy从program.elf中提取出芯片可以直接烧录的纯二进制文件program.bin。
- 使用 GNU 工具链中的
总结对比
| 工具 | 全称 | 角色 | 主要输入 | 主要输出 |
|---|---|---|---|---|
| GNU | GNU's Not Unix | 一整套工具链 | C/C++/Asm 源代码 | 可烧录的二进制文件 |
as |
GNU Assembler | 工具链中的一个组件(汇编器) | 汇编源代码 (.s, .S) |
目标文件 (.o) |
因此,GNU 是“生态系统”或“工具箱”,而 as 是这个工具箱里一把专门用于处理汇编语言的“螺丝刀”。
浙公网安备 33010602011771号