本文主要是介绍ARM指令集——乘法指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类位64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条:
- MUL 32位乘法指令
- MLA 32位带加数的乘法指令
- SMULL 64位有符号数乘法指令
- SMLAL 64位带加数的有符号乘法指令
- UMULL 64位无符号数乘法指令
- UMLAL 64位带加数的无符号数乘法指令
下面一一介绍之:
1、MUL
考虑执行命令的效率,指令中所有的操作数都放在寄存器中。
指令的语法格式:
MUL{<cond>}{S} <Rd>, <Rm>, <Rs>
指令操作的伪代码:
if ConditionPassed(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
V Flag = unaffected
指令的使用:
由于两个32位的数相乘结果为64位,而MUL指令仅仅保存了64位结果的低32位,所以对带符号的和无符号的操作数来说MUL指令执行的结果相同。
2、MLA
MLA指令实现两个32位数(有无符号都可以)的乘积,再将乘积加上第3个操作数,并将结果存放到一个32位的寄存器中。考虑执行命令的效率,指令中所有的操作数都放在寄存器中。
指令的语法格式:
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn>
指令操作的伪代码:
if ConditionPassed(cond) then
Rd = (Rm * Rs + Rn)[31:0]
if S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = unaffected
V Flag = unaffected
3、SMULL
指令的语法格式:
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
指令操作的伪代码:
if ConditionPassed(cond) then
RdHi = (Rm * Rs)[63 : 32]
RdLo = (Rm * Rs)[31 : 0]
if S == 1 then
N Flag = RdHi[31]
Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
C Flag = unaffected
V Flag = unaffected
指令的使用:
SMULL R1, R2, R3, R4 ; R1 = (R3 * R4)的低32位
; R2 = (R3 * R4)的高32位
4、SMLAL
指令的语法格式:
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
指令操作的伪代码:
if ConditionPassed(cond) then
RdLo = (Rm * Rs)[31 : 0] + RdLo
RdHi = (Rm * Rs)[63 : 32] + RdHi + CarryFrom( (Rm * Rs)[31 : 0] + RdLo)
if S == 1 then
N Flag = RdHi[31]
Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
C Flag = unaffected
V Flag = unaffected
5、UMULL
指令的语法格式:
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
指令操作的伪代码:
if ConditionPassed(cond) then
RdHi = (Rm * Rs)[63 : 32]
RdLo = (Rm * Rs)[31 : 0]
if S == 1 then
N Flag = RdHi[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = unaffected
V Flag = unaffected
指令的使用:
UMULL R1, R2, R3, R4 ; R2 R1 = R3 * R4
6、UMLAL
指令的语法格式:
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
指令操作的伪代码:
if ConditionPassed(cond) then
RdLo = (Rm * Rs)[31 : 0] + RdLo
RdHi = (Rm * Rs)[63 : 32] + RdHi + CarryFrom( (Rm * Rs)[31 : 0] + RdLo)
if S == 1 then
N Flag = RdHi[31]
Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
C Flag = unaffected
V Flag = unaffected
这篇关于ARM指令集——乘法指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!