第十三章 int指令

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

13.1int指令

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指令相似,都是调用一段程序,一般情况下,系统将具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用,我们在编程的时候,可以使用int指令调用这些子程序。当然我们也可以自己编写一些程序来供别人使用,我们称这些程序为中断例程。

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

编写,安装中断7ch的中断例程

求一个word型数据的平方

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

应用举例:求2*23452

assume cs:code
code segment
start:mov ax,3456
    int 7ch
    add ax,ax
    adc dx,dx
    mov ax,4c00h
    int 21h
  code ends
end start

7ch中断例程的实现

assume cs:code
start:mov ax,cs
      mov ds,ax
      mov si,offset sqr
      mov ax,0
      mov es,ax
      mov di,200h
      mov cx,offset sqrend-offset sqr
      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指令。

13.3对int,iret和栈的深入理解

问题:使用7ch中断例程完成loop指令功能

应用举例:在屏幕中间显示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
    
    mov ax,4c00h
    int 21
  code ends
end start

为了模拟loop指令,7ch中断例程应该具备以下功能:

  1. dec cx
  2. 如果cx!=0,转到标号s处执行,否则向下执行

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

在系统的ROM中存放着一套程序,称为BLOS(基本输入输出系统),BLOS中主要包含以下几部分内容;

  1. 硬件系统的检测和初始化程序
  2. 外部中断和内部中断的中断例程
  3. 用于对硬件设备进行i/o操作的中断例程
  4. 其他硬件系统相关的段中断例程

操作系统的dos也提供了中断例程,从操作系统的角度来看,dos中断例程就是操作系统向程序员提供的编程资源。

程序员在编程的时候,可以使用int指令来调用blos和dos提供的中断例程来完成某一些操作。

和硬件设备相关的dos中断例程,一般都是调用blos的中断例程。

13.5blos和dos的中断例程的安装过程

前面我们学习了,对于我们安装的中断例程,需要将它放在安装程序中,然后运行安装程序,将它们安装到指定的内存区中,此后,别的程序才是可以去调用。

blos和dos提供的中断例程的安装过程:

  1. 开机后,CPU一加电,初始化(CS)=0ffffh,(ip)=0,自动从FFFF:0单元开始执行程序,FFFF:0处有一条跳转指令,CPU执行该指令之后,转去执行blos的硬件系统检测和初始化程序
  2. 初始化程序将建立blos所支持的顶中断向量,即将blos提供的中断例程的入口地址登记在中断向量表中。注意,对于blos所提供的中断例程,只需将入口地址登记在向量表中即可,因为他们是固化到rom中的程序,一致在内存中存在。
  3. 硬件系统检测和初始化完成之后,调用int 19h进行操作系统的引导,从此将计算机的交由操作系统控制。
  4. dos启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

13.6blos中断例程应用

举例:

int 10h中断例程是blos提供的中断例程,其中包含了多个和屏幕输出相关的子程序。

一般来说,当程序包含多个子程序的时候,中断例程内部用传递来的参数决定执行哪一个子程序。blos和dos提供的中断例程,都用ah来传递内部子程序的编号。

下面是一个用int 10h中断例程的设置光标位置的功能

mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,5 ;dh存放行号
mov dl,12;dl存放列号
int 10h

bh中页号的含义:内存地址空间中,B8000H-bFFFFH共有32Kb,为80*25彩色字符模式的显示缓冲区。一屏的内容在显示缓冲区中共占据4000个自己。

下面是一个在光标位置显示字符的功能

mov ah,9   ;在光标的位置显示字符
mov al,'a' ;字符
mov bl,7   ;颜色属性
mov bh,0   ;第0页
mov cx,3   ;字符重复数
int 10h

bl的属性如下

7 6 5 4 3 2 1 0
BL R G B I R G B
闪烁 背景红 背景绿 背景蓝 高亮 前景红 前景绿 前景蓝

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的‘a’

assume cs:code
code segment
    mov ah,2 ;置光标
    mov bh,0 ;第0页
    mov dh,5 ;dh中存放行号
    mov dl,12;dl中存放列号
    int 10h
    
    mov ah,9 ;在光标的位置显示字符
    mov al,'a'
    mov bl,11001010b
    mov bh,0
    mov cx,3
    int 10h
    
    mov ax,4c00h
    int 21h
 code ends
end

13.7dos中断例程应用

int 21中断例程是dos提供的中断例程,其中包含了dos提供给程序员在编程时调用的子程序。

我们在前面一直使用int 21h中断例程的4ch号功能,即程序的返回功能。

mov ah,4ch
mov al,0
int 21h

(ah)=4ch表示调用第21h中断例程的4ch号子程序,功能为程序返回,可以提供返回值最为参数。

经常写为:

mov ax,4c00h
int 21h

使用int 21h中断例程在光标的位置显示字符串的功能

ds,dx指向字符串
mov ah,9
int 21h

编程:在屏幕的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

共有 0 条评论

Top