//宏指令

  令我感到极度兴奋的是 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 返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次都是如此,比较节省内存

宏指令每调用一次都要占一个程序段,调用次数越多,占用内存就越多,所以从开销来说,子程序优于

宏指令,但从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址,要消耗一些时间

宏指令调用不需要这个过程,执行时间较短,所以从执行时间来看,宏指令又优于子程序.

   所以说,当某一需要多次访问的程序段较长,访问次数又不是太多时,选用子程序比较好

          当某一需要多次访问程序段较短,访问次数又很频繁时,选用宏指令比较好