2014-08-30 22 views

回答

2

一个中断呼叫只是与推送标志的常规call类似。而iret所做的是返回并弹出标志。所以,是的,中断可以递归调用。实际上,由于硬件中断在系统上连续运行,所以始终在另一个中断处理程序中调用中断,除非当然禁用它们。

硬件中断有进一步的限制,通常在完成处理之前不会在同一个处理程序中调用。中断处理程序通过发信号通知中断控制器来通知硬件提供新的中断。

+1

事实上,如果你愿意,你可以通过简单地按压相同的数据来模拟中断的效果。所以,一个中断可能会因为硬件而中断另一个中断,但是可以产生相同的效果。难以做到的是模拟*优先级较低*中断的行为。 – 2014-08-30 16:31:07

2

尽管处理器对嵌套中断没有基本限制,但MS-DOS和BIOS服务不可重入。也就是说,在硬件中断期间调用它们通常是不安全的,因为在CPU已经执行MS-DOS或BIOS功能时可能发生中断。

要从硬件中断服务例程中使用MS-DOS和BIOS服务,可以采取一些步骤来确保它们可以安全使用。你需要做的事情相当复杂,除了其他事情你需要监视InDos标志并挂接其他中断,所以我只是将你指向“汇编语言编程的艺术”中的section on reentrency。它涵盖了所有的细节,做得非常好。

下面是该部分的摘录。这仅仅是你可能需要做哪些部分:

MS-DOS提供了包含零 一个特殊的一个字节的标志(INDOS)如果DOS是当前活动和非零值,如果是DOS已经处理应用请求 。通过测试InDOS标志,您的TSR 可以确定它是否可以安全地进行DOS调用。如果此标志为零,则可以始终进行DOS调用。如果这个标志包含一个,你可能不能进行DOS调用。 MS-DOS提供函数调用,Get InDOS标志地址,它返回InDOS标志的地址。要使用 这个函数,用34h加载ah并调用DOS。 DOS将返回es:bx中的InDOS标志的 地址。如果保存此地址,您的驻留程序将能够测试InDOS标志,以查看DOS是否为 处于活动状态。

实际上,您应该测试两个标志,InDOS标志和 严重错误标志(criterr)。在从TSR调用DOS之前,这两个标志都应该包含零 。在DOS版本3.1和更高版本中, 严重错误标志出现在InDOS标志之前的字节中。

那么如果这些标志不都为零,你应该怎么做?这很容易 足以说“嗨,回来后,当MS-DOS 返回到用户程序时做这个东西。”但你如何做到这一点?对于 示例,如果键盘中断激活您的TSR,并且您将 控件传递给真正的键盘处理程序,因为DOS很繁忙,您不能 期望您的TSR稍后在DOS无 较长时间激活时重新启动。

诀窍是将您的TSR修补到定时器中断以及键盘中断 。 [...]

+0

我认为这个答案离主题太远了,并且引入了OP没有询问的全新的混乱层面(DOS,TSR,...)。 – 2014-08-30 17:54:58

+1

原来的海报给出了一个例子,它使用int 21h作为主MS-DOS API的软件中断,然后询问“这些嵌套的中断是否有任何重要的洞穴”。他的具体例子有我在上面的答案中描述的“洞穴”。更一般地说,你不能假定它的安全性是“从中断服务程序中调用中断”,因为你调用的中断可能被ISR中断,并且可能不可重入。 – 2014-08-30 18:05:28

相关问题