先看一下arm的各种寻址方式,然后开始讲一下指令的分类和基本的格式,接着看一下指令中必不可少的条件码,最后看一下各类指令的操作码!!!
有些arm指令可能记录的不是很详细,可以查看第七次课的培训文档中的”命令帮助文档”
一.ARM寻址方式
1 立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:
n ADD R0,R0,#1 /*R0←R0+1*/
n ADD R0,R0,#0x3f /*R0←R0+0x3f*/
在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”
2 寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:
ADD R0,R1,R2 /*R0←R1+R2*/
该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
其中:
当第二操作数为寄存器型的移位操作:
在ARM指令的数据处理指令中参与操作的第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二操作数进行移位,即Rm,{
ADD R3,R2,R1,LSR #2 ;R3<—R2 + R1÷4
1. 关于第二操作数移位方式
LSL:逻辑左移,空出的最低有效位用0填充。
LSR:逻辑右移,空出的最高有效位用0填充。
ASL:算术左移,由于左移空出的有效位用0填充,因此 它与LSL同义。
ASR:算术右移,对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0填充,如果是负数用1填充。
ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。
RRX:带扩展循环右移。将寄存器内容循环右移1位,空位用原来C标志位填充。
2. 第二操作数的移位位数
移位位数可以用立即数方式或者寄存器方式给出,如下所示:
ADD R3,R2,R1,LSR #2 ;R3 <—R2 + R1÷22
ADD R3,R2,R1,LSR R4 ;R3 <—R2 + R1÷2R4
寄存器R1的内容分别逻辑右移2位、R4位(亦即R1÷22 R1÷2R4),再与寄存器R2的内容相加,结果放入R3中。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDR R0,[R1] /*R0←[R1]*/
STR R0,[R1] /*[R1]←R0*/
第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。
4 基址加偏址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令又可以分为以下几种形式:
前变址模式:
LDR R0,[R1,#4] ;R0←[R1+4]
自动变址模式:
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
后变址模式:
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
5 堆栈寻址
利用指针访问存储器时,存储器的地址向高地址方向生长,称为递增堆栈(ascending stack)。 存储器的地址向低地址方向生长,称为递减堆栈(descending stack)
四种类型的堆栈工作方式 :
满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
6 块拷贝寻址
块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可以把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。寻址操作中的寄存器可以是R0-R15这16个寄存器的子集或是所有寄存器。
LDM/STM指令依据其后缀名的不同其寻址的方式也有很大不同
7 相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:
BL NEXT ;跳转到子程序 NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
一.指令分类及指令格式
1. ARM指令集可以分为六大类,分别为:
数据处理指令
Load/Store指令
程序状态寄存器与通用寄存器之间的传送指令
跳转指令
异常产生指令。
协处理器指令
2. ARM指令使用的基本格式如下:
ARM指令集是32位的,程序的启动都是从ARM指令集开始。所有的ARM指令集都可以是有条件执行的。ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。每条32位ARM指令都具有不同的二进制编码方式,和不同的指令功能相对应。
〈opcode〉 {〈cond〉}{S} 〈Rd〉,〈Rn〉{,〈operand2〉}
其中:
opcode 操作码;指令助记符,如LDR、STR等。
cond 可选的条件码;执行条件,如EQ、NE等。
S 可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。
Rd 目标寄存器。
Rn 存放第1操作数的寄存器。
operand2 第2个操作数
二.ARM指令根据CPSR中的条件位自动判断是否执行指令,在条件满足时,指令执行, 否则指令被忽略。在ARM的指令编码表中,统一占用编码的最高四位[31:28]来表示“条件码”(即“cond”)
三.ARM指令详细介绍
1. 数据处理指令
2. Load/Store指令
ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。ARM指令集中有三种基本的数据存取指令:
单寄存器的存取指令(LDR,STR)
单寄存器存取指令是ARM在寄存器和存储器间传送单个字节和字的最灵活方式。根据传送数据的类型不同,单个寄存器存取指令又可以分为以下两类:
单字和无符号字节的数据传送指令
半字和有符号字节的数据传送指令
多寄存器存取指令(LDM,STM)
多寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下:
LDM/STM{
单寄存器交换指令(SWP)
3. ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是:
状态寄存器到通用寄存器的传送指令(MRS)
MRS{
通用寄存器到状态寄存器的传送指令(MSR)
MSR{
MSR{
4. 跳转指令
从当前指令向前或向后的32MB的地址空间跳转,根据功能可以分为以下4种 :
B 转移指令 BL 带链接的转移指令
转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。BL指令完全象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器LR(r14)中。汇编格式如下:
B{L}{
BX 带状态切换的转移指令 BLX 带链接和状态切换的转移指令
这些指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。汇编格式如下:
B{L}X{
BLX
5. 异常中断指令
异常中断指令可以分为一下两种:
软件中断指令(SWI)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hizhangke/archive/2009/10/25/4726457.aspx