ARM汇编基础
Cortex-A芯片上电后SP指针还没初始化,C环境还没准备好,不能运行C代码。
必须先用汇编语言设置好C环境,如初始化DDR、设置SP指针等。
GNU汇编语法
我们要编写的是ARM汇编,编译使用的是GCC交叉编译器,所以我们的汇编代码要符合GNU语法。
GNU汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分:
lab:instruction @ comment
比如以下代码:
add:
MOVS R0,#0X12 @设置R0 = 0X12
其中:
"add:" 就是标号
“MOVS R0,#0X12” 就是指令
“@设置R0 = 0X12” 就是注释
用户可以通过.section伪操作来定义一个段,汇编系统预定义了一些段名:
-
.text 表示代码段
-
.data 初始化的数据段
-
.bss 未初始化的数据段
-
.rodata 只读数据段
可以自己使用.section来定义一个段,每个段以段名开始,以下一段名或者文件结尾,如:.section .testsection @定义一个testsection段
汇编程序默认入口标号是 _start(也可以在连接脚本中使用ENTRY来指明其它的入口点)
.global _start
_start:
ldr r0 ,= 0x12 @r0 = 0X12
.global是伪操作,表示_start是一个全局标号
GNU汇编支持函数,格式如下:
函数名:
函数体
返回语句
CNU汇编函数返回语句不是必须的,如下代码就是用汇编写的Cortex-A7中断服务函数: