ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类为64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条。
- MUL:32位乘法指令
- MLA:32位带加数的乘法指令
- SMULL:64位有符号数乘法指令
- SMLAL:64位带加数的有符号数乘法指令
- UMULL:64位无符号数乘法指令
- UMLAL:64位带加数的无符号数乘法指令
MUL
MUL指令实现两个32位的数(可以为无符号,也可以为有符号)的乘积,并将结果存放到一个32位的寄存器中,同时可以根据运算结果设置CPSR寄存器中相应的条件标志位。考虑指令执行的效率,指令中所有操作数都存放在寄存器中。
指令的编码格式
指令的语法格式
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位