ARM系列文章,请点击以下汇总链接:
《从0学arm合集》
一、MDK和GNU伪指令区别
我们在学习汇编代码的时候经过会看到以下两种风格的代码:
gnu代码开头是:
代码语言:javascript复制.global _start
_start: @汇编入口
ldr sp,=0x41000000
.end @汇编程序结束
MDK代码开头是:
代码语言:javascript复制 AREA Example,CODE,READONLY ;声明代码段Example
ENTRY ;程序入口
Start
MOV R0,#0
OVER
END
这两种风格的代码是要使用不同的编译器,我们之前的实例代码都是MDK风格的。
那么多对于我们初学者来说要学习哪种风格呢?答案是肯定的,学习GNU风格的汇编代码,因为做Linux驱动开发必须掌握的linux内核、uboot,而这两个软件就是GNU风格的。
为了大家不要把过多精力浪费在暂时没用的知识上,下面我们只讲GNU风格汇编。
二、GNU汇编书写格式:
1. 代码行中的注释符号:
‘@’ 整行注释符号: ‘#’ 语句分离符号: 直接操作数前缀: ‘#’ 或 ‘$’
2. 全局标号:
标号只能由a~z,A~Z,0~9,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号的后面加“:”。
代码语言:javascript复制段内标号的地址值在汇编时确定;
段外标号的地址值在连接时确定。
3. 局部标号:
局部标号主要在局部范围内使用而且局部标号可以重复出现。它由两部组成开头是一个0-99直接的数字局部标号 后面加“:”
代码语言:javascript复制F:指示编译器只向前搜索,代码行数增加的方向 / 代码的下一句
B:指示编译器只向后搜索,代码行数减小的方向
注意局部标号的跳转,就近原则「举例:」
代码语言:javascript复制文件位置
arch/arm/kernel/entry-armv.S
三、伪操作:
1. 符号定义伪指令
标号 | 含义 |
---|---|
.global | 使得符号对连接器可见,变为对整个工程可用的全局变量 |
_start | 汇编程序的缺省入口是_ start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. |
.local | 表示符号对外部不可见,只对本文件可见 |
2. 数据定义(Data Definition)伪操作
数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种:
标号 | 含义 |
---|---|
.byte | 单字节定义 0x12,‘a’,23 【必须偶数个】 |
.short | 定义2字节数据 0x1234,65535 |
.long /.word | 定义4字节数据 0x12345678 |
.quad | 定义8字节 .quad 0x1234567812345678 |
.float | 定义浮点数 .float 0f3.2 |
.string/.asciz/.ascii | 定义字符串 .ascii “abcd ”, 注意:.ascii 伪操作定义的字符串需要每行添加结尾字符 ' |