003_ARM_THUMB指令ARM及Thumb指令集议程ARM指令集 Thumb指令集 v5TE体系结构扩展ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。这样可以提高代码密度,减少分支跳转指令数目,提高性能。CMPr3,#0CMPr3,#0BEQskipADDNEr0,r1,r2ADDr0,r1,r2skip默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。CMP不需要增加“S”就可改变相应的标志位。 loop…SUBSr1,r1,#1BNEloop条件执行及标志位如果Z标志清零则跳转R1减1,并设置标志位条件码不等于(Notequal)无符号的大于或等于无符号的小于负数(Minus)等于(Equal)溢出(Overflow)没溢出无符号的大于无符号的小于或大于正数或零小于(LessThan)大于(GreaterThan)小于等于总是执行(Always)大于等于EQNECS//LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1测试的标志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出条件执行示例一系列的指令都使用条件指令 if(a==0)func(1); CMPr0,#0MOVEQr0,#1BLEQfunc置标志位,再使用不同的条件码 if(a==0)x=0;if(a>0)x=1; CMPr0,#0MOVEQr1,#0MOVGTr1,#1使用条件比较指令 if(a==4||a==10)x=0; CMPr0,#4CMPNEr0,#10MOVEQr1,#0Branch: B{<cond>}labelBranchwithLink: BL{<cond>}subroutine_label处理器核按偏移量左移两位,符号扩展,再把该值加到当前PC寄存器内跳转范围:±32Mbyte如何执行长跳转?2831240Cond101L偏移量条件码区域Linkbit 0=Branch 1=Branchwithlink232527分支指令数据处理指令包括:算术指令: ADD ADC SUB SBC RSB RSC逻辑指令: AND ORR EOR BIC比较指令: CMP CMN TST TEQ数据搬移: MOV MVN上述指令只能对寄存器操作,不能针对存储器。语法: <操作>{<cond>}{S}Rd,Rn,Operand2只有比较指令影响标志位-不指定Rd数据搬移不指定Rn第二个操作数通过桶型移位器送到ALU中。桶型移位器DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(无符号数)乘2除2,并保留符号位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(无符号数)除2位轮换DestinationRRX:RotateRightExtended位轮换,从CF到MSB都参与操作CF寄存器,:5bit无符号整数放在另一个寄存器的低字节用于常数乘法立即数8bit,大小范围0-255。右移偶数位允许直接加载32-bit常数到寄存器中。结果操作数1BarrelShifter操作数2ALU桶型移位器:第二个操作数没有任何一条ARM指令可包括一个32bit的立即数所有的ARM指令都是32bits固定长度数据处理指令格式中,第二个操作数有12位4bit移位值(0-15)乘于2,得到一个范围在0-30,步长为2的移位值。记住一条准则:“最后8位一定要移动偶数位”.07118immed_8ShifterRORrotx2QuickQuiz:0xe3a004ffMOVr0,#???立即数(1)
003 ARM THUMB指令 来自淘豆网m.daumloan.com转载请标明出处.