码迷,mamicode.com
首页 > 其他好文 > 详细

arm指令系统

时间:2016-04-11 22:34:32      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:

arm常用指令主要包括以下六类:

1、数据处理指令:完成寄存器中数据的算术和逻辑运算操作

2、程序状态寄存器处理指令:MRS MSR

3、跳转指令:B和BL

4、load/store指令:用于寄存器和存储器之间数据传送的指令

5、异常中断指令:SWI和BKPT

6、协处理器指令:MRC MCR

=-------------------------------------------------------------------

二、汇编指令的格式

技术分享

arm指令编码格式:

技术分享

 

技术分享

如:ADDEQS R0,R1,R2  :加上S,cpsr寄存器中的标志位能被置位

--------------------------------------------------------------------------

寻址方式:共有9种

立即数寻址

SUBS R0,R0,#1  @R0=R0-1

ADD R0,#1,R0:这种方式是错误的,立即数只能作为第二操作数

立即数的合法性判断:合法性即:如果某个数据是非法的,是不能作为立即数的

技术分享

此外还有一个简单的规则:

1、立即数处于0x0---0xff之间

2、如果立即数大于0xff,立即数循环左移偶数位,得到一个在0x0--0xff之间的一个数

满足以上两个条件即合法:

非法数举例:0x101 0xffffff

非法数可通过这样来操作举例:LDR R1,=0xfffff

,寄存器寻址

MOV R1,R2

,寄存器间接寻址

LDR R1,[R2] ;将R2指向的存储单元的数据读出保存在R1中

STR R1,[R2];将R1中的数据读出来保存在R2指向的存储单元中

SWP R1,R1,[R2];  可分解为:[R2]<--R1 ,R1<--[R2]

,寄存器偏移寻址

MOV R0,R2,LSL #3

,基址变址寻址

LDR R1,[R3,#0X0C] ;读取R3+0xc地址上的存储单元的内容放到R1中

LDR R1,[R0],#4;可分解为 R1<--[R0];R0=R0+4

LDR R1,[R0,#-4]!;可分解为 R1<--[R0-4], R0=R0-4  R0中数据会自动更新

,多寄存器寻址

LDMIA R1!,{ R2-R7,R12};将R1指向的单元中的数据读出到R2-R7,R12中,R1自动+1

STMIA R0!,{ R2-R7,R12};

,堆栈寻址

几个重要概念:

技术分享

技术分享

嵌入式:使用的是满栈减栈 m:多个寄存器操作,F:FULL d:decrease

STMFD sp!,{r4-r7,lr};将R4-R7,LR寄存器的值压栈,同时sp的值自动更新,先入编号大的寄存器

LAMFD sp!,{r4-r7,lr};将栈中的内容放到r4-r7,lr中,SP自动更新,先出的数据给小的寄存器;

技术分享

,块拷贝寻址

技术分享

,相对寻址;

BL SUBR1;调用SUBR1子程序

。。。

SUBR1 ..

MOV PC,R14

---------------------------------------------------------------------------

指令按功能分类:

跳转指令:B,BX,BL,BLX只能跳转+/-32Mb

超过这个范围可通过LDR PC,=LABEL来跳转;

--------------------------------------------

寄存器与存储器交换指令(状态寄存器独有的)

MRS R0,CPSR

BIC R0,R0,#(1<<7)

MSR CPSR,R0

这样一来只修改了第七位

---------------------------------

逻辑运算指令:AND ,ORR,EOR,BIC 

BIC R1,R2,R3 ;将R3的反码和R2逻辑与,结果存放到R1中;

----------------------------------------------

协处理器指令:

arm微处理器可支持多达16个协处理器,每个协处理器里有多个寄存器;

MRC P15,0,Rd,C0,C0,0;读取协处理器C0中编号为0的寄存器到Rd中。

MCR ...

*MCR CPSR_c,r0

技术分享

--------------------------------------------------------------

arm汇编伪指令(并不是真正的arm指令,在编译的时候,编译器会讲伪指令变成真的arm指令)

start

ADRL

LDR R1,=0X33(伪指令)

LDR R1,[R2](ARM指令)

 

arm指令系统

标签:

原文地址:http://www.cnblogs.com/defen/p/5380149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!