编写、应用中断例程
一、 实验目的
- 学会自己编写不同功能的中断例程。
- 学习由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提供的中断例程,来完成某些工作,使编程变得简单。
|