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

ARM指令之乘法指令

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。) G. x' F# W) D1 [( ]3 z9 \1 k: v
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。
5 y) u5 E: j5 V# p对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。) i6 r& c  M/ u$ l( [
二进制编码
% x* C) f; s. L7 M4 E乘法的二进制编码
: D- Q7 V8 g2 Y" a" y4 O: a说明
. D4 {, {9 c; b! L1 t  M! o0 e表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:. U5 A' m2 O- \) c! q. g
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
0 G- E7 J: S# ]! F. c  M对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。
. F1 I# v/ o* g选择[31:0]意指只选取乘积结果的最低有效32位。
  v+ g: B) {) \0 h$ U/ [* E简单的赋值由“<-”表示。5 ~* y% e6 _/ t# B
累加(将右边加到左边)是由“+=”表示。$ e+ d4 k! J1 J
与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:( |* X7 R. l9 d
根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。4 N: K. z0 k1 T) }2 s5 T# `
在ARMV4及以前版本中,标志C和V不可靠;1 _. u8 n$ ^9 e1 H; {/ P, c
在ARMV5及以后版本中,不影响标志C和V。
$ v9 Y' j+ m! W汇编格式  ]: p2 t; y" e8 N  j- _
产生最低有效32位乘积的指令:
# i8 `7 `7 V% u; ~) m2 |* l; hMUL{<cond>}{S}        Rd,Rm,Rs# f# h! m* H- t  |9 g; ~
MULA{<cond>}{S}            Rd,Rm,Rs,Rn* `. \3 n. Z' q+ ]
产生64位乘积的命令:3 f! }: }; N1 C3 p- M9 d# j
<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs8 R. N5 D' E" a  \( l* E" ]* A0 p
在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。8 y2 g  k1 v& U- d2 @; E
例子
/ {/ u; X; ]% p( m) u4 K6 B形成两个矢量的标量积:8 m% p$ i/ Z) f+ [2 C
MOV             R11,#20                     ;初始化循环计数
+ c- s+ R5 C) @1 ?MOV             R10,#0                      ;初始化总和
* S& x$ ^! c" i' q' G' mLOOP     LDR              R0,[R8],#4                 ;读取第一分量$ F+ [  Y( @  o2 z; ^, h
              LDR              R1,[R9],#4                 ;读取第二分量) `$ \0 Z; y- d, I4 j; y1 M# U" r
              MLA              R10,R0,R1,R0       ;乘积累加
1 M6 R" u" x& k1 c4 r9 \              SUBS            R11,R11,#1              ;减循环计数. X/ u1 N  |- K2 P$ M/ I  h3 E1 }
              BNE              LOOP                  0 R9 I, O& |4 @" J) T
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
/ I  {1 Z0 d# }5 U  k- EADD              R0,R0,R0,LSL#2          ;R0`<-5×R0
+ `$ ~# j/ }+ |7 C1 Q8 L3 u" S9 JRSB               R0,R0,R0,LSL#3          ;R0``<-7×R0`" u4 }( I) j) Q6 h# t* x+ w$ [
注意事项1 F2 M3 p7 L+ t* \
它与其他数据处理指令的重要区别为:
1 c: E* P& r4 R* f  T$ I—不支持第2操作数为立即数0 z5 n1 q0 f7 O2 n% B
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。
9 _/ y. O! P3 u# R应避免R15为任意操作数或结果寄存器。+ F" \2 g) s! q( m+ R5 M
早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。

该用户从未签到

2#
发表于 2016-10-19 16:05 | 只看该作者
学习中,谢谢分享
( z/ @5 `* `" p5 w

该用户从未签到

4#
发表于 2016-10-20 15:23 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈& f- a: R' V: W8 x( ~% Q* @$ v

该用户从未签到

5#
发表于 2016-10-22 14:22 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈5 c1 Q% C3 d; z

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-19 17:15 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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