RSC(Reverse Subtract with Carry)帶進(jìn)位的翻轉(zhuǎn)減操作指令,從寄存器中減去表示的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼(NOT(Carry Flag)),并將結(jié)果保存到目標(biāo)寄存器中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。
RSC(Reverse Subtract with Carry)帶進(jìn)位的翻轉(zhuǎn)減操作指令,從寄存器中減去表示的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼(NOT(Carry Flag)),并將結(jié)果保存到目標(biāo)寄存器中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。
TEQ(Test Equivalence)測試指令用于將一個(gè)寄存器的值和一個(gè)算術(shù)值做比較。條件標(biāo)志位根據(jù)兩個(gè)操作數(shù)做“邏輯或”后的結(jié)果設(shè)置。以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
CMP(Compare)比較指令使用寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
CMN(Compare Negative)比較指令使用寄存器Rn的值減去operand2的負(fù)數(shù)值(加上operand2),根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
ORR(Logical OR)為邏輯或操作指令,將第二個(gè)源操作數(shù)的值與寄存器Rn的值按位做邏輯或操作,結(jié)果保存到Rd中。
BIC(Bit Clear)位清零指令,將寄存器Rn的值與第二源操作數(shù)的值的反碼按位做“邏輯與”操作,結(jié)果保存到Rd中。
MLA(Multiply Accumulate)32位乘累加指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的最低32位保存到Rd中。
UMULL(Unsigned Multiply Long)為64位無符號(hào)乘法指令。指令將Rm和Rs中的值做無符號(hào)數(shù)相乘,結(jié)果的低32位保存到RsLo中,而高32位保存到RdHi中。
MLA(Multiply Accumulate)32位乘累加指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的最低32位保存到Rd中。
UMLAL(Unsigned Multiply Accumulate Long)為64位無符號(hào)長乘-累加指令。指令將Rm和Rs中的值做無符號(hào)數(shù)相乘,64位乘積與RdHi,RdLo相加,結(jié)果的低32位保存到RsLo中,而高32位保存到RdHi中。
SMULL(Signed Multiply Long)64位有符號(hào)長乘法指令。指令將Rm和Rs中的值做有符號(hào)數(shù)相乘,結(jié)果的低32位保存到RsLo中,而高32位保存到RdHi中。
SMLAL(Signed Multiply Accumulate Long)為64位有符號(hào)長乘法指令。指令將Rm和Rs中的值做有符號(hào)數(shù)相乘,64位乘積與RdHi,RdLo相加,結(jié)果的低32位保存到RsLo中,而高32位保存到RdHi中。
跳轉(zhuǎn)指令B使程序跳轉(zhuǎn)到指定的地址執(zhí)行程序。帶連接的跳轉(zhuǎn)指令BL將下一條指令的地址拷貝到r14(即返回地址連接寄存器LR)寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。需要注意的是,這兩條指令和目標(biāo)地址處的指令都要屬于ARM指令集。兩條指令都可以根據(jù)CPSR中的條件標(biāo)志位的值決定指令是否執(zhí)行。
帶狀態(tài)切換的跳轉(zhuǎn)指令BX使程序跳轉(zhuǎn)到指令中指定的參數(shù)Rm指定的地址執(zhí)行程序,Rm的第0位拷貝到CPSR中T位,位[31∶1]移入PC。若Rm的bit[0]為1,則跳轉(zhuǎn)時(shí)自動(dòng)將CPSR中的標(biāo)志位T置位,即把目標(biāo)地址的代碼解釋為Thumb代碼;若Rm的位bit[0]為0,則跳轉(zhuǎn)時(shí)自動(dòng)將CPSR中的標(biāo)志位T復(fù)位,即把目標(biāo)地址代碼解釋為ARM代碼
帶連接和狀態(tài)切換的跳轉(zhuǎn)指令BLX(Branch with Link Exchange)使用標(biāo)號(hào),用于使程序跳轉(zhuǎn)到Thumb狀態(tài)或從Thumb狀態(tài)返回。該指令為無條件執(zhí)行指令,并用分支寄存器的最低位來更新CPSR中的T位,將返回地址寫入到連接寄存器LR中。
帶連接和狀態(tài)切換的跳轉(zhuǎn)指令BLX(Branch with Link Exchange)使用一個(gè)寄存器中的絕對地址,用于使程序跳轉(zhuǎn)到Thumb狀態(tài)或從Thumb狀態(tài)返回。該指令用分支寄存器的最低位來更新CPSR中的T位,將返回地址寫入到連接寄存器LR中。
ARM體系結(jié)構(gòu)允許通過增加協(xié)處理器來擴(kuò)展指令集。最常用的協(xié)處理器是用于控制片上功能的系統(tǒng)協(xié)處理器。例如控制Cache和存儲(chǔ)管理單元的CP15寄存器。此外,還有用于浮點(diǎn)運(yùn)算的浮點(diǎn)ARM協(xié)處理器,各生產(chǎn)商還可以根據(jù)需要開發(fā)自己的專用協(xié)處理器。
ARM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器psr。MRS指令用于把cpsr或者spsr的值傳送到一個(gè)寄存器;MSR與之相反,它將一個(gè)寄存器的內(nèi)容傳送到cpsr或者spsr。這兩條指令結(jié)合,可用于對cpsr和spsr進(jìn)行讀/寫操作。
ARMv5及其以上版本提供了一條新的指令——零計(jì)數(shù)指令CLZ(Count Leading Zeros)。該指令用于計(jì)算最高符號(hào)位與第一個(gè)1之間的0的個(gè)數(shù)。當(dāng)一些操作數(shù)需要規(guī)范化(使其最高位為1)時(shí),該指令用于計(jì)算操作數(shù)需要左移的位數(shù)。