ARM乘法指令完成兩個數據的乘法,兩個32位二進制數相乘的結果是64位的4積。
其中:
1、“RadHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)鏈接形成的64位數,“[31:0]”只選取結果的最低有效32位
2、簡單的賦值由“:=”表示
3、累加(將右邊加到左邊)是由“+=”表示
一、MUL乘法指令
1、作用
將Rm和Rs中的值相乘,結果的最低32位保存到Rd中
2、語法格式
MUL{<condition>}{S} <Rd>,<Rm>,<Rs>
3、參數說明
3.1、S:S位(bit[20])決定指令的操作是否影響CPSR中的條件標志位N位和Z位的值。當S=1時,跟新CPSR中的條件標志位的值;當S=0,指令不更新CPSR中的條件標志位。
3.2、<Rd>:寄存器位目標寄存器
3.3、<Rm>:第一個乘數所在寄存器
3.4、<Rs>:第二個乘數所在寄存器
4、舉例:
R1=R2*R3用指令表示為 MUL R1,R2,R3
二、MLA乘-累加指令
1、作用
將Rm和Rs中的值相乘,再將乘積加上第三個操作數,結果的最低32保存到Rd中
2、語法格式
MLA{<condition>}{S} <Rd>,<Rm>,<Rs>,<Rn>
3、參數說明:
3.1、<Rd>:寄存器位目標寄存器
3.2、<Rm>:第一個乘數所在寄存器
3.3、<Rs>:第二個乘數所在寄存器
3.4、<Rn>:將要累加到<Rm>*<Rs>結果中的第三操作數
4、舉例說明
R1=R2*R3+10用指令表示為 :
MOV R0,#0x0A
MLA R1,R2,R3,R0
三、UMULL無符號數長乘指令
1、作用
UMULL為64位無符號乘法指令,指令將Rm和Rs中的值做無符號數相乘,結果的低32位保存到RsLo中,而高32位保存到RdHi中。
2、語法格式
UMULL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
3、參數說明
3.1、<RdLo>:寄存器位目標寄存器,存儲結果的低32位值
3.2、<RdHi>:寄存器位目標寄存器,存儲結果的高32位值
3.3、<Rm>:第一個乘數寄存器
3.4、<Rs>:第二個乘數寄存器
4、舉例
完成(R1,R0)=R5*R8操作
UMULL R0,R1,R5,R8
四、UMLAL無符號長乘-累加操作指令
1、作用
UMLAL位64位無符號長乘-累加指令,指令將Rm和Rs中的值做無符號數相乘,64位乘積與RdHi,RdLo相加,結果的低32位保存到RsLo中,而高32位保存到RdHi中。
2、語法格式
UMLAL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
3、舉例
完成(R1,R0)=R5*R8+(R1,R0)操作
UMLAL R0,R1,R5,R8
五、SMULL有符號數長乘操作指令
1、作用
SMULL64位有符號長乘指令,指令將Rm和Rs中的值做有符號數相乘,結果的低32位保存到RsLo中,而高32位保存到RdHi中
2、語法格式
SMULL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
3、實例
完成(R3,R2)=R7*R6
SMULL R2,R3,R7,R6
六、SMLAL有符號長乘-累加操作指令
1、作用
SMLAL為64位有符號長乘法指令,指令將Rm和Rs中的值做有符號數相乘,64位乘積與RdHi,RdLo相加,結果的低32位保存到RsLo中,而高32位保存到RdHi中。
2、語法指令
SMLAL{<condition>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
3、實例
完成(R3,R2)=R7*R6+(R3,R2)
SMLAL R2,R3,R7,R6