第13节:int指令
int指令可以引起中断;
1.int指令:
int指令格式:int n ,n为中断类型码,功能:引发中断过程。
CPU执行int n指令,相当于引发一个n号中断的中断过程。
a.取中断类型码n
b.标志寄存器入栈,IF=0,TF=0;
c.CS,IP入栈
d.(IP)=(n*4),(CS)=(n*4+2)
从此转去执行n号中断的中断处理程序。
可以在程序中使用int指令调用任何一个中断的中断处理程序。
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov byte ptr es:[12*160+40*2],'!'
int 0
code ends
end start
程序是没有做除法,但是在结尾使用了int 0指令,引发中断过程,执行0号中断处理程序。
而系统设置0号中断处理程序的功能是显示”divide overflow”,然后返回到系统。
系统将一些具有一定功能的子程序,以中断处理处理程序的方式提供给应用程序调用。在编程时,可以用int指令调用这些子程序。
2.编写供应用程序调用的中断例程:
中断处理程序简称中断例程。
eg:编写,安装中断7ch的中断例程。
功能:求一word型数据的平方。
参数:(ax)=要计算的数据。
返回值:dx,ax中存放结果的高16位和低16位。
比如,2*3456^2
assum 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
3部分工作:编写实现求平方功能的程序;安装程序,求其安装在0:200处;设置中断向量表,将程序的入口保存在7ch表项中,使其成为中断7ch的中断例程。
安装程序如下:
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,0ffset 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
eg:编写,安装中断7ch的中断例程。
功能:将一个全是字母,以0结尾的字符串,转化为大写。
参数:ds:si指向字符串的首地址
举例:将data段中的字符串转化为大写。
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
int 71ch
mov ax,4c00h
int 21h
code ends
end start
安装程序如下:
assume cs:code
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
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
3.对int,iret和栈的深入理解:
eg:用7ch中断例程完成loop指令的功能。
loop s的执行需要循环次数(cx)和s的位移(bx)
在屏幕中显示80个‘!’
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s-offset se ;设置从标号se到标号s的转移位移。
mov cx,80
s: mov byte ptr es:[di],'!'
add di,2
int 71ch ;如果(cx)!=0,转移到标号s处
se: nop
mov ax,4c00h
inc 21h
code ends
end start
7ch中断例程如下
lp :push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:pop bp
iret
4.BIOS和DOS所提供的中断例程:
在系统板中的ROM中存放着一套程序,称为BIOS(基本输入输出系统)
BIOS中主要包含以下几部分内容:
a.硬件系统的检测和初始化程序。
b.外部中断和内部中断的中断例程。
c.用于对硬件设备进行I/O操作的中断例程。
d.其他和硬件系统相关的中断例程。
操作系统DOS也提供中断例程,就是操作系统向程序员提供的编程资源。
5.BIOS和DOS中断例程的安装过程:
BIOS和DOS提供的中断例程是如何安装到内存中的?
a.开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。
FFFF:0处跳转指令,转去执行BIOS中的硬件系统检测和初始化程序。
b.初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。
c.硬件系统检测和初始化完成后,调用int 19h 进行操作系统的引导。将计算机交由操作系统控制。
d.DOS启动后,除完成其他工作后,还将它提供的中断例程装入内存,并建立相应的中断向量。
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
int 10h 中断例程的在光标位置显示字符的功能:
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
闪烁 背景 高亮 前景
eg:在屏幕的第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 ;第0页
mov cx,3 ;字符重复个数
int 10h
mov ax,4c00h
int 21h
code ends
end start
7.DOS中断例程应用:
mov ah,4ch ;程序返回
mov al,0 ;返回值
int 21h
前面我们一直使用的是int 21h中断例程的4ch号功能
在屏幕的第5行12列显示字符串”welcome to masm!”
assume cs:code
data segment
db 'welcome to masm!','$'
data ends
code segment
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,5 ;dh中放行号
mov dl,12 ;dl中放列号
int 10h
mov ax,data
mov ds,ax
mov dx,0
mov ah,9 ;ds:dx指向2字符串的首地址data:0
int 21h
mov ax,4c00h
int 21h
code ends
end start