无符号有符号乘法_刘帅嵌入式系统-乘法指令

5ad05286f2da4c1e636938505334dd6d.png

ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条。

  • MUL:32位乘法指令
  • MLA:32位带加数的乘法指令
  • SMULL:64位有符号数乘法指令
  • SMLAL:64位带加数的有符号数乘法指令
  • UMULL:64位无符号数乘法指令
  • UMLAL:64位带加数的无符号数乘法指令

MUL

MUL指令实现两个32位的数(可以为无符号,也可以为有符号)的乘积,并将结果存放到一个32位的寄存器中,同时可以根据运算结果设置CPSR寄存器中相应的条件标志位。考虑指令执行的效率,指令中所有操作数都存放在寄存器中。

指令的编码格式

ed7a6f4a992d1d081c285561ad2fdbd4.png

指令的语法格式

MUL{< cond >} {S} < Rd >, < Rm >, < Rs >

其中:

  • < cond >为指令执行的条件码。当忽略< cond >时,指令为无条件执行。
  • S决定指令的操作是否影响CPSR中的条件标志位N位和Z位的值。当有S时,指令更新CPSR中的条件标志位的值;当没有S时,指令不更新CPSR中的条件标志位的值。
  • < Rd >寄存器为目标寄存器。
  • < Rm >寄存器为第1个乘数所在的寄存器。
  • < Rs >为第2个乘数所在的寄存器。

指令操作的伪代码

if ConditionPass(cond) then Rd=(Rm * Rs)[31:0] if S==1 then N Flag=Rd[31] Z Flag=if Rd == 0 then 1 else 0 C Flag=unaffected /*See "C flag" note*/ V Flag=unaffected

指令的使用

由于两个32位的数相乘的结果位64位,而MUL指令仅仅保存了64位结果的低32位,所以对于带符号的和无符号的操作数来说,MUL指令执行的结果相同。

对于ARMv5及以上的版本,MULS指令不影响CPSR寄存器中的C条件标志位。对于以前的版本,MULS指令执行后,CPSR寄存器中的C条件标志位数值是不确定的。

寄存器< Rm >、< Rn >及< Rd >为 R15时,指令执行的结果不可预期。

示例

MUL R0, R1, R2 ;R0 = R1 * R2MULS R0, R1, R2 ;R0 = R1 * R2 同时设置CPSR中N位和Z位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值