x86汇编中断服务程序可以调用另一个中断吗?

时间:2014-08-30 16:22:25

标签: assembly x86 interrupt interrupt-handling

我可以在独立的x686环境中从中断服务程序中调用中断吗?

所以可以做以下事情:

isr:
    pusha
    call doSomething
    int 21h
    popa
iret

如果可能,那么这些嵌套中断是否有任何重要的洞穴插入?

2 个答案:

答案 0 :(得分:3)

虽然处理器对嵌套中断没有基本限制,但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加载啊并调用DOS。 DOS将返回   es:bx中InDOS标志的地址。如果你保存这个地址,你的   驻留程序将能够测试InDOS标志以查看DOS是否   活性

     

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

     

那么如果这些标志不是零,你该怎么办?这很简单   足以说“嘿,回来后再做这个东西,当MS-DOS   返回用户程序。“但你怎么做?对于   例如,如果键盘中断激活您的TSR并且您通过了   控制到真正的键盘处理程序,因为DOS很忙,你不能   期待你的TSR在DOS没有的时候神奇地重新启动   更长时间的活跃。

     

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

答案 1 :(得分:2)

中断调用类似于推送标志的常规calliret做的是它返回并弹出标志。所以,是的,可以递归调用中断。实际上,由于系统上连续运行的硬件中断,在另一个中断处理程序中调用中断一直在发生,除非你当然禁用它们。

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