譯注: 這邊講的都是跟ARM v4同時(shí)代的,2000年之前的指令集
ARM 里面最不常用的, 大概就是指令的條件執(zhí)行。 每條指令的開(kāi)頭都有4個(gè)位可以標(biāo)識(shí)執(zhí)行條件, 根據(jù)當(dāng)前的條件碼, 確定指令是否真實(shí)執(zhí)行。 因此,可以將一些條件分支化做無(wú)條件分支指令執(zhí)行。 這可以有效減少執(zhí)行的代碼數(shù)量和時(shí)間。
12個(gè)位的立即數(shù)可以有獨(dú)特的解釋方式。 首先,低8位零擴(kuò)展到32位數(shù), 高4位則表示為2的指數(shù)。 這讓立即數(shù)可以表示更多的數(shù)值,擴(kuò)展到最多為32位的立即數(shù)。
操作數(shù)的移位也不限制于立即數(shù)。 所有算術(shù)和邏輯處理操作的第二個(gè)寄存器可以可選的移位。 移位操作包括邏輯左移,邏輯右移,算術(shù)右移,和循環(huán)右移。 觀察移位加,移位判斷等操作出現(xiàn)在ARM程序中的頻率也是一件有意思的事。
其余的指令
- 塊加載和存儲(chǔ): 指令中的16位掩碼標(biāo)識(shí)了在一條指令當(dāng)中,16個(gè)寄存器中的任意需要讀取或者保存的寄存器。 這些指令一般用在函數(shù)的開(kāi)頭和結(jié)束。 這些指令也可以用在memcpy之類的函數(shù),可以達(dá)到單寄存器讀寫4倍的帶寬。
- 反向減: RSB允許讓第一個(gè)寄存器被一個(gè)立即數(shù)減。 RSC 的功能類似,不過(guò)還支持標(biāo)識(shí)溢出。
- 長(zhǎng)乘: 類似于MIPS, Hi/Lo寄存器里面保存了64位的有符號(hào)(SMULL)或者無(wú)符號(hào)(UMULL)結(jié)果。
- 沒(méi)有除法: 類似于Alpha, 硬件不支持整數(shù)除法。
- 條件trap: 因?yàn)锳RM的所有指令都支持條件執(zhí)行,所以SWI也支持。
- 協(xié)處理器接口: 像很多桌面 RISC 一樣, ARM 定義了完整的協(xié)處理器指令: 數(shù)據(jù)傳輸, 通用寄存器和協(xié)處理器交換, 以及協(xié)處理器操作。
- 浮點(diǎn)體系結(jié)構(gòu): ARM中的浮點(diǎn)體系結(jié)構(gòu)用的是協(xié)處理器接口, 實(shí)現(xiàn)在 FPA10 協(xié)處理器。
- 跳轉(zhuǎn)和切換指令集: BX 指令可以切換ARM和Thumb模式, 低31位表示跳轉(zhuǎn)的目標(biāo)地址, 最高位決定是ARM(1)還是 Thumb(0)。