目录 上一页 下一页 下一章

第4章 奇妙的声音 -57-

小于+127,仅占一个字节,因此,编译程序便自动地将另一个字节置成"90H",于是在可执行程序中就有了"NOP"指令。
  如果不想程序中出现"NOP"指令,那么就必须在源程序中明确指出"JMP"指令是"短程"跳转,这只需将第一条指令改写成"JMP SHORT START"即可,指令中的"SHORT"就是告诉编译程序将此处的"JMP"指令处理为短程转移。
4.2 精确定时
  在4.1节中我们已经讨论了如何通过定时器的通道3发出确定频率的声音,这一节我们要一起学习怎样精确地定时,这样才能解决演奏音乐的问题。
  PC中的定时电路有三个通道,通道3用于发声,通道1用于控制系统内部的时钟。大家都十分清楚用DOS的"TIME"命令可以观察并修改系统内部的一个时钟,这个时钟之所以能连续运转主要依靠定时器的通道1。
  通道1的工作方式和通道3一样,但是系统启动时设定其发出一个频率固定为18.2Hz的信号,这个信号直接送到系统中的"中断控制器"。每一个"Hz"都产生一个硬件中断,一般称这个硬中断为"IRQ0",对应的中断号是08H。也就是说,当计算机启动后,我们的机器看上去十分平静,但实际上CPU非常忙碌。在定时器的控制下每隔55毫秒就要执行一个08H号中断,这个中断的主要工作就是连续地计数。
  在内存"0040H:006CH"处有四字节的存储空间专门用于保存计数值,CPU每执行一次08H中断,这四字节的计数值就被加1,不难算出这个计数值每增加1091后时间恰好过了1分钟,每增加65454后时间恰好过了1小时。系统内部的时钟之所以能准确走时,靠得就是08H中断和这四字节的计数值。因此我们要想精确的定时,必须依靠时钟计数值才行。
  程序PROG9.ASM是一个能准确发出1000Hz声音的程序,声音持续时间为5秒钟。这个程序中又出现了一条新的指令:
助记符:ADD(add)
用 途:将两个数据相加
格 式:ADD 寄存器,立即数
    ADD 寄存器,存储单元
    ADD 寄存器,寄存器
    ADD 存储单元,立即数
    ADD 存储单元,寄存器
执 行:两个数据相加,结果保存在左边的寄存器或存储单元中,右边数据不变。
PROG9.ASM
PORT_B
code


main

equ
segment
assume
org
proc

61H

cs:code,ds:code
100h
near

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章