我知道如何在8086中执行中断例程。我不清楚的是不同类型的中断(即硬件,软件和异常)如何使用控制标志(中断标志和陷阱标志)执行中。
还有什么是非掩码中断及其用途?
所以请帮助我,谢谢。
答案 0 :(得分:1)
中断处理程序没有"做"任何带有IF和TF标志的东西。它们被清除,因此中断处理程序可以正确安全地完成其工作。你需要了解这些标志的作用,然后很明显为什么它们在中断期间被清除。
当中断标志或 IF 置位时,处理器将允许外部硬件信号(通常来自可编程中断控制器或PIC)触发中断。当它被清除时,硬件中断信号被忽略。
( NMI 或不可屏蔽中断是一个例外情况,特殊情况适用于"紧急类型"或"真实-time"事件,即使IF被清除也会触发。)
调试器使用陷阱标志或 TF 。设置标志后,处理器将执行一个指令,然后触发INT 1.调试器可以使用它来执行单步机器代码而无需临时修改它(例如暂时插入INT 3指令),它甚至不可能(例如存储在ROM中的单步代码)。
现在为什么在中断期间两个标志都被清除了?
IF已被清除,因为英特尔并不想强加中断处理程序可重入的限制。可重入代码是可以随时安全挂起的代码,并从顶部再次调用。如果在中断处理程序运行时允许中断,则在处理第一个中断时很可能会触发第二个中断,这会导致句柄重新进入。注意,软件中断处理程序(如DOS中断处理程序21h)通常没有这个问题,因为它们不被异步硬件信号调用;因此,他们做的第一件事就是执行STI
来重新启用中断。
TF的情况非常相似,但要理解起来有点棘手。我没有编写x86调试器的经验,所以我不知道这些内容。短版本是在中断期间清除TF以避免混乱。以下是我的一个推测性练习。
首先,显而易见的是,至少单步中断(如果你愿意的话,输入类型1或INT 1)必须清除标志,否则调试器的单步处理程序本身会触发单步中断或根本不运行。其次,让我们想象每次中断都不会清除TF:如果在调试器尝试使用TF时触发硬件中断,则中断处理程序本身可能是触发单步中断的,而不是正在调试的代码。更糟糕的是,现在中断被暂停(参见上面的 IF )并且你不仅看错了代码(或彻底混淆了调试器),而且你的键盘不再工作了。 (正如我所说,我猜测:如果 IF 被清除但 TF 被设置了,我不知道会发生什么。)
异步硬件中断需要在没有"打扰"的情况下进行处理。当前正在运行的程序,也就是说,它们需要在程序没有意识到的情况下执行。这包括"没有打扰"单步调试器。