我有三个主要问题仅适用于x86架构,因为我是intel 80386微芯片的用户。
这些是我所知的基础知识:中断表从地址0x0000开始,因此int 0x01指令将搜索地址0x0001。然后处理器将看到位置0x0001中包含的地址,并期望0x0001指向该地址的中断处理程序0x01的开始。
所以我的第一个问题是,中断处理程序如何指示自己的结束并告诉cpu返回进行中断的进程。指标只是NULL,还是有一个特殊值来表示处理程序已完成?
第二个问题:在MS-DOS中,硬件中断0x19用于重启计算机。我想知道这个中断的处理程序在哪里。它是在BIOS ROM中,为什么它被称为“BIOS中断调用”?请向我解释一下这个词。此外,由于MS-DOS中断0x21包括MS-DOS功能(如获取和打印字符),它在RAM而不是BIOS,对吧?这是否意味着它不是BIOS中断?
最后,我想知道我是否加载了一个带有十六进制99中断的中断表,这意味着0x99是最后一个,如果用户执行0x9A(超过0x99)会发生什么?
请回答我的这三个问题,因为我现在对系统编程很重视。如果这是漫长而复杂的话,我很抱歉。 提前谢谢!
答案 0 :(得分:1)
在实模式下,中断表中的每个条目长度为4个字节,地址的段部分为2个字节,偏移量为2个字节。这意味着中断处理程序0x01的地址位于地址0x0:0x0004。中断处理程序通常通过执行IRET
指令返回发生中断的位置。弹出地址和中断发生时CPU保存在堆栈中的值FLAGS寄存器。
中断0x19的处理程序通常指向BIOS ROM中的某个位置,但是有可能挂起中断并将其指向RAM中的处理程序。 MS-DOS中断0x21通常指向RAM中的位置,尽管有一些MS-DOS版本位于ROM中。
在实模式下,中断表通常没有限制,因此无论有用值是否已加载到所有条目中,都会出现所有256个可能的条目。当发生中断时,CPU将开始执行它在表中找到的任何地址的指令。通常,如果地址不是中断处理程序的位置,这将导致崩溃。