2008-09-07 49 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]