① arm汇编跟汇编、C语言的区别
不一样,汇编主要是要了解CPU指令及用法。
我们常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。你下载一份arm的手册就可以了解了。
C语言ARM的和x86的差不多,除了对硬件寄存器操作不同,其它语法和流程都一样。
回答补充:
arm汇编程序每一行是指定arm
core执行一条指令,每条指令都是硬件相关。
如
LDR
R3,
#1
;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的操作才与硬件相关;如果用arm编译器来编译,每行可能编译出1到多条arm指令。
如
i++;
//变量
i
递增1
等效于
LDR
R3,#1
;用LDR指令将数值1放入R3寄存器准备参与运算
ADD
R2,
R2,
R3
;用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器
以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
强调mcuos有错,“c语言被编译器编译的时候会最终解释为汇编语言的”,无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。
② 源程序到可执行程序的编译过程
源代码到可执行程序的编译过程涉及四个关键步骤:预处理、编译、汇编和链接。
预处理是程序编译的第一步,由独立的预编译器处理,不属于编译器的直接工作。它主要负责处理预处理指令,如条件编译,但并不涉及运行时间。
编译阶段将源代码转换成特定硬件平台的汇编语言,比如X86的x86汇编或ARM的ARM汇编,生成.s/.asm文件。这个过程涉及语法、词法、语义分析等六大部分,以确保变量、函数等的正确使用和错误检测。
编译过程中,符号表管理至关重要,记录了标识符及其属性,如类型、内存占用和地址,而错误管理则用于识别并报告语法错误(如拼写错误、括号匹配问题)和语义错误(如类型不匹配、作用域错误)。
从源程序到目标程序,可能会进行多次遍历以优化代码,但过多遍历会增加编译时间。最终,汇编阶段将汇编语言转换为机器语言的可重定位目标文件,如.o/.obj。
链接是编译的最后一步,将目标文件、启动代码和库文件结合,形成可执行的.exe文件。链接分为静态和动态两种,静态链接时所有库代码会直接嵌入程序,而动态链接则依赖运行时查找库。
③ 熟悉又陌生的arm 编译器详解(armcc/armclang)
深入探讨 arm 编译器的使用与特性
在理解编译器的工作机制之前,让我们先对编译器这一核心软件组件有一个大致的了解。编译器一般由三部分组成:前端、优化器和后端。它们协同工作,将源代码转换为可执行程序,具体过程包括源代码->预处理->编译->目标代码->链接->可执行程序。
关于编译器的历史,我们提及了 GCC、LLVM、Clang 等知名编译器,以及 ARM 公司自主研发的 armcc 和 armclang。这两款编译器被集成在 ARM 的 IDE 和开发工具中,用户可通过 ARM 官网获取相关文档。
armcc 编译器是 ARM 公司的主力产品,主要负责编译.c/.cpp 源文件生成目标文件。使用 armcc 时,通过 command-line 参数,用户可以灵活配置编译选项,以支持各种特性。下面列出一些常用的编译选项:
-o 参数用于指定输出文件名称。-D 参数用于定义宏名称,例如 -DLOG, -DUART=1 或 -U 移除已定义的宏名称。在嵌入式物联网项目中,正确使用编译选项至关重要,以避免错误的路线和内容导致工资增长瓶颈。
armcc 编译器提供多种优化级别,如下:
-O0:最小优化,关闭大多数优化。适合调试,因为生成的代码结构直观对应源代码。
-O1:受限优化,执行调试信息可描述的优化。删除未使用的内联函数和未使用的静态函数。在与 -debug 一同使用时,提供良好的代码密度与清晰的调试视图。
-O2:高度优化,调试视图可能不如 -O1 清晰,但生成的代码更加紧凑。是默认的优化级别。
-O3:最大优化,可能在调试时提供较差的视图,但生成代码性能最佳。与 -Otime 一同使用时,编译器执行额外优化,如更积极的代码优化。
armasm 汇编器用于处理汇编语言文件,而 armclang 编译器则在后续版本中加入,以支持 C++11 标准和其他现代 C++ 功能。了解 armclang 的具体功能和使用方法将有助于掌握更先进的编译技术。
要获取 armcc 和 armclang 的完整文档和资源,可访问 ARM 官网,或参考相关技术教程和文档。在学习过程中,确保掌握正确的编译选项和优化策略,以高效地编写和优化 C/C++ 程序。