目录 上一页 下一页 下一章

第4章 奇妙的声音 -75-

不等于时转移)"。条件转移指令有很多,以后会陆续介绍,现在我们还是回到程序上来。
  讨论了有关转移指令的一些问题之后,我们还是回到SIREN程序上来。表"ADDR"中定义了两个子过程的入口偏移地址,如果把这两个数据看作是一个数组,那么很明显这相当于C语言中的"指针数组",它里面存放了两个指向"函数"(子过程)的指针。"OUTMSG"是将要显示在屏幕上的菜单。
  图4-4给出了SIREN主程序的流程图,程序首先在屏幕上显示出菜单并接收按键,判断按键是否是1或2,若不是则认为选择了"OTHER",退出程序;若是1或2则将输入的ASCII码转换成数字。字符0-9对应的ASCII码是30H-39H,将ASCII码减去30H就得到数字00H-09H。这个转换方法很常用,值得记住。

图4-4 SIREN主程序流程图
  完成转换后程序需要根据得到的数字在ADDR表中查到与按键相对应的子过程的指针,我们知道[ADDR+0]处的一个字存放了RISE子过程的入口地址,[ADDR+2]处的一个字存放了FALL子过程的地址,因此与按键相对应的子过程入口地址在ADDR表中的位置可以表示成"(K-1)×2",K就是所按键的ASCII码转换成的数字。当我们按下"1"键,K就是0001H,则(K-1)×2的值就是0000H,在ADDR表中偏移0处存放的正是RISE子过程的偏移地址,我们即可利用间接寻址的方法调用RISE子过程。相应的指令就是CALL ADDR[BX],BX中存放的就是(K-1)×2的值。
  对应于MUSIC程序中的"MOV AX,FREQ[BX]"指令,我们可以看出CALL指令的间接寻址用法与MOV等指令并无差别。
  善于思考的C语言用户恐怕早已明白,这种算法其实就是C语言中用函数指针变量调用函

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章