汇编语言笔记13-int指令(内中断续)
转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne
☞int指令简介
- int指令引发的中断,是另一种重要的内中断(当然外中断也是由int指令引发的)。本章主要介绍int指令引发的内中断。
-
CPU执行 int n指令,引发的n号中断的中断过程。
(1). 取中断类型码n;
(2). 标志寄存器入栈,IF=0,TF=0;
(3). CS、IP入栈;
(4). (IP)=(n*4),(CS)=(n*4+2)。
——————————————
从此处转去执行n号中断的中断处理程序(中断例程)。
- int n/iret和call/ret很相似,都是调用一段程序。通常,系统将一些具有一定功能的子程序,以中断例程的方式提供给应用程序。
☞编写中断例程
例1:编写、安装中断7ch的中断例程。
功能:求一个word型数据的平方。
参数:(ax)=要计算的数据。
返回值:dx、ax中存放结果的高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
☞BIOS和DOS所提供的中断例程
-
在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BOIS主要包含以下几部分内容:
(1). 硬件系统的检测和初始化程序;
(2). 外部中断和内部中断的中断例程;
(3). 用于对硬件设备进行I/O操作的中断例程;
(4). 其他和硬件系统相关的中断例程。
-
DOS所提供的中断例程
DOS的中断例程就是操作系统给程序员提供的编程资源。
- BIOS和DOS在所提供的中断例程中包含了许多子程序。这些子程序实现了程序员在编程的时候经常需要用的功能。在编程的时候,可以用int指令直接调用BIOS和DOS提供的中断例程。
-
BIOS和DOS中断例程的安装过程
☞BIOS中断例程应用
中断10h是视频BIOS服务,其中包含了多个和屏幕输出相关的子程序。BIOS和DOS都用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:在屏幕5行12列显示字符串"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