2008-09-07 50 views

回答

41

跳轉表可以是一個指針數組,以功能或機器代碼的跳轉指令的陣列。如果你有一組相對靜態的函數(比如一個類的系統調用或虛擬函數),那麼你可以創建這個表一次,並使用一個簡單的索引來調用這個函數。這意味着檢索指針並調用函數或根據所使用的表的類型跳轉到機器代碼。

在嵌入式編程這樣做的好處是:

  1. 索引是更多的內存比機器代碼或指針效率,所以在有限的環境存儲器節省的電勢。
  2. 對於任何特定的函數,索引將保持穩定,更改函數只需要將函數指針換出。

如果您花費了一點點的性能來訪問表,但這並沒有比其他虛擬函數調用更糟糕。

0

From Wikipedia

在計算機程序中,分支 表(有時也被稱爲跳躍 表)是用於描述傳送 程序控制(分支)到另一個 的 有效的方法的一個術語程序的一部分(或不同的 程序,可能已經動態加載 )使用分支 指令表。分支表 構造通常在彙編語言編程時使用 ,但 也可能由編譯器生成。

分支表包括無條件分支 指令串行 列表正在使用分支爲 的乘以 由指令 長度(由每個分支佔用的字節在存儲器 數的順序索引創建偏移指令)。 它利用這樣的事實,對於支化機器 代碼指令具有 固定長度,並且可以非常有效地通過最 硬件執行 ,並且是當 處理原始數據值,其可以 容易地轉換成順序的最有用 索引值。鑑於這樣的數據, 分支表可以是極其有效的;它通常由以下步驟組成 :可選擇驗證 輸入數據以確保它是 可接受的;將數據轉換爲 偏移到分支表中,該 通常涉及乘法或 將其移位以考慮指令長度 ;並分支到 由 表的基址和生成的偏移量組成的地址:該 通常涉及將 偏移量加到程序計數器 寄存器上。

1

跳轉表被描述爲here,但是簡單地說,它是一個CPU根據特定條件跳轉到的地址數組。作爲一個例子,C語句通常被實現爲一個跳轉表,其中每個跳轉條目將轉到特定的「case」標籤。

在嵌入式系統中,內存使用率很高,通過使用跳轉表而不是更多的內存密集型方法(如大量的if-else-if)可以更好地服務於許多構造。

1

Wikipedia概括起來很好:

在計算機程序中,分支 表(有時也被稱爲跳躍 表)是用於描述傳送 程序控制的 有效方法的一個術語(分支)使用分支 指令表的另一個 部分程序(或不同的 程序,該程序可能已經動態地加載了 )。分支表 構造通常在彙編語言編程時使用 ,但 也可能由編譯器生成。

...分支表和其他原材料 數據編碼的使用在計算的早期 天是共同的,當記憶是 昂貴,CPU的是慢, 緊湊的數據表示和替代 有效的選擇是很重要 。目前,他們通常使用嵌入式編程 和 操作系統開發。

換句話說,當您的系統內存和/或CPU有限時,這是一個非常有用的構造,在嵌入式平臺中經常出現這種情況。

0

跳轉表(通常稱爲分支表)通常僅由機器使用。

編譯器創建彙編程序中所有標籤的列表,並將所有標籤鏈接到內存位置。跳轉表非常適合作爲存儲器中存儲函數或變量或標籤可能存在的地方的參考卡。

所以作爲函數執行,在完成它跳回到它以前的存儲位置或跳轉到下一個功能等

,如果你說的是什麼,我認爲你是,你需要的不僅僅是他們在嵌入式系統中,但在任何類型的編譯/解釋環境中。

布賴恩Gianforcaro

21

跳轉表,也稱爲分支表,是一系列指令,全部無條件地分支到代碼中的另一個點。

你可以把它們作爲一個開關(或選擇),所有的案件都充滿聲明:

MyJump(int c) 
{ 
    switch(state) 
    { 
     case 0: 
     goto func0label; 
     case 1: 
     goto func1label; 
     case 2: 
     goto func2label; 
    } 
} 

注意,有沒有回報 - 它跳轉到將執行返回的代碼,並會跳回到myjump被調用的地方。

這對於您根據狀態變量執行某些代碼的狀態機非常有用。有許多其他用途,但這是主要用途之一。

它用在你不想浪費時間擺弄堆棧,並希望節省代碼空間的地方。它特別適用於速度非常重要的中斷處理程序,並且引起中斷的外設僅由單個變量知道。這與帶有中斷控制器的處理器中的向量表類似。

一個用途是花費0.60美元的微控制器,併爲視頻應用程序生成複合(TV)信號。微型功能並不強大 - 事實上,它僅僅足夠快地寫入每條掃描線。跳轉表將用於繪製字符,因爲從內存中加載位圖需要很長時間,並使用for()循環將位圖推出。而是單獨跳轉到字母和掃描行,然後是8條左右的指令,直接將數據直接寫入端口。

- 亞當

+2

這是我的理解是開關的情況下實際上是編譯成跳轉表?這似乎是一個多餘的解釋(跳轉表就像跳轉表一樣,就像開關一樣......) – ArtOfWarfare 2012-12-13 14:30:57

0

跳轉表通常(但不限於)在finite state machines用來製造它們驅動的數據。

代替嵌套開關/箱

switch (state) 
    case A: 
     switch (event): 
     case e1: .... 
     case e2: .... 
    case B: 
     switch (event): 
     case e3: .... 
     case e1: .... 

你可以做一個二維數組或函數指針並調用handleEvent[state][event]