首页 文章

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

提问于
浏览
3

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

所以可以做以下事情:

isr:
    pusha
    call doSomething
    int 21h
    popa
iret

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

2 回答

  • 2

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

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

  • 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 Flag Address,它返回InDOS标志的地址 . 要使用此功能,请使用34h加载ah并调用DOS . DOS将返回es:bx中InDOS标志的地址 . 如果保存此地址,您的常驻程序将能够测试InDOS标志以查看DOS是否处于活动状态 . 实际上,您应该测试两个标志,InDOS标志和严重错误标志(标准) . 在从TSR调用DOS之前,这两个标志都应该包含零 . 在DOS 3.1及更高版本中,严重错误标志出现在InDOS标志之前的字节中 . 那么如果这些标志不是零,你应该怎么做?很容易说“嘿,稍后当MS-DOS返回用户程序时再回来做这些事情 . ”但是你怎么做的?例如,如果键盘中断激活您的TSR并且您将控制权传递给真正的键盘处理程序,因为DOS正忙,那么当DOS不再处于活动状态时,您不能指望您的TSR在以后神奇地重新启动 . 诀窍是将TSR修补为定时器中断以及键盘中断 . [...]

相关问题