跳轉指令用于實現(xiàn)程序流程的跳轉,在 ARM 程序中有兩種方法可以實現(xiàn)程序流程的跳轉:— 使用專門的跳轉指令?!?直接向程序計數器 PC 寫入跳轉地址值。通過向程序計數器 PC 寫入跳轉地址值,可以實現(xiàn)在 4GB 的地址空
功能:比較二個字節(jié)中的值,若不等,則轉移。CINEA,#data,relCJNEA,direct,relCJNE@Ri,#data,relCJNERn,#data,rel該類指令具有比較和判斷雙重功能,比較的本質是做減法運算,用第一操作數內容減去第二操作數
跳轉指令B使程序跳轉到指定的地址執(zhí)行程序。帶連接的跳轉指令BL將下一條指令的地址拷貝到r14(即返回地址連接寄存器LR)寄存器中,然后跳轉到指定地址運行程序。需要注意的是,這兩條指令和目標地址處的指令都要屬于ARM指令集。兩條指令都可以根據CPSR中的條件標志位的值決定指令是否執(zhí)行。
帶狀態(tài)切換的跳轉指令BX使程序跳轉到指令中指定的參數Rm指定的地址執(zhí)行程序,Rm的第0位拷貝到CPSR中T位,位[31∶1]移入PC。若Rm的bit[0]為1,則跳轉時自動將CPSR中的標志位T置位,即把目標地址的代碼解釋為Thumb代碼;若Rm的位bit[0]為0,則跳轉時自動將CPSR中的標志位T復位,即把目標地址代碼解釋為ARM代碼
帶連接和狀態(tài)切換的跳轉指令BLX(Branch with Link Exchange)使用標號,用于使程序跳轉到Thumb狀態(tài)或從Thumb狀態(tài)返回。該指令為無條件執(zhí)行指令,并用分支寄存器的最低位來更新CPSR中的T位,將返回地址寫入到連接寄存器LR中。
帶連接和狀態(tài)切換的跳轉指令BLX(Branch with Link Exchange)使用一個寄存器中的絕對地址,用于使程序跳轉到Thumb狀態(tài)或從Thumb狀態(tài)返回。該指令用分支寄存器的最低位來更新CPSR中的T位,將返回地址寫入到連接寄存器LR中。
Thumb中有兩個分支跳轉指令的變體,第一個變體與ARM版本指令相似,可條件執(zhí)行,跳轉被限制在有符號8位立即數所表示的范圍內,或者是±256B。第二個變體不可條件執(zhí)行(沒有條件碼部分),但擴展了有效跳轉范圍,跳轉范圍為有符號11位立即數表示的范圍,即±2048B。