关于中断的汇编程序,求高手哥给详细解释下
时间: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
.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
.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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28