第13章 int指令

       中断信息可以来自CPU的内部和外部,当CPU的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。

       本章讲解由int指令引发的中断。

13.1 int指令

       Int 指令的格式为:int n,n为中断类型码,它的功能是引发中断过程

       CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:

1)        取中断类型码n;

2)        标志寄存器入栈:IF=0;TF=0;

3)        CS、IP入栈

4)        (IP)=(n*4),(CS)=(n*4+2)。

从此处转去执行n号中断的中断处理程序。

 

我们可以在程序中使用int 指令调用任何一个中断的处理过程。

 

Int指令的最终功能和call指令相似,都是调用一段代码。

 

13.2 编写供应用程序调用的中断例程

注意Irect指令的功能为:

Pop IP

Pop CS

Popf

(一)  功能:求一个word型数据的平方

参数:(ax)=要计算的数据

返回值:dx,ax中存放结果的高16位和低16位

1、中断处理程序如下:

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

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

(二)  功能:将一个全是字母,以0结尾的字符串,转化成大写。

参数:ds:si指向字符串的首地址。

举例:将data段中的字符串转化成大写

  1. 中断处理程序如下:

assume cs:code

code segment

 start: mov ax,cs

       mov ds,ax

       mov si,offset capital;设置ds:si指向源地址

       mov ax,0

       mov es,ax

       mov di,200h ;设置es:di指向目的地址

       mov cx,offset capitalend-offset capital;设置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

 

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

capitalend:nop

 

  code ends

  end start

  1. 调用的程序如下:

assume cs:code

 

data segment

 db 'conversation',0

data ends

 

code segment

start: mov ax,data

       mov ds,ax

       mov si,0

       int 7ch

 

       mov ax,4c00h

       int 21h

 

  code ends

  end start

 

13.3对int、iret和栈的深入理解(不理解)

 

13.4 BIOS和DOS所提供的中断例程

BIOS主要包含以下几部分内容。

1)        硬件系统的检测和初始化程序

2)        外部中断和内部中断的中断例程

3)        用于对硬件设备进行I/O操作的中断例程

4)        其他和硬件系统相关的中断例程

 

13.5、BIOS和DOS中断例程的安装过程。

以下是BIOS和DOS提供的中断例程安装到内存中的过程:

 

13.6 BIOS中断例程应用。

举例:int 10h中断例程BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。
一个供程序员调用的中断例程程序中往往包含多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。

int 10h中断例程的设置光标位置功能。
mov ah, 2               ;设置光标
mov bh, 0                ;第0页
mov dh, 5               ;dh中放行号数
mov dl, 12              ;dl中放列号数
int 10h
(ah) =2表示调用第10h中断例程的2号子程序,功能为设置光标位置,可以提供光标所在的行号(80*25字符模式下:0~24)、列号(80*25字符模式下:0~79),和页号作为参数。
(bh) =0,(dh) =5,(dl) =12,设置光标到第0页,第5行,第12列。

bh中页号的含义:内存地址空间中,B8000h~BFFFFh共32k的空间,为80*25彩色字符模式的显示缓冲区。一屏的内容在显示缓冲区中共占4000个字节。

显示缓冲区分为8页,每页4k(约4000),显示器可以显示任意一页的内容。
一般情况下,显示第0页的内容。也就是会所,通常情况下,B8000~B8F9F中的4000个字节的内容将出现在显示器上。


int 10h中断例程在光标位置显示字符功能。
mov ah, 9                   ;设置光标
mov al, 'a'                    ;字符
mov bl, 7                     ;颜色属性
mov bh, 0                   ;第0页
mov cx, 3                    ;字符重复个数
int 10h

(ah) =9表示将调用第10h号中断例程的9号子程序,功能为在光标位置显示字符,可以提供要显示的字符、颜色属性、页号、字符重复个数作为参数。
bh中的颜色属性的格式如下:


可以看出,和显存中的属性字节的格式相同。

程序:在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'。
assume cs:code
code segment
    mov ah, 2                        ;设置光标
     mov bh, 0                        ;第0页
    mov dh, 5                        ;dh中存放行号数
     mov dl, 12                        ;dl中存放列号数

    mov ah, 9                        ;设置光标
    mov al, 'a'                         ;字符
    mov bl, 11001010b          ;颜色属性
     mov bh, 0                          ;第0页
     mov cx, 3                          ;字符重复个数
    int 10h
        
    mov ax, 4c00h
    int 21h
code ends
end

注意:闪烁的效果必须在全屏DOS方式下才能看到。

 

13.7 DOS中断例程应用

示例:在屏幕的第5行12列显示字符串”Welcome to masm!”.这个可以用

assume cs:code

 

data segment

 db 'Welcome to masm','$'

data ends

 

code segment

 start: mov ah,2

 mov bh,0

 mov dh,5

 mov dl,12

 int 10h

 

 mov ax,data

 mov ds,ax

 mov dx,0

 mov ah,9

 int 21h

 

 mov ax,4c00h

 int 21h

      

  code ends

  end start

 

DOS为程序员提供了很多可以调用的子程序,都包含在int 21H 中。详情,可以参考其他书籍

posted on 2011-10-27 11:39  TsingCai  阅读(1144)  评论(0编辑  收藏  举报