资源描述
第,3,章,ARM,指令系统,ARM,原理与应用,上讲知识回顾,ARM,微处理器格式;,3,个必不可少部分,,3,个可选择部分,ARM,微处理器指令的寻址方式,立即数寻址(立即数格式,常数表达式),寄存器寻址、,寄存器偏移寻址(第,2,操作数移位方式:,6,种),本讲学习内容,1,、,ARM,跳转指令(了解),2,、,ARM,数据处理指令(熟悉),3,、,ARM,存储器访问指令(掌握),第三章,ARM指令系统,二、寄存器移位寻址,1)寄存器移位寻址,当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对第二操作数寄存器进行移位,此时,第二操作数,形式为:,MOV Rd,Rn,Rm,,其中:,Rm,称为第二操作数寄存器,用来指定移位类型和移位位数,有两种形式:,5,位立即数(其值小于,32,),寄存器,(,用,Rs,表示,),(其值小于,32,),在指令执行时将寄存器移位后的内容作为第二操作数参与,运算。,例如,指令:,ADD R3,,,R2,,,R1,,,LSR#2,;,R3R2+(R1,右移,2,位,),ADD R3,,,R2,,,R1,,,LSR R0,;,R3R2+(R1,右移,R0,位,),2),第二操作数移位方式,共有,6,种移位方式:,LSL,逻辑左移,LSR,逻辑右移,ASL,算术左移,ASR,算术右移,ROR,循环右移,RRX,带扩展的循环右移,(,1,),LSL,:逻辑左移,,空出的最低有效位用,0,填充。,0,31 0,0,(2)LSR:逻辑右移,,空出的最高有效位用0填充。,31 0,SUB R3,R2,R1,LSL#2;R3R2-(R1左移2位),SUB R3,R2,R1,LSR R0;R3R2-(R1右移R0位),0,(,3,),ASL,:算术左移,,由于左移空出的有效位用,0,填充,因此它与,LSL,同义。,(,4,),ASR,:算术右移,(Arithmetic Shift Right),。算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用,0,填充,如果是负数用,1,填充。,ADD R3,R2,,R1,ASL#2,;R3R2+(R1左移,2,位),SUB R3,R2,,R1,ASR R3,;R3R2-(R1算术右移,R3,位),30,0,(,5,),ROR,:循环右移,(Rotate Right),,移出的字的最低有效位依次填入空出的最高有效位。,31,0,(,6,),RRX,:带进位位的循环右移,(Rotate Right Extended),。将寄存器的内容,循环右移,1,位,,空位用原来,C,标志位填充。,31 0,C,SUB R3,R2,,R1,ROR#2,;R3R2+(R1循环右移,2,位),SUB R3,R2,,R1,RRX R0,;R3R2-(R1带进位位循环右移,R0,位),3)第二操作数的移位位数,移位位数可以用立即数方式或者寄存器方式给出,,其值均小于32,应为0-31。,如下所示:,ADD R3,R2,,R1,LSR#2,;R3,R2+(R1右移2位),ADD R3,R2,,R1,LSR R4,;R3,R2+(R1右移R4位),寄存器R1的内容分别逻辑右移2位、R4位,再与寄存器R2的内容相加,结果放入R3中。,3.寄存器间接寻址,就是以,寄存器中的值作为操作数的地址,,而操作数本身存放在存储单元中。例如以下指令:,LDRR0,,,R1;R0R1,STRR0,,,R1;R1R0,指令,1,将,以,R1,的值为地址的存储单元中的内容加载到寄存器,R0,中。,指令,2,将,R0,的内容存储到以,R1,的值为地址的存储单元中。,R1,基址寄存器,R1,的内容,基地址,3.4 ARM,指令分类,(1),跳转指令,在,ARM,中有两种方式可以实现程序的跳转:,一种是使用分支转移指令直接跳转;,另一种则是直接向,PC,寄存器赋值来实现跳转,。,ARM,的分支转移指令,可以从当前指令向前或向后的,32MB,的地址空间跳转,根据完成的功能它可以分为以下,4,种:,B,-,分支指令,BL-,带,链接的分支指令,BX,-,带,状态切换的分支指令,BLX,-,带,链接和状态切换的分支指令,1,),B转移指令,指令格式如下:,Bcond label,B指令跳转到指定的地址执行程序。,指令举例如下:,B WAITA ;跳转到WAITA标号处,B 0 x1234 ;跳转到绝对地址0 x1234处,转移指令B限制在当前指令的,32 MB的范围内。,例子:,无条件跳转:,B label,label ,执行10次循环:,MOV R0,#10,LOOP,SUBS R0,R0,#1,BNE LOOP,2,),BL带链接的转移指令,指令格式如下:,BLcond label,BL指令先将,下一条指令的地址拷贝到LR,链接寄存器中,然后跳转到指定地址运行程序。,指令举例如下:,BL SUB1 ;LR,下条指令地址,;转至子程序SUB1处,SUB1 ,MOV PC,LR;子程序返回,注意:,转移地址限制在当前指令的32 MB的范围内。BL指令用于子程序调用。,例子:根据不同的条件,执行不同的子程序。,CMP R1,#5,BLLT ADD11,;有符号数,BLGE SUB22,;有符号数,ADD11,SUB22,注:,如果,R15,,只有,ADD11,不改变条件码,本例才能正常工作。,例子:,BL SUB1,SUB1,STMFD R13,!,R0-R3,R14,BL SUB2,SUB2 ,注意:,在,保存,R14,之前子程序不应再调用下一级的嵌套子程序。否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。,3,),BX带状态切换的转移指令,指令格式如下:,BXcond Rm,BX指令跳转到Rm指定的地址执行程序。,若,Rm的位0为1,,则跳转时自动将CPSR中的标志,T置位,,即把目标地址的代码解释为Thumb代码;,若,Rm的位0为0,,则跳转时自动将CPSR中的标志,T复位,,即把目标地址的代码解释为ARM代码。,指令举例如下:,ADRL R0,ThumbFun+1,;中等范围的地址读取伪指令,BX R0 ;跳转到R0指定的地址,并,;根据R0的最低位来切换处理;器到Thumb状态。,.,ThumbFun,4)BLX,带链接和状态切换的转移指令,指令格式如下:,BLX ,BLX指令先将下一条指令的地址拷贝到R14(即LR)连接寄存器中,然后跳转到指定地址处执行程序。(只有V5T及以上体系 支持BLX),转移,地址限制在当前指令的32MB的范围内。,3.4.2,数据处理,指令,主要指令有:,1)算术运算指令,2)逻辑运算指令,3)数据传送指令,4)比较指令,5)测试指令,1)数据处理指令概述,(1)ARM数据处理指令的功能,主要完成寄存器中数据的算术和逻辑运算操作。,(2)ARM数据处理指令的特点,操作数来源:,所有的操作数要么来自寄存器,要么来自立即数,不会来自存储器。,操作结果:,如果有结果,则结果一定是为32位宽、或64位宽(长乘法指令),并且放在一个或两个寄存器中,不会写入存储器。,有第二个操作数(除了乘法指令)Operand2,:切记其三种形式:立即数、寄存器、寄存器移位。,乘法指令的操作数:,全部是寄存器。,(3)ARM数据处理指令分类,22条可分为5类:,算术运算指令:,ADD ADC,SUB SBC RSB RSC,MUL MLA UMULL UMLAL SMULL SMLAL,逻辑运算指令:,ANDORR EOR BIC,数据传送指令:,MOV MVN,比较指令:,CMP CMN,测试指令:,TST TEQ,上述指令只能对寄存器操作,不能针对存储器。,(4)数据处理指令对程序状态寄存器CPSR的影响,选择“S”后缀问题:,指令中可以选择s后缀,以影响状态标志。但是比较指令(cmp、cmn、tst和teq)不需要后缀S,它们总会直接影响CPSR中的状态标志。,对CPSR中标志位的影响:,标志位:,如果结果为负,则标志位置;否则清。,标志位:,如果结果为,则标志位置;否则清。,标志位:,如果是加、减运算指令或比较指令时,标志位设置为的进位输出;否则设置为移位器的移位输出。如果不需要移位,则保持不变。,标志位:,在非加减操作中,标志位保持原值。在加减操作中,如果有溢出,则置;不发生溢出,则清。,(,5)数据处理指令的详细列表(未含6条乘法指令),操作码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,反向带进位减,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,2)算术运算指令,一、加减运算指令,(1,),ADD加法运算指令,指令格式,ADDcondS Rd,Rn,operand2,ADD指令将operand2的数据与Rn的值相加,结果保存到Rd寄存器,指令举例,ADDS R1,R1,#1 ;R1R1+1,ADDS R3,R1,R2,LSL#2;R3R1+R22,(2,),ADC带进位加法指令,指令格式,ADCcondS Rd,Rn,operand2,ADC指令将operand2的数据与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。,指令举例,ADDS R4,R0,R2 ;使用ADC实现64位加法,ADC R5,R1,R3 ;(R5、R4)(R1、R0)+(R3、R2),(3,),SUB减法运算指令,指令格式,SUBcondS Rd,Rn,operand2,SUB指令用寄存器Rn减去operand2,结果保存到Rd中。,指令举例,SUBS R0,R0,#l ;R0R0-1,SUB R6,R7,#0 x10 ;R6R7-0 x10,(4,),SBC带进位减法指令,指令格式,SBCcondS Rd,Rn,operand2,SBC指令用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的反码,结果保存到Rd中。,指令举例,SUBS R4,R0,R2 ;使用SBC实现64位减法,,SBC R5,R1,R3 ;(R5,R4)(R1,R0)-(R3,R2),(,5,),MUL32位乘法指令,指令格式如下:,MULcondS Rd,Rm,Rs ;Rd,Rm*Rs,MUL指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。,指令举例如下:,MUL R1,R2,R3 ;R1=R2R3,MULS R0,R3,R7 ;R0=R3R7,,;设置CPSR的N位和Z位,二、乘法指令,ARM有两类乘法指令:,32位的乘法指令,即乘法操作的结果为32位;,64位的乘法指令,即乘法操作的结果为64位。,助记符,说 明,操 作,MUL Rd,Rm,Rs,32位乘法指令,Rd,Rm*Rs(Rd,Rm),MUA Rd,Rm,Rs,Rn,32位乘加指令,Rd,Rm*Rs+Rn(Rd,Rm),UMULL RdL,RdH,Rm,Rs,Rn,64位无符号乘法,(RdL,RdH),Rm*Rs,UMAL RdL,RdH,Rm,Rs,Rn,64位无符号乘加,(RdL,RdH),Rm*Rs,SMULL RdL,RdH,Rm,Rs,Rn,64位有符号乘法,SMULL RdL,RdH,Rm,Rs,Rn,64位有符号乘加,乘法指令的特点,不支持第2操作数为立即数。,结果寄存器不能与第一源寄存器相同。,Rd、RdHi、RdLo不能与Rm为同一寄存器。,RdHi和RdLo不能为同一寄存器。,避免将R15定义为任一操作数或结果寄存器。,早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。,3,)逻辑运算指令,(1,),AND逻辑“与”操作指令,指令格式如下:,ANDcondS Rd,Rn,operand2,AND指令将operand2的值与寄存器Rn的值按位逻辑“与”操作,结果保存到Rd中。,指令举例如下:,ANDS R0,R0,#0 x01 ;R0R0&0 x01,;取出最低位数据,AND R2,R1,R3 ;R2R1&R3,AND指令可用于提取寄存器中某些位的值,。,(2,),ORR逻辑“或”操作指令,指令格式如下:,ORRcondS Rd,Rn,operand2,ORR指令将operand2的值与寄存器Rn的值按位逻辑“或”操作,结果保存到Rd中。,指令举例如下:,ORR R0,R0,#0 x0F ;将R0的低4位置1,ORR指令用于将寄存器中某些位的值设置成1。,4)数据传送指令,(1,),MOV数据传送指令,指令格式如下:,MOVcondS Rd,operand2,MOV指令将operand2传送到目标寄存器Rd中。,指令举例如下:,MOV,S,R3,R1,LSL#2 ;R3R12 ,,影响标志位,MOV PC,LR ;PC,LR,子程序返回,MOV指令的功能,寄存器之间传送,。,立即数传送到寄存器中,。(8位立即数位图),实现单纯的移位操作,。MOV Rd,Rd,LSL,#3,实现子程序调用、从子程序中返回,。当PC寄存器作为目标寄存器时可以实现程序跳转。,实现把当前处理器模式的SPSR寄存器内容复制到CPSR中,。,
展开阅读全文