汇编实验-11

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档