//子程序的设计

  在程序设计中,如果程序要解决的问题比较复杂,则程序的代码就会比较多,这时就应该采用模块化的设计方法.

所谓模块化程序设计,就是先列举出一个大的模块中,各个个别的小模块,分别建立出各个模块的解决方案,再应用

于大的模块中.在6502汇编程序设计中,只能通过设计子程序的方式建立各个小的模块,然后在主程序中调用它们.

  设计子程序的优点:

1.使程序的可读性,可维护性大大增强

2.使得程序的空间效率得到大大的提高

3.使得代码得到重复利用,程序的可扩展性强

 

  设计子程序的原则:

1.空间小,结构完整,可以独立被调用

  子程序不能太大,否则无法灵活利用.程序的结构又必须独立完整,以便于分解组合,供二次开发程序自由调用

2.效率高,弹性大,便于其他程序调用

  各种应用程序都有各自特殊的需求和条件,子程序的设计就要考虑到通用性,否则很难满足各种条件

3.功能明确,其变化以参数来实现

4.子程序执行完后,以寄存器或地址作为返回的数据

5.要保护个寄存器的内容

  由于在子程序中也要用到一些寄存器,那么这比如会影响寄存器的值,所以我们应该在子程序前把各寄存器压入堆栈,在执行子程序结束

要把各寄存器从堆栈中弹出.希望大家能养成这样的习惯,因为在一些大的程序中,一些错误往往就是因为没有保护好寄存器的原因,而且

这些错误又比较难发现,所以如果每个子程序都能保护好寄存器的值,那么在程序调试时,就不需要考虑是否是没有保护寄存器的原因了

就可以节约大量的程序调试时间

 

例: 在前面的循环程序设计教程中,我们讲解了将地址2000-2FFF的内容送地址3000-3FFF.假设在我们设计的一个程序里,我们需要实现

将地址2000-2FFF的内容送3000-3FFF,那么我们是不是就将前面的程序做为子程序呢?从程序设计的角度讲,这样的子程序显然是非常失败

这样的子程序没有任何弹性,假如我又要实现将地址0000-0FFF的内容送地址3000-3FFF,是不是又重新设计呢?

  所以我们应该设计一个可以通用的子程序,可以实现任意段地址的数据之间的传送.

  这里我们可以这样规定:

  地址40 41:放源开始地址

  地址42 43:放源结束地址

  地址44 45:放目标开始地址

这样我们只要把源开始地址,源结束地址,目标开始地址 确定,放地址40 41 42 43 44 45,然后调用该子程序就可以了,程序的功能是不是

得到大大的拓宽呢?还大大节约了空间.下面我们就讲解如何实现,其实和前面的实现2000-2FFF送地址3000-3FFF基本上是一样的.

     2000:PHA                            //把各个寄存器压入堆栈

     2001:TXA

     2002:PHA

     2003:TYA

     2004:PHA

     2005:PHP

 

     2006:LDY #$00          

     2008:LDA ($40),Y

     200A:STA ($44),Y

 

     200C:LDA $40

     200E:CMP $42                   //关键的一步,把地址40 41的值和地址42 43比较,若相同,就说明完了

     2010:BNE $201F

     2012:LDA $41

     2014:CMP $43

     2016:BNE $201F

 

     2018:PLA                          //发送完毕后,恢复各个寄存器的值

     2019:TAY

     201A:PLA

     201B:TAX

     201C:PLA

     201D:PLP

     201E:RTS

 

     201F:INC $40

     2021:BNE $2025

     2023:INC $41

     2025:INC $44

     2027:BNE $202B

     2029:INC $45

 

     202B:JMP $2008

  我们可以发现,这个子程序是不是更理想呢,你想实现数据的传送,都可以用这个子程序,而且程序代码又不长.

  由于本人时间有限,所以就讲这么多,希望大家能编写出理想的子程序!