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

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

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: LINUX

2011-02-20 19:56:01

								ARMv4T指令集详解(共 38 条指令)
								
目录
一、数据传送指令
二、算术指令
三、移位
四、逻辑指令
五、比较指令
六、数据处理指令位图
七、常量的装载
八、乘法指令
九、乘法指令位图
十、分支指令
十一、单寄存器load-store指令
十二、内存寻址方式
十三、多寄存器load-store指令
十四、交换指令
十五、swi(software interrupt)软件中断指令
十六、程序状态寄存器指令
十七、协处理器指令


一、数据传送指令
	1、	mov指令	
		格式: mov{}{s} Rd,op
		
	2、	mvn指令
		格式: mvn{}{s} Rd,op
		
	3、代码: if(cond == 1)
				{
					Rd = op;				//mov
//					Rd = ~op;				//mvn
				}

二、算术指令
	1、	add加法指令
		格式: add{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = Rn + op;
				}
				
	2、	adc带进位加法指令
		格式: adc{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = Rn + op + C;
				}

	3、	sub减法指令
		格式: sub{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = Rn - op;
				}

	4、	sbc带借位减法指令
		格式: sbc{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = Rn - op - (~C);
				}

	5、	rsb逆向减法指令
		格式: rsb{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = op - Rn;
				}
				
	6、	rsc带借位的逆向减法指令
		格式: rsc{}{s} Rd,Rn,op
		代码: if(cond == 1)
				{
					Rd = op - Rn - (~C);
				}
				
三、移位
	1、	op
	立即数:		#number			//#label
	寄存器:		Rm
	寄存器移位:	Rm,<移位符> #number 或  Rm,<移位符> Rs
	举例:		mov r0,#100				//r0 = 100
			mov r0,r1				//r0 = r1
				mov r0,r1,lsr #1     //r0 = r1 >> 1
			     	mov r0,r1,lsr r2	   //r0 = r1 >> r2
			   add r0,r1,r2,lsr #1  //r0 = r1 + r2 >> 1
		     
	2、移位符
		lsl	逻辑左移		(unsigned)x << y
		说明:   无符号左移补0

		lsr	逻辑右移		(unsigned)x >> y
		说明:   无符号右移补0
	
		asl	算术左移		(signed)x << y
		说明:   有符号左移补0
		注意:   逻辑左移和算术左移结果一样

		asr	算术右移		(signed)x >> y
		说明:   有符号右移正数补0,负数补1

		ror	循环右移		((unsigned)x >> y) | (x << (32 - y))
		说明:	x逻辑右移y | x逻辑左移 (32  - y)

		rrx	扩展循环右移	(C << 31)  |  ((unsigned)x >> 1)
		说明:  相当于33位循环右移
		注意:  没有y,只移一位
		
四、逻辑指令
	1、	and逻辑与指令
		格式: and{}{s} Rd,Rn,op
		
	2、	orr逻辑或指令
		格式: orr{}{s} Rd,Rn,op		
		
	3、	eor逻辑异或指令
		格式: eor{}{s} Rd,Rn,op
		
	4、	bic位清除指令
		格式: bic{}{s} Rd,Rn,op
		
	5、代码: if(cond == 1)
				{
					Rd = Rn & op;				//and
//					Rd = Rn | op;				//orr
//					Rd = Rn ^ op;				//eor
//					Rd = Rn & (~op);			//bic
				}

五、比较指令
	1、	cmp比较指令
		格式: cmp{} Rn,op
		代码: if(cond == 1)
				{
					N = Rn - op < 0;
					Z = Rn - op == 0;
					C = Rn >= op;
					V = Rn > op && Rd < 0;
				}

	2、	cmn反比较指令
		格式: cmn{} Rn,op
		代码: if(cond == 1)
				{
					N = Rn + op < 0;
					Z = Rn + op == 0;
					C = (Rn + op) > (unsigned)0xffffffff;
					V = Rn > 0 && op > 0 && Rd < 0;			
				}

	3、	tst位测试指令
		格式: tst{} Rn,op
		代码: if(cond == 1)
				{
					N = Rn & op < 0;
					Z = Rn & op == 0;
				}

	4、	teq相等测试指令
		格式: teq{} Rn,op
		代码: if(cond == 1)
				{
					N = Rn ^ op < 0;
					Z = Rn ^ op == 0;
				}
	
六、数据处理指令位图
	1、	op为寄存器
		xxxx 000a aaas nnnn dddd cccc cttt mmmm
	
	2、	op为立即数 
		xxxx 001a aaas nnnn dddd rrrr bbbb bbbb
				
	3、	条件xxxx
		编码            cond     									条件
		0000    EQ (等于,Equal)              			Z
		0001    NE (不等于,Not Equal)	      				~Z
		0010    CS (进位设置,Carry Set)	     			C
		0011    CC (进位清除,Carry Clear)     			~C
		0100    MI (负号,MInus)        	      			N
		0101    PL (正号,PLus)         	      			~N
		0110 	  VS (溢出设置,oVerflow Set)    			V
		0111    VC (溢出清除,oVerflow Clear)  			~V
		1000    HI (高于,HIgher)       	      			C && ~Z
		1001    LS (低于或同于,Lower or Same) 			~C || Z
		1010    GE (大于等于,Greater or equal)			N == V
		1011    LT (小于,Less Than)    	      			N == ~V
		1100    GT (大于,Greater Than) 	      			(N ==  V) && ~Z
		1101    LE (小于等于,Less or equal)   			(N == ~V) || Z
		1110    AL (总是,Always)							所有版本
		1111	  NV (从不cond,never)						ARMv3之前版本,之后为非法条件,该编码位置已作为其他用途
					
		只有条件为真时才会cond指令,否则忽略该指令,继续下一条
			
	4、	数据处理指令aaaa
		指令:   	mov mvn   add adc sub sbc rsb rsc   and orr eor bic   cmp cmn tst teq
		编码:  	1101    1111         0100   0101    0010   0110   0011   0111        0000    1100   0001   1110         1010    1011   1000    1001
	
	5、	条件标志s
		指令含s则该位为 1 ,否则为 0

	6、	寄存器Rd,Rn,Rm分别对应dddd,nnnn,mmmm
		R0 ---> R15
		0000 ---> 1111
		没有寄存器的则对应位置为 0,如:mov没有Rn寄存器nnnn位为 0000 ,cmp没有Rd寄存器dddd位为 0000
		
	7、	移位数ccccc
		立即数方式:	最大为 0x1f
		寄存器方式:	第 1  - 4 个c为寄存器编号,第 5 个c为 0
	
	8、	移位符ttt
		移位符         :      lsl  lsr  asr  ror
		立即数编码:      000        010        100        110
		寄存器编码:      001        011        101        111
		
		asl 与 lsl 的编码相同
		ttt == 110 && ccccc == 00000 表示 rrx
		
	9、	立即数构造	
		立即数 = bbbb bbbb 循环右移   rrrr * 2 次

		这种方式并不能把所有的32位数都构造出来
		如: #12345,#0xffff
		
七、常量的装载
	1、	ldr伪指令
	格式:	ldr Rd,=		//ldr只有带'='号时才是伪指令
	说明:	将number或label的值赋给Rd,该指令会伪造成mov、mvn、ldr等可能的指令
	举例:	ldr r0,=0x100		//mov r0,#0x100
			ldr r0,=0x0			//mvn r0,#0x0
			ldr r0,=0x12345	//ldr r0,[pc,#offset]		//offset是该指令到.word的偏移量减去 8 (为什么要减去 8 请见第十二节 第7部分)
									//	...								//这里可能是其他指令或没指令
									//.word 0x12345
	2、	adr / adrl伪指令
	格式:	adr Rd,=label
	说明:	此指令不能用立即数,其他基本和ldr一样,小范围时用adr,大范围用时adrl
	
阅读(1546) | 评论(0) | 转发(0) |
0

上一篇:ARMv4T_指令集

下一篇:ARMv4T_指令集详解2

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