nasm预处理器(1)

时间:2021-04-04 02:47:35

与处理器将所有以反斜杠结尾的连续行合并为一行。

单行的宏以%define来定义;当单行的宏被扩展后还含有其他宏时,会在执行时而不是定义时展开。

%define a(x) 1+b(x)
%define b(x) 2*x
mov ax,a(8)

会被最终展开为mov ax,1+2*8,但宏b不是在定义宏a时展开的。%define定义宏是大小写敏感的,可以用%idefine来定义大小写非敏感的宏。
如果有嵌套定义的宏,与处理器只会展开第一层,保证不会进入一个死循环。

可以定义重载单行宏:

%define foo(x) 1+x
%define foo(x,y) 1+x*y

nasm可以通过传递的参数的个数来区分;但是一旦定义了不带参数的宏后,其他的foo定义都不会被接受了:

%define foo bar

你还可以在命令行中使用 -d选项来预定义宏。
你可以用%xdefine来定义嵌套宏不会被后来重定义改变的宏。

可以使用%+将单行宏中的单独记号被连接起来,组成一个更长的记号。
单行宏可以使用%undef命令来取消;在命令行上可以用-u来取消定义。

%assign和%iassign也可以定义单行宏,它不带参数,并返回一个数值型的值,该值可以以表达式的形式指定:

%assign i i+1

%strlen宏返回数值是一个字符串的长度:

%strlen len 'hello world'

上例中len被赋予字符串的长度。

%substr宏用来取子字符串:

%substr char 'xyz' 1 ;char equ 'x'