【问题标题】:Can someone explain this function pointer syntax?有人可以解释这个函数指针语法吗?
【发布时间】:2012-09-10 14:18:59
【问题描述】:

我得到了一些供应商提供的用 C 语言编写的驱动程序代码,该代码在 DOS(是的 DOS)上运行以访问硬件。我正在尝试弄清楚这段代码的作用,到目前为止没有太大的成功。特别是我在理解以下代码时遇到问题

void (interrupt *oldcan)(void);

void  interrupt far  can_isr(void)
{
    /* function body */
}

我猜第一行定义了一个函数指针,但我从未见过interrupt 这个词,我假设它是某种 DOS API 函数。我以前从未使用过 DOS,上面的函数定义在我看来它有 3 种返回类型 - voidinterruptfar,这显然是不可能的。该函数实际上有 void 返回类型,但interrupt far 是什么意思?如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 如果我没记错的话,far 与被调用函数的内存地址有关,在正常页面之外。

标签: c dos function-pointers


【解决方案1】:

interrupt 关键字(曾经)用于创建中断处理程序——即,此函数旨在由中断调用。 far 表示当它返回时,它期望 CS 和 IP 都在堆栈上(对于任何通过中断调用的东西都是给定的)。

最常见的用途可能是用于将使用串行端口的代码——BIOS/DOS 串行端口处理程序会在更高的速度(最初大约 300 bps)下丢失字符,因此您必须安装处理程序你自己。当字符出现在串行端口时,串行端口硬件将断言一条中断处理器的行。基于此,将调用您的中断处理程序例程。您的代码需要将数据从串行端口读入内存(并执行一些操作,例如重新启用中断)并返回。

【讨论】:

  • +1 即使您在个人资料中隐藏了年龄,这也是这些问题之一:)
  • 感谢您的回答,它给了我一个起点。那这种代码是不是不再使用了?我只在游戏中全职工作了 5 年,但我从未见过这样的事情。
  • 这就像在看 BONES 剧集。你是中断的布伦南 :-)
  • @mathematician1975:它是在DOS下使用的,但是Linux、Windows等通常都提供足够的设备驱动程序,所以自从它们开始使用以来就不需要它了。在它们上,您可以将串行端口作为普通设备打开并读/写。操作系统/设备驱动程序无需您的帮助即可完成中断处理。
  • @SonggTùng:对不起。 CS是“代码段”,“IP”是“指令指针”。基本思想是,在 DOS 下,地址分为两部分,一个段和该段的偏移量。 far 指针包含段和偏移量(而near 指针仅包含到某个隐式假定段的偏移量)。
【解决方案2】:

它很可能是特定于编译器的扩展,用于以某种非常特定于平台的方式将函数“安装”为中断处理程序。

标准 C 语言中没有 interrupt 关键字。

【讨论】:

    【解决方案3】:

    查看链接http://www.phanderson.com/printer/periodic_interrupt.html。该链接讨论了与代码示例一起使用的中断 - 请注意它非常简短。

    您还可以查看此帖子:What is the difference between far pointers and near pointers?,了解有关 far 关键字的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多