在自由支持x686环境下,我可以从中断服务例程内调用中断吗?
那么是否可以这样做:
isr:
pusha
call doSomething
int 21h
popa
iret
如果可能的话,这些嵌套中断是否有任何重大缺陷?
在自由支持x686环境下,我可以从中断服务例程内调用中断吗?
那么是否可以这样做:
isr:
pusha
call doSomething
int 21h
popa
iret
中断调用类似于普通的call
,但会压入标志位。而iret
则是返回并弹出标志位。所以,是的,中断可以被递归调用。实际上,在另一个中断处理程序中调用中断很常见,因为硬件中断一直在系统上运行,除非你禁用它们。
硬件中断有进一步的限制,通常情况下在同一个处理程序内部正在处理时不会被调用。中断处理程序通过向中断控制器发出信号来通知硬件提供新的中断。
int 21h
的示例,这是主要的 MS-DOS API 软件中断,然后问道“这些嵌套中断是否有任何重大缺陷”。他的具体示例在我上面的答案中描述了“缺陷”。更一般地说,你不能假设从“中断服务例程中调用中断”是安全的,因为你调用的中断可能已经被 ISR 中断,并且可能不可重入。 - Ross Ridge