ARM 常用汇编语法
如果使用过 STM32 的话就会知道 MDK 和 IAR 下的启动文件 startup_stm32f10x_hd.s其中的汇编语法是有所不同的,将 MDK 下的汇编文件直接复制到 IAR 下去编译就会出错,因为 MDK 和 IAR 的编译器不同,因此对于汇编的语法就有一些小区别。而我们要编写的是 ARM 汇编,编译使用的 GCC 交叉编译器,所以我们的汇编代码要符合 GNU 语法。
GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成,
汇编 每行一条语句,每条语句有三个可选部分,如下
label:instruction @ comment
如:
add:
MOVS R0,
label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。 instruction 即指令,也就是汇编指令或伪指令。 comment 就是注释内容,@符号,是注释。
注意!ARM 中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用
汇编程序的默认入口标号是_start,不过也可以在链接脚本中使用 ENTRY 来指明其它的入口点,下面的代码就是使用_start 作为入口标号:
global _start
_start:
ldr r0, =0x12 @r0=0x12
上面代码中.global 是伪操作,表示_start 是一个全局标号,类似 C 语言里面的全局变量一样,常见的伪操作有: .byte 定义单字节数据,比如.byte 0x12。 .short 定义双字节数据,比如.short 0x1234。 .long 定义一个 4 字节数据,比如.long 0x12345678。 .equ 赋值语句,格式为:.equ 变量名,表达式,比如.equ num, 0x12,表示 num=0x12。 .align 数据字节对齐,比如:.align 4 表示 4 字节对齐。 .end 表示源文件结束。 .global 定义一个全局符号,格式为:.global symbol,比如:.global _start。
GNU 汇编同样也支持函数,函数格式如下:
函数名:
函数体
返回语句
/* 未定义中断 */
Undefined_Handler:
ldr r0, =Undefined_Handler
bx r0
若需了解汇编基本指令,请点击汇编基本指令
|