1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第三章,ARM,指令集,3.1 ARM,指令集概述,3.2 ARM,寻址方式,3.3 ARM,指令详细介绍,3.1 ARM,指令集概述,ARM,指令集是,32,位的,程序的启动都是从,ARM,指令集开始。所有的,ARM,指令集都可以是有条件执行的。本节从以下三个方面介绍:,3.1.1,指令集编码,3.1.2,条件执行,3.1.3,指令分类及指令格式,3.1.1ARM,指令集,编码,ARM,指令集是以,32,位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每
2、条指令所对应的不同功能实现的二进制位。,每条,32,位,ARM,指令都具有不同的二进制编码方式,和不同的指令功能相对应,。,3.1.2,条件执行,ARM,指令根据,CPSR,中的条件位自动判断是否执行指令,在条件满足时,指令执行,否则指令被忽略。,在,ARM,的指令编码表中,统一占用编码的最高四位,31,:,28,来表示“条件码”(即“,cond,”,)。,条件域表,1,条件码,后缀,标,志,含,义,0000,EQ,Z,置位,相等,0001,NE,Z,清零,不相等,0010,CS,C,置位,无符号数大于或等于,0011,CC,C,清零,无符号数小于,0100,MI,N,置位,负数,0101,P
3、L,N,清零,正数或零,0110,VS,V,置位,溢出,0111,VC,V,清零,未溢出,条件域表,2,条件码,后缀,标,志,含,义,1001,LS,C,清零,Z,置位,无符号数小于或等于,1010,GE,N,等于,V,带符号数大于或等于,1011,LT,N,不等于,V,带符号数小于,1100,GT,Z,清零且(,N,等于,V,),带符号数大于,1101,LE,Z,置位或(,N,不等于,V,),带符号数小于或等于,1110,AL,忽略,无条件执行,3.1.3,指令分类及指令格式,ARM,指令集可以分为六大类,分别为数据处理指令、,Load/Store,指令、跳转指令、程序状态寄存器处理指令、协
4、处理器指令和异常产生指令。,ARM,指令使用的基本格式如下:,opcode,cond,S,Rd,,,Rn,,,operand2,指令格式中符号说明,opcode,操作码;指令助记符,如,LDR,、,STR,等。,cond,可选的条件码;执行条件,如,EQ,、,NE,等。,S,可选后缀;若指定“,S”,,,则根据指令执行结果更新,CPSR,中的条件码。,Rd,目标寄存器。,Rn,存放第,1,操作数的寄存器。,operand2,第,2,个操作数,3.2 ARM,寻址方式,3.2.1,立即寻址,3.2.2,寄存器寻址,3.2.3,寄存器间接寻址,3.2.4,基址加偏址寻址,3.2.5,堆栈寻址,3.
5、2.6,块拷贝寻址,3.2.7,相对寻址,3.2.1,立即寻址,立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:,ADDR0,,,R0,,,1,/*,R0R0,1*/,ADDR0,,,R0,,,0 x3f,/*,R0R0,0 x3f*/,在以上两条指令中,第二个源操作数即为立即数,要求以,“,”,为前缀,对于以十六进制表示的立即数,还要求在,“,”,后加上,“,0 x,”,。,3.2.2,寄存器寻址,寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器
6、经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:,ADD R0,,,R1,,,R2/*R0R1,R2*/,该指令的执行效果是将寄存器,R1,和,R2,的内容相加,其结果存放在寄存器,R0,中,。,寄存器寻址,第二操作数为寄存器型的移位操作,在,ARM,指令的数据处理指令中参与操作的第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二操作数进行移位,即,Rm,,,,,其中,Rm,称为第二操作数寄存器,,用来指定移位类型(,LSL,,,LSR,,,ASL,,,ASR,,,ROR,或,RRX,),和移位位数。移位位数可以是,5,位立即数(,#,),或寄存器(,Rs,)。,
7、在指令执行时将移位后的内容作为第二操作数参与运算。例如指令:,ADD R3,,,R2,,,R1,,,LSR#2,;,R3,R2+R1,4,寄存器寻址,第二操作数移位方式,LSL,:,逻辑左移,空出的最低有效位用,0,填充。,LSR,:,逻辑右移,空出的最高有效位用,0,填充。,ASL,:,算术左移,由于左移空出的有效位用,0,填充,因此 它与,LSL,同义。,ASR,:,算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用,0,填充,如果是负数用,1,填充。,ROR,:,循环右移,移出的字的最低有效位依次填入空出的最高有效位。,RRX,
8、带扩展的循环右移。将寄存器的内容循环右移,1,位,空位用原来,C,标志位填充。,寄存器寻址,寄存器寻址,第二操作数的移位位数,移位位数可以用立即数方式或者寄存器方式给出,如下所示:,ADD R3,,,R2,,,R1,,,LSR#2,;,R3,R2+R1,4,ADD R3,,,R2,,,R1,,,LSR R4,;,R3,R2+R1,2,R4,寄存器,R1,的内容分别逻辑右移,2,位、,R4,位(亦即,R1,4,、,R1,2,R4,),,再与寄存器,R2,的内容相加,结果放入,R3,中。,3.2.3,寄存器间接寻址,寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
9、例如以下指令:,LDRR0,,,R1/*R0R1*/,STRR0,,,R1/*R1R0*/,第一条指令将以,R1,的值为地址的存储器中的数据传送到,R0,中。第二条指令将,R0,的值传送到以,R1,的值为地址的存储器中。,3.2.4,基址加偏址寻址,基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令又可以分为以下几种形式:,前变址模式,:,LDR R0,,,R1,,,4,;,R0,R1,4,自动变址模式,:,LDR R0,,,R1,,,4,!;,R0R1,4
10、R1R1,4,后变址模式,:,LDR R0,,,R1,,,4,;,R0R1,、,R1R1,4,基址加偏址寻址,基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作,如下所示:,LDR,r,0,,,r1,,,r2,;,r0,mem,32,r1+r2,LDR r0,,,r1,,,r2,,,LSL#2,;,r0,r1+r2*4,但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用。,3.2.5,堆栈寻址,堆栈是一种数据结构,按先进后出(,First In Last Out,,,FILO,)的方式工作,使用一个称作堆栈指针的专用寄存器指示
11、当前的操作位置,堆栈指针总是指向栈顶。,当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(,Full Stack,),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(,Empty Stack,)。,即访问存储器时,存储器的地址向高地址方向生长,称为递增堆栈(,ascending stack,)。,存储器的地址向低地址方向生长,称为递减堆栈(,descending stack,)。,堆栈寻址,四种类型的堆栈工作方式,:,满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。,满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。,空递增堆栈:堆栈指针指向下一个将要放入
12、数据的空位置,且由低地址向高地址生成。,空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。,3.2.6,块拷贝寻址,块拷贝寻址是多寄存器传送指令,LDM/STM,的寻址方式。,LDM/STM,指令可以把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。寻址操作中的寄存器可以是,R0-R15,这,16,个寄存器的子集或是所有寄存器。,LDM/STM,指令依据其后缀名的不同其寻址的方式也有很大不同,见下表。,3.2.7,相对寻址,与基址变址寻址方式相类似,相对寻址以程序计数器,PC,的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之
13、后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令,BL,采用了相对寻址方式:,BLNEXT,;跳转到子程序,;,NEXT,处执行,NEXT,MOVPC,,,LR,;从子程序返回,3.3 ARM,指令详细介绍,3.3.1,数据处理指令,3.3.2 Load/Store,指令,3.3.3,程序状态寄存器与通用寄存器之间 的传送指令,3.3.4,转移指令,3.3.5,异常中断指令,3.3.6,协处理器指令,3.3.1,数据处理指令,ARM,的数据处理指令主要完成寄存器中数据的算术和逻辑运算操作。本节按以下内容组织:,数据处理指令,分类,数据处理指令表,数据处理指令分类,数据处理指令
14、根据指令实现处理功能可分为以下六类:,数据传送指令;,算术运算指令,;,逻辑运算指令;,比较指令;,测试指令;,乘法指令。,数据处理指令的详细列表如下:,操作码,24,:,21,助记符,意义,效果,0000,AND,逻辑位与,Rd=,Rn,AND Op2,0001,EOR,逻辑位异或,Rd=,Rn,EOR Op2,0010,SUB,减,Rd=,Rn,-Op2,0011,RSB,反向减,Rd=Op2,Rn,0100,ADD,加,Rd=,Rn,+Op2,0101,ADC,带进位加,Rd=,Rn,+Op2+C,0110,SBC,带进位减,Rd=,Rn,-Op2+C-1,0111,RSC,反向带进位减
15、Rd=Op2-,Rn,+C-1,1000,TST,测试,根据,Rn,AND Op2,设置条件码,1001,TEQ,测试相等,根据,Rn,EOR Op2,设置条件,1010,CMP,比较,根据,Rn,-Op2,设置条件码,1011,CMN,负数比较,根据,Rn,+Op2,设置条件码,1100,ORR,逻辑位或,Rd=,Rn,OR Op2,1101,MOV,传送,Rd=Op2,1110,BIC,位清零,Rd=,Rn,AND NOT Op2,1111,MVN,求反,Rd=NOT Op2,3.3.2 Load/Store,指令,ARM,的数据存取指令,Load/Store,是唯一用于寄存器和存储器之
16、间进行数据传送的指令。,ARM,指令集中有三种基本的数据存取指令:,单寄存器的存取指令(,LDR,,,STR,),多寄存器存取指令(,LDM,,,STM,),单寄存器交换指令(,SWP,),单寄存器的存取指令,单寄存器存取指令是,ARM,在寄存器和存储器间传送单个字节和字的最灵活方式。根据传送数据的类型不同,单个寄存器存取指令又可以分为以下两类:,单字和无符号字节的数据传送指令,半字和有符号字节的数据传送指令,单字和无符号字节的数据传送指令,这,一类数据传送指令的汇编格式如下:,前变址格式,LDR|STR B Rd,,,Rn,,,!,后变址格式,LDR|STR B T Rd,,,Rn,,,相对
17、PC,的形式,LDR|STR B Rd,,,LABEL,多寄存器存取指令,多寄存器传送指令可以用一条指令将,16,个可见寄存器(,R0R15,)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。,多寄存器存取指令的汇编格式如下:,LDM/STM,Rn,!,,,3.3.3,程序状态寄存器与通用寄存器之间的传送指令,ARM,指令中有两条指令,,,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取修改写回”三个步骤的操作来实现的。,这两条指令分别是:,状态寄存器到通用寄存器的传送指令(,MR
18、S,),通用寄存器到状态寄存器的传送指令(,MSR,),MRS,其汇编格式如下:,MRS Rd,,,CPSR|SPSR,MSR,其汇编格式如下:,MSR CPSR_f|SPSR_f,,,#,MSR CPSR_|SPSR_,,,Rm,3.3.4,转移指令,ARM,的转移指令可以从当前指令向前或向后的,32MB,的地址空间跳转,根据完成的功能它可以分为以下,4,种,:,B,转移指令,BL,带链接的转移指令,BX,带状态切换的转移指令,BLX,带链接和状态切换的转移指令,转移和转移链接指令(,B,,,BL,),转移指令,B,在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。,BL,指令完全
19、象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器,LR,(,r14,)。汇编格式如下:,BL,转移交换和转移链接交换(,BX,,,BLX,),这些指令用于支持,Thumb,(,16,位)指令集的,ARM,芯片,程序可以通过这些指令完成处理器从,ARM,状态到,Thumb,状态的切换。类似的,Thumb,指令可以使处理器切换回,32,位,ARM,指令。,汇编格式如下:,1,:,BLX,Rm,2,:,BLX,3.3.6,异常中断指令,异常中断指令可以分为一下两种:,软件中断指令(,SWI,),断点指令(,BKPT,仅用于,v5T,体系),软件中断指令,SWI,用于产生,
20、SWI,异常中断,用来实现在用户模式下对操作系统中特权模式的程序的调用;断点中断指令,BKPT,主要用于产生软件断点,供调试程序用。,SWI,SWI,(,SoftWare Interrupt,),代表“软件中断”,用于用户调用操作系统,的系统例程,,常称为“监控调用”。它将处理器置于监控(,SVC,),模式,从地址,0 x08,开始执行指令。其汇编格式如下:,SWI,断点指令(,BKPT,仅用于,v5T,体系),断点指令用于软件调试;它使处理器停止执行正常指令而进入相应的调试程序。,汇编格式如下:,BKPT immed_16,3.3.6,协处理器指令,ARM,支持,16,个协处理器,用于各种协
21、处理器操作,最常使用的协处理器是用于控制片上功能的系统协处理器,例如控制,ARM720,上的高速缓存和存储器管理单元等,也开发了浮点,ARM,协处理器,还可以开发专用的协处理器。,ARM,协处理器指令根据其用途主要分为以下三类:,数据操作指令;,数据传送指令;,寄存器和内存单元之间的传送数据。,协处理器的数据操作,协处理器数据操作完全是协处理器内部的操作,它完成协处理器寄存器的状态改变。,汇编格式如下:,CDP,,,,,CRd,,,CRn,,,CRm,,,协处理器的数据存取,协处理器数据传送指令从存储器读取数据装入协处理器寄存器,或将协处理器寄存器的数据存入存储器。,汇编格式如下:,前变址格式:,LDC|STCL,,,CRd,,,Rn,!,后变址格式:,LDC|STCL,,,CRd,,,Rn,,,协处理器的寄存器传送,在,ARM,和协处理器寄存器之间传送数据有时是有用的。这些协处理寄存器传送指令使得协处理器中产生的整数能直接传送到,ARM,寄存器或者影响,ARM,条件码标志位。,汇编格式如下:,从协处理器传送到,ARM,寄存器:,MRC,,,,,Rd,,,CRn,,,CRm,,,从,ARM,寄存器传送到协处理器:,MCR,,,,,Rd,,,CRn,,,CRm,,,






