视频7 中断
cpu如何去找中断向量表
注意两个字是4个字节
入栈后cs和ip保存的是中断程序的cs和ip,执行完中断程序后,再把原来程序的cs和ip出栈。
也是c语言函数调用的本质。
但是我们自己会编一些中断的程序。
如何产生中断呢?
用0号中断来演示。0号中断是什么,当除法错误的时候会发生0号中断。
上面三行引发0号中断
运行后效果如上,说明0号中断是打印Divide error。
所以上述除法是1000h除1,结果仍然是1000h,然后这个数存在AH中自然会溢出。
那我们修改0号中断程序,如何修改?
修改成我们自己程序的入口地址就可以了。
当然要先把ds设为0
必须得保证中断处理程序不能被覆盖,那把中断处理程序放在哪呢?
看到上图,那中断程序岂不是要覆盖中断向量表了吗,其实不然,中断向量表只有256个,还没用到0000:0200
ds:[0]和ds:[2]表示的是中断向量表的前4个字节,把0200给ds:[0],0给ds:[2],就修改了中断向量表。
这样写有错误,得明确知道考给ds:[0]是几个字节,我们希望是两个
这样明确告诉是拷贝2个字节
我们希望中断后立即跳到显示字符串的代码,而不是把数据定义当成指令来执行。
在中断处理程序中加入跳转指令。
把中断程序拷贝到刚在0号中断指向的内存地址。
刚才第二步的指令其实都是字符串,只要把这些字符串拷到指定的地址就行。
这里用CLD
rep是重复拷贝,
要拷贝的字节数是在cx里。