目录 上一页 下一页 附录A

第11章 更高级的技术 -305-

  在回答这个问题之前请大家先想一想中断调用与返回的过程与一般的子程序调用与返回的过程有没有区别?其实区别很明显:采用CALL指令完成远程调用时CPU会自动将CS:IP压入堆栈,子过程返回指令"RETF"会把CS:IP从堆栈中恢复;而CPU响应中断时不仅要把CS:IP压入堆栈,而且要先把标志寄存器压入堆栈。执行中断返回指令"IRET"时标志寄存器也会自动从堆栈中弹出。所以程序中采用CALL指令调用原中断服务程序时要先把标志寄存器压入堆栈,这实际上提供了一种以CALL指令模拟INT指令的方法。
  (4)1CH中断
  08H中断并不是PC系统中唯一一个每秒钟执行18.2次的中断,1CH也有这样的性质。不过1CH中断并不是由硬件触发的,它是一个软件中断。1CH中断与05H中断有相似的特点,05H中断是由09H中断服务程序调用而产生的,1CH则恰好是由08H中断服务程序调用产生,所以它具有与08H中断相同的性质--每55Ms调用一次。
  这个中断才是真正提供给用户使用的,系统为它编制的服务程序只有一条指令--IRET,也就是说当用户没有为它编制服务程序时,它是什么事都不做的。所以用户编制一些需要定时的内存驻留程序时通常不选择08H中断,而是选择1CH中断,重编1CH中断服务程序时可以不用考虑与其原服务程序配合工作。
  下面给出的程序例是一个音乐程序,与第四章中的程序例不同,这个程序可以产生出"背景音乐",即音乐的播放不会影响到机器进行其它工作。你可以一面听音乐一面格式化磁盘,或者用WPS写文章。总之,音乐的产生与用户的工作是同时的,而且互不干扰。
BKMUSIC.
code


main

freq

note



nxtnote
delay

new_1ch:





ASM
segment
assume
org
proc
jmp
dw
dw
db
db
db
dw
dw
db


push
push
push
cmp
jz


cs:code,ds:code
100h
far
install
0,4552,4029,3617,3415
3223,3042,2871
3,4,2,4,1,4,2,4,3,4,3,4,
3,4,6,4,6,8,3,4,2,4,1,4,
3,4,2,4,2,4,3,4,2,4,1,16
-1
?
?


ax
bx
si
byte ptr cs:[delay],0
play_next





;跳转至安装部分
;各音符频率表

3,8,2,4,2,4,2,8 ;乐谱
2,4,3,4,3,4,3,4


;将要演奏的音符在乐谱中的位置
;当前音符应持续的时间

;新的1CH中断服务程序
;保存寄存器


;当前的音符演奏完了吗?
;若当前的音符已奏完,转PLAY_NEXT

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 附录A