什么是跳表?

有人可以解释跳转表的机制,为什么在embedded式系统中需要?

跳转表可以是指向函数的指针数组,也可以是机器代码跳转指令数组。 如果你有一组相对静态的函数(比如一个类的系统调用或者虚拟函数),那么你可以创build一个这个表,然后用一个简单的索引调用这个函数。 这意味着检索指针并调用函数或根据所使用的表的types跳转到机器代码。

embedded式编程的好处是:

  1. 索引比机器码或指针的内存效率更高,因此在受限环境中可以节省内存。
  2. 对于任何特定的函数索引将保持稳定,改变函数只需要交换出函数指针。

如果你花费了一点点的性能访问表,但这并不比其他虚拟函数调用更糟糕。

跳转表(也称为分支表)是一系列指令,全部无条件地分支到代码中的另一个点。

你可以把它们想象成一个开关(或select)语句,其中所有的情况都被填充了:

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

请注意,没有返回 – 它跳转到的代码将执行返回,它会跳回到myjump被调用的地方。

这对于根据状态variables执行某些代码的状态机很有用。 有许多其他用途,但这是主要用途之一。

它用在你不想浪费时间摆弄堆栈的地方,并且想节省代码空间。 在速度非常重要的中断处理程序中尤其如此,引起中断的外设仅由一个variables知道。 这与带有中断控制器的处理器中的向量表类似。

一个用途就是花费0.60美元的微控制器,为video应用产生一个复合(TV)信号。 微不是强大的 – 事实上,它只是勉强够写每个扫描线。 使用跳转表来绘制字符,因为从内存中加载位图需要很长的时间,并使用for()循环来移动位图。 而是单独跳转到字母和扫描行,然后是8条左右的指令,直接将数据直接写入端口。

-亚当

维基百科总结得很好:

在计算机编程中,分支表(有时称为跳转表)是一个术语,用于描述将程序控制(分支)转移到程序的另一部分(或可能已dynamic加载的不同程序)的有效方法分支指令表。 分支表结构通常在汇编语言编程时使用,但也可能由编译器生成。

在计算的早期,使用分支表和其他原始数据编码是很常见的,因为内存昂贵,CPU速度较慢,数据表示紧凑,替代scheme的有效select非常重要。 目前,它们常用于embedded式编程和操作系统开发。

换句话说,当系统的内存和/或CPU数量非常有限时,这是一个非常有用的结构,在embedded式平台中通常就是这种情况。

维基百科 :

在计算机编程中,分支表(有时称为跳转表)是一个术语,用于描述将程序控制(分支)转移到程序的另一部分(或可能已dynamic加载的不同程序)的有效方法分支指令表。 分支表结构通常在汇编语言编程时使用,但也可能由编译器生成。

分支表由无条件分支指令的串行列表组成,该指令使用通过将指令长度(每个分支指令占用的存储器中的字节数)乘以连续索引而创build的偏移量来分支。 它利用了这样的事实:用于分支的机器码指令具有固定的长度,并且可以由大多数硬件非常有效地执行,并且在处理可以容易地转换为顺序索引值的原始数据值时是最有用的。 给定这样的数据,分支表可以是非常有效的; 它通常包含以下步骤:可选地validationinput数据以确保它是可接受的; 将数据转换为分支表中的偏移量,这通常涉及将其乘以或移位以考虑指令长度; 并分支到一个由表格的底部和生成的偏移量组成的地址:这往往涉及在程序计数器寄存器上增加偏移量。

这里描述了一个跳转表,但是简要地说,它是一个CPU根据特定条件跳转到的地址数组。 作为一个例子,C语句通常被实现为一个跳转表,其中每个跳转条目将转到特定的“case”标签。

在embedded式系统中,内存使用率非常高的情况下,通过使用跳转表而不是更多的内存密集型方法(如大量的if-else-if)可以更好地服务于许多构造。

跳转表(通常称为分支表)通常仅由机器使用。

编译器创build一个汇编程序中所有标签的列表,并将所有标签链接到一个内存位置。 跳转表几乎是一个参考卡,可以将函数或variables或标签可能存储的内容存储在内存中。

所以当一个函数执行时,在完成时它会跳回到之前的内存位置或者跳转到下一个函数等等。

而如果你谈论我认为你是什么,你不仅需要他们在embedded式系统,但在任何types的编译/解释环境。

布赖恩Gianforcaro

跳转表通常(但不是唯一的)在有限状态机中使用,以使其数据驱动。

而不是嵌套的开关/大小写

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

你可以做一个2D数组或函数指针,只需调用handleEvent[state][event]