找回密码
 注册
关于网站域名变更的通知
查看: 664|回复: 5
打印 上一主题 下一主题

ARM指令之乘法指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-10-19 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。% p! x, \2 M; ^% I
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。2 r7 T* L8 z$ Z5 E+ f
对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。" D' P: |3 y" t; t( [( c4 s
二进制编码& J0 ~" U8 V% j* u" @; P3 ^& r
乘法的二进制编码
8 O2 A6 n/ g( t) T! w6 \说明
& G) ^; X2 h) b9 M( v+ Y. ~( a+ F9 d表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:1 b2 A) O2 B  U# G% W# v' ^! s# e
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
2 ~7 {  p+ }( M  L/ P0 c, s- D+ Y对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。# o7 Q0 @. S6 ?( q- f2 K' ~
选择[31:0]意指只选取乘积结果的最低有效32位。5 C! u: D$ g  e4 d5 e
简单的赋值由“<-”表示。
9 u2 z& ?' k, f0 `3 {累加(将右边加到左边)是由“+=”表示。
4 X( O) y" T0 J0 K/ q0 h* K与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:
8 X9 D( W3 j9 A$ ?( f+ d* `( M( y  q1 z根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。- w) {$ v9 x; ~' O, C5 J8 l7 H
在ARMV4及以前版本中,标志C和V不可靠;
' t  \! ~/ H: v4 _2 ?! q: ?在ARMV5及以后版本中,不影响标志C和V。5 ^+ y$ q6 @" A8 J! ^
汇编格式
, I5 d, A1 f, \产生最低有效32位乘积的指令:) f4 ]& H7 S2 P5 ~1 b( x( `. R
MUL{<cond>}{S}        Rd,Rm,Rs
" x( ?7 x- c  ]: a0 KMULA{<cond>}{S}            Rd,Rm,Rs,Rn. F. r6 b  D! g! }
产生64位乘积的命令:
7 I1 L" S0 f2 p" e( w<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs
" {& ^0 E  ^2 J在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。
9 b/ @! l' ~4 L3 }* e例子4 `: I% Z9 ]0 ?
形成两个矢量的标量积:6 ?7 _" S$ R6 D+ h& R
MOV             R11,#20                     ;初始化循环计数
# i2 s2 h+ S. C. lMOV             R10,#0                      ;初始化总和% k& m  @* ]& I0 C
LOOP     LDR              R0,[R8],#4                 ;读取第一分量% g; S9 D4 g9 ]
              LDR              R1,[R9],#4                 ;读取第二分量8 Q2 x  m* G& t8 m$ j+ m( R
              MLA              R10,R0,R1,R0       ;乘积累加
+ A) A7 D# {) Q5 K; _: p$ R              SUBS            R11,R11,#1              ;减循环计数. ?5 S( |( K' n) `% f3 c' A% s2 w) L5 p
              BNE              LOOP                  7 I9 d9 V8 |" D  `* R0 X$ \
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
/ b- x6 Z% J% \# e% OADD              R0,R0,R0,LSL#2          ;R0`<-5×R0
* E- J+ _- ~% f- {# C9 wRSB               R0,R0,R0,LSL#3          ;R0``<-7×R0`9 y6 I  A+ o. D$ W9 D7 o5 C5 t
注意事项+ @+ R9 A) P) a. h; R1 m  z3 H7 D
它与其他数据处理指令的重要区别为:
0 c7 U! u) P1 n# w—不支持第2操作数为立即数" P" U6 ^0 P9 t7 J8 M
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。
  b' s) q6 v+ k, c' J. g5 \  \1 Z应避免R15为任意操作数或结果寄存器。
9 I) G4 g6 \2 E; o+ s8 j早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。

该用户从未签到

2#
发表于 2016-10-19 16:05 | 只看该作者
学习中,谢谢分享0 X+ P7 l. o" ~# N

该用户从未签到

4#
发表于 2016-10-20 15:23 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
2 `! l4 [  ~& G* @* }" {# r

该用户从未签到

5#
发表于 2016-10-22 14:22 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈+ M: K0 T4 T8 h( M, c

该用户从未签到

6#
发表于 2017-11-19 18:44 | 只看该作者
GOOD!Thanks!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 12:24 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表