如果您有独特的中断处理程序(或者至少是唯一的入口点和序言代码),那么,当然,您可以区别int 0xFF对待int 0x30.ISR地址存储在IDT,因此,这是区分开始的地方.
没有非常好的替代独特的ISR.这就是为什么......
在ISR中,您可以检查调用者的堆栈,查看返回地址并检查返回地址之前的代码,以查看它是否是2字节int n指令(编码为字节:0xCD,n)或其他内容.问题是,也有int 3和into1字节的指令(分别编码为的0xCC和0xCE).你如何区分0xCD + 0xCC(int 0xCC)或0xCD + 0xCE(int 0xCE)和0xCC(int 3)或0xCE(into)?在0xCC或0xCE之前可能有任何内容.可变长度的指令不允许我们轻松可靠地分析/反汇编代码.
那么触发中断/异常的其他方法ud2呢?或触发#GP,#PF的指令?那些可以是任意指令.
此外,您应该记住,异常不会以完全相同的方式处理.其中一些在进入ISR之前带有CPU保存在堆栈上的额外信息,这是错误代码.其他人没有此错误代码,您的ISR需要在执行之前将其删除iret.确定异常向量时出错将导致代码崩溃或挂起.
现在,关于硬件中断......您可以确定正在处理哪个硬件中断.在PIC有in-service register(ISR),其中一个位设置为1(AFAIR)表示IRQ,但如果你让更高优先级的中断抢占的ISR处理低优先级的中断(通过启用的ISR内部中断),那么中断识别很快变得更为复杂比必要的.
因此,只需使用独特的ISR来处理所有IRQ,异常和系统调用.或者使用一个常见的ISR但具有多个唯一的入口点,每个入口点在堆栈上保存唯一的编号(=向量编号).之后的公共代码将提取该数字并执行该中断向量所需的操作.