ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
跳轉(zhuǎn)到所需目標(biāo)的分支稱為“分支鏈接”。僅在 16-BIS 模式下支持分支鏈接??紤]以下代碼序列:
LAB1: BR L10
....
LAB2: BR L10
....
L10:如果 L10 離 LAB1 很遠(yuǎn)(大偏移量),匯編器會(huì)將 BR 轉(zhuǎn)換為無條件分支和其周圍分支的序列,從而產(chǎn)生四個(gè)或六個(gè)字節(jié)長的兩條指令。相反,如果 LAB1 處的分支可以跳轉(zhuǎn)到 LAB2,并且距離 LAB2 足夠近,以至于 BR 可以被單個(gè)短分支指令替換,則生成的代碼會(huì)更小,因?yàn)?LAB1 中的 BR 將被轉(zhuǎn)換為一條兩個(gè)字節(jié)長的指令。如果 L10 離 LAB2 太遠(yuǎn),LAB2 會(huì)跳轉(zhuǎn)到另一個(gè)分支。因此,分支鏈接可以擴(kuò)展到任意深度。
當(dāng)在 thumb 模式下 (--code_state=16) 對(duì)代碼大?。ㄎ词褂?--opt_for_speed)進(jìn)行編譯時(shí),編譯器生成兩條偽指令:
#depth 是可選參數(shù)。如果未指定 深度,則將其設(shè)置為默認(rèn)的分支鏈接深度。如果已指定,則此分支指令的分支鏈接深度設(shè)置為 #depth。如果 #depth 小于零,則匯編器發(fā)出警告,并將此指令的分支鏈深度設(shè)置為零。
#depth已BTcc 偽指令的相同。
BT 偽指令取代了 BR(偽分支)指令。同樣,BQ 取代了 B。如果啟用了分支鏈接,匯編器會(huì)為這些指令執(zhí)行分支鏈優(yōu)化。匯編器將 BT 和 BQ 跳轉(zhuǎn)目標(biāo)替換為這些指令跳轉(zhuǎn)到的分支的偏移量。
默認(rèn)分支鏈接深度為 10。此限制旨在防止較長的分支鏈對(duì)性能造成影響。
可以在匯編語言程序中使用 BT 和 BQ 指令使匯編器能夠執(zhí)行分支鏈接??梢酝ㄟ^指定(可選)#depth 參數(shù)來控制每條指令的分支鏈接深度。必須使用 BR 和 B 指令來防止任何 BT 或 BQ 分支的分支鏈接。