int指令可以引发中断
int指令格式:int n
,n为中断类型码,它的功能是引发中断过程。
CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下。
很简单的例子自己看。
用int 7ch来模拟loop指令,挺复杂的。
大致步骤如下:
将上面的例子简单概括一下:
int 7ch
引发中断,将CS、IP入栈add [bp+2],bx
是将入栈后的IP改为s标号处的IPadd [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
BIOS中主要包括以下几部分内容。
操作系统DOS也提供了中断例程,从操作系统的角度来看,DOS的中断例程就是操作系统向程序员提供的编程资源。
BIOS和DOS在所提供的中断例程中包含了许多子程序,这些子程序实现了程序员在编程的时候经常需要用到的功能。程序员在编程的时候,可以用int指令直接调用BIOS和DOS提供的中断例程,来完成某些工作。
和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。
BIOS和DOS提供的中断例程的安装过程
检测点 13.2
判断下面说法的正误:
(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
答:不行,因为BIOS的中断例程是ROM(只读)。
(2)int 19h中断例程,可以由DOS提供。
答:不行,因为int 19h是用来启动DOS的。而DOS不能在没被启动的情况下提供int 19h。
自行阅读,略过。
这里说明一个内容,其他自行阅读,略过。
mov ah,4c ;程序返回
mov al,0 ;返回值
int 21h
(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