NASM相对MASM和GAS而言,是一款比较中庸的汇编器,它语法简洁、功能强大,而且跨平台、免费,是外联汇编的不错选择。

    使用Visual Studio开发项目时,如果需要外联NASM汇编,可以使用VS中集成的功能进行设定,让它自动编译相应的汇编文件。在VS2005以前的版本中,可以使用“生成事件”来设置汇编文件的编译工作;在VS2005及以上版本中,可以使用“自定义生成规则”来设定。这里主要说明一下后者。

    在VS2005及以上版本中都有“自定义生成规则”功能,它使用一个扩展名为.rules的XML格式的文档来定义生成规则,VS自带一个MASM的生成规则文件masm.rules,在VS安装目录下的VC\VCProjectDefaults中可以找到。要在VS中使用NASM汇编器,也需要一个这样的文件,可以在 http://sourceforge.net/projects/nasm/files/Contributions/rules%20file%20for%20VS/下载,将之放在前面提到的目录中。这个文件只能生成Win32格式的文件。为了生成多种文件格式,需要自己添加相应的规则。下面是我修改后的,可以生成多种格式的规则文件。

  1<?xml version="1.0" encoding="utf-8"?>
  2<VisualStudioToolFile
  3	Name="Netwide Macro Assembler"
  4	Version="8.00"
  5	>
  6	<Rules>
  7		<CustomBuildRule
  8			Name="NASM"
  9			DisplayName="Netwide Macro Assembler"
 10			CommandLine="nasm.exe [AllOptions] [AdditionalOptions] [Inputs]"
 11			Outputs="[$ObjectFileName]"
 12			FileExtensions="*.asm"
 13			ExecutionDescription="正在汇编..."
 14			>
 15			<Properties>
 16				<StringProperty
 17					Name="PreprocessorDefinitions"
 18					DisplayName="宏定义"
 19					PropertyPageName="常规"
 20					Description="Defines a text macro with the given name.     (-D[symbol])"
 21					HelpURL="http://www.nasm.us/doc/"
 22					Switch="-D[value]"
 23					Delimited="true"
 24					Inheritable="true"
 25				/>
 26				<StringProperty
 27					Name="UndefinePreprocessorDefinitions"
 28					DisplayName="取消宏定义"
 29					PropertyPageName="常规"
 30					Description="Undefines a text macro with the given name.     (-U[symbol])"
 31					HelpURL="http://www.nasm.us/doc/"
 32					Switch="-U[value]"
 33					Delimited="true"
 34					Inheritable="true"
 35				/>
 36				<StringProperty
 37					Name="IncludePaths"
 38					DisplayName="包含路径"
 39					PropertyPageName="常规"
 40					Description="设置包含文件查找路径.     (-I[path])"
 41					HelpURL="http://www.nasm.us/doc/"
 42					Switch="-I[value]"
 43					Delimited="true"
 44					Inheritable="true"
 45				/>
 46				<BooleanProperty
 47					Name="TreatWarningsAsErrors"
 48					DisplayName="将警告视为错误"
 49					PropertyPageName="常规"
 50					Description="Returns an error code if warnings are generated.     (-Werror)"
 51					HelpURL="http://www.nasm.us/doc/"
 52					Switch="-Werror"
 53				/>
 54				<BooleanProperty
 55					Name="GenerateDebugInformation"
 56					DisplayName="生成调试信息"
 57					PropertyPageName="常规"
 58					Description="Generates Debug Information.     (-g)"
 59					HelpURL="http://www.nasm.us/doc/"
 60					Switch="-g"
 61					DefaultValue="true"
 62				/>
 63				<EnumProperty
 64					Name="Format"
 65					DisplayName="目标格式"
 66					PropertyPageName="常规"
 67					Description="输出文件的格式(win32,win64,bin,obj,coff),(-f [format])"
 68					>
 69					<Values>
 70						<EnumValue
 71							Value="0"
 72							Switch="-f win32"
 73							DisplayName="WIN32"
 74						/>
 75						<EnumValue
 76							Value="1"
 77							Switch="-f win64"
 78							DisplayName="WIN64"
 79						/>
 80						<EnumValue
 81							Value="2"
 82							Switch="-f bin"
 83							DisplayName="BIN"
 84						/>
 85						<EnumValue
 86							Value="3"
 87							Switch="-f obj"
 88							DisplayName="OBJ"
 89						/>
 90						<EnumValue
 91							Value="4"
 92							Switch="-f coff"
 93							DisplayName="COFF"
 94						/>
 95					</Values>
 96				</EnumProperty>
 97				<StringProperty
 98					Name="ObjectFileName"
 99					DisplayName="输出文件"
100					PropertyPageName="常规"
101					Description="Specifies the name of the output object file.     (-o [file])"
102					HelpURL="http://www.nasm.us/doc/"
103					Switch="-o "[value]""
104					DefaultValue="$(IntDir)\$(InputName).obj"
105				/>
106				<StringProperty
107					Name="AssembledCodeListingFile"
108					DisplayName="汇编代码列表文件"
109					PropertyPageName="常规"
110					Description="Generates an assembled code listing file.     (-l [file])"
111					HelpURL="http://www.nasm.us/doc/"
112					Switch="-l "[value]""
113				/>
114			</Properties>
115		</CustomBuildRule>
116	</Rules>
117</VisualStudioToolFile>

    将此文件放在指定目录后,打开VS的“自定义生成规则”对话框,在“可用规则文件”中我们可以看到刚才添加的规则文件,把它前面的选择框勾上就可以在项目中编译NASM汇编代码了。