nasm预处理器(3)

nasm提供一个限定符.nolist,可以包含它到一个宏定义中,这样该宏就不会在列表文件中被展开;限定符 .nolist直接放到参数后面:

%macro foo 1.nolist

条件汇编

和C预处理器类似,nasm允许对一段源代码只在某特定条件满足时进行汇编:

%if<condition>
%elif<condition2>
%else
%endif

%ifdef和 %ifndef 测试单行宏是否存在,在分支测试中也有类似的%elifdef和%elifndef

%ifmacro测试多行宏是否存在,同样存在和判断单行宏类似的%ifnmacro、%elifmacro和%elifnmacro

%ifctx ctxname 测试上下文栈,当与处理器上下文栈中顶部的上下文为ctxname时条件成立。

%ifidn和%ifidni当且仅当文本相同时才会使代码汇编,2段文本在空格个数的不同会被忽略。后者是前者的大小写不敏感版本。

%ifid 当参数为记号时条件成立

%ifnum 当参数为数字时条件成立

%ifstr当参数为字符串时条件成立

%error产生一个错误

虽然nasm的times前缀很有用,但不能用来作用于一个多行宏,在nasm展开宏之后times才被处理,所以nasm提供另外一种在预处理器级别的循环:%rep

%rep可以带一个数值表达式,表示rep代码重复的次数:

%assign i 0
%rep 100
    inc word [table+2*i]
    %assign i i+1
%endrep

可以使用%exitrep跳出%rep循环

使用%include包含其它源文件,被包含文件在运行nasm所在目录查找,可以通过在nasm命令行中使用-i增加搜索路径。也可以在命令行中使用-p包含一个文件。

上一篇:修练8年C++面向对象程序设计之体会


下一篇:shell脚本比较字符串相等