【北京迅为】i.MX6ULL终结者GNU汇编语法

GNU汇编语法适用于所有的架构,并不是ARM独享的,GNU汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:
label:instruction @ comment

label即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意label后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。

instruction即指令,也就是汇编指令或伪指令。
@符号,表示后面的是注释,就跟C语言里面的“/”和“/”一样,其实在GNU汇编文件中我们也可以使用“/”和“/”来注释。

comment就是注释内容。

比如下面的代码:

sum:                                                                                      
	MOVS R0, #0X5a  @设置 R0=0X5a                                                         

上面代码中“sum”就是标号,“MOVS R0, #0X5a”就是指令,后面的“@设置 R0=0X5a”就是注释。(注意:ARM汇编中的指令、伪指令、伪操作、寄存器等,都可以全部使用大写,也可以全部使用小写,但是不能大小写混用)

我们也可以使用.section伪操作来定义一个段名,汇编系统中预定义了一些段名,如下:
.text //代码段
.bss //未初始化的数据段
.data //初始化的数据段
.rodata //只读数据段
我们自己也可以使用.section定义一个段,如下:
.section .test_section @定义一个 test_setcion 段

我们知道在C语言中,程序的入口是main函数,在汇编中程序的入口标号是“_start”,下面的代码就是使用_start作为入口标号:

	.global _start                                                                        
	                                                                                   
	_start:                                                                              
		ldr r0, =0x5a  @r0=0x5a                                                           

上面代码中.global是伪操作,表示_start是一个全局标号,类似C语言里面的全局变量,常见的伪操作有:
.byte //定义单字节数据,比如.byte 0x5a
.short //定义双字节数据,比如.short 0x5a5a
.long //定义4字节数据,比如.long 0x5a5a5a5a
.equ //赋值语句,格式为: .equ变量名,表达式,比如.equ num, 0x5a,表 示num=0x5a
.align //数据字节对齐,比如:.align 4表示4字节对齐
.end //表示源文件结束
.global //定义一个全局符号,格式为:.global symbol,比如:.global _start
上面这些是最常见的伪操作,GNU汇编还有其他的伪操作,如果想更详细的了解伪操作可以参考《ARM Cortex-A(armV7)编程手册V4.0》(光盘目录:i.MX6UL终结者光盘资料\10_其它参考资料)

GNU汇编也支持函数,格式如下:

.type fun_name, @function                                                                 
fun_name:                                                                                 
	#content                                                                              
ret                                                                                       

.type指令指定fun_name为其它汇编程序调用此函数时的地址
fun_name也为函数名
@function表示函数内容开始
ret指令表示函数结束,返回到父函数调用子函数处

定义函数的例子如下:

.type add_fun, @function                                                                   
add_fun:                                                                                   
	add %ebx, %ebx                                                                         
	movl %ebx, %eax                                                                        
ret    
`` `     

      

猜你喜欢

转载自blog.csdn.net/BeiJingXunWei/article/details/108474072