汇编实验-11
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东大学实验报告
2016 年月日
姓名刘方铮,学号201411130001 系年级计算机科学与技术系2014级科目汇编语言题目中断练习程序
实验源程序清单
中断练习程序:
show macro buf
push dx
lea dx,buf
mov ah,9
int 21h
pop dx
endm
data segment
keep_ip1 dw ? ;保存9号中断偏移地址
keep_cs1 dw ? ;保存9号中断段地址
keep_ip2 dw ? ;保存1ch号偏移地址
keep_cs2 dw ? ;保存1ch号段地址
buffer db 'There is a interruption!',0dh,0ah,'$'
buffer1 db 'No ring,but waiting for interrupt',13,10,'$'
buffer2 db 'The bell is ring!',13,10,'$'
buffer3 db 'Recovery main program and ring!',13,10,'$' buffer4 db 'Hang on main program and ring ',13,10,'$'
flag db 0
count dw ?
data ends
code segment
main proc far
assume cs:code ,ds:data
start:
push ds
sub ax,ax
push ax;
mov ax,data
mov ds,ax
mov count,1
;保存原中断向量(9号中断向量)(实验书107页(1))
mov al,09h ;取中断类型09h
mov ah,35h ;取中断向量功能调用
int 21h
mov keep_cs1,es ;保存段地址
mov keep_ip1,bx ;保存偏移地址(为保存原中断向量);设置新的中断向量(9号中断向量)(实验书107页(2))push ds
mov dx,offset keyboard ;存储偏移地址
mov ax,seg keyboard ;存储段地址
mov ds,ax
mov al,09h ;中断类型9:键盘中断
mov ah,25h ;25号功能:设置中断向量
int 21h
pop ds
;保存原中断向量(1ch号中断向量)(实验书107页(1))
mov al,1ch ;取中断类型1ch:定时器控制的软中断mov ah,35h ;取中断向量功能调用
int 21h
mov keep_cs2,es
mov keep_ip2,bx
;设置新的中断向量(1ch号中断向量)(实验书107页(2))push ds
mov dx,offset ring ;存储偏移地址
mov ax,seg ring ;存储段地址
mov ds,ax
mov al,1ch
mov ah,25h
int 21h ;设置新的中断向量
pop ds
;允许键盘和定时器中断(通过控制对21h端口的各位分别置0或1来控制中断级是被允许还是禁止)
in al,21h
and al,11111100b
out 21h,al
sti
lop:
jmp lop
;恢复原来的中断向量(9ch中断),否则后续程序不能正确使用系统提供的例行程序(实验书108页(3))
push ds
mov dx,keep_ip1
mov ax,keep_cs1
mov ds,ax
mov ah,25h
int 21h
pop ds
;同上,这段是用来恢复1ch号中断(实验书108页(3))
push ds
mov dx,keep_ip2
mov ax,keep_cs2
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
pop ds
ret
main endp
;###################################################################### ###
;响铃子程序,参看书本P286页,有详解#
;###################################################################### ###
ring proc near
push ax
dec count
jnz exit
show buffer2 ;buffer2:'The bell is ring!'
mov dx,5000
in al,61h ;
and al,11111100b ;这两句话目的是让设备控制寄存器的末两位都变成0
sound:
xor al,02 ;第1位由0变为1,继续执行下去后又由于循环而回到这句,此时第1位由1变为0,
out 61h,al ;而端口61H的第1位和扬声器的脉冲门相连,当第1位由0变为1,延迟一会又由1变为0时,脉冲门就先打开后关闭,产生了一个脉冲电流。这个脉冲电流被放大后送到扬声器使之发出声音
mov cx,6000h ;这个循环语句就是所谓的延迟一会
wait1:
loop wait1
dec dx
jne sound