问题1
中断触发,大致可分
1a:自动触发,比如int8,是时脉中断,每秒向cpu自动发出18.2次中断.
1b:硬体触发,通常由周边引发,比如用户按了按键,便会触发int9
1c:程式异常,代码中执行了非法指令(int6,int0Dh),特权指令,结果异常(除以0或商值太大),溢位(int04)等情况,
都会触发相关的例外中断.
1d:软体触发,由程式中以intxx呼叫的中断程式,比如读取键盘int16h,dos系统中统int21h等等.
问题2.
其实就是不了解中断向量表.
中断由int00-intffh,一共100h个中断,每一个中断的进入点,是对应0:0-0:400h(中断向量表)的相关位置,
比如int0,int1,其进入点便是
int0 int1
地址 00 01 02 03 04 05 06 07
34 12 00 FF 90 78 00 FF
INT0的进入点:FF00:1234
INT1的进入点:FF00:7890
...
cpu上电后,bios已经定义好必要的bios中断,通常是int00-int1fh
然后dos载入,会改写部份bios中断,令原来中断向量指向自己,并且大体接管了20h-5fh的中断(或更后的).
不管怎样,100个中断向量中,总有不少是空的,也就是00 00 00 00,比如随便在debug中运行一下int60h,
系统可能马弹发出非法指令的警告,因为0000:0000里的只是中断向量表,不是程式.
比如我要写一个游戏,按键读取完全由自己控制,那就要自行写一个int9键盘中断,然后修改中断向量表指向自己.
但要记住一点,中断量表被修改后,不会自动复原,若游戏离开,int9仍指向原来游戏代码,但那段内存已被dos释放,
其结果就是系统挂掉.
问题3.
新的中断应该放在用户自己的程式段中,放在中断向量表是dos还是草创时期的玩法,不鼓励.