汇编语言笔记13-int指令(内中断续)

 转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

int指令简介

  1. int指令引发的中断,是另一种重要的内中断(当然外中断也是由int指令引发的)。本章主要介绍int指令引发的内中断。
  2. CPU执行 int n指令,引发的n号中断的中断过程。

    (1). 取中断类型码n

    (2). 标志寄存器入栈,IF=0,TF=0;

    (3). CSIP入栈;

    (4). (IP)=(n*4)(CS)=(n*4+2)

    ——————————————

    从此处转去执行n号中断的中断处理程序(中断例程)

  3. int n/iret和call/ret很相似,都是调用一段程序。通常,系统将一些具有一定功能的子程序,以中断例程的方式提供给应用程序。

   

编写中断例程

1:编写、安装中断7ch的中断例程。

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

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

返回值:dxax中存放结果的高16位和低16位。

   

代码: install.asm 

 1 assume cs:code
 2 
 3 code segment
 4 start:  ; 安装程序,将其安装在0:200处
 5         mov ax, cs
 6         mov ds, ax
 7         mov si, offset sqr
 8         
 9         mov ax, 0
10         mov es, ax
11         mov di, 200h
12         
13         mov cx, offset sqrend - offset sqr
14         cld
15         rep movsb
16         
17         ; 设置中断向量表
18         mov ax, 0
19         mov es, ax
20         mov word ptr es:[7ch*4], 200h
21         mov word ptr es:[7ch*4+2], 0
22         
23         mov ax, 4c00h
24         int 21h
25 
26 sqr:    ; 编写实现求平方的程序
27         mul ax
28         iret
29 sqrend: nop
30 
31 code ends
32 end start

代码:test.asm #测试代码计算 2*3456^2 

 1 assume cs:code
 2 
 3 code segment
 4 start: mov ax, 3456
 5        int 7ch
 6        add ax, ax
 7        adc dx, dx
 8        
 9        mov ax, 4c00h
10        int 21h
11 
12 code ends
13 end start

2:编写、安装中断7ch的中断例程。

功能:模拟实现loop指令。

参数:(cx)=循环次数,(bx)=传递位移的位移。

代码:test.asm #测试loop指令, 显示80个'!' 

 1 assume cs:code
 2 
 3 code segment
 4 start:
 5         mov ax, 0b800h
 6         mov es, ax
 7         mov di, 160*12
 8         
 9         mov bx, offset s - offset se     ; 设置从标号se到s的转移位移
10         mov cx, 80
11     s:  mov byte ptr es:[di], '!'
12         add di, 2
13         int 7ch                          ; 如果(cx)!=0,转到标号s处
14 code ends
15 end start

代码: install.asm 

 1 assume cs:code
 2 
 3 code segment
 4 start:  ; 安装程序,将其安装在0:200处
 5         mov ax, cs
 6         mov ds, ax
 7         mov si, offset lp
 8         
 9         mov ax, 0
10         mov es, ax
11         mov di, 200h
12         
13         mov cx, offset lp - offset lpend
14         cld
15         rep movsb
16         
17         ; 设置中断向量表
18         mov ax, 0
19         mov es, ax
20         mov word ptr es:[7ch*4], 200h
21         mov word ptr es:[7ch*4+2], 0
22         
23         mov ax, 4c00h
24         int 21h
25 
26 lp:     ; 模拟实现loop指令
27         push bp                ; windows的标准做法[bp记录栈顶]
28         mov bp, sp
29         dec cx
30         jcxz ok
31         add [bp+2], bx         ; 修改ip即可
32         
33 ok:     pop bp
34         iret
35 lpend:  nop
36 
37 code ends
38 end start

    

BIOSDOS所提供的中断例程

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

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

    (2). 外部中断和内部中断的中断例程;

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

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

  2. DOS所提供的中断例程

    DOS的中断例程就是操作系统给程序员提供的编程资源。

  3. BIOSDOS在所提供的中断例程中包含了许多子程序。这些子程序实现了程序员在编程的时候经常需要用的功能。在编程的时候,可以用int指令直接调用BIOSDOS提供的中断例程。
  4. BIOSDOS中断例程的安装过程

   

BIOS中断例程应用

中断10h是视频BIOS服务,其中包含了多个和屏幕输出相关的子程序。BIOSDOS都用ah来传递内部子程序的编号。

Example:

 1 assume cs:code
 2 
 3 code segment
 4 start:
 5         mov ah, 2              ; 设置光标位置(10h号中断例程的2号子程序)
 6         mov bh, 0              ; 第0页
 7         mov dh, 5              ; dh中放行号(80*25字符模式下:0~24)
 8         mov dl, 12             ; dl中放列号(80*25字符模式下:0~79)
 9         int 10h
10         
11         mov ah, 9              ; 在光标位置显示字符(10h号中断例程的9号子程序)
12         mov al, 'a'            ; 显示字符
13         mov bl, 11001010b      ; 颜色属性(BL R G B R G B)+闪烁需要在全屏DOS中才行+
14         mov bh, 0              ; 第0页
15         mov cx, 3              ; 字符重复个数
16         int 10h
17         
18         mov ax, 4c00h
19         int 21h
20 
21 code ends
22 
23 end start

   

DOS中断例程应用

21h号中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。通常和硬件设备相关的DOS中断中,都调用了BIOS的中断例程。   

mov ax, 4c00h
int 21h
等价形式:
mov ah, 4ch       ; int 21h中断例程的4ch号功能,即程序返回功能
mov al, 0            ; 返回值
int 21h

Example:在屏幕512列显示字符串"Welcome to masm!" 

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Welcome to masm', '$'
 5 data ends
 6 
 7 code segment
 8 start:
 9         mov ah, 2              ; 设置光标位置(10h号中断例程的2号子程序)
10         mov bh, 0              ; 第0页
11         mov dh, 5              ; dh中放行号(80*25字符模式下:0~24)
12         mov dl, 12             ; dl中放列号(80*25字符模式下:0~79)
13         int 10h
14         
15         mov ax, data
16         mov ds, ax
17         mov dx, 0              ; ds:dx执行字符串,要显示的字符串必须以'$'结束
18         mov ah, 9              ; 在光标位置显示字符串(21h号中断例程的9号子程序)
19         int 21h
20         
21         mov ax, 4c00h
22         int 21h
23 code ends
24 end start

 

posted @ 2012-10-26 13:22  dennis_fan  阅读(885)  评论(0编辑  收藏  举报