8.3??帶狀態(tài)切換的連接跳轉(zhuǎn)指令BLX(1)
1.指令編碼格式
帶連接和狀態(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中。
指令編碼格式如圖8.3所示。
圖8.3??BLX(1)指令編碼格式
2.語(yǔ)法格式
BLX??<target_add>
其中,<target_add>為指令的跳轉(zhuǎn)目標(biāo)地址。該地址根據(jù)以下規(guī)則計(jì)算。
①?將指令中指定的24位偏移量進(jìn)行符號(hào)擴(kuò)展,形成32位立即數(shù)。
②?將結(jié)果左移兩位。
③?位H(bit[24])加到結(jié)果地址的第一位(bit[1])。
④?將結(jié)果累加進(jìn)程序計(jì)數(shù)器PC中。
計(jì)算偏移量的工作一般由ARM匯編器來(lái)完成。這種形式的跳轉(zhuǎn)指令只能實(shí)現(xiàn)±32MB空間的跳轉(zhuǎn)。
左移兩位形成字偏移量,然后將其累加進(jìn)程序計(jì)數(shù)器PC中。這時(shí),程序計(jì)數(shù)器的內(nèi)容為BX指令地址加8字節(jié)。位H(bit[24])也加到結(jié)果地址的第一位(bit[1]),使目標(biāo)地址成為半字地址,以執(zhí)行接下來(lái)的Thumb指令。計(jì)算偏移量的工作一般由ARM匯編器來(lái)完成。這種形式的跳轉(zhuǎn)指令只能實(shí)現(xiàn)±32MB空間的跳轉(zhuǎn)。
3.指令操作的偽代碼
指令操作的偽代碼如下面程序段所示。
第一種格式BLX指令。
LR=address?of?the?instruction?after?the?BLX?instruction
T?Flag=1
PC=PC?+?PC?=?PC?+?(SignExtend(signed_immed_24)<<2)?+?(H<<1)
4.指令的使用
·??從Thumb狀態(tài)返回到ARM狀態(tài),使用BX指令。
BX??r14
·??可以在子程序的入口和出口增加棧操作指令。
PUSH??{<registers>,r14}
……
POP??{<registers>,PC}