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:

    1. mov ax,0b800h
    2. mov es,ax
    3. mov byte ptr es:[12*160+40*2],'!'
    4. int 0

code ends end start

  1. - 程序中没有做除法,但是在结尾使用了int 0指令。
  2. - CPU执行int 0指令时,将引发中断过程,执行0号中断处理程序,而系统设置的0号中断处理程序的功能是显示“Divide overflow”,然后返回到系统。
  3. - int指令的最终功能和call指令相似,都是调用一段程序。
  4. <a name="lIXCv"></a>
  5. ## 实例
  6. - 编写、安装中断7ch的中断例程,实现求一word型数据的平方。

code segment start:
mov ax,3456h int 7ch

  1. add ax,ax
  2. adc dx,dx
  3. mov ax,4c00h
  4. int 21h

code ends end start

  1. - 编写、安装中断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

  1. mov ax,0
  2. mov es,ax
  3. mov word ptr es:[7ch*4],200h
  4. mov word ptr es:[7ch*4+2],0
  5. mov ax,4c00h
  6. 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

  1. - 页面显示!

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

  1. mov ax,4c00h
  2. int 21h

code ends end start

  1. ```
  2. lp: push bp
  3. mov bp,sp
  4. dec cx
  5. jcxz lpret
  6. add [bp+2],bx
  7. lpret:pop bp
  8. iret
  • int 10h中断例程的在光标位置显示字符的功能 ``` code segment start:
    1. mov ah,9 --置光标
    2. mov al,'a' --字符
    3. mov bl,7 --颜色属性
    4. mov bh,0 --第0
    5. mov cx,3 --字符重复个数
    6. int 10h

code ends end start
```

  • int 21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员的编程调用的子程序。