跳轉指令之:跳轉指令B及帶連接的跳轉指令BL
3.指令操作的偽代碼
指令操作的偽代碼如下面程序段所示。
IfconditionPassed{cond}then
IfL==1then
LR=addressoftheinstructionafterthebranchinstruftion
PC=PC+(SignExtend(signed_immed_24)2)
4.指令的使用
BL指令用于實(shí)現子程序調用。子程序的返回可以通過(guò)將LR寄存器的值復制到PC寄存器來(lái)實(shí)現。下面三種指令可以實(shí)現子程序返回。
·MOVPC,r14。
·當子程序在入口處使用了壓棧指令:
STMFDr13!,{registers>,r14},
可以使用指令。
LDMFDr13!,{registers>,PC}
將子程序返回地址放入PC中。
ARM匯編器通過(guò)以下步驟計算指令編碼中的signed_immed_24。
(1)將PC寄存器的值作為本跳轉指令的基地址值。
(2)從跳轉的目標地址中減去上面所說(shuō)的跳轉的基地址,生成字節偏移量。由于ARM指令是字對齊的,該字節偏移量為4的倍數。
(3)當上面生成的字節偏移量超過(guò)-33554432~+33554430時(shí),不同的匯編器使用不同的代碼產(chǎn)生策略。
(4)否則,將指令編碼字中的signed_immed_24設置成上述字節偏移量的bits[25∶2]。
注意 | 在一些RISC體系結構的處理器中,存在延時(shí)跳轉(delayedbranch)模式,即在程序執行跳轉指令跳轉到目標地址之前,程序會(huì )執行跳轉指令之后的指令。但在ARM體系中,沒(méi)有這種延時(shí)跳轉機制。 |
5.指令舉例
(1)程序跳轉到LABLE標號處。
ADDr1,r2,#4
ADDr3,r2,#8
SUBr3,r3,r1
LABLE
SUBr1,r2,#8
(2)跳轉到絕對地址0x1234處。
B0x1234
(3)跳轉到子程序func處執行,同時(shí)將當前PC值保存到LR中。
BLfunc
(4)條件跳轉:當CPSR寄存器中的C條件標志位為1時(shí),程序跳轉到標號LABLE處執行。
BCCLABLE
(5)通過(guò)跳轉指令建立一個(gè)無(wú)限循環(huán)。
LOOP
ADDr1,r2,#4
ADDr3,r2,#8
SUBr3,r3,r1
BLOOP
(6)通過(guò)使用跳轉使程序體循環(huán)10次。
MOVr0,#10
LOOP
SUBSr0,#1
BNELOOP
(7)條件子程序調用示例。
……
CMPr0,#5;如果r05
BLLTSUB1;則調用
BLGESUB2;否則調用SUB2
注意 | 只有SUB1不改變條件碼,本例才能正確執行,因為如果BLLT執行了轉移,將返回到BLGE指令。如果條件碼被SUB1子程序改變,則SUB2可能又會(huì )被執行,從而達不到指令的預期效果。 |
評論