一、相同之处:
Macro和Procedure都是一个程序段。
二、不同之处:
Macro是由一对符号表示的:%MACRO Label #(#表示这个Macro需要几个参数,有0,1,2…,在使用的时候用%1, %2…代替相应)
%ENDMACRO(注意是在最后一行单独显示)
Procedure也是由一对符号表示,CALL和RET,不过CALL是由caller使用的,RET在Procedure中末尾。实际上Procedure是由label和RET标记的。
Macro只能有一个entry point,而Procedure可以有多个entry point。实际上,Procedure中的每个global labe都可以作为一个entry point。对于local label,可以用大lable和小label连接的方式来使用(比如WriteStr中有.poke,那么在这个procedure之外就可以使用WriteStr.poke来直接访问)。
Macro在程序中是直接替换的。比如在这个程序中使用了某个Macro,那么在编译的时候,assembler就会到磁盘上找这个Macro的文件,然后在我这个程序汇中直接把引用的部分用实际的Macro替换。这个和C语言中宏的使用是相同的。注意这只是在内存中发生的替换,磁盘中的源文件没有变化。
而Procedure则不同,它是“hook(Procedure)”和“eyelet(socket,In my program)”的结合。相当于C中的函数调用。
调用Procedure的时候需要使用CALL Procedure。
而使用Macro的时候只需要把Macro的名字放上去就可以了,后面跟着相应的参数:GotoXY 1,23
在Procedure中,local label的标志是以句号开头,如.poke,后面跟冒号。NASM对它的标识是大lable加上小label,比如WriteStr.poke(WriteStr是Procedure名)
在Macro中,local label的标志是以两个百分号开头,如%%IsLC,后面跟冒号。NASM对它的标识是..@1771.IsLC,1771是一个随机的四位数字,每次运行时由NASM指定,不一定相同。