来自 https://blog.csdn.net/fivedoumi/article/details/8003002
int 指令
格式:int n
含义:n为中断类型码,用于引发中断过程。
执行过程:
1)取中断类型码n;
2)标志寄存器入栈,IF=0,TF=0;
**跟踪标志:**当TF被设置为1时,CPU进入单步模式,所谓单步模式就是CPU在 每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令,需要用其他办法。
**中断标志:**决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
3)CS、IP入栈
4)(IP)=(n4),(CS)=(n4+2)
编写中断处理程序的步骤
可以供应用程序调用的中断例程的编写方法。
例题:编写、安装中断7ch的中断全程,功能:求一word型数据的平方。
参数:(ax)=要计算的数据。
返回值:dx、ax中存放结果的高16位和低16位。
应用举例:求2*3456^2
assume cs:code
code segment
start: mov ax,3456 ;(ax)=3456
int 7ch ;调用中断7ch的中断例程,计算ax中的数据的平方
add ax,ax
adc dx,dx ;dx:ax存放结果,将结果乘以2
mov ax,4c00h
int 21h
code ends
end start
分析 我们要做的三部分工作:
1)编写实现平方功能的程序
2)安装程序,将其安装在0:200处
3)设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si, offset sqr ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di, 200h ;设置es:di指向目的地址
mov cx, offset sqrend – offset sqr ;设置cx为传输长度
cld ;设置传输方向为正
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h ;设置中断向量表 偏移地址
mov word ptr es:[7ch*4+2],0 ;设置中断向量表,段地址
mov ax,4c00h
int 21h
sqr: mul ax
iret
sqrend: nop
code ends
end start
(iret指令的功能为:
pop IP
pop CS
popf
用于释放资源,返回原来的应用程序)
CPU执行int 7ch指令进入中断例程之前,标志寄存器、当前的CS和IP被压入栈中,在执行完中断例程后,应该用iret指令恢复int 7ch执行前的标志寄存器和CS、IP的值,从而接着执行应用程序。
int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。
与cs+ip的调用寻址也有相似的寻址思路。