ARM指令和指令系统:指令是指示计算机某种操作的命令,指令的集合称为指令系统。指令系统的功能强弱很大程度上决定了这类计算机智能的高低,它集中地反应了微处理器的硬件功能和属性。ARM指令在机器中的表示格式是用32位的二进制数表示。如ARM中有一条指令为ADDEQSR0,R1,#8;其二进制代码形式为:31~28|27~25|24~21|20|19~16|15~12|11~00000|001|0100|1|0001|0000|000000001000cond|opcode|Rn|Rd|Op2ARM指令格式一般如下:opcode{cond}{s}Rd,Rn{,OP2}格式中的内容是必不可少的,{}中的内容可忽略opcode表示操作码。如ADD表示算术加法{cond}表示指令执行的条件域。如EQ、NE等,缺省为AL。{S}决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行结果影响CPSR的值,否则不影响Rd表示目的寄存器Rn表示第一个操作数,为寄存器op2表示第二个操作数,可以是立即数。寄存器和寄存器移位操作数ARM指令后缀:S、!S后缀:指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。S后缀常用于对条件进行测试,如是否有溢出,是否进位等,根据这些变化,就可以进行一些判断,如是否大于,相等,从而影响指令执行的顺序。!后缀:如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。加上此后缀后,基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量(1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量(2)!后缀不能用于R15(PC)的后面(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDBR1!,{R3,R5,R7}”。此时地址基址寄存器R1的隐性偏移量为4(一条指令占32位,即4个字节)指令的条件码:31-28位4个字节存储,共16个条件码条件码助记符后缀标志含义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零无符号数大于1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行ARM指令分类:六大类ARM指令集可以分为数据处理指令,数据加载指令和存储指令,分支指令,程序状态寄存器(PSR)处理指令,协处理器指令和异常产生指令六大类。ARM指令的寻址方式:8类ARM指令的寻址方式一般可以分为8类:立即数寻址,寄存器寻址,寄存器间接寻址,寄存器移位寻址,基址变址寻址,多寄存器寻址,相对寻址,堆栈寻址等举例:MOVR0,#15;立即数15放入寄存器R0中ADDR0,R1,R2;R0=R1+R2LDRR0,[R4];R0=[R4](R4中存放的是一个指针变量,[]表示取改地址值指向的内容)ADDR0,R1,R2,LSL#1;R0=R1+R2(R2左移一位后的值)MOVR0,R1,LSLR3;R0=R1(R1左移R3位后)LDRR0,[R1,#4];R0=[R1+4]LDRR0,[R1,#4]!;R0=[R1+4],R1=R1+4。同时更新基址LDRR0,[R1],#4;R0=[R1],R1=R1+4LDRR0,[R1,R2];R0=[R1+R2]LDMIAR0!,{R1-R4};R1=[R0]、R1=[R0+4]、R1=[R0+8]、R1=[R0+12]BLproc;跳转到子程序proc处执行,执行完毕后返回(L标记,带返回的跳转)。STMFDR13!,{R0-R4};R0-R4压栈,FD为满栈递减,地址从高到低,R13为SP堆栈指针LDMFDR13!,{R0-R4};R0-R4出栈,FD为满栈递减ARM寄存器数据处理指令:1、数据处理指令机器编码格式:31~28|27~2625|24~21|20|19~16|15~12|11~0cond|00I|opcode|S|Rn|Rd|Op2cond:指令执行的条件码I:用于区别第二操作数是立即数(I=1)还是寄存器移位(I=0)opcode:数据处理指令操作码S:用于设置条件码,S=0时,条件码不改变,S=1时,条件码根据具体指令的结果修改Rn:第一操作数寄存器Rd:目标寄存器Op2:第二操作数,该数可以是立即数或寄存器移位数2、数据传送指令:MOVMVNMOVR1,R0;将寄存器R0的值传送到寄存器R1MOVPC,R14;将寄存器R14的值传送到PC,常用于子程序返回MOVR1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MOVR0,#5;将立即数5传送到寄存器R0MVNR0,#0;将立即数0按位取反后传送到寄存器R0中,完成后R0=-1MVNR1,R2;将R2按位取反后,结果存到R13、移位指令:LSL、LSR、ASR、ROR、RRXMOVR0,R1,LSL#1;寄存器R1左移一位后传送到R0MOVSR0,R1,LSL#1;寄存器R1左移一位后传送到R0,并更新状态标志位MOVSR0,R1,LSR#1;寄存器R1右移一位后传送到R0,并更新状态标志位MOVSR0,R1,ASR#1;寄存器R1算术右移一位后传送到R0,并更新状态标志位;算术右移,第一位符号位不变MOVR0,R1,ROR#1;寄存器R1循环右移一位后传送到R0MOVSR0,R1,RRX;寄存器R1循环右移一位后传送到R0,用C标志位作为最高位扩展4、算术指令:ADD、ADC、SUB、SBC、RSB、RSCADDR0,R1,R2;寄存器R1和R2的值相加后传送到R0ADDR0,R1,#5;寄存器R1的值加上5后传送到R0ADDR0,R1,R2,LSL#2;寄存器R2左移两位后与R1相加,得到的结果传送到R0ADDR0,R1,R2,LSLR3;寄存器R2左移R3后与R1相加,得到的结果传送到R0ADDSR0,R2,R4;64位加,低位放在R0ADCR1,R3,R5;64位加,高位放在R1,注意要加上低位的进位SUBR0,R1,R2;寄存器R1和R2的值相减后传送到R0SUBR0,R1,#6;寄存器R1的值减6后传送到R0SUBR0,R1,R2,LSL#1;R1与寄存器R2左移一位后的值相减,得到的结果传送到R0SUBSR0,R2,R4;64位减,低位放在R0SBCR1,R3,R5;64位减,高位放在R1,注意要减去低位的借位RSBR0,R1,R2;寄存器R2和R1的值相减后传送到R0,注意是R2-R1,方向相反RSBR0,R1,#6;6与寄存器R1的值相减后传送到R0RSBR0,R1,R2,LSL#1;寄存器R2左移一位后与R1相减,得到的结果传送到R0RSCR0,R1,R2;寄存器R2和R1的值相减,再减去借位后传送到R05、逻辑运算指令:AND、ORR、EOR、BICANDR0,R0,#0xF;R0的值与0xF相位与后的值传送到R0ORRR0,R0,#9;R0的值与9相位与后的值传送到R0EORR0,R0,#0xF;R0的值与0xF相异或后的值传送到R0BICR0,R0,#9;位清除指令R0的第0位和第3位清零6、比较指令:CMP、CMN、TST、TEQCMPR1,#10;将寄存器R1的值与10相减,并设置CPSR标志位ADDGTR0,R0,#5;如果R110,则执行ADDGT指令,将R0加5CMNR0,R1;R0-(-R1),反值比较,影响CPSR标志位CMNR0,#10;R0-(-10),反值比较,影响CPSR标志位TSTR1,#3;检查R1中第0位和第1位是否为1,根据结果更新条件标志位TEQR1,R2;将寄存器R1的值与寄存器R2的值进行按位异或,;并根据结果设置CPSR的标志位7、乘法指令:MUL、MLA、SMULL、SMLAL、UMULL、UMLALMULR0,R1,R2;R1和R2相乘的结果发送到R0MULSR0,R1,R2;R1和R2相乘的结果发送到R0,同时设置CPSR的相关条件标志位MLAR0,R1,R2,R3;R1和R2相乘的结果再加上R3后发送到R0MLASR0,R1,R2,R3;R1和R2相乘的结果再加上R3后发送到R0,更新CPSR标志位SMULLR0,R1,R2,R3;R2和R3相乘的结果的低32位放在R0,高32位放在R1SMLALR0,R1,R2,R3;R2和R3相乘的结果的低32位加上R0后放在R0,;高32位加上R1后放在R1UMULLR0,R1,R2,R3;无符号数相乘,结果与SMULL类似UMLALR0,R1,R2,R3;无符号数乘加,结果与SMLAL类似ARM数据加载和存储指令:1、数据加载和存储的方向。寄存器到存储器方向:Store;从存储器到寄存器方向:Load数据加载和存储指令共有三种类型:单寄存器加载和存储指令,多寄存器加载和存储指令和交换指令2、数据加载与存储器指令寻址LDRR5,[R6,#0x08];R6寄存器加0x08的和的地址值内的数据传送到R5STRR6,[R7],#-0x08;R6寄存器的数据传送到R7存储的地址值指向的存储空间,;同时更新R7寄存器的内容为R7-0x08LDRR5,[R6,R3];R6寄存器加R3的和的地址值内的数据传送到R5STRR6,[R7],-R8;R6寄存器的数据传送到R7存储的地址值指向的存储空间,;同时更新R7寄存器的内容为R7-R8LDRR3,[R2,R4,LSL#2];R3==[R2+R4(R4左移两位)]LDRR3,[R2],-R4,LSR#3;R3==[R2],R2=R2-R4(R4右移三位)LDRR4,START;将标号START标定的空间的数据加载到R4中3、地址索引:前索引、自动索引、后索引1】前索引:前索引也称为前变址,这种索引是在指令执行前把偏移量和基址相加减,得到的值作为变量的地址。如:LDRR5,[R6,#0x04]STRR0,[R5,-R8]2】自动索引:自动索引也称为自动变址,有时为了修改基址寄存器的内容,使之指向数据传送地址,可使用这种方法自动修改基址寄存器,如:LDRR5,[R6,#0x04]!3】后索引:后索引也被称为后变址,后索引就是用基址寄存器的地址值寻址,找出操作数进行操作,操作完成后,再把地址偏移量和基址相加/减,结果送到基址寄存器,作为下一次寻址的基址。如:LDRR5,[R6],#0x04STRR6,[R7],#-0x084、单寄存器加载和存储指令:LDR/STR、LDRB/STRB、LDRH/STRH、LDRSB/LDRSH1】字数据加载/存储指令格式:31~28|27~26|252423222120|19~16|15~12|11~0cond|01|IPUBWL|Rn|Rd|Op2cond:指令执行的条件编码I、P、U、W:用于区别不同的地址模式(偏移量)。I为0时,偏移量为12位立即数;I为1时,偏移量为移位寄存器移位P表示前/后索引U表示加/减W表示回写L:L为1时表示加载,L为0时表示存储B:B为1表示字节访问,B为0表示字访问Rd:源/目标寄存器Rn:基址寄存器Op2:表示偏移量是一个12位的无符号二进制数,与Rn一起构成地址addr2】存储器==寄存器LDR/STRLDR指令用于从存储器中间一个32位的字数据加载到目的寄存器Rd中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当做目的地址,从而实现程序流程的跳转。LDRR4,START;将存储地址为START的字数据读入R4ST