【ARM】乘法指令
00. 目錄
文章目錄
- 00. 目錄
- 01. 乘法指令概述
- 02. MUL 指令
- 03. MLA 指令
- 04. UMULL 指令
- 05. UMLAL 指令
- 06. SMULL 指令
- 07. SMLAL 指令
- 08. 附錄
01. 乘法指令概述
ARM 乘法指令完成兩個數(shù)據(jù)的乘法。兩個 32 位二進(jìn)制數(shù)相乘的結(jié)果是 64 位的積。在有些 ARM 的處理器版本中,將乘積的結(jié)果保存到兩個獨(dú)立的寄存器中。另外一些版本只將最低有效 32 位存放到一個寄存器中。無論是哪種版本的處理器,都有乘—累加的變型指令,將乘積連續(xù)累加得到總和。而且有符號數(shù)和無符號數(shù)都能使用。對于有符號數(shù)和無符號數(shù),結(jié)果的最低有效位是一樣的。因此,對于只保留 32 位結(jié)果的乘法指令,不需要區(qū)分有符號數(shù)和無符號數(shù)這兩種情況。
如表 3-7 所示為各種形式乘法指令的功能。
其中:
(1)“RdHi:RdLo”是由 RdHi(最高有效 32 位)和 RdLo(最低有效 32 位)連接形成的 64 位數(shù),“[31:0]”只選取結(jié)果的最低有效 32 位。
(2)簡單的賦值由“:=”表示。
(3)累加(將右邊加到左邊)是由“+ =”表示。
各個乘法指令中的位 S(參考下文具體指令的語法格式)控制條件碼的設(shè)置會產(chǎn)生以下結(jié)果。
① 對于產(chǎn)生 32 位結(jié)果的指令形式,將標(biāo)志位 N 設(shè)置為 Rd 的第 31 位的值;對于產(chǎn)生長結(jié)果的指令形式,將其設(shè)置為 RdHi 的第 31 位的值。
② 對于產(chǎn)生 32 位結(jié)果的指令形式,如果 Rd 等于零,則標(biāo)志位 Z 置位;對于產(chǎn)生長結(jié)果的指令形式,RdHi 和 RdLo 同時為零時,標(biāo)志位 Z 置位。
③ 將標(biāo)志位 C 設(shè)置成無意義的值。
④ 標(biāo)志位 V 不變。
02. MUL 指令
MUL(Multiply)32 位乘法指令將 Rm 和 Rs 中的值相乘,結(jié)果的最低 32 位保存到 Rd 中。
2.1 指令的語法格式
MUL{<cond>}{S} <Rd>,<Rm>,<Rs>2.2 應(yīng)用示例一
@ R1 = R2 × R3。 MUL R1, R2, R32.3 應(yīng)用示例二
@ R0 = R3 × R7,同時設(shè)置 CPSR 中的 N 位和 Z 位。 MULS R0, R3, R703. MLA 指令
MLA(Multiply Accumulate)32 位乘—累加指令將 Rm 和 Rs 中的值相乘,再將乘積加上第 3 個操作數(shù),結(jié)果的最低 32 位保存到 Rd 中。
3.1 指令的語法格式
MLA{<cond>}{S} <Rd>,<Rm>,<Rs>,<Rn>3.2 應(yīng)用示例一
@ 完成 R1 = R2×R3 + 10 的操作。 MOV R0, #0x0A MLA R1, R2, R3, R004. UMULL 指令
UMULL(Unsigned Multiply Long)為 64 位無符號乘法指令。它將 Rm 和 Rs 中的值做無符號數(shù)相乘,結(jié)果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
4.1 指令的語法格式:
UMULL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>4.2 應(yīng)用示例一
@ 下面的指令完成(R1,R0) = R5 × R8 操作。 UMULL R0, R1, R5, R8;05. UMLAL 指令
UMLAL(Unsigned Multiply Accumulate Long)為 64 位無符號長乘—累加指令。指令將 Rm 和 Rs 中的值做無符號數(shù)相乘,64 位乘積與 RdHi、RdLo 相加,結(jié)果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
5.1 指令語法格式
UMALL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>5.2 應(yīng)用示例一
@ 下面的指令完成(R1,R0) = R5 × R8+(R1,R0)操作。 UMLAL R0, R1, R5,R8;06. SMULL 指令
SMULL(Signed Multiply Long)為 64 位有符號長乘法指令。指令將 Rm 和 Rs 中的值做有符號數(shù)相乘,結(jié)果的低 32 位保存到 RsLo 中,高 32 位保存到 RdHi 中。
6.1 指令的語法格式
SMULL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>6.2 應(yīng)用示例一
@ 下面的指令完成(R3,R2) = R7 × R6 操作。 SMULL R2, R3, R7,R6;07. SMLAL 指令
SMLAL(Signed Multiply Accumulate Long)為 64 位有符號長乘—累加指令。指令將Rm 和 Rs 中的值做有符號數(shù)相乘,64 位乘積與 RdHi、RdLo 相加,結(jié)果的低 32 位保存到RsLo 中,高 32 位保存到 RdHi 中。
7.1 指令的語法格式
SMLAL{<cond>}{S} <RdLo>,<RdHi>,<Rm>,<Rs>7.2 應(yīng)用示例一
@ 下面的指令完成(R3,R2) = R7 × R6 +(R3,R2)操作。 SMLAL R2, R3, R7,R6;08. 附錄
11.1 ARM Architecture Reference Manual
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
- 上一篇: 【ARM】数据操作指令(下)
- 下一篇: 【ARM】Load Store指令