+ -
当前位置:首页 → 问答吧 → 关于中断的汇编程序,求高手哥给详细解释下

关于中断的汇编程序,求高手哥给详细解释下

时间:2011-03-12

来源:互联网

主程序运行时,每10秒响铃1次,同时在屏幕上显示信息“The bell is ring”(时钟中断约每秒中断18.2次)
.model small
.stack
.data
.code
main proc far
start:
mov ax,@data
mov ds,ax
mov al,1ch
mov ah,35h
int 21h
push es
push bx
push ds
mov dx,offset ring
mov ax,seg ring
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
pop ds
in al,21h
and al,11111110b /*从这里开始就都不是很懂了*/
out 21h,al
sti

mov di,20000 /*di,si值为什么设这么多*/
delay:
mov si,30000
delay1:
dec si
jnz delay1
dec di
jnz delay
pop dx
pop ds
mov al,1ch
mov ah,25h
int 21h

mov ax,4c00h /*这里*/
int 21h


ring proc near
push ds
push ax
push cx
push dx

mov ax,@data
mov ds,ax
sti

dec count
jnz exit
mov dx,offset msg
mov ah,09h
int 21h

mov dx,100 /*这一段*/
in al,61h
and al,0fch  
sound:
xor al,02
out 61h,al
mov cx,1400h
wait1:
loop wait1
dec dx
jne sound
mov count 182
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret

ring endp
end start

作者: cqulufei   发布时间: 2011-03-12

.model small
.stack
.data
.code
main proc far
start:
mov ax,@data
mov ds,ax
mov al,1ch
mov ah,35h
int 21h ;取原中断ich的中断向量
push es
push bx ;保存原中断向量
push ds
mov dx,offset ring
mov ax,seg ring
mov ds,ax
mov al,1ch
mov ah,25h
int 21h ;置中断1ch的新中断子程序为ring
pop ds
in al,21h ;取中断控制器的控制参数
and al,11111110b ;将最低位变成0,其他位不变
out 21h,al ;送回中断控制, 至此允许产生定时器中断
sti ;允许响应中断

mov di,20000 
delay:
mov si,30000
delay1:
dec si
jnz delay1
dec di
jnz delay ;以上是一段循环, 目的是让计算机在这里运行"很长"时间, 期间int 1ch不断产生, 不断去响应
pop dx
pop ds
mov al,1ch
mov ah,25h
int 21h ;恢复int 1ch原中断向量

mov ax,4c00h ;程序结束, 返回OS
int 21h


ring proc near
push ds
push ax
push cx
push dx

mov ax,@data
mov ds,ax
sti ;开中断, 运行响应中断

dec count ;计时器-1
jnz exit ;计时器为0时(即中断过182次---过去了10秒, 因每次中断1ch计时器减1)
mov dx,offset msg
mov ah,09h
int 21h ;显示指定的字符串

mov dx,100 
in al,61h ;从扬声器发声控制口(这个名称可能不对?), 取现控制状态
and al,0fch ;第3位置0 
sound:
xor al,02 ;第3位在0和1间交替(与1进行xor, 把这位取反)
out 61h,al ;把第3位在0和1间交替其他位不变的数不断送控制口, 让扬声器在"发声"与"不发声"间交替
mov cx,1400h
wait1:
loop wait1 ;相当于发声的频率
;这个循环次数可能需要调整, 1400应该是对8086CPU的, 现在的CPU需要往大调, 否则可能听不到产生的声音
dec dx
jne sound ;循环控制, 让发声与不发声交替100次
mov count 182 ;计时器重置182, 为了记录下一个10秒  
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret

ring endp
end start

作者: shzhfu   发布时间: 2011-03-12