arm指令集可以分為6類,即跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(psr)傳輸指令、load/store指令、協(xié)處理器指令和異常中版產(chǎn)生指令。下面分別對這6種指令進行介紹?! ?.跳轉(zhuǎn)指令 在arm中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn):一種是刀‘轉(zhuǎn)指令;另一種是直接向pc寄存器(r15)中寫入目標地址值?! ⊥ㄟ^直接向pc寄存器中寫入目標地址值可以實現(xiàn)在46b地址空間中任意跳轉(zhuǎn),這種跳轉(zhuǎn)指令又稱為長跳轉(zhuǎn)。如果在長跳轉(zhuǎn)指令之前使用mov lr,pc等指令,則可以保存將來返回的地址值,這樣就實現(xiàn)了在46b地址空間中的子程序調(diào)用?! ≡赼rm版本5及以上的體系中,實現(xiàn)了arm指令集和thumb指令集的混合使用。指令使用目標地址值的bit[0]來確定目標程序的類型。bit[0]的值為1時,目標程序為thumb指令;bit[0]值為0時,目標程序為arm指令。 在arm版本5以前的體系中,傳送到pc寄存器中的目標地址值的低兩位bits[1∶0]被忽略,跳轉(zhuǎn)指令只能在arm指令集中執(zhí)行,即程序不能從arm狀態(tài)切換到thumb狀態(tài)。非t系列arm版本5體系不含thumb指令,當程序試圖切換到thumb狀態(tài)時,將產(chǎn)生未定義指令異常中斷?! rm跳轉(zhuǎn)指令可以從當前指令向前或向后的32mb地址空間跳轉(zhuǎn)。這類跳轉(zhuǎn)指令有以下4種?! 。?)b 跳4專指令 b〔條件) (地址) b指令屬于arm指令集,是最簡單的分支指令。一旦遇到一個b指令,arm處理器將立即跳轉(zhuǎn)到給定的地址,從那里繼續(xù)執(zhí)行。注意:存儲在分支指令中的實際值是相對當前r15的值的一個偏移量,而不是一個絕對地址。它的值由匯編器來計算,是24位有符號數(shù),左移兩位后有符號擴展為32位,表示的有效偏移位為26位(+/- 32 mb)?! 。?)bl 帶返回的跳轉(zhuǎn)指令 bi,〔條件) (地址) bl指令也屬于arm指令集,是另一個分支指令。就在分支之前,在寄存器r14中裝載上r15的內(nèi)容,因此可以重新裝載r14到r15中來返回到這個分支之后的那個指令處執(zhí)行,它是子例程的一個基本但強力的實現(xiàn)?! 。?)blx 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令 blx <地址> blx指令有兩種格式,第1種格式的blx指令記作blx(1)。blx(1)從arm指令集跳轉(zhuǎn)到指令中指定的目標地址,并將程序狀態(tài)切換到thumb狀態(tài),該指令同時將pc寄存器的內(nèi)容復(fù)制到lr寄存器中?! lx(1)指令屬于無條件執(zhí)行的指令?! 〉?種格式的blx指令記作blx(2)。blx(2)指令從arm指令集跳轉(zhuǎn)到指令中指定的目標地址,目標地址的指令可以是arm指令,也可以是thumb指令。目標地址放在指令中的寄存器<dest>中,該地址的bit[0]值為0,目標地址處的指令類型由cpsr中的t位決定。該指令同時將pc寄存器的內(nèi)容復(fù)制到lr寄存器中?! 。?)bx 帶狀態(tài)切換的跳轉(zhuǎn)指令 bx(條件) (dest) bx指令跳轉(zhuǎn)到指令中指定的目標地址,目標地址處的指令可以是arm指令,也可以是thumb指令。目標地址值為指令的值和0xfl·ffffff做“與”操作的結(jié)果,目標地址處的指令類型由寄存器決定。
歡迎轉(zhuǎn)載,信息來源維庫電子市場網(wǎng)()