中断例程和 NMI [8086] 中的控制标志
Control Flags in Interrupt Routine and NMI [8086]
我知道中断程序是如何在 8086 中执行的。我不清楚的是不同类型的中断(即硬件、软件和异常)如何使用控制标志(中断标志和陷阱标志)在执行中。
另一件事是什么是 不可屏蔽中断 及其用途?
所以请帮我解决这个问题,谢谢。
中断处理程序不会"do"任何带有 IF 和 TF 标志的东西。它们被清除,因此中断处理程序可以正确和安全地完成其工作。您需要了解这些标志的作用,然后它们在中断期间被清除的原因就很明显了。
当设置中断标志或IF时,处理器将允许外部硬件信号(通常来自可编程中断控制器或PIC ) 触发中断。当它被清除时,硬件中断信号将被忽略。
(NMI 或 不可屏蔽中断 是一个例外,用于 "emergency-type" 或 "real-time"事件,即使清除IF也会触发。)
调试器使用Trap Flag或TF。当标志被设置时,处理器将执行 exactly one 指令,然后触发 INT 1。调试器可以使用它来单步执行机器代码,而不必临时修改它(例如临时插入一条 INT 3 指令),这甚至并不总是可能的(例如,存储在 ROM 中的单步执行代码)。
现在为什么两个标志在中断期间都被清除?
IF 被清除,因为 Intel 不想施加中断处理程序可重入的限制。可重入代码是可以随时安全挂起并从顶部再次调用的代码。如果在中断处理程序 运行ning 时允许中断,则很有可能在处理第一个中断时触发第二个中断,这将导致句柄重新进入。请注意,软件中断处理程序(如 DOS 中断处理程序 21h)通常没有这个问题,因为它们不被异步硬件信号调用;因此,他们做的第一件事就是执行 STI
以重新启用中断。
TF 的情况非常相似,但理解起来有点棘手。我没有编写 x86 调试器的经验,所以我不知道来龙去脉。简短的版本是在中断期间清除 TF 以避免混乱。以下是我的推测性练习。
首先,很明显至少单步中断(type-1 或 INT 1,如果你愿意的话)必须清除标志,否则调试器的单步处理程序 本身 会触发单步中断或根本不会 运行。其次,假设没有为每个中断清除 TF:如果在调试器尝试使用 TF 时触发硬件中断,则中断处理程序本身可能会触发单步中断,而不是被调试的代码.更糟糕的是,现在中断被暂停了(参见上面的 IF),不仅你看到了错误的代码(或者彻底混淆了调试器),而且 你的键盘也没有。不再工作了。 (正如我所说,我在猜测:我不知道如果清除 IF 但设置 TF 会发生什么)。
异步硬件中断需要在没有"bothering" 当前运行ning 程序的情况下处理,也就是说,它们需要在程序不知道的情况下执行。其中包括 "not bothering" 单步调试器。
我知道中断程序是如何在 8086 中执行的。我不清楚的是不同类型的中断(即硬件、软件和异常)如何使用控制标志(中断标志和陷阱标志)在执行中。
另一件事是什么是 不可屏蔽中断 及其用途?
所以请帮我解决这个问题,谢谢。
中断处理程序不会"do"任何带有 IF 和 TF 标志的东西。它们被清除,因此中断处理程序可以正确和安全地完成其工作。您需要了解这些标志的作用,然后它们在中断期间被清除的原因就很明显了。
当设置中断标志或IF时,处理器将允许外部硬件信号(通常来自可编程中断控制器或PIC ) 触发中断。当它被清除时,硬件中断信号将被忽略。
(NMI 或 不可屏蔽中断 是一个例外,用于 "emergency-type" 或 "real-time"事件,即使清除IF也会触发。)
调试器使用Trap Flag或TF。当标志被设置时,处理器将执行 exactly one 指令,然后触发 INT 1。调试器可以使用它来单步执行机器代码,而不必临时修改它(例如临时插入一条 INT 3 指令),这甚至并不总是可能的(例如,存储在 ROM 中的单步执行代码)。
现在为什么两个标志在中断期间都被清除?
IF 被清除,因为 Intel 不想施加中断处理程序可重入的限制。可重入代码是可以随时安全挂起并从顶部再次调用的代码。如果在中断处理程序 运行ning 时允许中断,则很有可能在处理第一个中断时触发第二个中断,这将导致句柄重新进入。请注意,软件中断处理程序(如 DOS 中断处理程序 21h)通常没有这个问题,因为它们不被异步硬件信号调用;因此,他们做的第一件事就是执行 STI
以重新启用中断。
TF 的情况非常相似,但理解起来有点棘手。我没有编写 x86 调试器的经验,所以我不知道来龙去脉。简短的版本是在中断期间清除 TF 以避免混乱。以下是我的推测性练习。
首先,很明显至少单步中断(type-1 或 INT 1,如果你愿意的话)必须清除标志,否则调试器的单步处理程序 本身 会触发单步中断或根本不会 运行。其次,假设没有为每个中断清除 TF:如果在调试器尝试使用 TF 时触发硬件中断,则中断处理程序本身可能会触发单步中断,而不是被调试的代码.更糟糕的是,现在中断被暂停了(参见上面的 IF),不仅你看到了错误的代码(或者彻底混淆了调试器),而且 你的键盘也没有。不再工作了。 (正如我所说,我在猜测:我不知道如果清除 IF 但设置 TF 会发生什么)。
异步硬件中断需要在没有"bothering" 当前运行ning 程序的情况下处理,也就是说,它们需要在程序不知道的情况下执行。其中包括 "not bothering" 单步调试器。