收藏 分销(赏)

ARM的指令系统PPT课件.ppt

上传人:丰**** 文档编号:9178412 上传时间:2025-03-16 格式:PPT 页数:88 大小:1.36MB 下载积分:16 金币
下载 相关
ARM的指令系统PPT课件.ppt_第1页
第1页 / 共88页
ARM的指令系统PPT课件.ppt_第2页
第2页 / 共88页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,ARM嵌入式体系结构与接口技术,第,3,章,ARM,的指令系统,目录,一、ARM指令,格式,二、,寻址方式,二、ARM指令,后缀,一、,ARM指令,格式,汇编指令由,操作码字段,和,操作数字段,两部分组成。,操作码字段,指示处理器所要执行的操作;,操作数字段,指出在指令执行操作的过程中所需要的操作数。,指令的一般格式:,操作码,操作数,操作数,操作码一般由指令助记符码、条件码等组成。操作数字段可以有两个或者三个,第一个操作数为目的操作数,后面的操作数为源操作数。,基本格式如下:,cond S ,operand2,其中:,opcode 指令助记符,如LDR.STR等。,cond 执行条件,如EQ、NE等。,S,是否影响CPSR寄存器的值,书写时影响CPSR,Rd,目标寄存器。,Rn,第一个操作数的寄存器。,operand2,第二个操作数。,在这格式里,,符号内的项是必须的,,符号内的项是可选的。,一、,ARM指令,格式,指令格式举例,LDR R0,R1,;读取R1地址上的存储器单元内容,即R0R1,无条件执行,BEQ Lable,;跳转指令B,执行条件EQ,即相等则程序跳转到Lable处,ADD R1,R1,R2 ;加法指令,R1+R2R1,即R1+R2的结果送给R1,ADDS R1,R1,#1,;加法指令,R1+1R1,并影响状态寄存器(S),第3条指令的R2和第4条指令的#1都是第二操作数。,第二操作数可以是:,8位立即数,或者8位图立即数;,寄存器值,或者寄存器的值移位得到的新数值。,ARM,处理器具有,6,种基本寻址方式:,立即寻址;,寄存器寻址;,寄存器移位寻址;,寄存器间接寻址;,基址寻址;,多寄存器寻址。,二,、,寻址方式,操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里。立即寻址方式经常用于给寄存器赋初值。,例:立即寻址举例,SU,B,R0,R0,#1,;将R0减1,结果放入R0,MOV,R0,#0 xFF,;将立即数0 xFF装入R0寄存器,2,.1 立即寻址,2,.2 寄存器寻址,寄存器寻址是指:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器的编号,指令执行时直接取出寄存器值来操作。,例:寄存器寻址举例,MOV R1,,,R2,;将,R2,的值存入,R1,中,寄存器移位寻址是,ARM,指令集特有的寻址方式,只能对操作数使用。,2,.3 寄存器移位寻址,MOVR0,,,R1,,,LSL#3,;,R1,的值左移,3,位,结果放入,R0,,即,R0=R18,ANDSR1,,,R1,,,R2,,,LSL R3,;,R2,的值左移,R3,位,然后和,R1,相“与”操作,,;结果放入,R1,中,LSL,逻辑左移(,L,ogical,S,hift,L,eft),寄存器中字的低端空出的位补0;,LSR,逻辑右移(,L,ogical,S,hift,R,ight),寄存器中字的高端空出的位补0;,ASR 算术右移(,A,rithmetic,S,hift,R,ight),移位过程中保持符号位不变;,ROR 循环右移(,RO,tate,R,ight),由字的低端移出的位填入字的高端;,RRX 带扩展的循环右移(,R,otate,R,ight e,X,tended by 1 place),操作数右移1位,,高端空出的位用原C标志值填充,C标志值用移出的最低位填充。,移位操作示意图,2,.4 寄存器间接寻址,LDR,R1,R2 ;将R2指向的存储单元的数据读出,即R2R1,AD,D,R1,R2,R3 ;将R3指向的存储单元的数据与R2相加,,;,结果保存在R1中,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,寄存器为操作数的地址指针。,例:寄存器间接寻址举例,2.5,基址寻址,基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。,前索引基址寻址方式,基址寄存器的值不改变。,LDR R2,,,R3,,,#0 x0C,;,R3+0 x0C R2,,基址寄存器,R3,的值保持不变,前索引基址寻址方式,基址寄存器的值发生变化。,LDR R2,,,R3,,,#0 x0C,!,;,R3+0 x0CR2,,基址寄存器,R3=R3+0 x0C,后索引基址寻址,基址寄存器的值发生变化。,LDRR2,,,R3,,,#0 x0C,;,R3R2,,基址寄存器,R3=R3+0 x0C,2.6,多寄存器寻址,LDMIA R1,!,,R2-R7,R12,;将R1指向的单元中的数据读出到R2-R7、R12中,;(每读出一个数据,R1就自动加4,指向下一个数据的物理地址),一次对多个寄存器寻址称之为多寄存器寻址。使用多寄存器寻址指令时,寄存器名的顺序是由小到大排列,连续的寄存器可用“,-”,链接,否则用“,”分隔书写。,三,、ARM指令,后缀,基本格式如下:,cond,*,operand2,其中:,cond 执行条件,后缀,。,*,其他后缀:,S,后缀、!后缀、字长后缀、索引后缀、,T,后缀等等,编 码,条件助记符,标 志 位,含 义,0000,EQ,Z=1,相等,0001,NE,Z=0,不相等,0010,CS,C=1,无符号大于或等于,0011,CC,C=0,无符号小于,0100,MI,N=1,负值,0101,PL,N=0,正值或,0,0110,VS,V=1,溢出,0111,VC,V=0,无溢出,1000,HI,C=1,且,Z=0,无符号大于,1001,LS,C=0,且,Z=1,无符号小于或等于,1010,GE,N,和,V,相同,有符号大于或等于,1011,LT,N,和,V,不相同,有符号小于,1100,GT,Z=0,且,N,等于,V,有符号大于,1101,LE,Z=1,且,N,不等于,V,有符号小于或等于,1110,AL,任意,无条件执行(不推荐使用),1111,NV,任意,从不执行(不要使用),例,1,:指令的条件执行,无后缀(总是执行):,B Lable,;程序跳转到,Label,运行,有后缀,EQ,(相等才执行):,BEQ Lable,;前面运算结果相等才跳转到,Label,运行,例,2,:条件码举例,比较两个值的大小,并进行加减用算,C代码为:,if(a b)a=a+b,;如果,a b,,则,a=a+b,else a=a b,;否则,a=a-b,相应的,ARM,指令为:,CMP R0,,,R1,;,R0,与,R1,比较,ADD,CC,R0,,,R0,,,R1,;,R0 R1,时,本指令执行,2,.6,条件后缀,其他后缀包括,S,后缀、!后缀、字长后缀、索引后缀、堆栈后缀、,T,后缀等等。,S,后缀,使用,S,后缀时,指令执行后程序状态寄存器的条件标志位将刷新。,例:,S,后缀举例,ADD R3,,,R5,,,R8,;,R3=R5+R8,,条件标志位不刷新,ADDS R3,,,R5,,,R8,;,R3=R5+R8,,条件标志位刷新,S后缀的使用目的:需要把此次指令执行的结果反映到条件标志位时候,就可以在这条指令的后面加上后缀S。,比较指令不需要加S后缀,在执行时会自动刷新条件标志位。,2,.6,其他后缀,!后缀,!,后缀表示指令执行后,基址寄存器中的地址将,发生变化,。,基址寄存器中的地址值(指令执行后),=,指令执行前的值,+,地址偏移量,LDMIA R1,,,R0,#04,;,R1 R0+#04,LDMIA R1,,,R0,#04,!,;,R1 R0+#04,,并且,R0=R0+#04,!后缀的使用注意事项:,后缀位于表达地址的表达式后面;,地址表达式要有明确的地址偏移量。,后缀不能用在,R15,(,PC,)后面。,例:,!,后缀举例,2,.6,其他后缀,字长后缀,字长后缀有四个:,B,,,H,,,SB,,,SH,。这些后缀都是跟在,LDR/STR,存储器访问指令助记符后面,后缀符号,含义,B,传送的数据是无符号一字节(,8,位),H,传送的数据是无符号一个半字(,16,位),SB,传送的数据是一个有符号字节,SH,传送的数据是一个有符号半字,LDR R3,,,R0,#20,;,R3R0+0 x20,,所传的数据是一个无符号字,LDRB R3,,,R0,#20,;,R3R0+0 x20,,所传的数据是一个无符号字节,LDRSB R3,,,R0,#20,;,R3R0+0 x20,,所传的数据是一个有符号字节,LDRH R3,,,R0,#20,;,R3R0+0 x20,,所传的数据是一个无符号半字,例:带字长后缀的存储器加载指令,2,.6,其他后缀,索引后缀与堆栈后缀,索引后缀包括,IA,、,IB,、,DA,、,DB,;,堆栈后缀包括,FD,、,ED,、,FA,、,EA,。,这些后缀用于多寄存器加载,/,存储指令。,T,后缀,T,后缀含义是:指令在特权模式下对存储器的访问,将被存储器看成是用户模式的访问。,T,后缀一般只用在字传送和无符号字节传送中。,2,.6,其他后缀,1.3,堆栈概念,ARM7TDMI,内核中通常把寄存器,R13,作为堆栈栈顶指针(,SP,)。,栈的工作方式是“,先进后出,”,或称为“,后进先出,”。,出栈和入栈都会改变栈顶的位置。,入栈,与出栈,入,出,堆栈类型,堆栈按栈顶与栈底的物理位置可分为两种:,递增堆栈,:栈底的物理地址比栈顶的物理地址小。,递减堆栈,:栈底的物理地址比栈顶的物理地址大。,如果堆栈指针指向最后压入堆栈的有效数据项,称为,满堆栈,。,如果堆栈指针指向下一个待压入数据的空位置,称为,空堆栈,。,堆栈的四种类型:,1,、满递增,2,、空递增,3,、满递减,4,、空递减,堆栈后缀包括,FA、EA,、,FD、ED,。,字数据,A,以满递增堆栈为例进出栈示意图:,3.2 ARM,处理器的指令集,数据操作指令,存储器访问指令,分支跳转指令,协处理器指令,状态操作指令,异常产生指令,3.2.1,数据操作指令,数据操作指令是指对存放在寄存,器中的数据进行操作的指令。包括,数据传送指令、算术指令、逻辑指,令、比较与测试指令及乘法指令。,如果在数据处理指令前使用,S,前缀,指令的执行结果将会影响,CPSR,中的标志位。,数据处理指令列表,右图:,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,1,MOV,指令,MOV,指令多用于设置初始值或者在寄存器间传送数据,(,1,)指令的语法格式:,MOVS ,(,2,)指令举例,MOV R0,R0;R0=R0,NOP,指令,MOV R0,R0,LSL#3;R0=R0*8,MOV PC,R14;,退出到调用者,用于普通函数返回,,PC,即是,R15,MOVS PC,R14;,退出到调用者并恢复标志位,用于异常函数返回,3.2 ARM,处理器的指令集,(,3,)指令的使用,将数据从一个寄存器传送到另一个寄存器 将一个常数值传送到寄存器中。实现无算术和逻辑运算的单纯移位操作,操作数乘以,2,n,可以用左移,n,位来实现 当,PC,(,R15,)用作目的寄存器时,可以实现程序跳转。如,“,MOV PC,,,LR,”,,所以这种跳转可以实现子程序调用及从子程序返回,代替指令,“,B,,,BL,”,当,PC,作为目标寄存器且指令中,S,位被设置时,指令在执行跳转操作的同时,将当前处理器模式的,SPSR,寄存器的内容复制到,CPSR,中。这种指令,“,MOVS PC LR,”,可以实现从某些异常中断中返回。,3.2.1,数据操作指令,2,MVN,指令,MVN,指令多用于向寄存器传送一个负数或生成位掩码,(,1,)指令的语法格式:,MNVS ,(,2,)指令举例,MVN R0,#4 ;R0=-5,MVN R0,#0 ;R0=-1,这是逻辑非操作而不是算术操作,这个取反的值加,1,才是它的取负的值。,(,3,)指令的使用,向寄存器中传送一个负数。,生成位掩码(,Bit Mask,)。,求一个数的反码。,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,3,AND,指令,AND,指令将,shifter_operand,表示的数值与寄存器,Rn,的值按位(,bitwise,)做逻辑与操作,并将结果保存到目标寄存器,Rd,中,同时根据操作的结果更新,CPSR,寄存器。,(,1,)指令的语法格式:,ANDS ,(,2,)指令举例,保留,R0,中的,0,位和,1,位,丢弃其余的位。,AND R0,R0,#3,R2,=,R1&R3,。,AND R2,R1,R3,R0,=,R0&0 x01,,取出最低位数据。,ANDS R0,R0,#0 x01,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,4,EOR,指令,EOR,(,Exclusive OR,)指令将寄存器,Rn,中的值和,shifter_operand,的值执行按位,“,异或,”,操作,并将执行结果存储到目的寄存器,Rd,中,同时根据指令的执行结果更新,CPSR,中相应的条件标志位。,(,1,)指令的语法格式:,EORS ,(,2,)指令举例,反转,R0,中的位,0,和,1,:,EOR R0,R0,#3,将,R1,的低,4,位取反:,EOR R1,R1,#0 x0F,R2,=,R1R0,:,EOR R2,R1,R0,将,R5,和,0 x01,进行逻辑异或,结果保存到,R0,,并根据执行结果设置标志位。,EORS R0,R5,0 x01,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,5,SUB,指令:,SUB,(,Subtract,)指令从寄存器,Rn,中减去,shifter_operand,表示的数值,并将结果保存到目标寄存器,Rd,中,并根据指令的执行结果设置,CPSR,中相应的标志位。,(,1,)指令的语法格式,SUBS ,(,2,),SUB,指令举例,R0=R1 R2,。,SUB R0,R1,R2,R0=R1 256,。,SUB R0,R1,#256,R0=R2(R31),。,SUB R0,R2,R3,LSL#1,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,6,RSB,指令:,RSB,(,Reverse Subtract,)指令从寄存器,shifter_operand,中减去,Rn,表示的数值,并将结果保存到目标寄存器,Rd,中,并根据指令的执行结果设置,CPSR,中相应的标志位。,(,1,)指令的语法格式,RSBS ,(,2,),RSB,指令举例,下面指令序列可以求一个,64,位数值的负数。,64,位数放在寄存器,R0,与,R1,中,其负数放在,R2,和,R3,中。其中,R0,与,R2,中放低,32,位值。,RSBS R2,R0,0,RSC R3,R1,0,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,7,ADD,指令:,ADD,指令将寄存器,shifter_operand,的值加上,Rn,表示的数值,并将结果保存到目标寄存器,Rd,中,并根据指令的执行结果设置,CPSR,中相应的标志位。,(,1,)指令的语法格式,ADDS ,(,2,),ADD,指令举例,ADD R0,R1,R2;R0=R1+R2,ADD R0,R1,#256;R0=R1+256,ADD R0,R2,R3,LSL#1;R0=R2+(R3 1),3.2 ARM,处理器的指令集,3.2.1,数据操作指令,8ADC指令,:,ADC指令将寄存器shifter_operand的值加上Rn表示的数值,再加上CPSR中的C条件标志位的值,将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。,(,1,)指令的语法格式,ADCS ,(,2,),ADC,指令举例:两个,128,位的数相加,128,位结果:寄存器,R0,、,R1,、,R2,和,R3,第一个,128,位数:寄存器,R4,、,R5,、,R6,和,R7,第二个,128,位数:寄存器,R8,、,R9,、,R10,和,R11,。,ADDS R0,R4,R8 ;,加低端的字,ADCS R1,R5,R9 ;,加下一个字,带进位,ADCS R2,R6,R10 ;,加第三个字,带进位,ADCS R3,R7,R11 ;,加高端的字,带进位,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,9,SBC,指令:,SBC,(,Subtract with Carry,)指令用于执行操作数大于,32,位时的减法操作。该指令从寄存器,Rn,中减去,shifter_operand,表示的数值,再减去寄存器,CPSR,中,C,条件标志位的反码,NOT,(,Carry flag,),并将结果保存到目标寄存器,Rd,中,并根据指令的执行结果设置,CPSR,中相应的标志位。,(,1,)指令的语法格式,SBCS ,(,2,),SBC,指令举例:下面的程序使用,SBC,实现,64,位减法,(,R1,,,R0,)(,R3,,,R2,),结果存放到(,R1,,,R0,),SUBS R0,R0,R2,SBCS R1,R1,R3,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,10,RSC,指令:,RSC,(,Reverse Subtract with Carry,)指从寄存器,shifter_operand,中减去,Rn,表示的数值,再减去寄存器,CPSR,中,C,条件标志位的反码,NOT,(,Carry Flag,),并将结果保存到目标寄存器,Rd,中,并根据指令的执行结果设置,CPSR,中相应的标志位。,(,1,)指令的语法格式,RSCS ,(,2,),RSC,指令举例,下面程序使用,RSC,指令实现求,64,位数值的负数。,RSBS R2,R0,0,RSC R3,R1,0,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,11,TST,测试指令:,TST,(,Test,)测试指令用于将一个寄存器的值和一个算术值进行比较。条件标志位根据两个操作数做,“,逻辑与,”,后的结果设置。,(,1,)指令的语法格式,TST ,(,2,),TST,指令举例,TST,指令类似于,CMP,指令,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用,TST,指令来检查是否设置了特定的位。操作数,1,是要测试的数据字而操作数,2,是一个位掩码。经过测试后,如果匹配则设置,Zero,标志,否则清除它。与,CMP,指令一样,该指令不需要指定,S,后缀。,下面的指令测试在,R0,中是否设置了位,0,TST R0,#%1,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,12,TEQ,指令:,TEQ,(,Test Equivalence,)指令用于将一个寄存器的值和一个算术值做比较。条件标志位根据两个操作数做,“,逻辑异或,”,后的结果设置。以便后面的指令根据相应的条件标志来判断是否执行。,(,1,)指令的语法格式,TEQ ,(,2,),TEQ,指令举例,下面的指令是比较,R0,和,R1,是否相等,该指令不影响,CPSR,中的,V,位和,C,位。,TEQ R0,R1,TST,指令与,EORS,指令的区别在于,TST,指令不保存运算结果。使用,TEQ,进行相等测试,常与,EQ,和,NE,条件码配合使用,当两个数据相等时,条件码,EQ,有效;否则条件码,NE,有效。,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,13,CMP,指令:,CMP,(,Compare,)指令使用寄存器,Rn,的值减去,operand2,的值,根据操作的结果更新,CPSR,中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。,(,1,)指令的语法格式,CMP ,(,2,),CMP,指令举例,比较,R1,和立即数,10,并设置相关的标志位。,CMP R1,#10,比较寄存器,R1,和,R2,中的值并设置相关的标志位。,CMP R1,R2,CMP,指令与,SUBS,指令的区别在于,CMP,指令不保存运算结果,在进行两个数据大小判断时,常用,CMP,指令及相应的条件码来进行操作,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,14,CMN,指令:,CMN,(,Compare Negative,)指令使用寄存器,Rn,的值减去,operand2,的负数值(加上,operand2,),根据操作的结果更新,CPSR,中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。,(,1,)指令的语法格式,CMN ,(,2,),CMN,指令举例,CMP Rn,0,CMN Rn,0,第,1,条指令使标志位,C,值为,1,,第,2,条指令使标志位,C,值为,0,使,R0,值加,1,,判断,R0,是否为,1,的补码,若是,则,Z,置位,CMN R0,1,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,15,ORR,指令:,ORR,(,Logical OR,)为逻辑或操作指令,它将第,2,个源操作数,shifter_operand,的值与寄存器,Rn,的值按位做,“,逻辑或,”,操作,结果保存到,Rd,中。,(,1,)指令的语法格式,ORRS ,(,2,),ORR,指令举例,设置,R0,中位,0,和,1,。,ORR R0,R0,#3,将,R0,的低,4,位置,1,。,ORR R0,R0,#0 x0F,使用,ORR,指令将,R2,的高,8,位数据移入到,R3,的低,8,位中。,MOV R1,R2,LSR,8,ORR R3,R1,R3,LSL,8,3.2 ARM,处理器的指令集,3.2.1,数据操作指令,16,BIC,位清零指令:,BIC,(,Bit Clear,)位清零指令,将寄存器,Rn,的值与第,2,个源操作数,shifter_operand,的值的反码按位做,“,逻辑与,”,操作,结果保存到,Rd,中。,(,1,)指令的语法格式,BICS ,(,2,),BIC,指令举例,清除,R0,中的位,0,、,1,和,3,,保持其余的不变。,BIC R0,R0,#0 x0B,将,R3,的反码和,R2,逻辑与,结果保存到,R1,中。,BIC R1,R2,R3,3.2 ARM,处理器的指令集,3.2.2 乘法指令,ARM,乘法指令完成两个数据的乘法。两个,32,位二进制数相乘的结果是,64,位的积。,各种形式乘法指令,3.2 ARM,处理器的指令集,3.2.2 乘法指令,1,MUL,指令:,MUL,(,Multiply,),32,位乘法指令将,Rm,和,Rs,中的值相乘,结果的最低,32,位保存到,Rd,中。,(,1,)指令的语法格式,MULS ,(,2,)指令举例,R1=R2 R3,。,MUL R1,R2,R3,R0=R3 R7,,同时设置,CPSR,中的,N,位和,Z,位。,MULS R0,R3,R7,3.2 ARM,处理器的指令集,3.2.2 乘法指令,2,MLA,乘,累加指令:,MLA,(,Multiply Accumulate,),32,位乘,累加指令将,Rm,和,Rs,中的值相乘,再将乘积加上第,3,个操作数,结果的最低,32,位保存到,Rd,中。,(,1,)指令的语法格式,MLAS ,(,2,)指令举例,下面指令完成,R1=R2R3+10,的操作。,MOV R0,#0 x0A,MLA R1,R2,R3,R0,3.2 ARM,处理器的指令集,3.2.2 乘法指令,2,MLA,乘,累加指令:,MLA,(,Multiply Accumulate,),32,位乘,累加指令将,Rm,和,Rs,中的值相乘,再将乘积加上第,3,个操作数,结果的最低,32,位保存到,Rd,中。,(,1,)指令的语法格式,MLAS ,(,2,)指令举例,下面指令完成,R1=R2R3+10,的操作。,MOV R0,#0 x0A,MLA R1,R2,R3,R0,3.2 ARM,处理器的指令集,3.2.2 乘法指令,3,UMULL,指令:,UMULL,(,Unsigned Multiply Long,)为,64,位无符号乘法指令。它将,Rm,和,Rs,中的值做无符号数相乘,结果的低,32,位保存到,RdLo,中,高,32,位保存到,RdHi,中。,(,1,)指令的语法格式,UMULLS ,(,2,)指令举例,下面指令完成,(R1,,,R0)=R5 R8,操作。,UMULL R0,R1,R5,R8;,3.2 ARM,处理器的指令集,3.2.2 乘法指令,4,UMLAL,指令:,UMLAL,(,Unsigned Multiply Accumulate Long,)为,64,位无符号长乘,累加指令。指令将,Rm,和,Rs,中的值做无符号数相乘,,64,位乘积与,RdHi,、,RdLo,相加,结果的低,32,位保存到,RsLo,中,高,32,位保存到,RdHi,中。,(,1,)指令的语法格式,UMALLS ,(,2,)指令举例,下面的指令完成,(R1,,,R0)=R5 R8+(R1,,,R0),操作。,UMLAL R0,R1,R5,R8;,3.2 ARM,处理器的指令集,3.2.2 乘法指令,5,SMULL,指令:,SMULL,(,Signed Multiply Long,)为,64,位有符号长乘法指令。指令将,Rm,和,Rs,中的值做有符号数相乘,结果的低,32,位保存到,RsLo,中,高,32,位保存到,RdHi,中。,(,1,)指令的语法格式,SMULLS ,(,2,)指令举例,下面的指令完成,(R3,,,R2)=R7 R6,操作。,SMULL R2,R3,R7,R6;,3.2 ARM,处理器的指令集,3.2.2 乘法指令,6,SMLAL,指令:,SMLAL,(,Signed Multiply Accumulate Long,)为,64,位有符号长乘,累加指令。指令将,Rm,和,Rs,中的值做有符号数相乘,,64,位乘积与,RdHi,、,RdLo,相加,结果的低,32,位保存到,RsLo,中,高,32,位保存到,RdHi,中。,(,1,)指令的语法格式,SMLALS ,(,2,)指令举例,下面的指令完成,(R3,,,R2)=R7 R6+(R3,,,R2),操作。,SMLAL R2,R3,R7,R6;,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,Load/Store,内存访问指令在,ARM,寄存器和存储器之间传送数据。,ARM,指令中有,3,种基本的数据传送指令。,1,单寄存器,Load/Store,指令(,Single Register,),这些指令在,ARM,寄存器和存储器之间提供更灵活的单数据项传送方式。数据项可以是字节、,16,位半字或,32,位字。,2,多寄存器,Load/Store,内存访问指令,这些指令的灵活性比单寄存器传送指令差,但可以使大量的数据更有效地传送。它们用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据。,3,单寄存器交换指令(,Single Register Swap,),这些指令允许寄存器和存储器中的数值进行交换,在一条指令中有效地完成,Load/Store,操作。它们在用户级编程中很少用到。它的主要用途是在多处理器系统中实现信号量(,Semaphores,)的操作,以保证不会同时访问公用的数据结构。,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(,8,位)、半字(,16,位)和字(,32,位)。,单寄存器,Load/Store,指令,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,1,LDR,指令:用于从内存中将一个,32,位的字读取到目标寄存器,(,1,)指令的语法格式,LDR ,(,2,)指令举例,LDR R1,R0,#0 x12;,将,R0+12,地址处的数据读出,保存到,R1,中(,R0,的值不变),LDR R1,R0 ;,将,R0,地址处的数据读出,保存到,R1,中(零偏移),LDR R1,R0,R2 ;,将,R0+R2,地址的数据读出,保存到,R1,中(,R0,的值不变),LDR R1,R0,R2,LSL#2;,将,R0+R24,地址处的数据读出,保存到,R1,中(,R0,、,R2,的值不变),LDR Rd,label ;label,为程序标号,,label,必须是当前指令的,-4,4KB,范围内,LDR Rd,Rn,0 x04;Rn,的值用作传输数据的存储地址。在数据传送后,将偏移量,0 x04,与,Rn,相加,结果写回到,Rn,中。,Rn,不允许是,R15,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,2,STR,指令:用于将一个,32,位的字数据写入到指令中指定的内存单元,(,1,)指令的语法格式,STR ,(,2,)指令举例,LDR/STR,指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等,若使用,LDR,指令加载数据到,PC,寄存器,则实现程序跳转功能,这样也就实现了程序散转。,变量访问,NumCount EQU 0 x40003000;,定义变量,NumCount,LDR R0,=NumCount ;,使用,LDR,伪指令装载,NumCount,的地址到,R0,LDR R1,R0 ;,取出变量值,ADD R1,R1,1 ;NumCount=NumCount+1,STR R1,R0 ;,保存变量,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,GPIO,设置,GPIO,BASE EQU 0 xe0028000;,定义,GPIO,寄存器的基地址,LDR R0,=GPIO,BASE,LDR R1,=0 x00ffff00;,将设置值放入寄存器,STR R1,R0,#0 x0C;IODIR=0 x00ffff00,IOSET,的地址为,0 xE002800C,程序散转,MOV R2,R2,LSL#2;,功能号乘以,4,,以便查表,LDR PC,PC,R2;,查表取得对应功能子程序地址并跳转,NOP,FUN,TAB DCD FUN,SUB0,DCD FUN,SUB1,DCD FUN,SUB2,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,3,LDRB,指令,LDRB,指令根据,addr_mode,所确定的地址模式将一个,8,位字节读取到指令中的目标寄存器,Rd,。,指令的语法格式:,LDRB ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,4STRB指令,STRB指令从寄存器中取出指定的8位字节放入寄存器的低8位,并将寄存器的高位补0。,指令的语法格式:,STRB ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,5,LDRH,指令,LDRH,指令用于从内存中将一个,16,位的半字读取到目标寄存器。,如果指令的内存地址不是半字节对齐的,指令的执行结果不可预知。,指令的语法格式:,LDRH ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.1,单寄存器的,Load/Store,指令,6STRH指令,STRH指令从寄存器中取出指定的16位半字放入寄存器的低16位,并将寄存器的高位补0。,指令的语法格式:,STRH ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.2 多寄存器的Load/Store内存访问指令,多寄存器的,Load/Store,内存访问指令也叫批量加载,/,存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。,LDM,用于加载多个寄存器,,STM,用于存储多个寄存器。多寄存器的,Load/Store,内存访问指令允许一条指令传送,16,个寄存器的任何子集或所有寄存器。多寄存器的,Load/Store,内存访问指令主要用于现场保护、数据复制和参数传递等。,多寄存器的,Load/Store,内存访问指令:,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.2 多寄存器的Load/Store内存访问指令,1,LDM,指令,LDM,指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。当,PC,包含在,LDM,指令的寄存器列表中时,指令从内存中读取的字数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。,指令的语法格式:,LDM !,寄存器,R0,R15,分别对应于指令编码中,bit0,bit15,位。如果,Ri,存在于寄存器列表中,则相应的位等于,1,,否则为,0,。,LDM,指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。,指令的语法格式:,LDM ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.2 多寄存器的Load/Store内存访问指令,2,STM,指令,STM,指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器的操作。,指令的语法格式:,STM !,STM,指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器等操作。,指令的语法格式:,STM ,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.2 多寄存器的Load/Store内存访问指令,3,、数据传送指令应用,LDM/STM,批量加载,/,存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。,LDM,为加载多个寄存器,,STM,为存储多个寄存器。允许一条指令传送,16,个寄存器的任何子集或所有寄存器。指令格式如下,LDMcond Rn!,regist,STMcond Rn!,regist,LDM/STM,的主要用途有现场保护、,数据复制和参数传递等。其模式有,8,种,,其中前面,4,种用于数据块的传输,后面,4,种是堆栈操作,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.2 多寄存器的Load/Store内存访问指令,【,举例,】,使用,LDM/STM,进行数据复制。,LDR R0,=SrcData;,设置源数据地址,LDR R1,=DstData;,设置目标地址,LDMIA R0,R2,R9;,加载,8,字数据到寄存器,R2,R9,STMIA R1,R2,R9;,存储寄存器,R2,R9,到目标地址,【,举例,】,使用,LDM/STM,进行现场寄存器保护,常在子程序或异常处理使用。,SENDBYTE,STMFD SP!,R0,R7,LR;,寄存器压栈保护,BL DELAY;,调用,DELAY,子程序,LDMFD SP!,R0,R7,PC;,恢复寄存器,并返回,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.3,单数据交换指令,交换指令是,Load/Store,指令的一种特例,它把一个内存单元的内容与寄存器内容交换。交换指令是一个原子操作(,Atomic Operation,),也就是说,在连续的总线操作中读,/,写一个存储单元,在操作期间阻止其他任何指令对该存储单元的读,/,写。,交换指令,SWP,:,3.2 ARM,处理器的指令集,3.2.3 Load/Store,指令,3.2.3.3,单数据交换指令,1,SWP,字交换指令,SWP,指令用
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服