您好,欢迎访问三七文档
一、ARM指令系统分为六大类1.数据传送2.数据处理3.跳转指令4.程序状态寄存器访问指令5.异常中断指令6.协处理器指令二、指令格式1.SUBNESR2,R1,R02.SUB操作码,NE可选条件码,S可选更新条件标识码,R2目标寄存器,R1第一操作数,R0第二操作数。三、程序状态寄存器CPSR和SPSR313029282726-876543210NZCVQDNM(RAZ)IFTMMMMM1.标志位N,Z,C,VN:Negative,如果结果是带符号二进制补码,结果为负时N=1;否则N=0。Z:Zero,若指令结果为0,则Z=1,通常表示比较结果为“相等”,否则Z=0。C:Carry,加法时,若产生进位,则C=1,否则Z=0;减法时,若产生借位,则C=0,否则C=1;对于结合移位操作的非加减法指令,C为移出值的最后1位。其他指令C通常不变。V:oVerflow,对于加减法指令,当发生带符号溢出时,V=1;认为操作数和结果是补码形式的带符号整数。对于非加减法指令,V通常不变。四、ARM条件码操作码【31:28】NZCV助记符后缀标志含义0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(无符号)0011CC/LOC清零小于(无符号)0100MIN置位负0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零大于(无符号)1001LSC清零或Z置位小于或等于(无符号)1010GEN和V相同大于等于(有符号)1011LTN和V不同小于(有符号)1100GTZ清零且N和V相同大于(有符号)1101LEZ置位或N和V不同小于等于(有符号)1110AL任何总是(通常省略)操作码【31:28】助记符后缀标志含义0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(无符号)1000HIC置位且Z清零大于(无符号)0011CC/LOC清零小于(无符号)1001LSC清零或Z置位小于或等于(无符号)0100MIN置位负0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1010GEN和V相同大于等于(有符号)1100GTZ清零且N和V相同大于(有符号)1011LTN和V不同小于(有符号)1101LEZ置位或N和V不同小于等于(有符号)1110AL任何总是(通常省略)五、ARM指令的寻址方式1.立即数寻址ADDR0,R0,#5;R0+5R00X或&表示16进制数,0b或2_表示二进制数立即数的大小受限,因为在32位指令中,第二操作数只有12位,所以他的范围不大于4096.ARM采用8位常数(0xff以内)循环右移偶数位(2-30位之间的偶数)得到32位立即数。所以立即数是否合法可以对他进行偶数位的循环右移位,看他能否落在0xff以内。MOVR0,#0X12800;0X12800右移10位后变为0x4a,落在0xff内。需循环右移22位后复原,所以22/2=11=C,所以最后0x12800立即数在指令中的存储数据为C4A,占用12位。2.寄存器寻址ADDR0,R0,R1,LSR#3;R1逻辑右移3位后再与r0相加ADDR0,R0,R1,LSRR4;R1逻辑右移R4值位后再与R0相加LSL\LSR\ASR\ROR\RRX(逻辑左移、逻辑右移、算术右移、循环右移、带进位循环右移)。3.寄存器间接寻址LDRR0,[R1];将R1内容为地址的数据装入R0寄存器中。STRR0,[R1];将R0的值存入R1内容为地址的内存中。4.基址加偏址寻址LDRR0,[R1,#4];R1先加4,然后将对应地址的值装入R0。LDRR0,[R1,#4]!;同上,指令执行完后R1=R1+4。LDRR0,[R1],#4;R1对应地址的值装入R0,然后R1=R1+4.LDRR0,[R1,R2];同第一个。LDRR0,[R1,R2,LSR#4];5.堆栈寻址满堆栈(fullstack):堆栈指针指向数据。空堆栈(emptystack):堆栈指针指向数据上/下的空位。递增堆栈(Ascendingstack):堆栈由低地址向高地址生长。递减堆栈(Descendingstack):堆栈由高地址向低地址生长。ARM堆栈的工作方式是满递减堆栈。ARM模式下:STMFDSP!,{R0-R9};R0到R9压入堆栈。先压编号大的,不论他在大括号中的位置如何。LDMFDSP!,{R0-R0};R0到R9出栈。THUMB模式下:PUSH{R0-R9};R0到R9压栈。POP{R0-R9};R0到R9出栈。6.块拷贝寻址LDM/STM加上以下后缀就形成块拷贝指令IA(increaseafter)操作完成后再增加地址值。IB(increasebefore)操作之前先增加地址值。DA(decreaseafter)操作完成后再减地址值。DB(decreasebefore)操作之前先减地址值。STMIAR10!,{R1,R2,R3};将R1,R2,R3按编号由小往大存入R10所指向的内存中,R10的值在存入数据后再增加。7.相对寻址操作数的地址为PC+标号地址。用于程序跳转,子程序调用。六、ARM指令集1.数据传送指令在寄存器和存储器之间传送数据a)LDR/STR{COND}{B/SB/H//SH}Rd,[Rn,offset{!}无符号字节半字目标寄存器偏移量有符号字节带符号半字原寄存器自动变址LDRBR0,[R1],#2;[R1]R0,R1=R1+2,R0只保留低8位,高位清零。LDRSHR0,[R1,R2,LSL#2]!;[R1+R2*4]R0,(R1+R2*4)R1,高16位用符号位扩充。b)STRR0,LABEL1;R0[LABEL1].c)LDM/STM{COND}{IA/IB/DA//DB}Rn{!},Register{^}普通数据块操作,LDM的时候一般不用{!},Register与书写顺序无关,高编号的寄存器存在高地址上。{^}不允许在用户模式或系统模式下使用。d)LDM/STM{COND}{FD/FA/ED//EA}Rn{!},Register{^}堆栈操作使用,ARM只使用满减操作FD.LDM是把Rn地址的数据存入Register中。STM是把Register中的数据存入Rn指向的地址中。e)交换指令SWP/SWPB用于将寄存器的内容存到存储器中,同时将存储器的内容存到寄存器中。SWPR0,R1,[R2];[R2]R0,R1[R2].SWPR0,R0,[R2];实现R0中数据和R2指向内存数据的交换。2.数据处理指令完成寄存器中数据的算术和逻辑运算。S:可选后缀,决定指令的操作是否影响CPSR的值,有如下三种情况:目标寄存器不是R15时,更新CPSR的值。目标寄存器是R15时,将当前模式下的SPSR拷贝到CPSR中。比较测试指令不带S,但总是影响条件标志位。a)数据移动指令MOVR0,R1MOVSPC,R14;R14PC,SPSRCPSR.MOVEQSR1,#0XFFMVNR0,R1;把R1的数据按位取反后存入R0中。b)算术运算指令OP{COND}{S}Rd,Rn,Operand2ADD/SUBRSB:(Operand2-Rn)RdADC:(Rn+Operand2+C)RdSBC:(Rn-Operand2-!C)RdRSC:(Operand2-Rn-!C)Rdc)逻辑运算指令AND:ANDr0,r0,#3;r0&3r0,用于保留r0中的特定位,其余位清零。BIC:BICr0,r0,#0xff000000;将r0中的高8位清零。ORR:ORRr0,r0,#3;将r0中的低2位置1,其余不变。EOR:EORr0,r0,#3;将r0中的低2位取反,其余不变。d)比较测试指令CMP:CMPR0,R1;执行R0-R1操作,影响标志位。CMN:CMNR0,R1;执行R0+R1操作,影响标志位。TST:TSTR0,#1;检测R0的最低位是否为1,为1时标志位Z=0,否则Z=1。TSTR0,#0xff;检测R0的低8位是否全部为1,全部为1时Z=0,否则Z=1。TEQ:TEQR1,R2;异或操作,用于比较两个数是否相等。更新除V以外的标志位。e)乘法指令所有参与操作的数据必须是通用寄存器,目的操作数和第一操作数不能相同。MULR0,R1,R2;R1*R2R0,只取低32位。MLAR0,R1,R2,R3;R1*R2+R3R0,只取低32位。SMULLR0,R1,R2,R3;R2*R3低32位R0,高32位R1。SMLALR0,R1,R2,R3;(R2*R3低32位+R0)R0,(R2*R3高32位+R1)R1。UMULLR0,R1,R2,R3;R2*R3低32位R0,高32位R1。UMLALR0,R1,R2,R3;(R2*R3低32位+R0)R0,(R2*R3高32位+R1)R1。3.状态寄存器访问指令状态寄存器不允许直接修改,一般是通过“读取”,“修改”,“写回“三个步骤来实现状态寄存器的修改。c指CPSR中的controlfield(PSR[7:0])f指flagfield(PSR[31:24])x指extendfield(PSR[15:8])s指statusfield(PSR[23:16])MRS:读取状态寄存器MRSR0,CPSR;CPSRR0。MSR:写入状态寄存器,可以指定上面提到的cfxs几个域4.跳转移指令B{cond}targetaddress目标地址由24位有符号立即数符号扩展为30位,再左移两位得到32位,并将其与PC相加得到目标地址。范围为正负32MB。BLPROG1程序跳转到PROG1处执行,同时将当前PC值保存到LR。BLXtarget__address跳转到目标地址,完成ARM到THUMB的模式转变,将PC保存到LR。BLX{COND}Rm目标地址在Rm中,同时保存PC到LR中。Rm最低位如果是0表明是ARM模式,否则模式切换到THUMB。BX{COND}Rm同上,只是不保存PC。5.异常产生指令SWI(softwareinterrupt),用于用户程序访问操作系统的特权程序。BKPT(BreakPoint)断点指令。产生预取指令异常,用于产生软件断点,供调试程序用,或进行预取指令异常处理。6.协处理器指令
本文标题:ARM指令系统
链接地址:https://www.777doc.com/doc-2898561 .html