TI C66x DSP 指令集 之 跳轉指令B

2021-06-21 22:15:30 字數 1801 閱讀 8608

跳轉指令用於實現程式流程的跳轉,在

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功能單元執行,指令操作嗎如下。