什么是跳台?

Posted

技术标签:

【中文标题】什么是跳台?【英文标题】:What is a jump table? 【发布时间】:2010-09-08 01:28:15 【问题描述】:

谁能解释一下跳转表的机制以及为什么在嵌入式系统中需要它?

【问题讨论】:

【参考方案1】:

跳转表可以是指向函数的指针数组或机器代码跳转指令数组。如果您有一组相对静态的函数(例如系统调用或类的虚函数),那么您可以创建此表一次并使用数组中的简单索引调用函数。这意味着检索指针并调用函数或跳转到机器代码,具体取决于所使用的表类型。

在嵌入式编程中这样做的好处是:

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

如果确实会花费您一点点访问表的性能,但这并不比任何其他虚函数调用差。

【讨论】:

【参考方案2】:

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

你可以把它们想象成一个switch(或select)语句,所有的case都被填满了:

MyJump(int c)

   switch(state)
   
      case 0:
         goto func0label;
      case 1:
         goto func1label;
      case 2:
         goto func2label;
   

请注意,没有返回 - 它跳转到的代码将执行返回,它会跳回到调用 myjump 的位置。

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

它用于您不想浪费时间摆弄堆栈并希望节省代码空间的地方。它尤其适用于速度极其重要的中断处理程序,并且导致中断的外围设备仅由单个变量知道。这类似于带有中断控制器的处理器中的向量表。

一种用途是使用 0.60 美元的微控制器并为视频应用生成复合 (TV) 信号。微型并不强大-实际上它的速度几乎不足以写入每条扫描线。将使用跳转表来绘制字符,因为从内存中加载位图需要很长时间,并使用 for() 循环将位图推出。相反,有一个单独的跳转到字母和扫描行,然后是 8 条左右的指令,它们实际上将数据直接写入端口。

-亚当

【讨论】:

我的理解是switch-cases实际上是编译成跳转表的?这似乎是一个多余的解释(跳转表就像开关,又像跳转表,又像开关......)【参考方案3】:

From Wikipedia:

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

一个分支表由一个序列组成 无条件分支列表 分支到的指令 使用通过乘法创建的偏移量 指令的顺序索引 长度(内存中的字节数 被每个分支指令占用)。 它利用了机器 分支代码指令有一个 固定长度,可以执行 大多数人非常有效 硬件,并且是最有用的时候 处理可能的原始数据值 很容易转换为顺序 指数值。鉴于这样的数据,一个 分支表可以非常 高效的;它通常由 以下步骤:可选地验证 输入数据,以确保它是 可接受的;将数据转化为 分支表的偏移量,这 通常涉及乘法或 转移它以考虑到 指令长度;并分支到 由基址组成的地址 表和生成的偏移量:this 通常涉及添加 偏移到程序计数器上 注册。

【讨论】:

【参考方案4】:

跳转表在finite state machines 中通常(但不限于)使用,以使其成为数据驱动的。

而不是嵌套的 switch/case

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

您可以创建一个二维数组或函数指针,然后调用handleEvent[state][event]

【讨论】:

【参考方案5】:

here 描述了一个跳转表,但简而言之,它是 CPU 应根据特定条件跳转到的地址数组。例如,C switch 语句通常实现为跳转表,其中每个跳转条目将转到特定的“case”标签。

在内存使用非常宝贵的嵌入式系统中,使用跳转表而不是更占用内存的方法(如大量 if-else-if)可以更好地服务于许多结构。

【讨论】:

【参考方案6】:

Wikipedia 总结得很好:

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

... 使用分支表和其他原始 数据编码在早期很常见 内存还没有的计算天数 昂贵,CPU 速度较慢,并且 紧凑的数据表示和 替代品的有效选择是 重要的。如今,它们很常见 用于嵌入式编程和 操作系统开发。

换句话说,当您的系统内存和/或 CPU 极度受限时使用它是一个有用的结构,嵌入式平台中经常出现这种情况。

【讨论】:

【参考方案7】:

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

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

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

如果您谈论的是我认为的自己,您不仅需要在嵌入式系统中使用它们,而且在任何类型的编译/解释环境中都需要它们。

布赖恩·詹福卡罗

【讨论】:

以上是关于什么是跳台?的主要内容,如果未能解决你的问题,请参考以下文章

横版游戏跳台的碰撞忽略解决

XNA 不跳台

青蛙跳台阶问题2.

跳台阶问题

2018年研究生数学建模优秀论文汇总

英派斯专业体能训练 成就非凡竞技