13.1 int指令
CPU执行int n指令相当于引发一个n号中断的中断过程,执行过程如下:
1.取中断类型码n
2.标志寄存器入栈IF=0,TF=0
3.CS,IP入栈
4.(IP)=N4,(CS)=N4+2
我们可以将中断处理程序简称为中断例程。
13.2 编写供应用程序调用的中断例程
编写安装中断7ch的中断例程
功能:求一word型数据的平方
03:
assume cs:code
code segment
;安装
start:mov ax,cs
mov ds,ax
mov si,offset sqr
mov ax,0
mov es,ax
mov di,200h
mov cx,offset sqrend-offset sqr
cld
rep movsb
;设置中断向量表
mov ax,0
mov es,ax
mov word ptr es:[7chx4],200h
mov word ptr es:[7chx4+2],0
mov ax,4c00h
int 21h
sqr :mul ax
iret
sqrend:nop
code ends
end start
04:
assume cs:code
code segment
start:mov ax,3456
int 7ch
add ax,ax
adc dx,dx
mov ax,4c00h
int 21h
code ends
end start
功能:将一个全是字母,以0结尾的字符串,转化为大写
05:
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:[7ch4],200h
mov word ptr es:[7ch4+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
06:
assume cs:code
data segment
db ‘conversation’,0
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
13.3 对int、iret和栈的深入理解
在屏幕中间显示80个!
让int 7ch 实现loop s的功能
07:
assume cs:code
code segment
;安装
start:mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset lpend-offset lp
cld
rep movsb
;设置中断向量
mov ax,0
mov es,ax
mov word ptr es:[7ch4],200h
mov word ptr es:[7ch4+2],0
mov ax,4c00h
int 21h
lp:push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:pop bp
iret
lpend:nop
code ends
end start
08:
assume cs:code
code segment
start:mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se ;是一个负数,为了等一下求s的偏移地址
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
检测点13.1
1.128
2.assume cs:code
code segment
;安装
start:mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset lpend-offset lp
cld
rep movsb
;设置中断向量
mov ax,0
mov es,ax
mov word ptr es:[7ch4],200h
mov word ptr es:[7ch4+2],0
mov ax,4c00h
int 21h
lp:push bp
mov bp,sp
dec cx
add [bp+2],bx
pop bp
iret
lpend:nop
code ends
end start
13.4 BIOS和DOS提供的中断例程
在系统板ROM中,存在BIOS程序
1.硬件系统的 检测和初始化
2.外部中断和内部中断例程
3.用于硬件设备进行I/O操作的中断例程
4.其他和硬件系统相关的中断例程
13.5 BIOS和DOS提供的中断例程的安装过程
1.CPU一开机,自动从ffff:0单元开始执行程序。此处有一条跳转指令,执行完该指令后,转去执行BIOS中的硬件系统检测和初始化程序
2.初始化程序将建立BIOS所支持的中断向量
3.硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导
4.DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
13.6 BIOS 中断例程的应用
BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号
编程:在屏幕5行12列显示3个红底高亮闪烁绿色的’a’
assume cs:code
code segment
mov ah,2
mov bh,0
mov dh,5
mov dl,12
int 10h
mov ah,9
mov al,‘a’
mov bl,11001010b
mov bh,0
mov cx,3
int 10h
mov ax,4c00h
int 21h
code ends
end
13.7 DOS 中断例程应用
在屏幕5行12列显示字符串’Welcome to masm!’
mov ah,2
mov bh,0
mov dh,5
mov dl,12
int 10h
mov ax,data
mov ds,ax
mov dx,0
mov ah,9
int 21h