4.1.3 基于Linux下GCC的汇编语言程序结构
Linux下GCC的汇编程序语言程序是以程序段为单位进行组织的。Linux下GCC的汇编语言规则总结如下。
所有的指令均不能顶格写。
大小写区分(要么全部大写,要么全部小写,不可以大小写混用)。
代码标号必须在一行的顶格,后面要加上冒号":"。
注释的内容可以使用符号"@",其后面的内容编译器会放弃编译。注释可以在一行的顶格。
下面以一个简单的汇编程序example1.s为例,对上述规则做具体介绍。
- .EXAMPLE1 @表示是只读代码段
- _START: .GOLBAL START @START作为链接器使用
- .GOLBAL MAIN @MAIN函数
- B MAIN @跳转至MAIN函数
- MAIN:
- MOV R0,#0 @R0=0
- LDR R1,#1 @R1=1
- ADDOP:
- ADD R2,R1,R0 @R2=R1+R0
- MOV PC,LR @程序结
束,交出对CPU的控制权 - .END
对程序的说明如下。
程序中出现的PC是程序计数器,它是寄存器R15的别名。LR是链接寄存器,它是寄存器R14的别名。当使用B指令调用MAIN函数过程时,MAIN函数的返回地址PC将存放到LR中,所以程序最后"MOV PC,LR"即将LR的值放入PC,执行的就是函数返回操作。
另外有关编译需要说明的是:
在Linux下,需要使用arm-linux-gcc对程序进行交叉汇编和链接,在终端中输入命令:arm-linux-gcc example1.s -o example1。
注意:不能用GCC编译,因为GCC是支持x86系列的处理器,而我们这里则是基于ARM的处理器。
在Linux下,也可以通过GCC、arm-linux-gcc编译器来生成.s的汇编程序文件,终端命令格式为:gcc -S filename.c,生成的文件名为filename.s。参数-S表示只进行预处理、编译,而不进行汇编。