博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Macro和Procedure的比较(汇编中的宏与函数)

Posted on 2011-03-28 14:13  天地玄黄  阅读(1492)  评论(0编辑  收藏  举报
Technorati 标签: 汇编,Macro,Procedure

一、相同之处

         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指定,不一定相同。