int指令
- CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:
- 取中断类型码n;
- 标志寄存器入栈,IF=0,TF=0;
- CS、IP入栈
- (IP)=(n4),(CS)=(n4+2)
- 从此处转去执行n号中断的中断处理程序。
可以在程序中使用int指令调用任何一个中断你的中断处理程序。 ``` data segment db ‘Welcome to tong!’ db 16 dup (0) data ends
code segment start:mov ax,0b800h
mov es,ax
mov byte ptr es:[12*160+40*2],'!'
int 0
code ends end start
- 程序中没有做除法,但是在结尾使用了int 0指令。
- CPU执行int 0指令时,将引发中断过程,执行0号中断处理程序,而系统设置的0号中断处理程序的功能是显示“Divide overflow”,然后返回到系统。
- int指令的最终功能和call指令相似,都是调用一段程序。
<a name="lIXCv"></a>
## 实例
- 编写、安装中断7ch的中断例程,实现求一word型数据的平方。
code segment
start:
mov ax,3456h
int 7ch
add ax,ax
adc dx,dx
mov ax,4c00h
int 21h
code ends end start
- 编写、安装中断7ch的中断例程,实现讲一个全是字母,以0结尾的字符串,转化为大写。
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset capital
mov ax,0
mov es,ax
mov di,200h
mov cx,offset capitalend-offset capital
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
capital: push cx push si change: mov cl,[si] mov ch,0 jcxz ok and byte ptr [si],11011111b inc si jmp short change ok: pop si pop cx iret
code ends end start
- 页面显示!
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
mov ax,4c00h
int 21h
code ends end start
```
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:pop bp
iret
- int 10h中断例程的在光标位置显示字符的功能
```
code segment
start:
mov ah,9 --置光标
mov al,'a' --字符
mov bl,7 --颜色属性
mov bh,0 --第0页
mov cx,3 --字符重复个数
int 10h
code ends
end start
```
- int 21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员的编程调用的子程序。