跳轉指令用於實現程式流程的跳轉,在
arm (
同樣在ti c66x dsp)
程式中有兩種方法可以實現程式流程的跳**
—使用專門的跳轉指令(如
b指令)。
—直接向程式計數器
pc寫入跳轉位址值
。通過向程式計數器
pc寫入跳轉位址值,可以實現在
4gb的位址空間中的任意跳轉,在跳轉之前結合使用
mov lr,pc
等類似指令,可以儲存將來的返回位址值,從而實現在
4gb連續的線性位址空間的子程式呼叫
。arm
指令集中的跳轉指令可以完成從當前指令向前或向後的
32mb
的位址空間的跳轉,包括以下
4條指令:
— b
跳轉指令
(ti c66x dsp
指令集也有該指令)
b 指令的格式為:
b 目標位址
; //
程式跳轉到目標位址處執行
b label //程式無條件跳轉到標號
label
處執行b
指令是最簡單的跳轉指令。一旦遇到乙個
b指令,
arm處理器將立即跳轉到給定的目標位址,從那裡繼續執行,並需要重新裝入
pc(程式計數器
),使執行流水線中斷。
注意儲存在跳轉指令中的實際值是相對當前
pc 值的乙個偏移量,而不是乙個絕對位址,它的值由彙編器來計算
(參考定址方式中的相對定址)。它是
24位有符號數,左移兩位後有符號擴充套件為
32 位,表示的有效偏移為26位
(前後32mb
的位址空間)。
如下面的彙編**(摘自
ti c66x dsp
彙編**):
b.s1 $c$l48 //表示跳轉到
$c$l48 label;
b.s1 setueantinfo //表示跳轉到
setueantinfo
函式;0x1083ef60是指令位址
下圖中,第一條指令,如果a0=true,會跳轉到0x8008b8執行,0x8008b8是當前cpu訪問自己所屬corepac的l2資源時使用的
內部位址,對外用
別名位址
0x108008b8(corepac1的l2位址),0x118008b8(corepac2的l2位址),0x128008b8(corepac3的l2位址
),0x138008b8(corepac4的l2位址
),即外設訪問corepac的l2資源或者當前cpu訪問其他corepac的l2資源時,會使用32位的別名位址。第二條指令,跳轉到b0(b0存的是位址)去執行。
下圖摘自tms320c66x_dsp_cpu_and_instruction and set.pdf文件,表明b指令會有5個cycle的延遲(可能是在等待硬體更新pc的值,在這5個延遲的cycle期間,cpu將繼續執行b指令後面的指令,直到5個cycle後,才真正的跳轉,所以跳轉前執行了5個無用的指令),圖中program counter就是程式計數器(pc)。
該指令在cpu的s2功能單元執行,指令操作嗎如下。