Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308110
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: LINUX

2011-02-20 19:57:02

						GNU汇编
						
注:所有关键字都以‘.’开头
		
一、基本	
	.arch	ISA										告诉汇编器当前汇编文件的指令集架构
	{.section}	.section_name{,"flags"}		声明一个段的开始,以下一个段的开始或文件尾结束
														section_name:
																			.text			代码段
																			.data			数据段
																			.rodata		只读数据段
																			.bss			未初始化数据段,bss段可以不声明 
																			.mysection	自定义段
														flags:
																			a				可分配段
																			w				可写段
																			x				可执行段
	
	.code		number_of_bits						按number_of_bits设置ARM(32)或Thumb(16)指令
	.global	symbol								符号导出,C默认是导出,不导出要加static,汇编默认是不导出												
	.align	power_of_2{,fill_value{,max_padding}}
														对齐到power_of_2字节,用fill_value或 0(默认值)来填充对齐
														如需要填充的字节数大于max_padding,则对齐不会发生
	
	alias_name .req register					为register取一个别名,如: aa .req r0,  bb .req aa			
	.include	"filename"							等于 C的#include "filename"
	.err												以一个错误导致汇编结束(是编译文件时结束而不时运行时)
	.end												表示一个汇编文件的结束,剩下的部分可以加注释,一般省略
	#			expr注释									只能放在行的开头,注释至行尾
	@			注释									可放在行的任意位置,注释至行尾
	label_name:										label_name表示当前的地址

						
二、数据类型
	.ascii	"string"								定义字符串变量,不会在string后面自动加 ‘\0’
	.asciz	"string"								定义字符串变量,会自动加‘\0’
	.byte		byte1{,byte2}...					定义char型变量(1字节),如有多个数据则是定义char数组
	.hword	hword1{,hword2}...				定义short型变量(2字节),如有多个数据则是定义short数组
	.word		word1{,word2}...					定义int型变量(4字节),如有多个数据则是定义int数组
	.space	number_of_byte{,fill_byte}		定义number_of_byte大小的空间,以fill_byte填充,fill_byte默认是 0
		
	注:以上定义的数据类型都是当前段的全局变量 ,还有其它类似的数据类型,如:.string == .asciz, .int == .word,...
	
	.comm		name,number_of_byte{,element_size}		
														在bss段定义number_of_byte大小的空间,name是该空间的起始地址
														element_size只是说明每个元素的大小,可以不要
	
三、条件分支
	.if											定义一个条件代码块,以.endif结束
	.ifdef	symbol								"""
	.ifndef	symbol								"""
	.elseif	expr									使用在.if和.endif之间
	.else												使用在.if和.endif之间
	.endif											条件代码块的结束
	
	
四、循环
	.irp	param {,val1}{,val2}{,val3}...	开启一个循环的代码块,有多少个val就循环多少次,代码块中用\param来代替val
														和shell的for i in类似						
	.rept	number_of_times						开启一个循环的代码块,循环number_of_times次										
	.endr												结束.irp和.rept的循环
						.irp i r1,r2,r3
							mov	r0,\i
						.endr
						
						.rept 10
							mov	r0,r1
						.endr
	
五、宏
	.equ		symbol_name,value					等于C的#define symbol_name value
	.set		variable_name,value				等于.equ
	.macro	name {arg1}{,arg2}{,arg3}...	宏函数
	.exitm											退出宏函数
	.endm												宏函数结束
						.macro  NAME a,b
							.if	\a > \b
								mov	r0,#\a
							.elseif \b > 0	
								mov	r0,#\b
							.else
								exitm
							.endif
						.endm
	
	
阅读(599) | 评论(0) | 转发(0) |
0

上一篇:ARMv4T_指令集详解2

下一篇:GNU内嵌汇编

给主人留下些什么吧!~~