一、汇编一般使用的场合:
(1)、汇编语言在ARM中一般用在启动代码中,比如Bootloader 初始化时对 CPU 和 协处理器 等进行初始化, 此时没有建立起 C 语言运行环境, 这个时候使用汇编语言执行初始化操作;
(2)、汇编效率比较高, 在Linux 内核中对效率有特殊要求的地方也会使用汇编语言来编写.
二、ARM汇编的分类:汇编语言可以分为ARM标准汇编语言和GNU汇编语言两种;
他们使用的地方是不同的,一般来说ARM标准汇编语言适用于ARM公司的汇编器, 适合在 Windows 平台使用, 如ADS
而GNU汇编语言适用于 Linux 平台交叉编译工具链的汇编器。
补充:
ARM标准汇编语言和GNU汇编语言的区别: ARM汇编代码是大写,后者是小写;前者的伪指令前不加点,后者要加点。
GNU ARM汇编特殊字符和语法
代码行中的注释符号: ‘@’
整行注释符号: ‘#’
语句分离符号: ‘;’
直接操作数前缀: ‘#’ 或 ‘$’
整行注释符号: ‘#’
语句分离符号: ‘;’
直接操作数前缀: ‘#’ 或 ‘$’
.arm 以arm格式编译,同code32
.thumb 以thumb格式编译,同code16
.code16 以thumb格式编译
.code32 以arm格式编译
.thumb 以thumb格式编译,同code16
.code16 以thumb格式编译
.code32 以arm格式编译
三、ARM汇编语言有个固定的模板:
.section .data
< 初始化的数据>
.section .bss
< 未初始化的数据>
.section .text
.global _start
_start:......
程序入口 : "_start:" 是汇编程序的入口, 相当于 main();
标注入口 : 使用 ".global _start" 标注程序入口, 外部才可以识别这是程序入口;
标明代码段 : ".section .text" 标明这是一个代码段;
标明 bss 段 : 使用 ".section .bss" 标明bss段, 如果没有 bss 段 和 数据段, 直接从 .text 开始;
下面我们来搭建汇编开发调试环境
程序代码 :
定义代码段 : .text ;
定义程序入口 : .globl _start;
代码示例 :
.text
.globl _start
_start:
mov r1,#1
mov r2,#2
mov r3,#3
1. ARM 机器码
(1) 机器码反汇编示例
汇编程序执行流程 : 汇编代码 > 汇编器 > 机器码 > CPU 运行;
反汇编示例 : 找到一个 elf 文件, 使用 arm-linux-objdump 反汇编;
命令 : 使用arm-linux-objdump -D -S test.elf > dist命令进行反汇编, 其中 "50008000:e3a01001 movr1, #1; 0x1" 中的 "e3a01001" 就是机器码, 如下图标注部分;

.ascii “<string>” 在汇编中定义字符串并为之分配存储空间(与armasm中的DCB功能类似)。
.asciz “<string>” 和.ascii类似, 但不分配存储空间。
.asciz “<string>” 和.ascii类似, 但不分配存储空间。
GNU ARM汇编特殊字符和语法
代码行中的注释符号: ‘@’
整行注释符号: ‘#’
语句分离符号: ‘;’
直接操作数前缀: ‘#’ 或 ‘$’
整行注释符号: ‘#’
语句分离符号: ‘;’
直接操作数前缀: ‘#’ 或 ‘$’
.arm 以arm格式编译,同code32
.thumb 以thumb格式编译,同code16
.code16 以thumb格式编译
.code32 以arm格式编译
.thumb 以thumb格式编译,同code16
.code16 以thumb格式编译
.code32 以arm格式编译