1.int指令,重要的一种内中断
CPU执行int n指令后,执行过程如下:
(1)取中断类型码n
(2)标志寄存器入栈,TF=0,IF=0
(3)CS,IP入栈
(4)(IP)=(n*4),(CS)=(n*4+2)
2.对int iret深入理解
问题:用7ch中断例程完成loop指令
loop s的执行需要两个信息,循环次数和s的位移,用cx存放循环次数,bx存放位移应用:在屏幕中间显示80个!
assume cs:code
code segment
start:mov ax,0b800H
mov es,ax
mov di,160*12
mov bx,offset s-offset se
mov cx,80
s:mov byte ptr es:[di],'!'
add di,2
int 7ch
se:nop
7ch中断例程:
lp:push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:pop bp
iret
总结:{
要模拟loop指令,7ch中断例程应该具备下面功能:
(1)dec cx
(2)若(cx)!=0,转至s标号执行,否则,继续执行
显然要转到s标号,就好改变CS和IP,那么怎么获取s的段地址和偏移地址呢?
在中断过程中,CS和IP和当前标志寄存器都要入栈,那么入栈的CS就是跟s标号同一个段地址的,int 7ch后的一条指令的偏移地址,即se的偏移地址,
得知这两个后,还知道了bx存放位移,所以,s的偏移地址就知道了,即se的偏移地址加上bx中的转移位移(即修改栈中的数据就可以了,因为中断程序结束后,会iret进行相应出栈操作,然后跳转到s标号)
}
3.系统板的ROM上有一套BIOS程序,主要包含以下内容:
(1)硬件系统的检测和初始化程序
(2)外部中断和内部中断的中断例程
(3)用于对硬件设备进行I/O操作的中断例程
(4)其他和硬件系统相关的中断例程
4.BIOS和DOS中断例程的安装过程
(1)开机后,CPU加电,初始化(CS)=0FFFFH,(IP)=0,FFFF:0处有一条跳转指令,转到执行BIOS中的硬件系统检测和初始化程序:BIOS提供的中断例程的入口地址将要登记到中断向量表中
(2)硬件系统检测和初始化完之后,调用int 19h进行操作系统引导,从此将计算机交给操作系统控制
(3)DOS启动后,除了完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量