要汇编一个文件,你可以以下面的格式执行一个命令:
nasm -f <format> <filename> [-o <output>]
比如, 会把文件'myfile.asm'汇编成'ELF'格式 的文件'myfile.o'.还有:
nasm -f bin myfile.asm -o myfile.com
会把文件'myfile.asm'汇编成纯二进制格式的文件'myfile.com'。
想要以十六进制代码的形式产生列表文件输出,并让代码显示在源代码的左侧, 使用'-l'选项并给出列表文件名,比如:
nasm -f coff myfile.asm -l myfile.lst
想要获取更多的关于NASM 的使用信息,请输入:
nasm -h
它同时还会输出可以使用的输出文件格式,
如果你使用Linux 并且不清楚你的系统是'a.out'还是'ELF',请输入:
file nasm
(在nasm 二进制文件的安装目录下使用),如果系统输出类似下面的信息:
nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
那么你的系统就是'ELF'格式的,然后你就应该在产生Linux 目标文件时使用选 项'-f elf',如果系统输入类似下面的信息:
nasm: Linux/i386 demand-paged executable (QMAGIC)
或者与此相似的,你的系统是'a.out'的,那你应该使用'-f aout'(Linux 的'a.out'
系统很久以前就过时了,现在已非常少见。)
就像其他的Unix 编译器与汇编器,NASM 在碰到错误以前是不输出任何信息的,所 以除了出错信息你看不到任何其他信息。
2.1.1 '-o'选项:指定输出文件的文件名。
NASM 会为你的输出文件选择一个文件名;具体如何做取决于目标文件的格式,对 于微软的目标文件格式('obj'和'win32'),它会去掉你的源文件名的'.asm'扩展 名(或者其他任何你喜欢使用的扩展名,NASM 并不关心具体是什么),并替换上
'obj'。对于Unix 的目标文件格式('aout','coff','elf'和'as86')它会替换成
'.o', 对于'rdf',它会使用'.rdf',还有为'bin'格式,它会简单地去掉扩展名,所以
'myfile.asm'会产生的一个输出文件'myfile'。
如果输出文件已经存在,NASM 会覆盖它,除非它的文件名与输入文件同名,在这种 情况下,它会给出一个警告信息,并使用'nasm.out'作为输出文件的文件名。 在某些情况下,上述行为是不能接受的,所以,NASM 提供了'-o'选项,它能让你指定 你的输出文件的文件名,你使用'-o'后面紧跟你为输出文件取的名字,中间可以加 空格也可以不加。比如:
nasm -f bin program.asm -o program.com
nasm -f bin driver.asm -odriver.sys
请注意这是一个小写的o,跟大写字母O 是不同的,大写的是用来指定需要传递的选 项的数目,请参阅2.1.15
2.1.2 `-f'选项:指定输出文件的格式。
如果你没有对NASM 使用'-f'选项,它会自己为你选择一个输出文件格式。在发布的 NASM 版本中,缺省的输出格式总是'bin';如果你自己编译你的NASM,你可以在编译的 时候重定义'OF_DEFAULT'来选择你需要的缺省格式。
就象'-o','-f'与输出文件格式之间的空格也是可选的,所以'-f elf'和'-felf'都是 合法的。 所有可使用的输出文件格式的列表可以通过运行命令'nasm -hf'得到。
2.1.3 `-l' 选项: 产生列表文件
如果你对NASM 使用了'-l'选项,后面跟一个文件名,NASM 会为你产生一个源文件的列表 文件,在里面,地址和产生的代码列在左边,实际的源代码(包括宏扩展,除了那些指定 不需要在列表中扩展的宏,参阅4.3.9)列在右边,比如:
nasm -f elf myfile.asm -l myfile.lst
2.1.4 `-M'选项: 产生Makefile 依赖关系.
该选项可以用来向标准输出产生makefile 依赖关系,可以把这些信息重定向到一个文件 中以待进一步处理,比如:
NASM -M myfile.asm > myfile.dep
2.1.5 `-F'选项: 选择一个调试格式
该选项可以用来为输出文件选择一个调试格式,语法跟-f 选项相册,唯一不同的是它产 生的输出文件是调试格式的。 一个具体文件格式的完整的可使用调试文件格式的列表可通过命令'nasm -f <format> -y'
来得到。 这个选项在缺省状态下没有被构建时NASM 。如何使用该选项的信息请参阅6.10
2.1.6 `-g' 选项:使调试信息有效。
该选项可用来在指定格式的输出文件中产生调试信息。
更多的信息请参阅2.1.5
2.1.7 `-E' 选项: 把错误信息输入到文件。
在'MS-DOS'下,尽管有办法,但要把程序的标准错误输出重定向到一个文件还是非常困 难的。因为NASM 常把它的警告和错误信息输出到标准错误设备,这将导致你在文本编 辑器里面很难捕捉到它们。
因此NASM 提供了一个'-E'选项,带有一个文件名参数,它可以把错误信息输出到指定的 文件而不是标准错误设备。所以你可以输入下面这样的命令来把错误重定向到文件:
nasm -E myfile.err -f obj myfile.asm
2.1.8 `-s' 选项: 把错误信息输出到'stdout'
'-s'选项可以把错误信息重定向到'stdout'而不是'stderr',它可以在'MS-DOS'下进行 重定向。想要在汇编文件'myfile.asm'时把它的输出用管道输出给'more'程序,可以这样:
nasm -s -f obj myfile.asm | more
请参考2.1.7 的'-E'选项.
2.1.9 `-i'选项: 包含文件搜索路径
当NASM 在源文件中看到'%include'操作符时(参阅4.6),它不仅仅会在当前目录下搜索给 出的文件,还会搜索'-i'选项在命令行中指定的所有路径。所以你可以从宏定义库中 包含进一个文件,比如,输入:
nasm -ic:macrolib -f obj myfile.asm
(通常,在 '-i'与路径名之间的空格是允许的,并且可选的。)
NASM 更多的关注源代码级上的完全可移植性,所以并不理解正运行的操作系统对文件的 命名习惯;你提供给'-i'作为参数的的字符串会被一字不差地加在包含文件的文件名前。 所以,上例中最后面的一个反斜杠是必要的,在Unix 下,一个尾部的正斜线也同样是必要 的。
(当然,如果你确实需要,你也可以不正规地使用它,比如,选项'-ifoo'会导致
'%incldue "bar.i'去搜索文件'foobar.i'...)
如果你希望定义一个标准的搜索路径,比如像Unix 系统下的'/usr/include',你可以在环境 变量NASMENV 中放置一个或多个'-i'(参阅2.1.19)
为了与绝大多数C 编译器的Makefile 保持兼容,该选项也可以被写成'-I'。
2.1.10 `-p' 选项: 预包含一个文件
NASM 允许你通过'-p'选项来指定一个文件预包含进你的源文件。所以,如果运行:
nasm myfile.asm -p myinc.inc
跟在源文件开头写上'%include "myinc.inc"然后运行'nasm myfile.asm'是等效的。
为和'-I','-D','-U'选项操持一致性,该选项也可以被写成'-P'
2.1.11 `-d'选项: 预定义一个宏。
就像'-p'选项给出了在文件头放置'%include'的另一种实现,'-d'选项给出了在文
件中写'�fine'的另一种实现,你可以写:
nasm myfile.asm -dFOO=100
作为在文件中写下面一行语句的一种替代实现:
�fine FOO 100
在文件的开始,你可以取消一个宏定义,同样,选项'-dFOO'等同于代码'�fine FOO'。 这种形式的操作符在选择编译时操作中非常有用,它们可以用'%ifdef'来进行测试, 比如'-dDEBUG'。
为了与绝大多数C 编译器的Makefile 保持兼容,该选项也可以被写成'-D'。
2.1.12 `-u' 选项: 取消一个宏定义。
'-u'选项可以用来取消一个由'-p'或'-d'选项先前在命令行上定义的一个宏定义。 比如,下面的命令语句:
nasm myfile.asm -dFOO=100 -uFOO
会导致'FOO'不是一个在程序中预定义的宏。这在Makefile 中不同位置重载一个操 作时很有用。 为了与绝大多数C 编译器的Makefile 保持兼容,该选项也可以被写成'-U'。
2.1.13 `-e'选项: 仅预处理。
NASM 允许预处理器独立运行。使用'-e'选项(不需要参数)会导致NASM 预处理输入 文件,展开所有的宏,去掉所有的注释和预处理操作符,然后把结果文件打印在标 准输出上(如果'-o'选项也被指定的话,会被存入一个文件)。
该选项不能被用在那些需要预处理器去计算与符号相关的表达式的程序中,所以 如下面的代码:
%assign tablesize ($-tablestart)
会在仅预处理模式中会出错。
2.1.14 `-a' 选项: 不需要预处理。
如果NASM 被用作编译器的后台,那么假设编译器已经作完了预处理,并禁止NASM 的预处理功能显然是可以节约时间,加快编译速度。'-a'选项(不需要参数),会让NASM 把 它强大的预处理器换成另一个什么也不做的预处理器。
2.1.15 `-On'选项: 指定多遍优化。
NASM 在缺省状态下是一个两遍的汇编器。这意味着如果你有一个复杂的源文件需要 多于两遍的汇编。你必须告诉它。使用'-O'选项,你可以告诉NASM 执行多遍汇编。语法如下:
(*)'-O0'严格执行两遍优化,JMP 和Jcc 的处理和0.98 版类似,除了向后跳的JMP 是 短跳 转,如果可能,立即数在它们的短格式没有被指定的情况下使用长格式。
(*)'-O1'严格执行两遍优化,但前向分支被汇编成保证能够到达的代码;可能产生比
'-O0'更大的代码,但在分支中的偏移地址没有指定的情况下汇编成功的机率更大,
(*)'-On' 多编优化,最小化分支的偏移,最小化带符号的立即数,当'strict'关键字
没有用的时候重载指定的大小(参阅3.7),如果2<=n<=3,会有5*n 遍,而不是n 遍。
注意这是一个大写的O,和小写的o 是不同的,小写的o 是指定输出文件的格式,可参阅
2.1.16 `-t'选项: 使用TASM 兼容模式。
NASM 有一个与Borlands 的TASM 之间的受限的兼容格式。如果使用了NASM 的'-t'选项,就会产生下列变化:
(*)本地符号的前缀由'.'改为'@@'
(*)TASM 风格的以'@'开头的应答文件可以由命令行指定。这和NASM 支持的'-@resp' 风格是不同的。
(*)扩号中的尺寸替换被支持。在TASM 兼容模式中,方括号中的尺寸替换改变了操 作 数的尺寸大小,方括号不再支持NASM 语法的操作数地址。比如,'mov eax,[DWORD VAL]' 在TASM 兼容语法中是合法的。但注意你失去了为指令替换缺省地址类型的能力。
(*)'%arg'预处理操作符被支持,它同TASM 的ARG 操作符相似。
(*) `%local'预处理操作符。
(*) `%stacksize'预处理操作符。
(*) 某些操作符的无前缀形式被支持。 (`arg', `elif',`else', `endif', `if',
`ifdef', `ifdifi', `ifndef', `include',`local')
(*) 还有很多...
需要更多的关于操作符的信息,请参阅4.9 的TASM 兼容预处理操作符指令。
2.1.17 `-w'选项: 使汇编警告信息有效或无效。
NASM 可以在汇编过程中监视很多的情况,其中很多是值得反馈给用户的,但这些情况 还不足以构成严重错误以使NASM 停止产生输出文件。这些情况被以类似错误的形式 报告给用户,但在报告信息的前面加上'warning'字样。警告信息不会阻止NASM 产生 输出文件并向操作系统返回成功信息。
有些情况甚至还要宽松:他们仅仅是一些值得提供给用户的信息。所以,NASM 支持'-w' 命令行选项。它以使特定类型的汇编警告信息输出有效或无效。这样的警告类型是 以命名来描述的,比如,'orphan-labels',你可以以下列的命令行选项让此类警告信息 得以输出:'-w orphan-labels',或者以'-w-orphan-labels'让此类信息不能输出。 可禁止的警告信息类型有下列一些:
(*)`macro-params'包括以错误的参数个数调用多行的宏定义的警告。这类警告信息
缺省情况下是输出的,至于为什么你可能需要禁止它,请参阅4.3.1。
(*)`orphan-labels'包含源文件行中没有指令却定义了一个没有结尾分号的label 的
警告。缺省状况下,NASM 不输出此类警告。如果你需要它,请参阅3.1 的例子。
(*) 'number-overflow'包含那些数值常数不符合32 位格式警告信息(比如,你很容易 打 了很多的F,错误产生了'0x7fffffffffff')。这种警告信息缺省状况下是打开的。
2.1.18 `-v'选项: 打印版本信息。
输入'NASM -v'会显示你正使用的NASM 的版本号,还有它被编译的时间。 如果你要提交bug 报告,你可能需要版本号。
2.1.19 `NASMENV'环境变量。
如果你定义了一个叫'NASMENV'的环境变量,程序会被把它认作是命令行选项附加的一 部分,它会在真正的命令行之前被处理。你可以通过在'NASMENV'中使用'-i'选项来定义包含文件的标准搜索路径。 环境变量的值是通过空格符分隔的,所以值'-s ic:nasmlib'会被看作两个单独的操 作。也正因为如此,意味着值'-dNAME='my name'不会象你预期的那样被处理, 因为它会在空格符处被分开,NASM 的命令行处理会被两个没有意义的字符串'-dNAME="my'和 'name"'给弄混。 为了解决这个问题,NASM 为此提供了一个特性,如果你在'NASMENV'环境变量的第一个 字符处写上一个非减号字符,NASM就会把这个字符当作是选项的分隔符。所以把环 境变量设成'!-s!-ic:nasmlib'跟'-s -ic:nasmlib'没什么两样,但是
'!-dNAME="my name"就会正常工作了。 这个环境变量以前叫做'NASM',从版本0.98.32 以后开始叫这个名字。
第三章 NASM 语言
----------------
3.1 NASM 源程序行的组成。
就像很多其他的汇编器,每一行NASM 源代码包含(除非它是一个宏,一个预处理操作 符,或一个汇编器操作符,参况第4,5 章)下面四个部分的全部或某几个部分: 通常,这些域的大部分是可选的;label,instruction,comment 存在或不存在都是允 许的。当然,operands 域会因为instruction 域的要求而必需存或必须不存在。 NASM 使用反斜线()作为续行符;如果一个以一个反斜线结束,那第二行会被认为 是前面一行的一部分。
NASM 对于一行中的空格符并没有严格的限制:labels 可以在它们的前面有空格,或 其他任何东西。label 后面的冒号同样也是可选的。(注意到,这意味着如果你想 要写一行'lodsb',但却错误地写成了'lodab',这仍将是有效的一行,但这一行不做 任何事情,只是定义了一个label。运行NASM 时带上命令行选项'-w orphan-labels' 会让NASM 在你定义了一个不以冒号结尾的label 时警告你。
labels 中的有效的字符是字母,数字,'-','$','#','@','~','.'和'?'。但只有字母
'.',(具有特殊含义,参阅3.9),'_'和'?'可以作为标识符的开头。一个标识符还可
以加上一个'$'前缀,以表明它被作为一个标识符而不是保留字来处理。这样的话,
如果你想到链接进来的其他模块中定义了一个符号叫'eax',你可以用'$eax'在
NASM 代码中引用它,以和寄存器的符号区分开。
instruction 域可以包含任何机器指令:Pentium 和P6 指令,FPU 指令,MMX 指令还有甚 至没有公开的指令也会被支持。这些指令可以加上前缀'LOCK','REP','REPE/REPZ' 或'REPNE'/'REPNZ',通常,支持显示的地址尺寸和操作数尺寸前缀'A16','A32', 'O16'和'O32'。关于使用它们的一个例子在第九章给出。你也可以使用段寄存器 名作为指令前缀:代码'es mov [bx],ax'等效于代码'mov [es:bx],ax'。我们推荐后一种语法。因为它和语法中的其它语法特性一致。但是对于象'LODSB'这样的 指令,它没有操作数,但还是可以有一个段前缀,对于'es lodsb'没有清晰地语法 处理方式 在使用一个前缀时,指令不是必须的,像'CS','A32','LOCK'或'REPE'这样的段前缀 以单独出现在一行上,NASM 仅仅产生一个前缀字节。 作为对实际机器指令的扩展,NASM 同时提供了一定数量的伪操作指令,这在3.2 节 详细描述。
指令操作数可以使用一定的格式:它们可以是寄存器,仅仅以寄存器名来表示(比 如:'ax','bp','ebx','cr0':NASM 不使用'gas'的语法风格,在这种风格中,寄存器名 前必须加上一个'%'符号),或者它们可以是有效的地址(参阅3.3),常数(3.4),或 表达式。
对于浮点指令,NASM 接受各种语法:你可以使用MASM 支持的双操作数形式,或者你 可以使用NASM 的在大多数情况下全用的单操作数形式。支持的所以指令的语法 细节可以参阅附录B。比如,你可以写:
fadd st1 ; this sets st0 := st0 st1
fadd st0,st1 ; so does this
fadd st1,st0 ; this sets st1 := st1 st0
fadd to st1 ; so does this
几乎所有的浮点指令在引用内存时必须使用以下前缀中的一个'DWORD',QWORD' 或'TWORD'来指明它所引用的内存的尺寸。
3.2 伪指令。
伪指令是一些并不是真正的x86 机器指令,但还是被用在了instruction 域中的指 令,因为使用它们可以带来很大的方便。当前的伪指令'DB','DW','DD','DQ'和‘DT’,它们对应的未初始化指令是'RESB','RESW','RESD','RESQ'和'REST','INCBIN' 命令,'EQU'命令和'TIEMS'前缀。
3.2.1 `DB'一类的伪指令: 声明已初始化的数据。
在NASM 中,`DB', `DW', `DD', `DQ'和`DT'经常被用来在输出文件中声明已初始化 的数据,你可以多种方式使用它们:
db 0x55 ; just the byte 0x55
db 0x55,0x56,0x57 ; three bytes in succession
db 'a',0x55 ; character constants are OK
db 'hello',13,10,'$' ; so are string constants
dw 0x1234 ; 0x34 0x12
dw 'a' ; 0x41 0x00 (it's just a number)
dw 'ab' ; 0x41 0x42 (character constant)
dw 'abc' ; 0x41 0x42 0x43 0x00 (string)
dd 0x12345678 ; 0x78 0x56 0x34 0x12
dd 1.234567e20 ; floating-point constant
dq 1.234567e20 ; double-precision float
dt 1.234567e20 ; extended-precision float
'DQ'和'DT'不接受数值常数或字符串常数作为操作数。
3.2.2 `RESB'类的伪指令:
声明未初始化的数据。 `RESB', `RESW', `RESD', `RESQ' and `REST'被设计用在模块的BSS 段中:它们声明 未初始化的存储空间。每一个带有单个操作数,用来表明字节数,字数,或双字数 或其他的需要保留单位。就像在2.2.7 中所描述的,NASM 不支持MASM/TASM 的扣留未 初始化空间的语法'DW ?'或类似的东西:现在我们所描述的正是NASM 自己的方式。 'RESB'类伪指令的操作数是有严格的语法的,参阅3.8。
3.2.3 `INCBIN':包含其他二进制文件。
'INCBIN'是从老的Amiga 汇编器DevPac 中借过来的:它将一个二进制文件逐字逐句地
包含到输出文件中。这能很方便地在一个游戏可执行文件中包含中图像或声音数 据。它可以以下三种形式的任何一种使用:
incbin "file.dat" ; include the whole file
incbin "file.dat",1024 ; skip the first 1024 bytes
incbin "file.dat",1024,512 ; skip the first 1024, and
; actually include at most 512
3.2.4 `EQU': 定义常数。
'EQU'定义一个符号,代表一个常量值:当使用'EQU'时,源文件行上必须包含一个label。 'EQU'的行为就是把给出的label 的名字定义成它的操作数(唯一)的值。定义是不可更 改的,比如:
message db 'hello, world'
msglen equ $-message
把'msglen'定义成了常量12。'msglen'不能再被重定义。这也不是一个预自理定义: 'msglen'的值只被计算一次,计算中使用到了'$'(参阅3.5)在此时的含义。注意 ‘EQU’的操作数也是一个严格语法的表达式。(参阅3.8)
3.2.5 `TIMES': 重复指令或数据。为了与绝大多数C 编译器的Makefile 保持兼容,该选项也可以被写成'-U'。
2.1.13 `-e'选项: 仅预处理。
NASM 允许预处理器独立运行。使用'-e'选项(不需要参数)会导致NASM 预处理输入 文件,展开所有的宏,去掉所有的注释和预处理操作符,然后把结果文件打印在标 准输出上(如果'-o'选项也被指定的话,会被存入一个文件)。
该选项不能被用在那些需要预处理器去计算与符号相关的表达式的程序中,所以 如下面的代码:
%assign tablesize ($-tablestart)
会在仅预处理模式中会出错。
2.1.14 `-a' 选项: 不需要预处理。
如果NASM 被用作编译器的后台,那么假设编译器已经作完了预处理,并禁止NASM 的 预处理功能显然是可以节约时间,加快编译速度。'-a'选项(不需要参数),会让NASM 把 它强大的预处理器换成另一个什么也不做的预处理器。
2.1.15 `-On'选项: 指定多遍优化。
NASM 在缺省状态下是一个两遍的汇编器。这意味着如果你有一个复杂的源文件需要 多于两遍的汇编。你必须告诉它。
使用'-O'选项,你可以告诉NASM 执行多遍汇编。语法如下:
(*)'-O0'严格执行两遍优化,JMP 和Jcc 的处理和0.98 版类似,除了向后跳的JMP 是 短跳 转,如果可能,立即数在它们的短格式没有被指定的情况下使用长格式。
(*)'-O1'严格执行两遍优化,但前向分支被汇编成保证能够到达的代码;可能产生比
'-O0'更大的代码,但在分支中的偏移地址没有指定的情况下汇编成功的机率更大,
(*)'-On' 多编优化,最小化分支的偏移,最小化带符号的立即数,当'strict'关键字 没有用的时候重载指定的大小(参阅3.7),如果2<=n<=3,会有5*n 遍,而不是n 遍。 注意这是一个大写的O,和小写的o是不同的,小写的o 是指定输出文件的格式,可参阅
2.1.1
2.1.16 `-t'选项: 使用TASM 兼容模式。
NASM 有一个与Borlands 的TASM 之间的受限的兼容格式。如果使用了NASM 的'-t'选项, 就会产生下列变化:
(*)本地符号的前缀由'.'改为'@@'
(*)TASM 风格的以'@'开头的应答文件可以由命令行指定。这和NASM 支持的'-@resp'
风格是不同的。
(*)扩号中的尺寸替换被支持。在TASM 兼容模式中,方括号中的尺寸替换改变了操 作 数的尺寸大小,方括号不再支持NASM 语法的操作数地址。比如,'mov eax,[DWORD VAL]' 在TASM 兼容语法中是合法的。但注意你失去了为指令替换缺省地址类型的能力。
(*)'%arg'预处理操作符被支持,它同TASM 的ARG 操作符相似。
(*) `%local'预处理操作符。
(*) `%stacksize'预处理操作符。
(*) 某些操作符的无前缀形式被支持。 (`arg', `elif',`else', `endif', `if',
`ifdef', `ifdifi', `ifndef', `include',`local')
(*) 还有很多...
需要更多的关于操作符的信息,请参阅4.9 的TASM 兼容预处理操作符指令。
2.1.17 `-w'选项: 使汇编警告信息有效或无效。
NASM 可以在汇编过程中监视很多的情况,其中很多是值得反馈给用户的,但这些情况 还不足以构成严重错误以使NASM 停止产生输出文件。这些情况被以类似错误的形式报告给用户,但在报告信息的前面加上'warning'字样。警告信息不会阻止NASM 产生 输出文件并向操作系统返回成功信息。
有些情况甚至还要宽松:他们仅仅是一些值得提供给用户的信息。所以,NASM 支持'-w' 命令行选项。它以使特定类型的汇编警告信息输出有效或无效。这样的警告类型是 以命名来描述的,比如,'orphan-labels',你可以以下列的命令行选项让此类警告信息 得以输出:'-w orphan-labels',或者以'-w-orphan-labels'让此类信息不能输出。
可禁止的警告信息类型有下列一些:
(*)`macro-params'包括以错误的参数个数调用多行的宏定义的警告。这类警告信息
缺省情况下是输出的,至于为什么你可能需要禁止它,请参阅4.3.1。
(*)`orphan-labels'包含源文件行中没有指令却定义了一个没有结尾分号的label 的
警告。缺省状况下,NASM 不输出此类警告。如果你需要它,请参阅3.1 的例子。
(*) 'number-overflow'包含那些数值常数不符合32 位格式警告信息(比如,你很容易 打 了很多的F,错误产生了'0x7fffffffffff')。这种警告信息缺省状况下是打开的。
2.1.18 `-v'选项: 打印版本信息。
输入'NASM -v'会显示你正使用的NASM 的版本号,还有它被编译的时间。 如果你要提交bug 报告,你可能需要版本号。
2.1.19 `NASMENV'环境变量。
如果你定义了一个叫'NASMENV'的环境变量,程序会被把它认作是命令行选项附加的一 部分,它会在真正的命令行之前被处理。你可以通过在'NASMENV'中使用'-i'选项来定 义包含文件的标准搜索路径。 环境变量的值是通过空格符分隔的,所以值'-s ic:nasmlib'会被看作两个单独的操 作。也正因为如此,意味着值'-dNAME='my name'不会象你预期的那样被处理,因为它 会在空格符处被分开,NASM 的命令行处理会被两个没有意义的字串'-dNAME="my'和 'name"'给弄混。 为了解决这个问题,NASM 为此提供了一个特性,如果你在'NASMENV'环境变量的第一个 字符处写上一个非减号字符,NASM 就会把这个字符当作是选项的分隔符。所以把环 境变量设成'!-s!-ic:nasmlib'跟'-s -ic:nasmlib'没什么两样,但是 '!-dNAME="my name"就会正常工作了。
这个环境变量以前叫做'NASM',从版本0.98.32 以后开始叫这个名字。