//宏指令
令我感到极度兴奋的是 6502_Macroassembler &Simulator有强大的宏功能.这无疑使程序
的编写又简单方便许多了.
我们先说说宏的格式
宏名: .MACRO 宏虚参数1,宏虚参数2,宏虚参数3.....
宏体
.ENDM
这里 .MACRO 和 .ENDM 必须成对出现
宏调用的格式:
宏名 宏实参数1,宏实参数2,宏参数3
具有宏调用的源程序被编译时,每个宏调用将被编译程序展开,宏展开实际上是宏定义时设计的宏体去代替相应的
宏指令名,并且用实际参数去取代虚参数,以形成符合功能并可以被执行的实际代码
我们举例说明:
实现 中断指令 INT
大家知道,现在的6502编译器都不支持INT指令,给书写造成不便,不过现在我们可以用宏来实现
.ORG $0000
INT: .MACRO INT_PARAM
.DB $00
.DW INT_PARAM
.ENDM
说明,这里 INT 是宏名,注意后面要接 : ,INT_PARAM 是虚参数,由于INT的机器码是 00
所以我们在宏体中 .DB $00,比如 INT $C008,机器码是 00 08 C0,所以我们 .DW INT_PARAM
这样,我们实现 INT 指令,例如我们在程序里输入 INT $C008,就和文曲星里的 INT $C008是
一样的功能.
我再举个例子,在6502中没有寄存器X直接入堆栈和弹出堆栈功能的指令,这里我们用宏实现
.ORG $0000
PHX: .MACRO
TXA
PHA
.ENDM
PLX: .MACRO
PLA
TAX
.ENDM
MAIN: PHX
...
PLX
RTS
看到了吧,我们在程序中就可以用 PHX,PLX了
虽然宏的功能比较大,但是我们不可以乱用,因为宏和子程序是不一样的,子程序由 JSR 调用
由 RTS 返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次都是如此,比较节省内存
宏指令每调用一次都要占一个程序段,调用次数越多,占用内存就越多,所以从开销来说,子程序优于
宏指令,但从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址,要消耗一些时间
宏指令调用不需要这个过程,执行时间较短,所以从执行时间来看,宏指令又优于子程序.
所以说,当某一需要多次访问的程序段较长,访问次数又不是太多时,选用子程序比较好
当某一需要多次访问程序段较短,访问次数又很频繁时,选用宏指令比较好