//子程序的设计
在程序设计中,如果程序要解决的问题比较复杂,则程序的代码就会比较多,这时就应该采用模块化的设计方法.
所谓模块化程序设计,就是先列举出一个大的模块中,各个个别的小模块,分别建立出各个模块的解决方案,再应用
于大的模块中.在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
我们可以发现,这个子程序是不是更理想呢,你想实现数据的传送,都可以用这个子程序,而且程序代码又不长.
由于本人时间有限,所以就讲这么多,希望大家能编写出理想的子程序!