我可以在独立的x686环境中从中断服务程序中调用中断吗?
所以可以做以下事情:
isr:
pusha
call doSomething
int 21h
popa
iret
如果可能,那么这些嵌套中断是否有任何重要的洞穴插入?
答案 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)
中断调用类似于推送标志的常规call
。 iret
做的是它返回并弹出标志。所以,是的,可以递归调用中断。实际上,由于系统上连续运行的硬件中断,在另一个中断处理程序中调用中断一直在发生,除非你当然禁用它们。
硬件中断有进一步的限制,通常在完成处理之前在同一个处理程序中调用。中断处理程序通过发信号通知中断控制器来通知硬件提供新的中断。