首页 ARM的指令系统

ARM的指令系统

举报
开通vip

ARM的指令系统*ARM嵌入式体系结构与接口技术第3章ARM的指令系统*目录一、ARM指令格式二、寻址方式二、ARM指令后缀*一、ARM指令格式汇编指令由操作码字段和操作数字段两部分组成。操作码字段指示处理器所要执行的操作;操作数字段指出在指令执行操作的过程中所需要的操作数。指令的一般格式:操作码一般由指令助记符码、条件码等组成。操作数字段可以有两个或者三个,第一个操作数为目的操作数,后面的操作数为源操作数。 操作码 操作数 ······ 操作数*...

ARM的指令系统
*ARM嵌入式体系结构与接口技术第3章ARM的指令系统*目录一、ARM指令格式二、寻址方式二、ARM指令后缀*一、ARM指令格式汇编指令由操作码字段和操作数字段两部分组成。操作码字段指示处理器所要执行的操作;操作数字段指出在指令执行操作的过程中所需要的操作数。指令的一般格式:操作码一般由指令助记符码、条件码等组成。操作数字段可以有两个或者三个,第一个操作数为目的操作数,后面的操作数为源操作数。 操作码 操作数 ······ 操作数*基本格式如下:<opcode>{cond}{S}<Rd>,<Rn>{,operand2}其中:opcode指令助记符,如LDR.STR等。cond执行条件,如EQ、NE等。S是否影响CPSR寄存器的值, 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写时影响CPSRRd目标寄存器。Rn第一个操作数的寄存器。operand2第二个操作数。在这格式里,<>符号内的项是必须的,{}符号内的项是可选的。一、ARM指令格式*指令格式举例LDR R0,[R1];读取R1地址上的存储器单元内容,即R0←[R1],无条件执行BEQ Lable ;跳转指令B,执行条件EQ,即相等则程序跳转到Lable处ADD R1,R1,R2;加法指令,R1+R2→R1,即R1+R2的结果送给R1ADDSR1,R1,#1;加法指令,R1+1→R1,并影响状态寄存器(S)第3条指令的R2和第4条指令的#1都是第二操作数。第二操作数可以是:◎8位立即数,或者8位图立即数;◎寄存器值,或者寄存器的值移位得到的新数值。*ARM处理器具有6种基本寻址方式:①立即寻址;②寄存器寻址;③寄存器移位寻址;④寄存器间接寻址; ⑤基址寻址; ⑥多寄存器寻址。二、寻址方式*操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里。立即寻址方式经常用于给寄存器赋初值。例:立即寻址举例SUBR0,R0,#1 ;将R0减1,结果放入R0MOVR0,#0xFF ;将立即数0xFF装入R0寄存器2.1立即寻址*2.2寄存器寻址寄存器寻址是指:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器的编号,指令执行时直接取出寄存器值来操作。例:寄存器寻址举例MOV R1,R2 ;将R2的值存入R1中*寄存器移位寻址是ARM指令集特有的寻址方式,只能对操作数使用。2.3寄存器移位寻址MOV R0,R1,LSL#3 ;R1的值左移3位,结果放入R0,即R0=R1×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“与”操作, ;结果放入R1中LSL逻辑左移(LogicalShiftLeft),寄存器中字的低端空出的位补0;LSR逻辑右移(LogicalShiftRight),寄存器中字的高端空出的位补0;ASR算术右移(ArithmeticShiftRight),移位过程中保持符号位不变;ROR循环右移(ROtateRight),由字的低端移出的位填入字的高端;RRX带扩展的循环右移(RotateRighteXtendedby1place),操作数右移1位,高端空出的位用原C 标志 禁止坐卧标志下载饮用水保护区标志下载桥隧标志图下载上坡路安全标志下载地理标志专用标志下载 值填充,C标志值用移出的最低位填充。*移位操作示意图*2.4寄存器间接寻址LDRR1,[R2];将R2指向的存储单元的数据读出,即[R2]→R1ADDR1,R2,[R3];将R3指向的存储单元的数据与R2相加,;结果保存在R1中寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,寄存器为操作数的地址指针。例:寄存器间接寻址举例*2.5基址寻址基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。①前索引基址寻址方式,基址寄存器的值不改变。LDR R2,[R3,#0x0C] ;[R3+0x0C]→R2,基址寄存器R3的值保持不变②前索引基址寻址方式,基址寄存器的值发生变化。LDR R2,[R3,#0x0C]!;[R3+0x0C]→R2,基址寄存器R3=R3+0x0C③后索引基址寻址,基址寄存器的值发生变化。LDR R2,[R3],#0x0C ;[R3]→R2,基址寄存器R3=R3+0x0C*2.6多寄存器寻址LDMIAR1!,[R2-R7,R12];将R1指向的单元中的数据读出到R2-R7、R12中;(每读出一个数据,R1就自动加4,指向下一个数据的物理地址)一次对多个寄存器寻址称之为多寄存器寻址。使用多寄存器寻址指令时,寄存器名的顺序是由小到大排列,连续的寄存器可用“-”链接,否则用“,”分隔书写。*三、ARM指令后缀基本格式如下:<opcode>{cond}{*}<Rd>,<Rn>{,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+belsea=a–b ;否则a=a-b相应的ARM指令为:CMPR0,R1 ;R0与R1比较ADDCCR0,R0,R1 ;R0<R1时,本指令执行SUBHIR0,R0,R1 ;R0>R1时,本指令执行2.6条件后缀*其他后缀包括S后缀、!后缀、字长后缀、索引后缀、堆栈后缀、T后缀等等。①S后缀使用S后缀时,指令执行后程序状态寄存器的条件标志位将刷新。例:S后缀举例ADDR3,R5,R8 ;R3=R5+R8,条件标志位不刷新ADDSR3,R5,R8 ;R3=R5+R8,条件标志位刷新S后缀的使用目的:需要把此次指令执行的结果反映到条件标志位时候,就可以在这条指令的后面加上后缀S。比较指令不需要加S后缀,在执行时会自动刷新条件标志位。2.6其他后缀*②!后缀!后缀表示指令执行后,基址寄存器中的地址将发生变化。基址寄存器中的地址值(指令执行后)=指令执行前的值+地址偏移量LDMIAR1,[R0,#04];R1←[R0+#04]LDMIAR1,[R0,#04]!;R1←[R0+#04],并且R0=R0+#04!后缀的使用注意事项:◎后缀位于表达地址的表达式后面;◎地址表达式要有明确的地址偏移量。◎后缀不能用在R15(PC)后面。例:!后缀举例2.6其他后缀*③字长后缀字长后缀有四个:B,H,SB,SH。这些后缀都是跟在LDR/STR存储器访问指令助记符后面LDRR3,[R0,#20] ;R3←[R0+0x20],所传的数据是一个无符号字LDRBR3,[R0,#20] ;R3←[R0+0x20],所传的数据是一个无符号字节LDRSBR3,[R0,#20] ;R3←[R0+0x20],所传的数据是一个有符号字节LDRHR3,[R0,#20] ;R3←[R0+0x20],所传的数据是一个无符号半字例:带字长后缀的存储器加载指令2.6其他后缀 后缀符号 含义 B 传送的数据是无符号一字节(8位) H 传送的数据是无符号一个半字(16位) SB 传送的数据是一个有符号字节 SH 传送的数据是一个有符号半字*④索引后缀与堆栈后缀 索引后缀包括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.2ARM处理器的指令集 数据操作指令 存储器访问指令 分支跳转指令 协处理器指令 状态操作指令 异常产生指令* 3.2.1数据操作指令 数据操作指令是指对存放在寄存器中的数据进行操作的指令。包括数据传送指令、算术指令、逻辑指令、比较与测试指令及乘法指令。 如果在数据处理指令前使用S前缀,指令的执行结果将会影响CPSR中的标志位。 数据处理指令列表,右图:3.2ARM处理器的指令集* 3.2.1数据操作指令 1.MOV指令 MOV指令多用于设置初始值或者在寄存器间传送数据 (1)指令的语法格式:MOV{<cond>}{S}<Rd>,<shifter_operand> (2)指令举例 MOVR0,R0 ;R0=R0…NOP指令 MOVR0,R0,LSL#3 ;R0=R0*8 MOVPC,R14 ;退出到调用者,用于普通函数返回,PC即是R15 MOVSPC,R14 ;退出到调用者并恢复标志位,用于异常函数返回3.2ARM处理器的指令集如果R15是目的寄存器,将修改程序计数器或标志。这用于被调用的子函数结束后返回到调用代码,方法是把连接寄存器的内容传送到R15。MOVPC,R14 ;退出到调用者,用于普通函数返回,PC即是R15MOVSPC,R14 ;退出到调用者并恢复标志位,用于异常函数返回(3)指令的使用MOV指令主要完成以下功能。①将数据从一个寄存器传送到另一个寄存器。②将一个常数值传送到寄存器中。③实现无算术和逻辑运算的单纯移位操作,操作数乘以2n可以用左移n位来实现。④当PC(R15)用作目的寄存器时,可以实现程序跳转。如“MOVPC,LR”,所以这种跳转可以实现子程序调用及从子程序返回,代替指令“B,BL”。⑤当PC作为目标寄存器且指令中S位被设置时,指令在执行跳转操作的同时,将当前处理器模式的SPSR寄存器的内容复制到CPSR中。这种指令“MOVSPCLR”可以实现从某些异常中断中返回。* (3)指令的使用 ①将数据从一个寄存器传送到另一个寄存器②将一个常数值传送到寄存器中。③实现无算术和逻辑运算的单纯移位操作,操作数乘以2n可以用左移n位来实现④当PC(R15)用作目的寄存器时,可以实现程序跳转。如“MOVPC,LR”,所以这种跳转可以实现子程序调用及从子程序返回,代替指令“B,BL”⑤当PC作为目标寄存器且指令中S位被设置时,指令在执行跳转操作的同时,将当前处理器模式的SPSR寄存器的内容复制到CPSR中。这种指令“MOVSPCLR”可以实现从某些异常中断中返回。* 3.2.1数据操作指令 2.MVN指令 MVN指令多用于向寄存器传送一个负数或生成位掩码 (1)指令的语法格式:MNV{<cond>}{S}<Rd>,<shifter_operand> (2)指令举例 MVNR0,#4;R0=-5 MVNR0,#0;R0=-1 这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值。 (3)指令的使用 ①向寄存器中传送一个负数。 ②生成位掩码(BitMask)。 ③求一个数的反码。3.2ARM处理器的指令集* 3.2.1数据操作指令 3.AND指令 AND指令将shifter_operand表示的数值与寄存器Rn的值按位(bitwise)做逻辑与操作,并将结果保存到目标寄存器Rd中,同时根据操作的结果更新CPSR寄存器。 (1)指令的语法格式:AND{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)指令举例 ①保留R0中的0位和1位,丢弃其余的位。 ANDR0,R0,#3 ②R2 = R1&R3。 ANDR2,R1,R3 ③R0 = R0&0x01,取出最低位数据。 ANDSR0,R0,#0x013.2ARM处理器的指令集* 3.2.1数据操作指令 4.EOR指令 EOR(ExclusiveOR)指令将寄存器Rn中的值和shifter_operand的值执行按位“异或”操作,并将执行结果存储到目的寄存器Rd中,同时根据指令的执行结果更新CPSR中相应的条件标志位。 (1)指令的语法格式:EOR{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)指令举例 ①反转R0中的位0和1: EORR0,R0,#3 ②将R1的低4位取反: EORR1,R1,#0x0F ③R2 = R1∧R0: EORR2,R1,R0 ④将R5和0x01进行逻辑异或,结果保存到R0,并根据执行结果设置标志位。 EORSR0,R5,#0x013.2ARM处理器的指令集* 3.2.1数据操作指令 5.SUB指令:SUB(Subtract)指令从寄存器Rn中减去shifter_operand表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 SUB{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)SUB指令举例 ①R0=R1−R2。 SUBR0,R1,R2 ②R0=R1−256。 SUBR0,R1,#256 ③R0=R2−(R3<<1)。 SUBR0,R2,R3,LSL#13.2ARM处理器的指令集* 3.2.1数据操作指令 6.RSB指令:RSB(ReverseSubtract)指令从寄存器shifter_operand中减去Rn表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 RSB{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)RSB指令举例 下面指令序列可以求一个64位数值的负数。64位数放在寄存器R0与R1中,其负数放在R2和R3中。其中R0与R2中放低32位值。 RSBSR2,R0,#0 RSCR3,R1,#03.2ARM处理器的指令集* 3.2.1数据操作指令 7.ADD指令:ADD指令将寄存器shifter_operand的值加上Rn表示的数值,并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 ADD{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)ADD指令举例 ADDR0,R1,R2 ;R0=R1+R2 ADDR0,R1,#256 ;R0=R1+256 ADDR0,R2,R3,LSL#1 ;R0=R2+(R3<<1)3.2ARM处理器的指令集* 3.2.1数据操作指令 8.ADC指令:ADC指令将寄存器shifter_operand的值加上Rn表示的数值,再加上CPSR中的C条件标志位的值,将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 ADC{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)ADC指令举例:两个128位的数相加 128位结果:寄存器R0、R1、R2和R3 第一个128位数:寄存器R4、R5、R6和R7 第二个128位数:寄存器R8、R9、R10和R11。 ADDSR0,R4,R8;加低端的字 ADCSR1,R5,R9;加下一个字,带进位 ADCSR2,R6,R10;加第三个字,带进位 ADCSR3,R7,R11;加高端的字,带进位3.2ARM处理器的指令集* 3.2.1数据操作指令 9.SBC指令:SBC(SubtractwithCarry)指令用于执行操作数大于32位时的减法操作。该指令从寄存器Rn中减去shifter_operand表示的数值,再减去寄存器CPSR中C条件标志位的反码[NOT(Carryflag)],并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 SBC{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)SBC指令举例:下面的程序使用SBC实现64位减法,(R1,R0)−(R3,R2),结果存放到(R1,R0) SUBSR0,R0,R2 SBCSR1,R1,R33.2ARM处理器的指令集* 3.2.1数据操作指令 10.RSC指令:RSC(ReverseSubtractwithCarry)指从寄存器shifter_operand中减去Rn表示的数值,再减去寄存器CPSR中C条件标志位的反码[NOT(CarryFlag)],并将结果保存到目标寄存器Rd中,并根据指令的执行结果设置CPSR中相应的标志位。 (1)指令的语法格式 RSC{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)RSC指令举例 下面程序使用RSC指令实现求64位数值的负数。 RSBSR2,R0,#0 RSCR3,R1,#03.2ARM处理器的指令集* 3.2.1数据操作指令 11.TST测试指令:TST(Test)测试指令用于将一个寄存器的值和一个算术值进行比较。条件标志位根据两个操作数做“逻辑与”后的结果设置。 (1)指令的语法格式 TST{<cond>}<Rn>,<shifter_operand> (2)TST指令举例 TST指令类似于CMP指令,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用TST指令来检查是否设置了特定的位。操作数1是要测试的数据字而操作数2是一个位掩码。经过测试后,如果匹配则设置Zero标志,否则清除它。与CMP指令一样,该指令不需要指定S后缀。 下面的指令测试在R0中是否设置了位0 TSTR0,#%13.2ARM处理器的指令集* 3.2.1数据操作指令 12.TEQ指令:TEQ(TestEquivalence)指令用于将一个寄存器的值和一个算术值做比较。条件标志位根据两个操作数做“逻辑异或”后的结果设置。以便后面的指令根据相应的条件标志来判断是否执行。 (1)指令的语法格式 TEQ{<cond>}<Rn>,<shifter_operand> (2)TEQ指令举例 下面的指令是比较R0和R1是否相等,该指令不影响CPSR中的V位和C位。 TEQR0,R1 TST指令与EORS指令的区别在于TST指令不保存运算结果。使用TEQ进行相等测试,常与EQ和NE条件码配合使用,当两个数据相等时,条件码EQ有效;否则条件码NE有效。3.2ARM处理器的指令集* 3.2.1数据操作指令 13.CMP指令:CMP(Compare)指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。 (1)指令的语法格式 CMP{<cond>}<Rn>,<shifter_operand> (2)CMP指令举例 ①比较R1和立即数10并设置相关的标志位。 CMPR1,#10 ②比较寄存器R1和R2中的值并设置相关的标志位。 CMPR1,R2 CMP指令与SUBS指令的区别在于CMP指令不保存运算结果,在进行两个数据大小判断时,常用CMP指令及相应的条件码来进行操作3.2ARM处理器的指令集* 3.2.1数据操作指令 14.CMN指令:CMN(CompareNegative)指令使用寄存器Rn的值减去operand2的负数值(加上operand2),根据操作的结果更新CPSR中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。 (1)指令的语法格式 CMN{<cond>}<Rn>,<shifter_operand> (2)CMN指令举例 CMPRn,#0 CMNRn,#0 第1条指令使标志位C值为1,第2条指令使标志位C值为0 使R0值加1,判断R0是否为1的补码,若是,则Z置位 CMNR0,#13.2ARM处理器的指令集* 3.2.1数据操作指令 15.ORR指令:ORR(LogicalOR)为逻辑或操作指令,它将第2个源操作数shifter_operand的值与寄存器Rn的值按位做“逻辑或”操作,结果保存到Rd中。 (1)指令的语法格式 ORR{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)ORR指令举例 ①设置R0中位0和1。 ORRR0,R0,#3 ②将R0的低4位置1。 ORRR0,R0,#0x0F ③使用ORR指令将R2的高8位数据移入到R3的低8位中。 MOVR1,R2,LSR#8 ORRR3,R1,R3,LSL#83.2ARM处理器的指令集* 3.2.1数据操作指令 16.BIC位清零指令:BIC(BitClear)位清零指令,将寄存器Rn的值与第2个源操作数shifter_operand的值的反码按位做“逻辑与”操作,结果保存到Rd中。 (1)指令的语法格式 BIC{<cond>}{S}<Rd>,<Rn>,<shifter_operand> (2)BIC指令举例 ①清除R0中的位0、1和3,保持其余的不变。 BICR0,R0,#0x0B ②将R3的反码和R2逻辑与,结果保存到R1中。 BICR1,R2,R33.2ARM处理器的指令集* 3.2.2乘法指令 ARM乘法指令完成两个数据的乘法。两个32位二进制数相乘的结果是64位的积。 各种形式乘法指令3.2ARM处理器的指令集①“RdHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成的64位数,“[31∶0]”只选取结果的最低有效32位。②简单的赋值由“:=”表示。③累加(将右边加到左边)是由“+=”表示。各个乘法指令中的位S(参考下文具体指令的语法格式)控制条件码的设置会产生以下结果:(1)对于产生32位结果的指令形式,将标志位N设置为Rd的第31位的值;对于产生长结果的指令形式,将其设置为RdHi的第31位的值。(2)对于产生32位结果的指令形式,如果Rd等于零,则标志位Z置位;对于产生长结果的指令形式,RdHi和RdLo同时为零时,标志位Z置位。(3)将标志位C设置成无意义的值。(4)标志位V不变。* 3.2.2乘法指令 1.MUL指令:MUL(Multiply)32位乘法指令将Rm和Rs中的值相乘,结果的最低32位保存到Rd中。 (1)指令的语法格式 MUL{<cond>}{S}<Rd>,<Rm>,<Rs> (2)指令举例 ①R1=R2×R3。 MULR1,R2,R3 ②R0=R3×R7,同时设置CPSR中的N位和Z位。 MULSR0,R3,R73.2ARM处理器的指令集* 3.2.2乘法指令 2.MLA乘—累加指令:MLA(MultiplyAccumulate)32位乘—累加指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的最低32位保存到Rd中。 (1)指令的语法格式 MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn> (2)指令举例 下面指令完成R1=R2×R3+10的操作。 MOVR0,#0x0A MLAR1,R2,R3,R03.2ARM处理器的指令集* 3.2.2乘法指令 2.MLA乘—累加指令:MLA(MultiplyAccumulate)32位乘—累加指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的最低32位保存到Rd中。 (1)指令的语法格式 MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn> (2)指令举例 下面指令完成R1=R2×R3+10的操作。 MOVR0,#0x0A MLAR1,R2,R3,R03.2ARM处理器的指令集* 3.2.2乘法指令 3.UMULL指令:UMULL(UnsignedMultiplyLong)为64位无符号乘法指令。它将Rm和Rs中的值做无符号数相乘,结果的低32位保存到RdLo中,高32位保存到RdHi中。 (1)指令的语法格式 UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs> (2)指令举例 下面指令完成(R1,R0)=R5×R8操作。 UMULLR0,R1,R5,R8;3.2ARM处理器的指令集* 3.2.2乘法指令 4.UMLAL指令:UMLAL(UnsignedMultiplyAccumulateLong)为64位无符号长乘—累加指令。指令将Rm和Rs中的值做无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RsLo中,高32位保存到RdHi中。 (1)指令的语法格式 UMALL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs> (2)指令举例 下面的指令完成(R1,R0)=R5×R8+(R1,R0)操作。 UMLALR0,R1,R5,R8;3.2ARM处理器的指令集* 3.2.2乘法指令 5.SMULL指令:SMULL(SignedMultiplyLong)为64位有符号长乘法指令。指令将Rm和Rs中的值做有符号数相乘,结果的低32位保存到RsLo中,高32位保存到RdHi中。 (1)指令的语法格式 SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs> (2)指令举例 下面的指令完成(R3,R2)=R7×R6操作。 SMULLR2,R3,R7,R6;3.2ARM处理器的指令集* 3.2.2乘法指令 6.SMLAL指令:SMLAL(SignedMultiplyAccumulateLong)为64位有符号长乘—累加指令。指令将Rm和Rs中的值做有符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RsLo中,高32位保存到RdHi中。 (1)指令的语法格式 SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs> (2)指令举例 下面的指令完成(R3,R2)=R7×R6+(R3,R2)操作。 SMLALR2,R3,R7,R6;3.2ARM处理器的指令集* 3.2.3Load/Store指令 Load/Store内存访问指令在ARM寄存器和存储器之间传送数据。ARM指令中有3种基本的数据传送指令。 1.单寄存器Load/Store指令(SingleRegister) 这些指令在ARM寄存器和存储器之间提供更灵活的单数据项传送方式。数据项可以是字节、16位半字或32位字。 2.多寄存器Load/Store内存访问指令 这些指令的灵活性比单寄存器传送指令差,但可以使大量的数据更有效地传送。它们用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据。 3.单寄存器交换指令(SingleRegisterSwap) 这些指令允许寄存器和存储器中的数值进行交换,在一条指令中有效地完成Load/Store操作。它们在用户级编程中很少用到。它的主要用途是在多处理器系统中实现信号量(Semaphores)的操作,以保证不会同时访问公用的数据结构。3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(8位)、半字(16位)和字(32位)。 单寄存器Load/Store指令3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 1.LDR指令:用于从内存中将一个32位的字读取到目标寄存器 (1)指令的语法格式 LDR{<cond>}<Rd>,<addr_mode> (2)指令举例 LDRR1,[R0,#0x12];将R0+12地址处的数据读出,保存到R1中(R0的值不变) LDRR1,[R0] ;将R0地址处的数据读出,保存到R1中(零偏移) LDRR1,[R0,R2] ;将R0+R2地址的数据读出,保存到R1中(R0的值不变) LDRR1,[R0,R2,LSL#2];将R0+R2×4地址处的数据读出,保存到R1中(R0、R2的值不变) LDRRd,label ;label为程序标号,label必须是当前指令的-4~4KB范围内 LDRRd,[Rn],#0x04;Rn的值用作传输数据的存储地址。在数据传送后,将偏移量0x04与Rn相加,结果写回到Rn中。Rn不允许是R153.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 2.STR指令:用于将一个32位的字数据写入到指令中指定的内存单元 (1)指令的语法格式 STR{<cond>}<Rd>,<addr_mode> (2)指令举例 LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等,若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。 ①变量访问 NumCountEQU0x40003000;定义变量NumCount LDRR0,=NumCount ;使用LDR伪指令装载NumCount的地址到R0 LDRR1,[R0] ;取出变量值 ADDR1,R1,#1 ;NumCount=NumCount+1 STRR1,[R0] ;保存变量3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 ②GPIO设置 GPIO—BASEEQU0xe0028000;定义GPIO寄存器的基地址 … LDRR0,=GPIO—BASE LDRR1,=0x00ffff00 ;将设置值放入寄存器 STRR1,[R0,#0x0C] ;IODIR=0x00ffff00,IOSET的地址为0xE002800C ③程序散转 MOVR2,R2,LSL#2 ;功能号乘以4,以便查表 LDRPC,[PC,R2] ;查表取得对应功能子程序地址并跳转 NOP FUN—TABDCDFUN—SUB0 DCDFUN—SUB1 DCDFUN—SUB23.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 3.LDRB指令 LDRB指令根据addr_mode所确定的地址模式将一个8位字节读取到指令中的目标寄存器Rd。 指令的语法格式: LDR{<cond>}B<Rd>,<addr_mode>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 4.STRB指令 STRB指令从寄存器中取出指定的8位字节放入寄存器的低8位,并将寄存器的高位补0。 指令的语法格式: STR{<cond>}B<Rd>,<addr_mode>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 5.LDRH指令 LDRH指令用于从内存中将一个16位的半字读取到目标寄存器。 如果指令的内存地址不是半字节对齐的,指令的执行结果不可预知。 指令的语法格式: LDR{<cond>}H<Rd>,<addr_mode>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.1单寄存器的Load/Store指令 6.STRH指令 STRH指令从寄存器中取出指定的16位半字放入寄存器的低16位,并将寄存器的高位补0。 指令的语法格式: STR{<cond>}H<Rd>,<addr_mode>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.2多寄存器的Load/Store内存访问指令 多寄存器的Load/Store内存访问指令也叫批量加载/存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。LDM用于加载多个寄存器,STM用于存储多个寄存器。多寄存器的Load/Store内存访问指令允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器的Load/Store内存访问指令主要用于现场保护、数据复制和参数传递等。 多寄存器的Load/Store内存访问指令:3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.2多寄存器的Load/Store内存访问指令 1.LDM指令 LDM指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。 指令的语法格式:LDM{<cond>}<addressing_mode><Rn>{!},<registers> 寄存器R0~R15分别对应于指令编码中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,则相应的位等于1,否则为0。 LDM指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。 指令的语法格式: LDM{<cond>}<addressing_mode><Rn>,<registers_without_pc>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.2多寄存器的Load/Store内存访问指令 2.STM指令 STM指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器的操作。 指令的语法格式: STM{<cond>}<addressing_mode><Rn>{!},<registers> STM指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作及进入子程序时保存相关寄存器等操作。 指令的语法格式: STM{<cond>}<addressing_mode><Rn>,<registers>3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.2多寄存器的Load/Store内存访问指令 3、数据传送指令应用 LDM/STM批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器,STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。指令格式如下 LDM{cond}<模式>Rn{!},regist{ˆ} STM{cond}<模式>Rn{!},regist{ˆ} LDM/STM的主要用途有现场保护、数据复制和参数传递等。其模式有8种,其中前面4种用于数据块的传输,后面4种是堆栈操作3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.2多寄存器的Load/Store内存访问指令 【举例】使用LDM/STM进行数据复制。 LDRR0,=SrcData ;设置源数据地址 LDRR1,=DstData ;设置目标地址 LDMIAR0,{R2~R9} ;加载8字数据到寄存器R2~R9 STMIAR1,{R2~R9} ;存储寄存器R2~R9到目标地址 【举例】使用LDM/STM进行现场寄存器保护,常在子程序或异常处理使用。 SENDBYTE STMFDSP!,{R0~R7,LR} ;寄存器压栈保护 … BLDELAY ;调用DELAY子程序 … LDMFDSP!,{R0~R7,PC} ;恢复寄存器,并返回3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.3单数据交换指令 交换指令是Load/Store指令的一种特例,它把一个内存单元的内容与寄存器内容交换。交换指令是一个原子操作(AtomicOperation),也就是说,在连续的总线操作中读/写一个存储单元,在操作期间阻止其他任何指令对该存储单元的读/写。 交换指令SWP:3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.3单数据交换指令 1.SWP字交换指令 SWP指令用于将内存中的一个字单元和一个指定寄存器的值相交换。操作过程如下:假设内存单元地址存放在寄存器<Rn>中,指令将<Rn>中的数据读取到目的寄存器Rd中,同时将另一个寄存器<Rm>的内容写入到该内存单元中。当<Rd>和<Rm>为同一个寄存器时,指令交换该寄存器和内存单元的内容。 指令的语法格式: SWP{<cond>}<Rd>,<Rm>,[<Rn>]3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.3单数据交换指令 2.SWPB字节交换指令 SWPB指令用于将内存中的一个字节单元和一个指定寄存器的低8位值相交换,操作过程如下:假设内存单元地址存放在寄存器<Rn>中,指令将<Rn>中的数据读取到目的寄存器Rd中,寄存器Rd的高24位设为0,同时将另一个寄存器<Rm>的低8位内容写入到该内存字节单元中。当<Rd>和<Rm>为同一个寄存器时,指令交换该寄存器低8位内容和内存字节单元的内容。 指令的语法格式: SWP{<cond>}B<Rd>,<Rm>,[<Rn>]3.2ARM处理器的指令集* 3.2.3Load/Store指令 3.2.3.3单数据交换指令 3.交换指令SWP应用 SWP指令举例: SWPR1,R1,[R0] ;将R1的内容与R0指向的存储单元内容进行交换 SWPBR1,R2,[R0] ;将R0指向的存储单元内容读取一字节数据到R1中(高24位清零),并将R2的内容写入到该内存单元中(最低字节有效) 使用SWP指令可以方便地进行信号量操作。 12C_SEMEQU0x40003000 … 12C_SEM_WAIT MOVR1,#0 LDRR0,=12C_SEM SWPR1,R1,[R0];取出信号量,并将其设为0 CMPR1,#0 ;判断是否有信号 BEQ12C_SEM_WAIT ;若没有信号则等待3.2ARM处理器的指令集* 3.2.4跳转指令 跳转(B)和跳转连接(BL)指令是改变指令执行顺序的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 方式。ARM一般按照字地址顺序执行指令,需要时使用条件执行跳过某段指令。只要程序必须偏离顺序执行,就要使用控制流指令来修改程序计数器。 跳转指令改变程序的执行 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 或者调用子程序。这种指令使得一个程序可以使用子程序、if-then-else结构及循环。执行流程的改变迫使程序计数器(PC)指向一个新的地址,ARMv5架构指令集包含的跳转指令如表所示。3.2ARM处理器的指令集* 3.2.4跳转指令 1.跳转指令B及带连接的跳转指令BL 跳转指令B使程序跳转到指定的地址执行程序。带连接的跳转指令BL将下一条指令的地址拷贝到R14(即返回地址连接寄存器LR)寄存器中,然后跳转到指定地址运行程序。 (1)指令的语法格式 B{L}{<cond>}<target_address> BL指令用于实现子程序调用。子程序的返回可以通过将LR寄存器的值复制到PC寄存器来实现。下面三种指令可以实现子程序返回。 ①BXR14(如果体系结构支持BX指令)。 ②MOVPC,R14。 ③当子程序在入口处使用了压栈指令: STMFDR13!,{<registers>,R14} 可以使用指令: LDMFDR13!,{<registers>,PC} 将子程序返回地址放入PC中。3.2ARM处理器的指令集需要注意的是,B和BL这两条指令和目标地址处的指令都要属于ARM指令集。两条指令都可以根据CPSR中的条件标志位的值决定指令是否执行。ARM汇编器通过以下步骤计算指令编码中的signed_immed_24。①将PC寄存器的值作为本跳转指令的基地址值。②从跳转的目标地址中减去上面所说的跳转的基地址,生成字节偏移量。由于ARM指令是字对齐的,该字节偏移量为4的倍数。③当上面生成的字节偏移量超过−33 554 432~+33 554 430时,不同的汇编器使用不同的代码产生策略。④否则,将指令编码字中的signed_immed_24设置成上述字节偏移量的bits[25∶2]。* 3.2.4跳转指令 1.跳转指令B及带连接的跳转指令BL (2)程序举例 ①程序跳转到LABLE标号处。 BLABLE; ADDR1,R2,#4 ADDR3,R2,#8 SUBR3,R3,R1 LABLE SUBR1,R2,#8 ②跳转到绝对地址0x1234处。 B0x1234 ③跳转到子程序func处执行,同时将当前PC值保存到LR中。 BLfunc ④条件跳转:当CPSR寄存器中的C条件标志位为1时,程序跳转到标号LABLE处执行。 BCCLABLE3.2ARM处理器的指令集* 3.2.4跳转指令 1.跳转指令B及带连接的跳转指令BL ⑤通过跳转指令建立一个无限循环。 LOOP ADDR1,R2,#4 ADDR3,R2,#8 SUBR3,R3,R1 BLOOP ⑥通过使用跳转使程序体循环10次。 MOVR0,#10 LOOP SUBSR0,#1 BNELOOP ⑦条件子程序调用示例。 CMPR0,#5;如果R0<5 BLLTSUB1;则调用 BLGESUB2;否则调用SUB23.2ARM处理器的指令集* 3.2.4跳转指令 2.BX带状态切换的跳转指令BX BX使程序跳转到指令中指定的参数Rm指定的地址执行程序,Rm的第0位拷贝到CPSR中T位,bit[31∶1]移入PC。若Rm的bit[0]为1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码;若Rm的位bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址代码解释为ARM代码。 (1)指令的语法格式 BX{<cond>}<Rm> ①当Rm[1∶0]=0b10时,指令的执行结果不可预知。因为在ARM状态下,指令是4字节对齐的。 ②PC可以作为Rm寄存器使用,但这种用法不推荐使用。当PC作为<Rm>使用时,指令“BXPC”将程序跳转到当前指令下面第二条指令处执行。虽然这样跳转可以实现,但最好使用下面的指令完成这种跳转。 MOVPC,PC或ADDPC,PC,#03.2ARM处理器的指令集* 3.2.4跳转指令 2.BX带状态切换的跳转指令BX (2)指令举例 ①转移到R0中的地址,如果R0[0]=1,则进入Thumb状态。 BXR0; ②跳转到R0指定的地址,并根据R0的最低位来切换处理器状态 ADRLR0,ThumbFun+1; BXR0;3.2ARM处理器的指令集* 3.2.4跳转指令 3.带状态切换的连接跳转指令BLX 带连接和状态切换的跳转指令(BranchwithLinkExchange,BLX)使用标号,用于使程序跳转到Thumb状态或从Thumb状态返回。该指令为无条件执行指令,并用分支寄存器的最低位来更新CPSR中的T位,将返回地址写入到连接寄存器LR中。 (1)语法格式 BLX<target_add> 其中,<target_add>为指令的跳转目标地址。该地址根据以下规则计算。 ①将指令中指定的24位偏移量进行符号扩展,形成32位立即数。 ②将结果左移两位。 ③位H(bit[24])加到结果地址的第一位(bit[1])。 ④将结果累加进程序计数器(PC)中。3.2ARM处理器的指令集计算偏移量的工作一般由ARM汇编器来完成。这种形式的跳转指令只能实现−32~32MB空间的跳转。左移两位形成字偏移量,然后将其累加进程序计数器(PC)中。这时,程序计数器的内容为BX指令地址加8字节。位H(bit[24])也加到结
本文档为【ARM的指令系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
宝哥
资源教育工作者
格式:ppt
大小:629KB
软件:PowerPoint
页数:0
分类:
上传时间:2020-03-23
浏览量:13