有人能解释一下这个函数指针语法吗?

4

我收到了一些供应商提供的用C语言编写的驱动程序代码,它在DOS系统上运行,用于访问硬件。我正在努力弄清楚这段代码的作用,但目前进展不大。特别是我无法理解以下代码:

void (interrupt *oldcan)(void);

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

我猜测第一行定义了一个函数指针,但我从未见过 interrupt 这个词,我猜它是一些DOS API函数。我以前从未使用过DOS,而上面的函数定义看起来像它有三个返回类型 - voidinterruptfar,这显然是不可能的。实际上,该函数具有void返回类型,但是 interrupt far 的含义是什么?任何帮助都将不胜感激。


如果我没记错的话,far 与被调用函数的内存地址有关,超出了正常页面的范围。 - Richard J. Ross III
3个回答

8

中断关键字被用于创建中断处理程序,即这个函数旨在由中断调用。 far 表示当它返回时,它期望 CS 和 IP 都在堆栈上,并且 interrupt 关键字表示它期望标志寄存器也已经被推入(对于通过中断调用的任何内容都是给定的,但也可以通过推送标志寄存器,然后进行 far 跳转来模拟中断)。

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


7
+1 这是那种问题,即使你在个人资料中隐藏了年龄,它也会暴露出你的年龄 :) - Sergey Kalinichenko
谢谢你的回答,它给了我一个起点。那这种代码不再使用了吗?我已经全职从事游戏行业5年了,但我从未见过这样的东西。 - mathematician1975
就像看一集《骨科女王》一样。你是中断处理程序的Brennan :-) - Simon Mourier
抱歉,我是一个初学者,在这方面刚接触,请问在这种情况下CS和IP代表什么意思? - Songg Tùng
1
@SonggTùng:抱歉,CS代表“代码段”,IP代表“指令指针”。基本思想是,在DOS下,一个地址由两部分组成,即段和该段的偏移量。far指针包含段和偏移量(而near指针仅包含对某个隐含段的偏移量)。 - Jerry Coffin
显示剩余3条评论

2

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

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接