位的,程序的启动都是从ARM指令集开始。所有的ARM指令集都可以是有条件执行的。本节从以下三个方面介绍:3.1.1指令集编码3.1.2条件执行3.1.3指令分类及指令格式位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。每条32位ARM指令都具有不同的二进制编码方式,和不同的指令功能相对应。中的条件位自动判断是否执行指令,在条件满足时,指令执行,否则指令被忽略。在ARM的指令编码表中,统一占用编码的最高四位[31:28]来表示“条件码”(即“cond”)。清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。ARM指令使用的基本格式如下:〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}指令格式中符号说明opcode操作码;指令助记符,如LDR、STR等。cond可选的条件码;执行条件,如EQ、NE等。S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。Rd目标寄存器。Rn存放第1操作数的寄存器。operand2第2个操作数立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:ADDR0,R0,#1/*R0←R0+1*/ADDR0,R0,#0x3f/*R0←R0+0x3f*/在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”。寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:ADDR0,R1,R2/*R0←R1+R2*/该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。指令的数据处理指令中参与操作的第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二操作数进行移位,即Rm,{shift},其中Rm称为第二操作数寄存器,shift用来指定移位类型(LSL,LSR,ASL,ASR,ROR或RRX)和移位位数。移位位数可以是5位立即数(##shift)或寄存器(Rs)。在指令执行时将移位后的内容作为第二操作数参与运算。例如指令:ADDR3,R2,R1,LSR#2;R3—R2+R1÷4:逻辑左移,空出的最低有效位用0填充。LSR:逻辑右移,空出的最高有效位用0填充。ASL:算术左移,由于左移空出的有效位用0填充,因此它与LSL同义。ASR:算术右移,算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0填充,如果是负数用1填充。ROR:循环右移,移出的字的最低有效位依次填入空出的最高有效位。RRX:带扩展的循环右移。将寄存器的内容循环右移1位,空位用原来C标志位填充。寄存器寻址第二操作数的移位位数移位位数可以用立即数方式或者寄存器方式给出,如下所示:ADDR3,R2,R1,LSR#2;R3—R2+R1÷4ADDR3,R2,R1,LSRR4;R3—R2+R1÷2R4寄存器R1的内容分别逻辑右移2位、R4位(亦即R1÷4、R1÷2R4),再与寄存器R2的内容相加,结果放入R3中。寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:LDRR0,[R1]/*R0←[R1]*/STRR0,[R1]/*[R1]←R0*/第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。基址加偏址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令又可以分为以下几种形式:前变址模式:LDRR0,[R1,#4];R0←[R1+4]自动变址模式:LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4后变址模式:LDRR0,[R1],#4;R0←[R1]、R1←R1+4基址加偏址寻址基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作,如下所示:LDRr0,[r1,r2];r0—mem32[r1+r2]LDRr0,[r1,r2,LSL#2];r0—[r1+r2*4]但常用的是立即数偏移的形式,地址偏移为寄存器形式的指令很少使用。堆栈寻址堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。即访问存储器时,存储器的地址向高地址方向生长,称为递增堆栈(ascendingstack)。存储器的地址向低地址方向生长,称为递减堆栈(descendingstack)。堆栈寻址四种类型的堆栈工作方式:满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。块拷贝寻址块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。LDM/STM指令可以把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。寻址操作中的寄存器可以是R0-R15这16个寄存器的子集或是所有寄存器。LDM/STM指令依据其后缀名的不同其寻址的方式也有很大不同,见下表。相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BLNEXT;跳转到子程序;NEXT处执行……NEXT……MOVPC,LR;从子程序返回指令3.3.3程序状态寄存器与通用寄存器之间的传送指令3.3.4转移指令3.3.5异常中断指令3.3.6协处理器指令的数据处理指令主要完成寄存器中数据的算术和逻辑运算操作。本节按以下内容组织:数据处理指令分类数据处理指令表数据处理指令-分类数据处理指令根据指令实现处理功能可分为以下六类:数据传送指令;算术运算指令;逻辑运算指令;比较指令;测试指令;乘法指令。数据处理指令的详细列表如下:操作码[24:21]助记符意义效果0000AND逻辑位与Rd=RnANDOp20001EOR逻辑位异或Rd=RnEOROp20010SUB减Rd=Rn-Op20011RSB反向减Rd=Op2–Rn0100ADD加Rd=Rn+Op20101ADC带进位加Rd=Rn+Op2+C0110SBC带进位减Rd=Rn-Op2+C-10111RSC反向带进位减Rd=Op2-Rn+C-11000TST测试根据RnANDOp2设置条件码1001TEQ测试相等根据RnEOROp2设置条件1010CMP比较根据Rn-Op2设置条件码1011CMN负数比较根据Rn+Op2设置条件码1100ORR逻辑位或Rd=RnOROp21101MOV传送Rd=Op21110BIC位清零Rd=RnANDNOTOp21111MVN求反Rd=NOTOp2指令ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。ARM指令集中有三种基本的数据存取指令:单寄存器的存取指令(LDR,STR)多寄存器存取指令(LDM,STM)单寄存器交换指令(SWP)在寄存器和存储器间传送单个字节和字的最灵活方式。根据传送数据的类型不同,单个寄存器存取指令又可以分为以下两类:单字和无符号字节的数据传送指令半字和有符号字节的数据传送指令单字和无符号字节的数据传送指令这一类数据传送指令的汇编格式如下:前变址格式LDR|STR{cond}{B}Rd,[Rn,offset]{!}后变址格式LDR|STR{cond}{B}{T}Rd,[Rn],offset相对PC的形式LDR|STR{cond}{B}Rd,LABEL个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下:LDM/STM{cond}addmodeRn{!},regi