00. 目录
01. 乘法指令概述
ARM 乘法指令完成两个数据的乘法。两个 32 位二进制数相乘的结果是 64 位的积。在有些 ARM 的处理器版本中,将乘积的结果保存到两个独立的寄存器中。另外一些版本只将最低有效 32 位存放到一个寄存器中。无论是哪种版本的处理器,都有乘—累加的变型指令,将乘积连续累加得到总和。而且有符号数和无符号数都能使用。对于有符号数和无符号数,结果的最低有效位是一样的。因此,对于只保留 32 位结果的乘法指令,不需要区分有符号数和无符号数这两种情况。
如表 3-7 所示为各种形式乘法指令的功能。
其中:
(1)“RdHi:RdLo”是由 RdHi(最高有效 32 位)和 RdLo(最低有效 32 位)连接形成的 64 位数,“[31:0]”只选取结果的最低有效 32 位。
(2)简单的赋值由“:=”表示。
(3)累加(将右边加到左边)是由“+ =”表示。
各个乘法指令中的位 S(参考下文具体指令的语法格式)控制条件码的设置会产生以下结果。
① 对于产生 32 位结果的指令形式,将标志位 N 设置为 Rd 的第 31 位的值;对于产生长结果的指令形式,将其设置为 RdHi 的第 31 位的值。
② 对于产生 32 位结果的指令形式,如果 Rd 等于零,则标志位 Z 置位;对于产生长结果的指令形式,RdHi 和 RdLo 同时为零时,标志位 Z 置位。
③ 将标志位 C 设置成无意义的值。
④ 标志位 V 不变。
02. MUL 指令
MUL(Multiply)32 位乘法指令将 Rm 和 Rs 中的值相乘,结果的最低 32 位保存到 Rd 中。
2.1 指令的语法格式
MUL{<cond>}{S} <Rd>,<Rm>,<Rs>
2.2 应用示例一
@ R1 = R2 × R3。
MUL R1, R2, R3
2.3 应用示例二
@ R0 = R3 × R7,同时设置 CPSR 中的 N 位和 Z 位。
MULS R0, R3, R7
03. MLA 指令
MLA(Multiply Accumulate)32 位乘—累加指令将 Rm 和 Rs 中的值相乘,再将乘积加上第 3 个操作数,结果的最低 32 位保存到 Rd 中。
3.1 指令的语法格式
MLA{<cond>}{S} <Rd>,<Rm>,<Rs>,<Rn>
3.2 应用示例一
@ 完成 R1 = R2×R3 + 10 的操作。
MOV R0, #0x0A
MLA R1, R2, R3, R0
04. UMULL 指令
UMULL(Unsigned Multiply Long)为 64 位无符号乘法指令。它将 Rm 和 Rs 中的值做无符号数相乘,结果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
4.1 指令的语法格式:
UMULL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
4.2 应用示例一
@ 下面的指令完成(R1,R0) = R5 × R8 操作。
UMULL R0, R1, R5, R8;
05. UMLAL 指令
UMLAL(Unsigned Multiply Accumulate Long)为 64 位无符号长乘—累加指令。指令将 Rm 和 Rs 中的值做无符号数相乘,64 位乘积与 RdHi、RdLo 相加,结果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
5.1 指令语法格式
UMALL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
5.2 应用示例一
@ 下面的指令完成(R1,R0) = R5 × R8+(R1,R0)操作。
UMLAL R0, R1, R5,R8;
06. SMULL 指令
SMULL(Signed Multiply Long)为 64 位有符号长乘法指令。指令将 Rm 和 Rs 中的值做有符号数相乘,结果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
6.1 指令的语法格式
SMULL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
6.2 应用示例一
@ 下面的指令完成(R3,R2) = R7 × R6 操作。
SMULL R2, R3, R7,R6;
07. SMLAL 指令
SMLAL(Signed Multiply Accumulate Long)为 64 位有符号长乘—累加指令。指令将Rm 和 Rs 中的值做有符号数相乘,64 位乘积与 RdHi、RdLo 相加,结果的低 32 位保存到RsLo 中,高 32 位保存到 RdHi 中。
7.1 指令的语法格式
SMLAL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>
7.2 应用示例一
@ 下面的指令完成(R3,R2) = R7 × R6 +(R3,R2)操作。
SMLAL R2, R3, R7,R6;
08. 附录
11.1 ARM Architecture Reference Manual