跳轉(zhuǎn)指令用于實(shí)現(xiàn)程序流程的跳轉(zhuǎn),在 ARM 程序中有兩種方法可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn):— 使用專門(mén)的跳轉(zhuǎn)指令?!?直接向程序計(jì)數(shù)器 PC 寫(xiě)入跳轉(zhuǎn)地址值。通過(guò)向程序計(jì)數(shù)器 PC 寫(xiě)入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在 4GB 的地址空
功能:比較二個(gè)字節(jié)中的值,若不等,則轉(zhuǎn)移。CINEA,#data,relCJNEA,direct,relCJNE@Ri,#data,relCJNERn,#data,rel該類指令具有比較和判斷雙重功能,比較的本質(zhì)是做減法運(yùn)算,用第一操作數(shù)內(nèi)容減去第二操作數(shù)
跳轉(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)地址的代碼解釋為T(mén)humb代碼;若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)返回。該指令為無(wú)條件執(zhí)行指令,并用分支寄存器的最低位來(lái)更新CPSR中的T位,將返回地址寫(xiě)入到連接寄存器LR中。
帶連接和狀態(tài)切換的跳轉(zhuǎn)指令BLX(Branch with Link Exchange)使用一個(gè)寄存器中的絕對(duì)地址,用于使程序跳轉(zhuǎn)到Thumb狀態(tài)或從Thumb狀態(tài)返回。該指令用分支寄存器的最低位來(lái)更新CPSR中的T位,將返回地址寫(xiě)入到連接寄存器LR中。
Thumb中有兩個(gè)分支跳轉(zhuǎn)指令的變體,第一個(gè)變體與ARM版本指令相似,可條件執(zhí)行,跳轉(zhuǎn)被限制在有符號(hào)8位立即數(shù)所表示的范圍內(nèi),或者是±256B。第二個(gè)變體不可條件執(zhí)行(沒(méi)有條件碼部分),但擴(kuò)展了有效跳轉(zhuǎn)范圍,跳轉(zhuǎn)范圍為有符號(hào)11位立即數(shù)表示的范圍,即±2048B。