3.7 GNU ARM汇编语言

ARM平台下从事嵌入式软件开发大家会遇到各种不同集成开发环境编译器例如IAR,ADSIRVDS Keil MDK RealVidew MDK ARM交叉编译aarm-linux-gcc如果这些不同IDE归类一般可以分为两大类一类IDE内部集成ARM编译器另一使用开源GNU GCC for ARM编译器为了方便在后续文字我们简称GNU ARM编译器

3.7.1 重新认识编译器

编译器到底是什么在很多人概念中编译器可能就是一个gcc命令用来C程序编译器成可执行文件其实编译器不仅仅是一个简单gcc或者arm-linux-gcc命令而是一套完整工具集一套完整编译工具集主要包括以下几个部分

编译器用来C源文件编译成汇编文件

汇编用来将汇编文件汇编成目标文件

链接器将目标文件组装成可执行文件

二进制转化工具objdump, objcopy, strip

打包工具ar

调试工具gdb , nm

/头文件根据C语言标准定义API实现C标准以及对应头文件

一套完整编译器工具不仅仅包含编译器还有各种个样工具函数库头文件等编译器只不过是我们叫顺口我们所说编译器其实不仅仅编译器还有各种二进制工具C标准库头文件等等

不同ARM编译器开发商会根据ARM指令集规定标准指令开发各自编译器软件目前市面上比较常见编译器ARM公司开发ARMCC编译器IARC/C++编译器开源GNU GCC for ARM交叉编译器不同IDE一般都会内嵌上面三种编译器中一种或者IDE编译器分别独立发布甚至有些IDE还可以通过配置支持多种编译器

各种厂商编译器因为遵循统一套ARM指令集标准因此经过不同编译器编译程序都可以同一台ARM处理器运行市面上各种ARM编译器之间唯一区别汇编指令格式有所差异造成差异原因各家编译器厂商虽然遵循统一套AMR指令集但是根据自己产品需求定位各自扩展了不同伪指令

ARM 指令集

ARM编译器 ARM GNU编译器

扩展伪指令 扩展伪指令

ARM指令 ARM指令

CPU

3-8 ARM指令集伪操作

ARM公司官方发布ARM编译器开源GNU ARM编译器为例3-8所示他们之间主要差别在于伪操作编译器开发设计编译器会参考ARM指令集C程序翻译成CPU能够识别运行ARM标准指令除此之外为了方便使用汇编程序编写不同编译器还会扩展一些各自语法特性, 这些扩展伪指令语法特性称为伪操作这些操作主要用来辅助程序员编程定义数据定义不同代码段数据段设计汇编程序分支跳转结构以及用来汇编指令组装一个可以运行汇编程序我们学习编写汇编程序除了掌握指令定义ARM指令还要了解编译器扩展微操作以及他们之间区别

3.7.2 GNU ARM编译器伪操作

不同ARM编译器之间伪操作差别还是挺大ARM编译器GNU ARM编译器为例我们可以对比下他们数据定义程序结构方面差别

3-5 所示

ARM编译器

GNU ARM编译器

伪操作说明

AREA copy, CODE, ...

.text

定义一个代码段

AREA .dat .DATA ...

.data

定义一个数据段

使用;注释

使用//注释

汇编注释方式

DCD

.long .word

分配一片连续存储单元

Entry

ENTRY(_start)

汇编程序执行入口

END

.end

汇编程序结束标记

CODE32

.arm / .code32

告诉编译器后面指令ARM指令

CODE16

.thumb /.code16

告诉编译器后面指令Thumb指令

SPACE

.space

分配一片连续内存并初始化为0

GBLL,GBLA

.global

定义一个全局变量

EXPORT, GLOBAL

.global

全局符号声明

EQU,SETL,SETA

.extern

引用其它文件全局符号需要声明

IF,ELSE,ENDIF

.ifdef .else .endif

条件汇编

MACRO/MEND

.macro/.endm

宏定义

GET INCLUDE

.include

文件包含展开编译

INCBIN

.incbin

文件包含不编译

后面内容我们会经常使用ARM反汇编代码来分析C语言底层运行机制为了看懂反汇编代码我们还需要熟悉一下一个反汇编文件经常看到各种GNU ARM伪指令操作

相关推荐

  1. 汇编语言学习(1)

    2024-02-05 13:26:06       45 阅读
  2. C++汇编语言学习计划

    2024-02-05 13:26:06       41 阅读
  3. 汇编语言中的MVC

    2024-02-05 13:26:06       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-05 13:26:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-05 13:26:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-05 13:26:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-05 13:26:06       20 阅读

热门阅读

  1. 华为配置车地通信快速切换实验

    2024-02-05 13:26:06       29 阅读
  2. 系统分析师-23年-上午答案

    2024-02-05 13:26:06       27 阅读
  3. 【使用 Python 进行 NLP】 第 2 部分 NLTK

    2024-02-05 13:26:06       31 阅读
  4. 合并排序算法

    2024-02-05 13:26:06       31 阅读
  5. JVM介绍

    JVM介绍

    2024-02-05 13:26:06      29 阅读
  6. HTTP/2

    2024-02-05 13:26:06       25 阅读
  7. 开源Vue UI框架

    2024-02-05 13:26:06       34 阅读
  8. 力扣292-Nim游戏

    2024-02-05 13:26:06       32 阅读
  9. 前端简历内容模板

    2024-02-05 13:26:06       28 阅读