编写、应用中断例程
一、 实验目的
- 学会自己编写不同功能的中断例程。
- 学习由int指令引发的中断。
二、实验内容或主要代码
1.编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数: (dh)=行号, (dl)=列号, (cl)=颜色 ds:si指向字符串首地址
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。
assume cs:code
data segment
db “welcome to masm!”,0
data ends
code segment
start: mov dh,10
mov dl,10
mov cl,2h
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
2. 编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。
在屏幕中间显示80个“!”
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
3. 下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗。
assume cs:code
code segment
s1: db ‘Good,better,best,’,’
′
s
2
:
d
b
′
N
e
v
e
r
l
e
t
i
t
r
e
s
t
,
′
,
′
' s2: db 'Never let it rest,','
′s2:db′Neverletitrest,′,′’
s3: db ‘Till good is better,’,’
′
s
4
:
d
b
′
A
n
d
b
e
t
t
e
r
,
b
e
s
t
.
′
,
′
' s4: db 'And better,best.','
′s4:db′Andbetter,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,[si]
mov dl,0
mov ah,2
int 10h
mov dx,[bx]
mov ah,9
int 21h
add bx,2
inc si
loop ok
mov ax,4c00h
int 21h
code ends
end start
三、 实验结果或截图
- assume cs:code
data segment
db 'welcome to masm! ',0
data ends
code segment
start:mov ax,cs
mov ds,ax
mov si,offset do7
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7end-offset do7
cld
rep movsb
mov word ptr es:[7ch4],200h
mov word ptr es:[7ch4+2],0
mov ax,data
mov ds,ax
mov si,0
mov dh,12
mov dl,40
mov cl,2
int 7ch
mov ax,4c00h
int 21h
do7:push ax
push si
push es
push di
push dx
push cx
mov ax,0b800h
mov es,ax
mov al,0A0h
mul dh
mov di,ax
mov al,2
mul dl
add di,ax
show:mov al,ds:[si]
cmp al,0
je ok
mov es:[di],al
inc si
inc di
mov es:[di],cl
inc di
jmp short show
ok: pop cx
pop dx
pop di
pop es
pop si
pop ax
iret
do7end: nop
code ends
end start
单步跟踪提所给程序:
2. assume cs:code
code segment
start: call loop_7c
mov ax,0b800h
mov es,ax
mov di,16012
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
loop_7c:
mov ax,cs
mov ds,ax
lea si,strat_7c
mov ax,0
mov es,ax
mov di,200H
mov cx,offset end_7c-offset strat_7c
cld
rep movsb
mov ax,0
mov ds,ax
mov word ptr ds:[7cH4],200H
mov word ptr ds:[7cH*4+2],0H
ret
strat_7c: cmp cx,0
jz ok
dec cx
pop ax
add ax,bx
push ax
iret
ok: iret
end_7c:
code ends
end start
单步跟踪题所给程序:
3.
四、 实验分析或体会
中断信息可以来自CPU的内部和外部,当CPU内部有需要处理的事情发生时,将产生需要马上处理的中断信息,引发中断过程。BIOS和DOS在所提供的中断例程中包含了许多的子程序,在编程时,可以用int指令直接调用BIOS和DOS提供的中断例程,来完成某些工作,使编程变得简单。