#int指令
int指令可以引发中断
###13.1 int指令
int指令格式:int n
,n为中断类型码,它的功能是引发中断过程。
CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下。
- 取中断类型码n
- 标志寄存器入栈,IF=0、TF=0
- CS、IP入栈
- ( I P ) = ( n ∗ 4 ) , ( C S ) = ( n ∗ 4 + 2 ) (IP)=(n*4),(CS)=(n*4+2) (IP)=(n∗4),(CS)=(n∗4+2)
###13.2 编写供应用程序调用的中断例程
很简单的例子自己看。
###13.3 对int、iret和栈的深入理解
用int 7ch来模拟loop指令,挺复杂的。
大致步骤如下:
- int引发中断的过程,将CS、IP入栈
- 将栈中的 ( I P ) = ( I P ) − ( l o o p 指 令 位 置 − l o o p 标 号 位 置 ) (IP)=(IP)-(loop指令位置-loop标号位置) (IP)=(IP)−(loop指令位置−loop标号位置)
- 执行iret指令,将CS、IP弹出
例子:
将上面的例子简单概括一下:
int 7ch
引发中断,将CS、IP入栈- 7ch中断例程中的
add [bp+2],bx
是将入栈后的IP改为s标号处的IP - iret指令执行后,将CS、IP弹出,将指令执行位置重新定位到s标号处
- 如果cx等于0,那么将不会执行
add [bp+2],bx
,这样程序将向下继续执行
检测点 13.1
(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
答:必须在1个字所能存储的范围以内,也就是0000~FFFF,容量大小是65536。
(2)用7ch中断例程完成jmp near ptr s
指令的功能,用bx向中断例程传送转移位移。
应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,12*160
s:
cmp byte ptr [si],0
je ok
mov al,[si]
mov es:[di],al
inc si
add di,2
mov bx,offset s-offset ok
int 7ch
ok:
mov ax,4c00h
int 21h
code ends
end start
int 7ch中断例程及安装
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset se-offset s
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
s:
push bp
mov bp,sp
add [bp+2],bx
pop bp
iret
se:
nop
code ends
end start
完整程序:
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset se-offset s
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,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,12*160
s1:
cmp byte ptr [si],0
je ok
mov al,[si]
mov es:[di],al
inc si
add di,2
mov bx,offset s1-offset ok
int 7ch
ok:
mov ax,4c00h
int 21h
s:
push bp
mov bp,sp
add [bp+2],bx
pop bp
iret
se:
nop
code ends
end start
###13.4 BIOS和DOS所提供的中断例程
BIOS中主要包括以下几部分内容。
- 硬件系统的检测和初始化程序
- 外部中断和内部中断的中断例程
- 用于对硬件设备进行I/O操作的中断例程
- 其他和硬件系统相关的中断例程
操作系统DOS也提供了中断例程,从操作系统的角度来看,DOS的中断例程就是操作系统向程序员提供的编程资源。
BIOS和DOS在所提供的中断例程中包含了许多子程序,这些子程序实现了程序员在编程的时候经常需要用到的功能。程序员在编程的时候,可以用int指令直接调用BIOS和DOS提供的中断例程,来完成某些工作。
和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。
###13.5 BIOS和DOS中断例程的安装过程
BIOS和DOS提供的中断例程的安装过程
- 开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
- 初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。
- 硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制。
- DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
检测点 13.2
判断下面说法的正误:
(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
答:不行,因为BIOS的中断例程是ROM(只读)。
(2)int 19h中断例程,可以由DOS提供。
答:不行,因为int 19h是用来启动DOS的。而DOS不能在没被启动的情况下提供int 19h。
###13.6 BIOS中断例程应用
自行阅读,略过。
###13.7 DOS中断例程应用
这里说明一个内容,其他自行阅读,略过。
mov ah,4c ;程序返回
mov al,0 ;返回值
int 21h
##实验13 编写、应用中断例程
(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start:
mov dh,10
mov dl,10
mov cl,2
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
7ch中断例程编写及其安装
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset se-offset s
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
s:
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov di,ax
mov ax,2
mul dl
add di,ax
sl:
mov al,ds:[si]
mov ah,0
cmp ah,al
je ok
mov ah,cl
mov es:[di],ax
inc si
add di,2
jmp sl
ok:
iret
se:
nop
code ends
end start
实验结果:
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。
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 21h
code ends
end start
7ch中断例程及其安装:
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset se-offset s
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
s:
push bp
mov bp,sp
dec cx
jcxz ok
add [bp+2],bx
ok:
pop bp
iret
se:
nop
code ends
end start
实验结果:
(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。
assume cs:code
code segment
s1:
db 'Good,better,best,','$'
s2:
db 'Never let it rest,','$'
s3:
db 'Till good is better,','$'
s4:
db 'And better,best.','$'
s:
dw offset s1,offset s2,offset s3,offset s4
row:
db 2,4,6,8
start:
mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok:
mov bh,0
mov dh,
mov dl,0
mov ah,2
int 10h
mov dx,
mov ah,9
int 21h
loop ok
mov ax,4c00h
int 21h
code ends
end start
实验结果: