马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。 这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。2种类型指令共有6条,如表所列
对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。 二进制编码 乘法的二进制编码如图所示
说明 表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下: 对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。 对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。 选择[31:0]意指只选取乘积结果的最低有效32位。 简单的赋值由“<-”表示。 累加(将右边加到左边)是由“+=”表示。 与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时: 根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。 在ARMV4及以前版本中,标志C和V不可靠; 在ARMV5及以后版本中,不影响标志C和V。 汇编格式 产生最低有效32位乘积的指令: MUL{<cond>}{S} Rd,Rm,Rs MULA{<cond>}{S} Rd,Rm,Rs,Rn 产生64位乘积的命令: <mul>{<cond>}{S}RdHi,RdLo,Rm,Rs 在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。 例子 形成两个矢量的标量积: MOV R11,#20 ;初始化循环计数 MOV R10,#0 ;初始化总和 LOOP LDR R0,[R8],#4 ;读取第一分量 LDR R1,[R9],#4 ;读取第二分量 MLA R10,R0,R1,R0 ;乘积累加 SUBS R11,R11,#1 ;减循环计数 BNE LOOP 乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35: ADD R0,R0,R0,LSL#2 ;R0`<-5×R0 RSB R0,R0,R0,LSL#3 ;R0``<-7×R0` 注意事项 它与其他数据处理指令的重要区别为: —不支持第2操作数为立即数 —结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。 应避免R15为任意操作数或结果寄存器。 早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |