汇 编 语 言 实 验 报 告
Assembly Language Programming Lab Reports
______________________________________________________________________________ 班级: _________ 姓名:___________ 学号:___________ 实验日期:_____________ 学院: _____计算机与通信工程学院____ 专业:_______计算机科学与技术___________
实验顺序:___实验____ 实验名称:____________中断程序设计________________ 实验分数:_______ 考评日期:________ 指导教师:
______________________________________________________________________________
一.实验目的
1.掌握中断的类型,软件中断和硬件中断。
2.掌握中断处理的过程,理解中断类型值,中断向量。 3.掌握系统中断以及功能调用。 4.可以自己设计中断程序
______________________________________________________________________________
二.实验环境
操作系统:windows xp 编译程序:masm 5.0
______________________________________________________________________________
三.实验原理
1.CPU响应中断的条件 (1)当前的指令周期结束
(2)采样到有效的中断请求型号
(3)如果是可屏蔽的中断请求INTR,检查中断允许标志IF是否为1
(4)CPU正在执行的程序是不是中断服务程序,或者是中断优先级较低的中断
服务程序 2.中断响应过程
(1)首先将标志寄存器FLAGS压入堆栈 (2)将TF与IF清零,IF=0即关中断
(3)将正在运行程序的断点CS和IP压入堆栈
(4)从中断向量表中取出中断向量高两个字节的内容送入CS,取出低两个字节
的内容送入IP
(5)转到相应中断源的中断服务程序入口,执行中断处理服务程序
______________________________________________________________________________ 四.实验步骤及结果分析 1.修改已有中断处理程序。
修改已有的中断int 9h
(1)将原有9号中断的程序入口地址放在一个地方保存起来 (2)编写中断处理程序:int9;调用原有的int9中断 (3)将新int9中断服务程序送入内存0000:0200处;
(4)将int9的入口地址0000:0200存储在中断向量表9号表项中。
源代码:
code segment
assume cs:code start:
mov ax,0 mov es,ax
mov ax,es:[9+4] mov es:[0200h],ax mov ax,es:[9+4+2] mov es:[0202h],ax cli
mov ax,offset int9 mov es:[9+4],ax mov ax,seg int9 sti
mov dx,offset int9end-offset int9start add dx,16 mov ah,31h mov al,0 int 21h
mov ah,4ch int 21h int9 proc near
int9start: push ax push bx push cx push es mov ax,0 mov es,ax in al,60h pushf
call dword ptr es:[0200h] cmp al,3Bh jne int9iret mov cx,2000 mov ax,0b800h mov es,ax mov bx,1 s:
inc byte ptr es:[bx] add bx,2 loop s int9iret:
pop es pop cx pop bx pop ax iret int9end:nop int9 endp
code ends end start
运行结果:
2.写自己的中断例程
Int 60h用到了dos中断的int 21h功能
(1) 如果触发该中断,在屏幕上显示一串笑脸; (2) 选择60H号中断类型作为笑脸中断类型; (3) 编写中断子程序smile_face,显示一串笑脸; (4) 将该中断子程序的入口地址写入中断向量表中
设置中断向量
将在DS:DX中的中断向量写入中断向量表中。 格式:AH=25H
AL=中断类型号 DS:DX=中断向量 INT 21H
(5) 编写应用程序,触发60H号中断; (6) 中断结束后,返回应用程序继续执行; (7)把中断子程序驻留在内存中。
中断驻留是一种特殊的退出程序功能,它在退出前保留程序占用的内存,使这
些内存单元不被其它程序覆盖或占用。 格式: AH=31H
AL=0 DX=驻留程序长度+16 INT 21H
AL=0表示返回码。
源代码:
.model small .stack .code
mess1 db 0ah,0dh,'enter interrupt!',0ah,0dh,'$' mess2 db 'exit interrupt!$'
mess3 db 0ah,0dh, 'continue or quit (c/q) ?$' main proc far start:
mov ax,@code mov ds,ax
mov dx,offset smile_face mov ax,seg smile_face mov ds,ax mov al,60h mov ah,25h int 21h
conti:
mov dx,offset mess1 mov ah,9 int 21h
int 60h
mov dx,offset mess2 mov ah,9 int 21h
mov dx,offset mess3 mov ah,9 int 21h
mov ah,1 int 21h cmp al,'c' je conti mov al,0 mov ah,31h
mov dx,smiend-smigin+16 int 21h main endp
smile_face proc far smigin:
sti
mov cx,10 leng:
mov dl,01h mov ah,2 int 21h loop leng mov dl,0dh int 21h mov dl,0ah int 21h cli iret smiend:nop smile_face endp end start
运行结果:
____________________________________________________________________________ 五.实验心得疑问建议
通过本次实验的学习,了解了中断程序设计的基本思路和方法,明白了中断程序运行的方式,学会了合理使用保护现场和恢复现场使程序有效运行。